From 787c841a51b6a1779507dc4021ce97510c4bd653 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 21 Jul 2021 16:31:17 +0300 Subject: [PATCH 001/109] [WIP] new DF experiment --- build.gradle.kts | 4 +- settings.gradle.kts | 1 + .../space/kscience/visionforge/VisionBase.kt | 8 ++-- .../kscience/visionforge/VisionChange.kt | 2 +- .../visionforge/VisionPropertyContainer.kt | 7 +-- .../kscience/visionforge/schemeDesctiptors.kt | 5 ++- visionforge-markdown/build.gradle.kts | 44 +++++++++++++++++++ .../visionforge/markup/VisionOfMarkup.kt | 40 +++++++++++++++++ .../kscience/visionforge/markup/markdown.kt | 25 +++++++++++ .../visionforge/markup/MarkupPlugin.kt | 38 ++++++++++++++++ .../visionforge/plotly/VisionOfPlotly.kt | 1 - .../visionforge/three/server/VisionServer.kt | 2 +- .../kscience/visionforge/solid/Extruded.kt | 4 +- 13 files changed, 163 insertions(+), 18 deletions(-) create mode 100644 visionforge-markdown/build.gradle.kts create mode 100644 visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt create mode 100644 visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/markdown.kt create mode 100644 visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt diff --git a/build.gradle.kts b/build.gradle.kts index 4ab2a7d5..c7fbc2d8 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -8,7 +8,7 @@ plugins { // kotlin("js") version(kotlinVersion) apply false } -val dataforgeVersion by extra("0.4.3") +val dataforgeVersion by extra("0.5.0-dev-2") val fxVersion by extra("11") allprojects { @@ -20,7 +20,7 @@ allprojects { } group = "space.kscience" - version = "0.2.0-dev-22" + version = "0.2.0-dev-23" } subprojects { diff --git a/settings.gradle.kts b/settings.gradle.kts index 6311841e..70f3606a 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -33,6 +33,7 @@ include( ":visionforge-gdml", ":visionforge-server", ":visionforge-plotly", + ":visionforge-markdown", ":demo:solid-showcase", ":demo:gdml", ":demo:muon-monitor", diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt index 78b75124..4dcffbca 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt @@ -30,13 +30,13 @@ internal data class PropertyListener( @SerialName("vision") public open class VisionBase( override @Transient var parent: VisionGroup? = null, - protected var properties: Config? = null + protected var properties: MutableItemProvider? = null ) : Vision { @Synchronized - protected fun getOrCreateProperties(): Config { + protected fun getOrCreateProperties(): MutableItemProvider { if (properties == null) { - val newProperties = Config() + val newProperties = MetaBuilder() properties = newProperties } return properties!! @@ -46,7 +46,7 @@ public open class VisionBase( * A fast accessor method to get own property (no inheritance or styles */ override fun getOwnProperty(name: Name): MetaItem? = if (name == Name.EMPTY) { - properties?.asMetaItem() + properties?.rootItem } else { properties?.getItem(name) } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt index 06ccb7bc..aa50001a 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt @@ -21,7 +21,7 @@ public class VisionChangeBuilder : VisionContainerBuilder { private var reset: Boolean = false private var vision: Vision? = null - private val propertyChange = Config() + private val propertyChange = MetaBuilder() private val children: HashMap = HashMap() public fun isEmpty(): Boolean = propertyChange.isEmpty() && propertyChange.isEmpty() && children.isEmpty() diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionPropertyContainer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionPropertyContainer.kt index 112295c9..3710175c 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionPropertyContainer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionPropertyContainer.kt @@ -1,9 +1,6 @@ package space.kscience.visionforge -import space.kscience.dataforge.meta.Config -import space.kscience.dataforge.meta.MetaItem -import space.kscience.dataforge.meta.get -import space.kscience.dataforge.meta.set +import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.Name /** @@ -20,7 +17,7 @@ public interface VisionPropertyContainer { public fun setProperty(name: Name, item: MetaItem?, notify: Boolean = true) } -public open class SimpleVisionPropertyContainer(protected val config: Config): VisionPropertyContainer{ +public open class SimpleVisionPropertyContainer(protected val config: ObservableMeta): VisionPropertyContainer{ override fun getProperty( name: Name, inherit: Boolean, diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/schemeDesctiptors.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/schemeDesctiptors.kt index 8f342b52..4187843f 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/schemeDesctiptors.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/schemeDesctiptors.kt @@ -2,10 +2,11 @@ package space.kscience.visionforge import space.kscience.dataforge.meta.Scheme import space.kscience.dataforge.meta.SchemeSpec +import space.kscience.dataforge.meta.asObservable import space.kscience.dataforge.meta.descriptors.NodeDescriptor import space.kscience.dataforge.meta.descriptors.NodeDescriptorBuilder import space.kscience.dataforge.meta.descriptors.ValueDescriptorBuilder -import space.kscience.dataforge.meta.toConfig +import space.kscience.dataforge.meta.toMutableMeta import space.kscience.dataforge.values.ValueType import kotlin.reflect.KProperty1 import kotlin.reflect.typeOf @@ -53,7 +54,7 @@ public inline fun NodeDescriptorBuilder.value( } public fun NodeDescriptor.copy(block: NodeDescriptorBuilder.() -> Unit = {}): NodeDescriptor { - return NodeDescriptorBuilder(toMeta().toConfig()).apply(block) + return NodeDescriptorBuilder(toMeta().toMutableMeta().asObservable()).apply(block) } public inline fun NodeDescriptorBuilder.scheme( diff --git a/visionforge-markdown/build.gradle.kts b/visionforge-markdown/build.gradle.kts new file mode 100644 index 00000000..210e4ee8 --- /dev/null +++ b/visionforge-markdown/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("ru.mipt.npm.gradle.mpp") +} + +val markdownVersion = "0.2.4" + +kscience { + useSerialization() +} + +kotlin { + js { + //binaries.library() + binaries.executable() + browser { + webpackTask { + outputFileName = "js/visionforge-markdown.js" + } + } + } + + jvm { + val processResourcesTaskName = + compilations[org.jetbrains.kotlin.gradle.plugin.KotlinCompilation.MAIN_COMPILATION_NAME] + .processResourcesTaskName + } + + + val jsBrowserDistribution by tasks.getting + + tasks.getByName("jvmProcessResources") { + dependsOn(jsBrowserDistribution) + from(jsBrowserDistribution) + } + + sourceSets { + commonMain { + dependencies { + api(project(":visionforge-core")) + api("org.jetbrains:markdown:$markdownVersion") + } + } + } +} \ No newline at end of file diff --git a/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt b/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt new file mode 100644 index 00000000..689ed221 --- /dev/null +++ b/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt @@ -0,0 +1,40 @@ +package space.kscience.visionforge.markup + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.modules.SerializersModule +import kotlinx.serialization.modules.polymorphic +import kotlinx.serialization.modules.subclass +import space.kscience.dataforge.meta.string +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.toName +import space.kscience.visionforge.Vision +import space.kscience.visionforge.VisionBase +import space.kscience.visionforge.setProperty + +@Serializable +@SerialName("vision.markup") +public class VisionOfMarkup( + public val format: String = COMMONMARK_FORMAT +) : VisionBase() { + + //TODO add templates + + public var content: String? + get() = getOwnProperty(CONTENT_PROPERTY_KEY).string + set(value) { + setProperty(CONTENT_PROPERTY_KEY, value) + } + + public companion object { + public val CONTENT_PROPERTY_KEY: Name = "content".toName() + public const val COMMONMARK_FORMAT: String = "markdown.commonmark" + public const val GFM_FORMAT: String = "markdown.gfm" + } +} + +internal val markupSerializersModule = SerializersModule { + polymorphic(Vision::class) { + subclass(VisionOfMarkup.serializer()) + } +} \ No newline at end of file diff --git a/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/markdown.kt b/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/markdown.kt new file mode 100644 index 00000000..0ac353e4 --- /dev/null +++ b/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/markdown.kt @@ -0,0 +1,25 @@ +package space.kscience.visionforge.markup + +import kotlinx.html.TagConsumer +import kotlinx.html.div +import kotlinx.html.unsafe +import org.intellij.markdown.flavours.MarkdownFlavourDescriptor +import org.intellij.markdown.flavours.commonmark.CommonMarkFlavourDescriptor +import org.intellij.markdown.html.HtmlGenerator +import org.intellij.markdown.parser.MarkdownParser + +/** + * Render markdown inside kotlinx-html tag + */ +public fun TagConsumer.markdown( + flavour: MarkdownFlavourDescriptor = CommonMarkFlavourDescriptor(), + block: () -> String +): T { + val src = block() + val parsedTree = MarkdownParser(flavour).buildMarkdownTreeFromString(src) + return div("visionforge-markdown") { + unsafe { + +HtmlGenerator(src, parsedTree, flavour).generateHtml() + } + } +} \ No newline at end of file diff --git a/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt b/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt new file mode 100644 index 00000000..30b8b848 --- /dev/null +++ b/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt @@ -0,0 +1,38 @@ +package space.kscience.visionforge.markup + +import kotlinx.browser.document +import kotlinx.serialization.modules.SerializersModule +import org.w3c.dom.Element +import space.kscience.dataforge.context.Context +import space.kscience.dataforge.context.PluginFactory +import space.kscience.dataforge.context.PluginTag +import space.kscience.dataforge.meta.Meta +import space.kscience.visionforge.ElementVisionRenderer +import space.kscience.visionforge.Vision +import space.kscience.visionforge.VisionClient +import space.kscience.visionforge.VisionPlugin +import kotlin.reflect.KClass + +public class MarkupPlugin : VisionPlugin(), ElementVisionRenderer { + public val visionClient: VisionClient by require(VisionClient) + override val tag: PluginTag get() = Companion.tag + override val visionSerializersModule: SerializersModule get() = markupSerializersModule + + override fun rateVision(vision: Vision): Int = when (vision) { + is VisionOfMarkup -> ElementVisionRenderer.DEFAULT_RATING + else -> ElementVisionRenderer.ZERO_RATING + } + + override fun render(element: Element, vision: Vision, meta: Meta) { + require(vision is VisionOfMarkup) { "The vision is not a markup vision" } + val div = document.createElement("div") + element.append(div) + TODO() + } + + public companion object : PluginFactory { + override val tag: PluginTag = PluginTag("vision.markup", PluginTag.DATAFORGE_GROUP) + override val type: KClass = MarkupPlugin::class + override fun invoke(meta: Meta, context: Context): MarkupPlugin = MarkupPlugin() + } +} \ No newline at end of file diff --git a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt index 773ff4bf..8603971e 100644 --- a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt +++ b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt @@ -2,7 +2,6 @@ package space.kscience.visionforge.plotly import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import space.kscience.dataforge.meta.Config import space.kscience.dataforge.misc.DFExperimental import space.kscience.plotly.Plot import space.kscience.plotly.Plotly diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt b/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt index 2c9ed631..fabb0675 100644 --- a/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt +++ b/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt @@ -54,7 +54,7 @@ public class VisionServer internal constructor( private val application: Application, private val rootRoute: String, ) : Configurable, CoroutineScope by application { - override val config: Config = Config() + override val config: ObservableMeta = ObservableMeta() public var updateInterval: Long by config.long(300, key = UPDATE_INTERVAL_KEY) public var cacheFragments: Boolean by config.boolean(true) public var dataEmbed: Boolean by config.boolean(true, "data.embed".toName()) diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt index 40e03512..d94062d8 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt @@ -2,7 +2,7 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import space.kscience.dataforge.meta.Config +import space.kscience.dataforge.meta.ObservableMeta import space.kscience.visionforge.* import kotlin.math.PI import kotlin.math.cos @@ -95,7 +95,7 @@ public class Extruded( public class ExtrudeBuilder( public var shape: List = emptyList(), public var layers: ArrayList = ArrayList(), - config: Config = Config() + config: ObservableMeta = ObservableMeta() ) : SimpleVisionPropertyContainer(config) { public fun shape(block: Shape2DBuilder.() -> Unit) { this.shape = Shape2DBuilder().apply(block).build() From a0d62c65d73a69abd8518e8e4415a8a287f5c882 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Thu, 22 Jul 2021 20:11:14 +0300 Subject: [PATCH 002/109] Fix FX ValueChooser crash --- ui/ring/build.gradle.kts | 1 - .../visionforge/editor/TextValueChooser.kt | 2 +- .../visionforge/editor/ValueChooser.kt | 7 +++---- .../visionforge/editor/ValueChooserBase.kt | 12 ++++++----- .../editor/VisualObjectEditorFragment.kt | 20 +++++++++---------- .../editor/VisualObjectTreeFragment.kt | 15 ++++++++------ .../kscience/visionforge/solid/FX3DPlugin.kt | 6 +++--- .../visionforge/solid/FXReferenceFactory.kt | 2 +- .../solid/VisualObjectFXBinding.kt | 12 +++++------ 9 files changed, 39 insertions(+), 38 deletions(-) diff --git a/ui/ring/build.gradle.kts b/ui/ring/build.gradle.kts index 84d33b43..4469b8cf 100644 --- a/ui/ring/build.gradle.kts +++ b/ui/ring/build.gradle.kts @@ -22,7 +22,6 @@ dependencies{ implementation(npm("@jetbrains/icons", "3.14.1")) implementation(npm("@jetbrains/ring-ui", "4.0.7")) - implementation(npm("core-js","3.12.1")) implementation(npm("file-saver", "2.0.2")) compileOnly(npm("url-loader","4.1.1")) compileOnly(npm("postcss-loader","5.2.0")) diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/TextValueChooser.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/TextValueChooser.kt index ea55fc83..e7beac2b 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/TextValueChooser.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/TextValueChooser.kt @@ -15,7 +15,7 @@ import space.kscience.dataforge.names.asName import space.kscience.dataforge.values.* import tornadofx.* -class TextValueChooser : ValueChooserBase() { +public class TextValueChooser : ValueChooserBase() { private val displayText: String get() = currentValue().let { diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooser.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooser.kt index c3796fa0..8816a250 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooser.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooser.kt @@ -14,7 +14,6 @@ import space.kscience.dataforge.meta.descriptors.ValueDescriptor import space.kscience.dataforge.misc.Named import space.kscience.dataforge.misc.Type import space.kscience.dataforge.names.toName -import space.kscience.dataforge.provider.provideByType import space.kscience.dataforge.values.Null import space.kscience.dataforge.values.Value import space.kscience.visionforge.widget @@ -63,7 +62,7 @@ public interface ValueChooser { public fun setCallback(callback: ValueCallback) - @Type("space.kscience.dataforge.vis.fx.valueChooserFactory") + @Type("space.kscience..fx.valueChooserFactory") public interface Factory : Named { public operator fun invoke(meta: Meta = Meta.EMPTY): ValueChooser } @@ -75,7 +74,7 @@ public interface ValueChooser { TextValueChooser.name -> TextValueChooser ColorValueChooser.name -> ColorValueChooser ComboBoxValueChooser.name -> ComboBoxValueChooser - else -> context.provideByType(type)//Search for additional factories in the plugin + else -> null//context.provideByType(type)//Search for additional factories in the plugin } } @@ -101,7 +100,7 @@ public interface ValueChooser { } } - fun build( + public fun build( context: Context, value: ObservableValue, descriptor: ValueDescriptor? = null, diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooserBase.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooserBase.kt index 81dc42ac..98790f96 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooserBase.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooserBase.kt @@ -18,16 +18,18 @@ import tornadofx.* * * @author Alexander Nozik */ -abstract class ValueChooserBase : ValueChooser { +public abstract class ValueChooserBase : ValueChooser { - override val node by lazy { buildNode() } - final override val valueProperty = SimpleObjectProperty(Null) - final override val descriptorProperty = SimpleObjectProperty() + override val node: T by lazy { buildNode() } + final override val valueProperty: SimpleObjectProperty = + SimpleObjectProperty(Null) + final override val descriptorProperty: SimpleObjectProperty = + SimpleObjectProperty() override var descriptor: ValueDescriptor? by descriptorProperty override var value: Value? by valueProperty - fun resetValue() { + public fun resetValue() { setDisplayValue(currentValue()) } diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisualObjectEditorFragment.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisualObjectEditorFragment.kt index 929c7e85..a918a3a5 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisualObjectEditorFragment.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisualObjectEditorFragment.kt @@ -13,13 +13,13 @@ import space.kscience.dataforge.meta.update import space.kscience.visionforge.* import tornadofx.* -class VisualObjectEditorFragment(val selector: (Vision) -> Meta) : Fragment() { +public class VisualObjectEditorFragment(public val selector: (Vision) -> Meta) : Fragment() { - val itemProperty = SimpleObjectProperty() - var item: Vision? by itemProperty - val descriptorProperty = SimpleObjectProperty() + public val itemProperty: SimpleObjectProperty = SimpleObjectProperty() + public var item: Vision? by itemProperty + public val descriptorProperty: SimpleObjectProperty = SimpleObjectProperty() - constructor( + public constructor( item: Vision?, descriptor: NodeDescriptor?, selector: (Vision) -> MutableItemProvider = { it.allProperties() }, @@ -30,13 +30,13 @@ class VisualObjectEditorFragment(val selector: (Vision) -> Meta) : Fragment() { private var currentConfig: Config? = null - private val configProperty: Binding = itemProperty.objectBinding { visualObject -> - if (visualObject == null) return@objectBinding null - val meta = selector(visualObject) + private val configProperty: Binding = itemProperty.objectBinding { vision -> + if (vision == null) return@objectBinding null + val meta = selector(vision) val config = Config().apply { update(meta) onChange(this@VisualObjectEditorFragment) { key, _, after -> - visualObject.setProperty(key, after) + vision.setProperty(key, after) } } //remember old config reference to cleanup listeners @@ -51,7 +51,7 @@ class VisualObjectEditorFragment(val selector: (Vision) -> Meta) : Fragment() { } } - private val styleBoxProperty: Binding = configProperty.objectBinding() { + private val styleBoxProperty: Binding = configProperty.objectBinding { VBox().apply { item?.styles?.forEach { styleName -> val styleMeta = item?.getStyle(styleName) diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisualObjectTreeFragment.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisualObjectTreeFragment.kt index f1faaf1a..2fa6cee1 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisualObjectTreeFragment.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisualObjectTreeFragment.kt @@ -3,6 +3,7 @@ package space.kscience.visionforge.editor import javafx.beans.property.SimpleObjectProperty import javafx.scene.control.SelectionMode import javafx.scene.control.TreeItem +import javafx.scene.layout.VBox import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionGroup import tornadofx.* @@ -29,13 +30,13 @@ private fun toTreeItem(vision: Vision, title: String): TreeItem() - var item: Vision? by itemProperty +public class VisualObjectTreeFragment : Fragment() { + public val itemProperty: SimpleObjectProperty = SimpleObjectProperty() + public var item: Vision? by itemProperty - val selectedProperty = SimpleObjectProperty() + public val selectedProperty: SimpleObjectProperty = SimpleObjectProperty() - override val root = vbox { + override val root: VBox = vbox { titledpane("Object tree", collapsible = false) { treeview> { cellFormat { @@ -47,7 +48,9 @@ class VisualObjectTreeFragment : Fragment() { } } selectionModel.selectionMode = SelectionMode.SINGLE - val selectedValue = selectionModel.selectedItemProperty().objectBinding { it?.value?.second } + val selectedValue = selectionModel.selectedItemProperty().objectBinding { + it?.value?.second + } selectedProperty.bind(selectedValue) } } diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt index f843e02c..d46bab32 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt @@ -23,7 +23,7 @@ import kotlin.collections.set import kotlin.math.PI import kotlin.reflect.KClass -class FX3DPlugin : AbstractPlugin() { +public class FX3DPlugin : AbstractPlugin() { override val tag: PluginTag get() = Companion.tag private val objectFactories = HashMap, FX3DFactory<*>>() @@ -42,7 +42,7 @@ class FX3DPlugin : AbstractPlugin() { as FX3DFactory? } - fun buildNode(obj: Solid): Node { + public fun buildNode(obj: Solid): Node { val binding = VisualObjectFXBinding(this, obj) return when (obj) { is SolidReferenceGroup -> referenceFactory(obj, binding) @@ -149,7 +149,7 @@ public interface FX3DFactory { public operator fun invoke(obj: T, binding: VisualObjectFXBinding): Node public companion object { - public const val TYPE = "fx3DFactory" + public const val TYPE: String = "fx3DFactory" } } diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXReferenceFactory.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXReferenceFactory.kt index dc72f7f1..022900df 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXReferenceFactory.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXReferenceFactory.kt @@ -7,7 +7,7 @@ import space.kscience.visionforge.Vision import space.kscience.visionforge.onPropertyChange import kotlin.reflect.KClass -class FXReferenceFactory(val plugin: FX3DPlugin) : FX3DFactory { +public class FXReferenceFactory(public val plugin: FX3DPlugin) : FX3DFactory { override val type: KClass get() = SolidReferenceGroup::class override fun invoke(obj: SolidReferenceGroup, binding: VisualObjectFXBinding): Node { diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisualObjectFXBinding.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisualObjectFXBinding.kt index 5045a375..a2f41fbe 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisualObjectFXBinding.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisualObjectFXBinding.kt @@ -14,7 +14,7 @@ import tornadofx.* /** * A caching binding collection for [Vision] properties */ -public class VisualObjectFXBinding(public val fx: FX3DPlugin, public val obj: Vision) { +public class VisualObjectFXBinding(private val fx: FX3DPlugin, public val obj: Vision) { private val bindings = HashMap>() init { @@ -33,15 +33,13 @@ public class VisualObjectFXBinding(public val fx: FX3DPlugin, public val obj: Vi } } - public operator fun get(key: Name): ObjectBinding { - return bindings.getOrPut(key) { - object : ObjectBinding() { - override fun computeValue(): MetaItem? = obj.getProperty(key) - } + public operator fun get(key: Name): ObjectBinding = bindings.getOrPut(key) { + object : ObjectBinding() { + override fun computeValue(): MetaItem? = obj.getProperty(key) } } - public operator fun get(key: String) = get(key.toName()) + public operator fun get(key: String): ObjectBinding?> = get(key.toName()) } public fun ObjectBinding.value(): Binding = objectBinding { it.value } From 4bdea746fc35a8c19d62254e466fa9989e80f6f6 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Wed, 4 Aug 2021 22:07:51 +0300 Subject: [PATCH 003/109] Images for polyline --- docs/images/polyline-points-2.png | Bin 0 -> 2912 bytes docs/images/polyline-points.png | Bin 0 -> 2547 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/images/polyline-points-2.png create mode 100644 docs/images/polyline-points.png diff --git a/docs/images/polyline-points-2.png b/docs/images/polyline-points-2.png new file mode 100644 index 0000000000000000000000000000000000000000..716ebb181df3321015fbcc3309a6cb808c54995b GIT binary patch literal 2912 zcmeHJX;>3?8XwLE$~6QLXt>6LAgFlICF;uI7!n8&*2IwatO1~c{pEtU3`)y| zkX;!7pwxgp5*v){;s8K?iUM2zo$2vjSaI?zTS=bxp755s$l5(lp(mVm-1}n$?r|Bi zVeL1jyP7gXxi@L=BWW#T;ac$~PX2Dt(!kMlDt6G}7UqL)T`csyOtrJ33Bx>LF$8JTVaD9k%ICVHuL>9?U-1{`=! zats7>BTRMD%MKP98kL)ZS1C^$edu=kc7|DxBOxGYIsKu;=**+|Y9kMsPykPaD{jR#N~V zLzPQppf0W=8-0^n6h+CRkK@2+U#4Xh!oN>x57+RQ4THK|=IeCeId3$jqq!Ug! z00}h5XQ(j!bpjeQL6zf(@Ur2T`vNSKGJAxF+^FwdM2!cmF78yJ{)I_dJZn6XbJA?% zE{-E%ufu#rTFP##92Vi954UGAEpu2jJjXFFs)YTxJearzn&=aZ++yL(!8dT!qgz{T zk2fO=i$bTmq1f4Ju`9P*!PWu3#UgJOAcQ?BcK-@;A*Jx|G#tW%fslapGeoDBRb?K6 z1U43dkc|Vpr@|Ljnld}$x>K+5&L)A|D%THA4LDI<*@)aGq~;=M1WFkf677|8SV2z@ zSF3V7Rt(0gZ=$#5R%PaI68KmIz7j>g#T!C`cn^r~-`r<+3Vicdf;o8A5Yiqshj@fU z18rJ%3g2C#&w0g9`Hkf$LtEnd1L10|6<5JT?C`5zuK{P6gv0V7CU0*ymI{qAIe$1N z$a-PeTP@u~)zKp#7D&RvumM#t-ZR|BC!HeZ{& z>}t-Jp}yN19!+m|eI~tpQsI#n=#q#$+dK~!%0U9Ce?Hz3!NsV$`JY38Z2Xir3l~%A zB%Q0bx?#&tcO&)mCa*-%9|WHruXnLtiCsx+2m^1KI~)%`!}hM-y6Cg zHRHCl^(4(t4Qlv)akB2=2XXkBnpoMkcKrwcfh)dg6|1=9uhFs_q>Ns{i?UoF&s zLlJKV+Rv%wYr8fo=~WAYy^gNloi)(QH;>V775uLd%1P3t2iE!B&?{v#jfQ}((seLW z?~mO6y7@()QD@i9bpBn?B?&2~@EV+vFWc;4jf=JQ_h4zA&QMUz;tCoBBTW5IfVDo# c^skw>JR2O}b5~UV6^e=h%0WlC)W+-F?+ouEhX4Qo literal 0 HcmV?d00001 diff --git a/docs/images/polyline-points.png b/docs/images/polyline-points.png new file mode 100644 index 0000000000000000000000000000000000000000..68d5d1416b059d3433259b4bb8e4e9f6cf536add GIT binary patch literal 2547 zcmeH}ZBP?O7{@P00?2^@DkdQ!g1lHjQZCA?0uc!yqGD@NQKRT3YQ_p-1SM#IAfPF= zN|7Ycm_mz6Rgf7eA`ssI&0UCP~p{moRlUG&{lS0Z=?QK18A2zEVN-Z0x^>f)!W$$_+xNCHv?OX4vq``Fn zaa^fg2ZWiJ154yMdnYtR7NZC{Oipp2GxyvvT9KRZG2J9+sWV& z^HISXOGz>9;tF>iJr?^%&;b%Cv8UD4w7KN&bRnDoL+jH^C5JRByI4h~vC_InRBe&O@>eo7~9+6^XW_ zEwGf_D?o=<6CAja9QgSvp=UY2p;ZVwz>vbu6pcjSu`QFE+E1y6HYky%WpstF3A)%_ z`qtxhOSzL=ocSxU?x%Y4atFFKO^VZCL$G$=$H%OUb7Me0m1MiS_L=4;=u7^3z~6MH_xdc+CTC^`?!%Hi#D*Wq5RTDO7Y0S!EXFA?XiVJn1 zJ6`=wRXr|sSWM6ON-AfKi%zRW4NcZ0LmL) zf-K^6FNC+f9v~QCx1V^=!S|O6e5LI_(~>kb-lo0WLsRtVleLZgkITFVYO-o}_@zuc zw?HnwGjdY4e0e7Xe{69mam!y$qtkYdqufjwKV9gr1=>g zir}#9mB9jDp-+Yf7I1eGsdI1Mb=a9UOD+~}EgZKQWlFaN-VXhsr>(wlosAsrz>eQ$4O`G?CCM3EYF^Hqp*YG_{c&&qF?h-@VVFBUhz*zjVYq44 zV%~!IYk~N}lLpnKPH$NNPY>D}41&hi8Y_+m&Yd#px;L$LR#yHasoQ}}*bH;%{-5N}dH+AYZ-{ Date: Wed, 4 Aug 2021 22:08:38 +0300 Subject: [PATCH 004/109] Delete tutorial.md --- docs/tutorial.md | 333 ----------------------------------------------- 1 file changed, 333 deletions(-) delete mode 100644 docs/tutorial.md diff --git a/docs/tutorial.md b/docs/tutorial.md deleted file mode 100644 index 15b24b3c..00000000 --- a/docs/tutorial.md +++ /dev/null @@ -1,333 +0,0 @@ -# Tutorial - -#### The main goal of this tutorial is to show all capabilities of ... (this part will be supplemented) - -The simple visualization can be made with function `main`. (this part will be supplemented as well) -```kotlin -import kotlinx.html.div -import space.kscience.dataforge.context.Context -import space.kscience.visionforge.html.ResourceLocation -import space.kscience.visionforge.solid.* -import java.nio.file.Paths - -fun main(){ - val context = Context{ - plugin(Solids) - } - - context.makeVisionFile ( - Paths.get("customFile.html"), - resourceLocation = ResourceLocation.EMBED - ){ - div { - vision { - solid { - } - } - } - } -} -``` -## Solids properties -**We will analyze which basic properties solids have using `box` solid.** - -*Basic properties:* -1. `opacity` - It is set in `float`. It takes on values from 0 to 1, which represent percents of solid opacity. It's initial value is 1. -2. `color` - It can be specified as `Int`, `String`, or as three `Ubytes`, which represent color in `rgb`. Elementally, the solid will have `green` color. -3. `rotation` - it's the point, around which the solid will be rotated. Initially, the value is `Point3D(0, 0, 0)`. Changing `x` coordinate of the point, you make pivot around `x axis`. The same for other coordinates: changing `y` - pivot around `y axis`, changing `z` - pivot around `z axis`. -4. position, which is given by values `x`, `y`, `z`. Initial values are `x = 0`, `y = 0`, `z = 0`. The coordinate system is Cartesian. It's elemental position is this - vertical `y` axis and horizontal `Oxz` plane. - -Let's see how properties are set in solids. -The `small box` will have elemental values of properties. If you will not set properties, it will have the same `position`, `color`, `rotation`, and `opacity` values. - -***You can see that `box` take four values. Later, we will discuss what they do in more detail. Now, it does not really matter.*** -```kotlin -box(10, 10, 10, name = "small box"){ - x = 0 - y = 0 - z = 0 - opacity = 1 //100% opacity - color("red") //as string - rotation = Point3D(0, 0, 0) -} -``` -![](../docs/images/small-box.png) - -The `big box` will have properties with custom values. -```kotlin -box(40, 40, 40, name = "big box"){ - x = 20 - y = 10 - z = 60 - opacity = 0.5 //50% opacity - color(0u, 179u, 179u) //color in rgb - rotation = Point3D(60, 80, 0) -} -``` -![](../docs/images/big-rotated-box.png) -If we compare these boxes, we will see all differences. - -Here is the function `main` with both boxes. -```kotlin -fun main(){ - val context = Context{ - plugin(Solids) - } - - context.makeVisionFile ( - Paths.get("customFile.html"), - resourceLocation = ResourceLocation.EMBED - ){ - div { - vision { - solid { - box(10, 10, 10, name = "small box"){ - x = 0 - y = 0 - z = 0 - opacity = 1 //100% opacity - color("red") //as string - rotation = Point3D(0, 0, 0) - } - box(40, 40, 40, name = "big box"){ - x = 20 - y = 10 - z = 60 - opacity = 0.5 //50% opacity - color(0u, 179u, 179u) //rgb - rotation = Point3D(60, 80, 0) - } - } - } - } - } -} -``` -![](../docs/images/two-boxes-1.png) -![](../docs/images/two-boxes-2.png) - -***There is plenty of other properties, especially of those, which you can create by yourself. Here we mention just small part.*** - -## Basic Solids -Now, let's see which solids can be visualized: -### 1) PolyLine -### 2) Box - -First thing which has to be mentioned is that `box` takes four values: `box(x, y, z, name)` -* `x` - x-axis length of the `box` -* `y` - y-axis length of the `box` -* `z` - z-axis length of the `box` - -These values have `Float` type. *`x`, `y`, and `z` are necessary values, which cannot be ignored. You have to set them.* - -* `name` - `box`'es identifier with `String` type. *It's an optional value, but without it you won't be able to control solid.* - -Let's create just usual `box` with equal ribs. - -```kotlin - box(50, 50, 50, name = "box") { - color("pink") - } -``` - ![](../docs/images/box.png) - -Now, let's make `box` with bigger `y` value. - ```kotlin - box(10, 25, 10, name = "high box") { - color("black") - } - ``` -As you can see, only rib of `y-axis` differs from other ribs. - - ![](../docs/images/high-box.png) - -For final trial, let's create `box` with bigger `x` value. - - ```kotlin - box(65, 40, 40, name = "wide box") { - x = 0 - y = 0 - z = 0 - color("black") - } - ``` -Predictably, only `x-axis` rib bigger than other ribs. - - ![](../docs/images/wide-box.png) - -### 3) Sphere - -It takes in two values: `radius`, and `name`. -Actually, `name` is general value for all solids, so do not wonder, since all solids need their own identifier. - -As for `radius`, it has `Float` type, and, as you can guess, it sets radius of the sphere, which will be created. - ```kotlin - sphere(50, name = "sphere") { - x = 0 - y = 0 - z = 0 - opacity = 0.9 - color("blue") - } - ``` - ![](../docs/images/sphere.png) - -### 4) Hexagon - -It is solid which has six edges. It is set by eight values: `node1`,..., `node8`. They all have `Point3D` type, so they are just points, vertices. - -*Six edges are these:* -1) Edge with vertices `node1`, `node4`, `node3`, `node2` -2) Edge with vertices `node1`, `node2`, `node6`, `node5` -3) Edge with vertices `node2`, `node3`, `node7`, `node6` -4) Edge with vertices `node4`, `node8`, `node7`, `node3` -5) Edge with vertices `node1`, `node5`, `node8`, `node4` -6) Edge with vertices `node8`, `node5`, `node6`, `node7` - -![](../docs/images/scheme.png) - -As hexagon takes in specific points, we understand that this solid cannot be moved, it fixed in space, and it can't make pivots. - -Let's make classic parallelepiped. -```kotlin - hexagon( - Point3D(25, 30, 25), - Point3D(35, 30, 25), - Point3D(35, 30, 15), - Point3D(25, 30, 15), - Point3D(30, 18, 20), - Point3D(40, 18, 20), - Point3D(40, 18, 10), - Point3D(30, 18, 10), - name = "classic hexagon"){ - color("green") - } -``` - ![](../docs/images/classic-hexagon.png) - -Now, let's make a custom hexagon. - - ```kotlin - hexagon( - Point3D(5, 30, 5), - Point3D(24, 30, 8), - Point3D(20, 30, -10), - Point3D(5, 30, -7), - Point3D(8, 16, 0), - Point3D(12, 16, 0), - Point3D(10, 16, -5), - Point3D(6.5, 12, -3), - name = "custom_hexagon"){ - color("brown") - } - ``` - ![](../docs/images/custom-hexagon.png) -### 3) Cone -It takes in six values: `bottomRadius`, `height`, `upperRadius`, `startAngle`, `angle`, and `name`. - -Obviously, `bottomRadius` is responsible for radius of a bottom base, and `height` sets height of a cone along the `z-axis`. - -As it takes such values as `upperRadius`, `startAngle`, `angle`, `cone` can build not only usual cones, but also cone segments. Initially, `upperRadius` will have `0.0` value, `startAngle` - `0f`, `angle` - `PI2`, so if you don't set them, you'll get just a simple cone. - -Setting `upperRadius`, you make a frustum cone, since it sets a radius of the upper base of a cone. Set `startAngle`, and `angle` let to cut off segments by planes perpendicular to the base. `startAngle` - an angle, starting with which segment will be left, `angle` - an angle of cone, which will be set from `startAngle`. - -Let's build a classic cone: -```kotlin - cone(60, 80, name = "cone") { - color("beige") - } - ``` - ![](../docs/images/cone-1.png) - ![](../docs/images/cone-2.png) - -First of all, we have to try to build a frustum cone: -```kotlin -cone(60, 80, name = "cone") { - color(0u, 40u, 0u) -} -``` -![](../docs/images/frustum-cone.png) - -Now, we need to make a try to build a cone segment: - -```kotlin -cone(60, 80, angle = PI, name = "cone") { - color(0u, 0u, 200u) -} -``` -![](../docs/images/cone-segment-1.png) -![](../docs/images/cone-segment-2.png) - -Finally, the segment of frustum cone is left for a try: -```kotlin -cone(60, 100, 20, PI*3/4, angle = PI/3, name = "cone") { - color(190u, 0u, 0u) -} -``` -![](../docs/images/frustum-cone-segment.png) - -### 4) Cone Surface -This solid is set by seven values:`bottomOuterRadius`, `bottomInnerRadius`, `height`, `topOuterRadius`, `topInnerRadius`, `startAngle`, and `angle`. - -In addition to `height`, `startAngle`, and `angle`, which work as they work in `cone`, there are some new values. -`bottomOuterRadius`, and `bottomInnerRadius` set properties of the bottom circle, `topOuterRadius`, `topInnerRadius` - of the upper circle. They have no initial value, so that means they have to be set. - -Generally, `cone`, and `coneSurface` buildings work in the same way, it's possible to make `coneSurface`'s fragments as in `cone` - -Let's build usual cone surface with almost all properties set: -```kotlin - coneSurface(60, 50, 30, 10, 100, name = "cone surface") { - color("red") - rotation = Point3D(2, 50, -9) - } - ``` -![](../docs/images/cone-surface-1.png) -![](../docs/images/cone-surface-2.png) - -Now, let's create a cone surface and set all it's properties: - -```kotlin -coneSurface(30, 25, 10, 10, 8,0f, pi*3/4, name = "cone surface") { - color("fuchsia") - rotation = Point3D(2, 50, -9) -} -``` -![](../docs/images/cone-surface-fragment.png) -![](../docs/images/cone-surface-fragment-2.png) - -### 5) Cylinder - -This solid is set by `radius`, and `height`. As you can see by accepting values, there's no option of building fragments of cylinders. - -Here's a demonstration of a cylinder: - -```kotlin -cylinder(40, 100, "cylinder"){ - rotation = Point3D(40, 0, 0) - color("indigo") -} -``` -![](../docs/images/cylinder-1.png) -![](../docs/images/cylinder-2.png) -### 6) Tube - -`tube` takes in `radius`, `height`, `innerRadius`, `startAngle`, `angle`, and `name`. *All values are familiar from `cone`, and `coneSurface` solids.* - -Here is an example of classic tube: -```kotlin -tube(50, 40, 20, name = "usual tube"){ - opacity = 0.4 -} -``` -![](../docs/images/tube.png) - -This is an example of tube fragment: - -```kotlin -tube(50, 40, 20, 0f, PI, name = "fragmented tube"){ - color("white") -} -``` -![](../docs/images/tube-fragment.png) -### 7) Extruded - From 145673752e145dc3dac5c0db859e0a675d441fbf Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Wed, 4 Aug 2021 22:09:15 +0300 Subject: [PATCH 005/109] Updated tutorial, some details left --- docs/tutorial.md | 373 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 373 insertions(+) create mode 100644 docs/tutorial.md diff --git a/docs/tutorial.md b/docs/tutorial.md new file mode 100644 index 00000000..d70d306d --- /dev/null +++ b/docs/tutorial.md @@ -0,0 +1,373 @@ +# Tutorial + +#### The main goal of this tutorial is to show main capabilities of the visualization instrument. + +The simple visualization can be made with function `main`. (this part will be supplemented) +```kotlin +import kotlinx.html.div +import space.kscience.dataforge.context.Context +import space.kscience.visionforge.html.ResourceLocation +import space.kscience.visionforge.solid.* +import java.nio.file.Paths + +fun main(){ + val context = Context{ + plugin(Solids) + } + + context.makeVisionFile ( + Paths.get("nameFile.html"), + resourceLocation = ResourceLocation.EMBED + ){ + div { + //first vision + vision { + solid { + //solids which you want to visualize + } + } + //second vision + vision { + solid { + //solids which you want to visualize + } + } + } + } +} +``` +## Solids properties +**We will analyze which basic properties solids have using `box` solid.** + +*Basic properties:* +1. `opacity` - It is set in `float`. It takes on values from 0 to 1, which represent percents of solid opacity. It's initial value is 1. +2. `color` - It can be specified as `Int`, `String`, or as three `Ubytes`, which represent color in `rgb`. Elementally, the solid will have `green` color. +3. `rotation` - it's the point, which set rotations along axes. Initially, the value is `Point3D(0, 0, 0)`. Changing `x` coordinate of the point, you make pivot around `x axis`. The same for other coordinates: changing `y` - pivot around `y axis`, changing `z` - pivot around `z axis`. +4. position, which is given by values `x`, `y`, `z`. Initial values are `x = 0`, `y = 0`, `z = 0`. The coordinate system is Cartesian. It's elemental position is this - vertical `y` axis and horizontal `Oxz` plane. + +Let's see how properties are set in solids. +The `small box` will have elemental values of properties. If you don't set properties, it will have the same `position`, `color`, `rotation`, and `opacity` values. + +***You can see that `box` take four values. Later, we will discuss what they do in more detail. Now, it does not really matter.*** +```kotlin +box(10, 10, 10, name = "small box"){ + x = 0 + y = 0 + z = 0 + opacity = 1 //100% opacity + color("red") //as string + rotation = Point3D(0, 0, 0) +} +``` +![](../docs/images/small-box.png) + +The `big box` will have properties with custom values. +```kotlin +box(40, 40, 40, name = "big box"){ + x = 20 + y = 10 + z = 60 + opacity = 0.5 //50% opacity + color(0u, 179u, 179u) //color in rgb + rotation = Point3D(60, 80, 0) +} +``` +![](../docs/images/big-rotated-box.png) +If we compare these boxes, we will see all differences. + +Here is the function `main` with both boxes. +```kotlin +fun main(){ + val context = Context{ + plugin(Solids) + } + + context.makeVisionFile ( + Paths.get("customFile.html"), + resourceLocation = ResourceLocation.EMBED + ){ + div { + vision { + solid { + box(10, 10, 10, name = "small box"){ + x = 0 + y = 0 + z = 0 + opacity = 1 //100% opacity + color("red") //as string + rotation = Point3D(0, 0, 0) + } + box(40, 40, 40, name = "big box"){ + x = 20 + y = 10 + z = 60 + opacity = 0.5 //50% opacity + color(0u, 179u, 179u) //rgb + rotation = Point3D(60, 80, 0) + } + } + } + } + } +} +``` +![](../docs/images/two-boxes-1.png) +![](../docs/images/two-boxes-2.png) + +***There is plenty of other properties, especially of those, which you can create by yourself. Here we mention just small part.*** + +## Basic Solids +Now, let's see which solids can be visualized: +### 1) PolyLine + +It's scarcely a solid, but it can be visualized, so we mention it. +`polyline` build lines, obviously. Let's take a look at it's work. + +`polyline` requires two values - `points`, and `name`: +* `points` is a `vararg` with `Point3D` type. It takes pairs of points, which you want to connect. +* `name` is an identifier of *any solid*, but in this case it is an identifier of `polyline`. +It's type is `String`. **This value can be required by any solid; +you can set it, you can not to set it, but without you won't be able to control solid, since it won't be inherited.** + +This is an example of polyline with other solid `box`: +```kotlin +box(100, 100, 100, name = "box"){ + x = -10 + y = -10 + z = -10 + opacity = 0.4 +} +polyline(Point3D(30, 20, 10), Point3D(30, -100, 30), Point3D(30, -100, 30), Point3D(50, -100, 30), name = "polyline"){ + color("red") +} +``` + +![](../docs/images/polyline-points.png) +![](../docs/images/polyline-points-2.png) + +### 2) Box + +First thing which has to be mentioned is that `box` takes four values: `box(x, y, z, name)` +* `x` - x-axis length of the `box` +* `y` - y-axis length of the `box` +* `z` - z-axis length of the `box` + +These values have `Float` type. + +*`x`, `y`, and `z` are necessary values, which cannot be ignored. You have to set them.* + +* `name` - `box`'es identifier. You've already met it. + +Let's create just usual `box` with equal ribs. + +```kotlin + box(50, 50, 50, name = "box") { + color("pink") + } +``` + ![](../docs/images/box.png) + +Now, let's make `box` with bigger `y` value. + ```kotlin + box(10, 25, 10, name = "high box") { + color("black") + } + ``` +As you can see, only rib of `y-axis` differs from other ribs. + + ![](../docs/images/high-box.png) + +For final trial, let's create `box` with bigger `x` value. + + ```kotlin + box(65, 40, 40, name = "wide box") { + x = 0 + y = 0 + z = 0 + color("black") + } + ``` +Predictably, only `x-axis` rib bigger than other ribs. + + ![](../docs/images/wide-box.png) + +### 3) Sphere + +It takes in two values: `radius`, and `name`. +We bring you to mind that `name` is a general value for all solids, so do not wonder, since all solids need their own identifier. + +As for `radius`, it has `Float` type, and, as you can guess, it sets radius of the sphere, which will be created. + ```kotlin + sphere(50, name = "sphere") { + x = 0 + y = 0 + z = 0 + opacity = 0.9 + color("blue") + } + ``` + ![](../docs/images/sphere.png) + +### 4) Hexagon + +It is solid which has six edges. It is set by eight values: `node1`,..., `node8`. They all have `Point3D` type, so they are just points, vertices. + +*Six edges are these:* +1) Edge with vertices `node1`, `node4`, `node3`, `node2` +2) Edge with vertices `node1`, `node2`, `node6`, `node5` +3) Edge with vertices `node2`, `node3`, `node7`, `node6` +4) Edge with vertices `node4`, `node8`, `node7`, `node3` +5) Edge with vertices `node1`, `node5`, `node8`, `node4` +6) Edge with vertices `node8`, `node5`, `node6`, `node7` + +![](../docs/images/scheme.png) + +As hexagon takes in specific points, we understand that this solid cannot be moved, it fixed in space, and it can't make pivots. + +Let's make classic parallelepiped. +```kotlin + hexagon( + Point3D(25, 30, 25), + Point3D(35, 30, 25), + Point3D(35, 30, 15), + Point3D(25, 30, 15), + Point3D(30, 18, 20), + Point3D(40, 18, 20), + Point3D(40, 18, 10), + Point3D(30, 18, 10), + name = "classic hexagon"){ + color("green") + } +``` + ![](../docs/images/classic-hexagon.png) + +Now, let's make a custom hexagon. + + ```kotlin + hexagon( + Point3D(5, 30, 5), + Point3D(24, 30, 8), + Point3D(20, 30, -10), + Point3D(5, 30, -7), + Point3D(8, 16, 0), + Point3D(12, 16, 0), + Point3D(10, 16, -5), + Point3D(6.5, 12, -3), + name = "custom_hexagon"){ + color("brown") + } + ``` + ![](../docs/images/custom-hexagon.png) +### 3) Cone +It takes in six values: `bottomRadius`, `height`, `upperRadius`, `startAngle`, `angle`, and `name`. + +Obviously, `bottomRadius` is responsible for radius of a bottom base, and `height` sets height of a cone along the `z-axis`. + +As it takes such values as `upperRadius`, `startAngle`, `angle`, `cone` can build not only usual cones, but also cone segments. Initially, `upperRadius` will have `0.0` value, `startAngle` - `0f`, `angle` - `PI2`, so if you don't set them, you'll get just a simple cone. + +Setting `upperRadius`, you make a frustum cone, since it sets a radius of the upper base of a cone. Set `startAngle`, and `angle` let to cut off segments by planes perpendicular to the base. `startAngle` - an angle, starting with which segment will be left, `angle` - an angle of cone, which will be set from `startAngle`. + +Let's build a classic cone: +```kotlin + cone(60, 80, name = "cone") { + color("beige") + } + ``` + ![](../docs/images/cone-1.png) + ![](../docs/images/cone-2.png) + +First of all, we have to try to build a frustum cone: +```kotlin +cone(60, 80, name = "cone") { + color(0u, 40u, 0u) +} +``` +![](../docs/images/frustum-cone.png) + +Now, we need to make a try to build a cone segment: + +```kotlin +cone(60, 80, angle = PI, name = "cone") { + color(0u, 0u, 200u) +} +``` +![](../docs/images/cone-segment-1.png) +![](../docs/images/cone-segment-2.png) + +Finally, the segment of frustum cone is left for a try: +```kotlin +cone(60, 100, 20, PI*3/4, angle = PI/3, name = "cone") { + color(190u, 0u, 0u) +} +``` +![](../docs/images/frustum-cone-segment.png) + +### 4) Cone Surface +This solid is set by seven values:`bottomOuterRadius`, `bottomInnerRadius`, `height`, `topOuterRadius`, `topInnerRadius`, `startAngle`, and `angle`. + +In addition to `height`, `startAngle`, and `angle`, which work as they work in `cone`, there are some new values. +`bottomOuterRadius`, and `bottomInnerRadius` set properties of the bottom circle, `topOuterRadius`, `topInnerRadius` - of the upper circle. They have no initial value, so that means they have to be set. + +Generally, `cone`, and `coneSurface` buildings work in the same way, it's possible to make `coneSurface`'s fragments as in `cone` + +Let's build usual cone surface with almost all properties set: +```kotlin + coneSurface(60, 50, 30, 10, 100, name = "cone surface") { + color("red") + rotation = Point3D(2, 50, -9) + } + ``` +![](../docs/images/cone-surface-1.png) +![](../docs/images/cone-surface-2.png) + +Now, let's create a cone surface and set all it's properties: + +```kotlin +coneSurface(30, 25, 10, 10, 8,0f, pi*3/4, name = "cone surface") { + color("fuchsia") + rotation = Point3D(2, 50, -9) +} +``` +![](../docs/images/cone-surface-fragment.png) +![](../docs/images/cone-surface-fragment-2.png) + +### 5) Cylinder + +This solid is set by `radius`, and `height`. As you can see by accepting values, there's no option of building fragments of cylinders. + +Here's a demonstration of a cylinder: + +```kotlin +cylinder(40, 100, "cylinder"){ + rotation = Point3D(40, 0, 0) + color("indigo") +} +``` +![](../docs/images/cylinder-1.png) +![](../docs/images/cylinder-2.png) +### 6) Tube + +`tube` takes in `radius`, `height`, `innerRadius`, `startAngle`, `angle`, and `name`. *All values are familiar from `cone`, and `coneSurface` solids.* + +Here is an example of classic tube: +```kotlin +tube(50, 40, 20, name = "usual tube"){ + opacity = 0.4 +} +``` +![](../docs/images/tube.png) + +This is an example of tube fragment: + +```kotlin +tube(50, 40, 20, 0f, PI, name = "fragmented tube"){ + color("white") +} +``` +![](../docs/images/tube-fragment.png) +### 7) Extruded + +`extruded` is set by two values: `shape`, and `layer`. +* `shape` is a value of `List` type. It' s just a list of all points of the solid. *`shape` has to consist of not less than two points!* +* `layer` is `MutableList` types variable. (here is a sentence with description of the work of this function). *The amount of `layer`-s has to be more than one* + From 639a192d59ce1b8bbdb263a380d8515e0aa76793 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Wed, 4 Aug 2021 22:11:09 +0300 Subject: [PATCH 006/109] Small renamings --- .../kscience/visionforge/solid/Extruded.kt | 45 +++++++++++-------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt index d5943e3a..480da818 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt @@ -2,9 +2,8 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import space.kscience.visionforge.VisionBuilder -import space.kscience.visionforge.VisionContainerBuilder -import space.kscience.visionforge.set +import space.kscience.dataforge.meta.Config +import space.kscience.visionforge.* import kotlin.math.PI import kotlin.math.cos import kotlin.math.sin @@ -13,7 +12,7 @@ import kotlin.math.sin public typealias Shape2D = List @Serializable -public class Shape2DBuilder(private val points: MutableList = ArrayList()) { +public class Shape2DBuilder(private val points: ArrayList = ArrayList()) { public fun point(x: Number, y: Number) { points.add(Point2D(x, y)) @@ -38,19 +37,9 @@ public data class Layer(var x: Float, var y: Float, var z: Float, var scale: Flo @Serializable @SerialName("solid.extrude") public class Extruded( - public var shape: List = ArrayList(), - public var layers: MutableList = ArrayList() -) : SolidBase(), GeometrySolid { - - public fun shape(block: Shape2DBuilder.() -> Unit) { - this.shape = Shape2DBuilder().apply(block).build() - //TODO send invalidation signal - } - - public fun layer(z: Number, x: Number = 0.0, y: Number = 0.0, scale: Number = 1.0) { - layers.add(Layer(x.toFloat(), y.toFloat(), z.toFloat(), scale.toFloat())) - //TODO send invalidation signal - } + public val shape: List, + public val layers: List +) : SolidBase(), GeometrySolid, VisionPropertyContainer { override fun toGeometry(geometryBuilder: GeometryBuilder) { val shape: Shape2D = shape @@ -103,6 +92,24 @@ public class Extruded( } } +public class ExtrudeBuilder( + public var shape: List = emptyList(), + public var layers: MutableList = ArrayList(), + config: Config = Config() +) : SimpleVisionPropertyContainer(config) { + public fun shape(block: Shape2DBuilder.() -> Unit) { + this.shape = Shape2DBuilder().apply(block).build() + } + + public fun layer(z: Number, x: Number = 0.0, y: Number = 0.0, scale: Number = 1.0) { + layers.add(Layer(x.toFloat(), y.toFloat(), z.toFloat(), scale.toFloat())) + } + + internal fun build(): Extruded = Extruded(shape, layers).apply { configure(config) } +} + @VisionBuilder -public fun VisionContainerBuilder.extrude(name: String? = null, action: Extruded.() -> Unit = {}): Extruded = - Extruded().apply(action).also { set(name, it) } \ No newline at end of file +public fun VisionContainerBuilder.extruded( + name: String? = null, + action: ExtrudeBuilder.() -> Unit = {} +): Extruded = ExtrudeBuilder().apply(action).build().also { set(name, it) } From 89cff65a90dcc6fe09f366da814012378a3dbf5c Mon Sep 17 00:00:00 2001 From: kiruma524 Date: Thu, 5 Aug 2021 16:46:02 +0300 Subject: [PATCH 007/109] Renamings in Gdml --- .../kotlin/space/kscience/visionforge/gdml/GdmlTransformer.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlTransformer.kt b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlTransformer.kt index 98b4509e..0bba2f1a 100644 --- a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlTransformer.kt +++ b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlTransformer.kt @@ -248,7 +248,7 @@ private class GdmlTransformerEnv(val settings: GdmlTransformer) { name = name ) } - is GdmlXtru -> extrude(name) { + is GdmlXtru -> extruded(name) { shape { solid.vertices.forEach { point(it.x * lScale, it.y * lScale) @@ -284,7 +284,7 @@ private class GdmlTransformerEnv(val settings: GdmlTransformer) { name = name, ) is GdmlOrb -> sphere(solid.r * lScale, name = name) - is GdmlPolyhedra -> extrude(name) { + is GdmlPolyhedra -> extruded(name) { //getting the radius of first require(solid.planes.size > 1) { "The polyhedron geometry requires at least two planes" } val baseRadius = solid.planes.first().rmax * lScale From eea617f418ff88584e1190e7408ab02247c31379 Mon Sep 17 00:00:00 2001 From: Iaroslav Postovalov Date: Thu, 5 Aug 2021 16:40:41 +0700 Subject: [PATCH 008/109] Use standard GA configuration --- .github/workflows/build.yml | 33 +++++++++++++++++++++++ .github/workflows/gradle.yml | 19 ------------- .github/workflows/pages.yml | 28 +++++++++++++++++++ gradle/wrapper/gradle-wrapper.jar | Bin 59203 -> 59536 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 2 +- 6 files changed, 63 insertions(+), 21 deletions(-) create mode 100644 .github/workflows/build.yml delete mode 100644 .github/workflows/gradle.yml create mode 100644 .github/workflows/pages.yml mode change 100644 => 100755 gradlew diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..412460ae --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,33 @@ +name: Gradle build + +on: + push: + branches: [ dev, master ] + pull_request: + +jobs: + build: + runs-on: ubuntu-latest + timeout-minutes: 40 + steps: + - uses: actions/checkout@v2 + - uses: DeLaGuardo/setup-graalvm@4.0 + with: + graalvm: 21.2.0 + java: java11 + arch: amd64 + - uses: actions/cache@v2 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ${{ runner.os }}-gradle-${{ hashFiles('*.gradle.kts') }} + restore-keys: | + ${{ runner.os }}-gradle- + - uses: actions/cache@v2 + with: + path: ~/.konan + key: ${{ runner.os }}-gradle-${{ hashFiles('*.gradle.kts') }} + restore-keys: | + ${{ runner.os }}-gradle- + - run: ./gradlew build --build-cache --no-daemon --stacktrace diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml deleted file mode 100644 index 15ef5105..00000000 --- a/.github/workflows/gradle.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: Gradle build - -on: [push] - -jobs: - build: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v1 - - name: Set up JDK 11 - uses: actions/setup-java@v1 - with: - java-version: 11 - - name: Make gradlew executable - run: chmod +x ./gradlew - - name: Build with Gradle - run: ./gradlew build diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml new file mode 100644 index 00000000..134d3d48 --- /dev/null +++ b/.github/workflows/pages.yml @@ -0,0 +1,28 @@ +name: Dokka publication + +on: + push: + branches: [ master ] + +jobs: + build: + runs-on: ubuntu-latest + timeout-minutes: 40 + steps: + - uses: actions/checkout@v2 + - uses: DeLaGuardo/setup-graalvm@4.0 + with: + graalvm: 21.2.0 + java: java11 + arch: amd64 + - uses: actions/cache@v2 + with: + path: ~/.gradle/caches + key: ${{ runner.os }}-gradle-${{ hashFiles('*.gradle.kts') }} + restore-keys: | + ${{ runner.os }}-gradle- + - run: ./gradlew dokkaHtmlMultiModule --build-cache --no-daemon --no-parallel --stacktrace + - uses: JamesIves/github-pages-deploy-action@4.1.0 + with: + branch: gh-pages + folder: build/dokka/htmlMultiModule diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index e708b1c023ec8b20f512888fe07c5bd3ff77bb8f..7454180f2ae8848c63b8b4dea2cb829da983f2fa 100644 GIT binary patch delta 18435 zcmY&<19zBR)MXm8v2EM7ZQHi-#I|kQZfv7Tn#Q)%81v4zX3d)U4d4 zYYc!v@NU%|U;_sM`2z(4BAilWijmR>4U^KdN)D8%@2KLcqkTDW%^3U(Wg>{qkAF z&RcYr;D1I5aD(N-PnqoEeBN~JyXiT(+@b`4Pv`;KmkBXYN48@0;iXuq6!ytn`vGp$ z6X4DQHMx^WlOek^bde&~cvEO@K$oJ}i`T`N;M|lX0mhmEH zuRpo!rS~#&rg}ajBdma$$}+vEhz?JAFUW|iZEcL%amAg_pzqul-B7Itq6Y_BGmOCC zX*Bw3rFz3R)DXpCVBkI!SoOHtYstv*e-May|+?b80ZRh$MZ$FerlC`)ZKt} zTd0Arf9N2dimjs>mg5&@sfTPsRXKXI;0L~&t+GH zkB<>wxI9D+k5VHHcB7Rku{Z>i3$&hgd9Mt_hS_GaGg0#2EHzyV=j=u5xSyV~F0*qs zW{k9}lFZ?H%@4hII_!bzao!S(J^^ZZVmG_;^qXkpJb7OyR*sPL>))Jx{K4xtO2xTr@St!@CJ=y3q2wY5F`77Tqwz8!&Q{f7Dp zifvzVV1!Dj*dxG%BsQyRP6${X+Tc$+XOG zzvq5xcC#&-iXlp$)L=9t{oD~bT~v^ZxQG;FRz|HcZj|^L#_(VNG)k{=_6|6Bs-tRNCn-XuaZ^*^hpZ@qwi`m|BxcF6IWc?_bhtK_cDZRTw#*bZ2`1@1HcB`mLUmo_>@2R&nj7&CiH zF&laHkG~7#U>c}rn#H)q^|sk+lc!?6wg0xy`VPn!{4P=u@cs%-V{VisOxVqAR{XX+ zw}R;{Ux@6A_QPka=48|tph^^ZFjSHS1BV3xfrbY84^=?&gX=bmz(7C({=*oy|BEp+ zYgj;<`j)GzINJA>{HeSHC)bvp6ucoE`c+6#2KzY9)TClmtEB1^^Mk)(mXWYvup02e%Ghm9qyjz#fO3bNGBX} zFiB>dvc1+If!>I10;qZk`?6pEd*(?bI&G*3YLt;MWw&!?=Mf7%^Op?qnyXWur- zwX|S^P>jF?{m9c&mmK-epCRg#WB+-VDe!2d2~YVoi%7_q(dyC{(}zB${!ElKB2D}P z7QNFM!*O^?FrPMGZ}wQ0TrQAVqZy!weLhu_Zq&`rlD39r*9&2sJHE(JT0EY5<}~x@ z1>P0!L2IFDqAB!($H9s2fI`&J_c+5QT|b#%99HA3@zUWOuYh(~7q7!Pf_U3u!ij5R zjFzeZta^~RvAmd_TY+RU@e}wQaB_PNZI26zmtzT4iGJg9U(Wrgrl>J%Z3MKHOWV(? zj>~Ph$<~8Q_sI+)$DOP^9FE6WhO09EZJ?1W|KidtEjzBX3RCLUwmj9qH1CM=^}MaK z59kGxRRfH(n|0*lkE?`Rpn6d^u5J6wPfi0WF(rucTv(I;`aW)3;nY=J=igkjsn?ED ztH&ji>}TW8)o!Jg@9Z}=i2-;o4#xUksQHu}XT~yRny|kg-$Pqeq!^78xAz2mYP9+4 z9gwAoti2ICvUWxE&RZ~}E)#M8*zy1iwz zHqN%q;u+f6Ti|SzILm0s-)=4)>eb5o-0K zbMW8ecB4p^6OuIX@u`f{>Yn~m9PINEl#+t*jqalwxIx=TeGB9(b6jA}9VOHnE$9sC zH`;epyH!k-3kNk2XWXW!K`L_G!%xOqk0ljPCMjK&VweAxEaZ==cT#;!7)X&C|X{dY^IY(e4D#!tx^vV3NZqK~--JW~wtXJ8X19adXim?PdN(|@o(OdgH3AiHts~?#QkolO?*=U_buYC&tQ3sc(O5HGHN~=6wB@dgIAVT$ z_OJWJ^&*40Pw&%y^t8-Wn4@l9gOl`uU z{Uda_uk9!Iix?KBu9CYwW9Rs=yt_lE11A+k$+)pkY5pXpocxIEJe|pTxwFgB%Kpr&tH;PzgOQ&m|(#Otm?@H^r`v)9yiR8v&Uy>d#TNdRfyN4Jk;`g zp+jr5@L2A7TS4=G-#O<`A9o;{En5!I8lVUG?!PMsv~{E_yP%QqqTxxG%8%KxZ{uwS zOT+EA5`*moN8wwV`Z=wp<3?~f#frmID^K?t7YL`G^(X43gWbo!6(q*u%HxWh$$^2EOq`Hj zp=-fS#Av+s9r-M)wGIggQ)b<@-BR`R8l1G@2+KODmn<_$Tzb7k35?e8;!V0G>`(!~ zY~qZz!6*&|TupOcnvsQYPbcMiJ!J{RyfezB^;fceBk znpA1XS)~KcC%0^_;ihibczSxwBuy;^ksH7lwfq7*GU;TLt*WmUEVQxt{ zKSfJf;lk$0XO8~48Xn2dnh8tMC9WHu`%DZj&a`2!tNB`5%;Md zBs|#T0Ktf?vkWQ)Y+q!At1qgL`C|nbzvgc(+28Q|4N6Geq)Il%+I5c@t02{9^=QJ?=h2BTe`~BEu=_u3xX2&?^zwcQWL+)7dI>JK0g8_`W1n~ zMaEP97X>Ok#=G*nkPmY`VoP8_{~+Rp7DtdSyWxI~?TZHxJ&=6KffcO2Qx1?j7=LZA z?GQt`oD9QpXw+s7`t+eeLO$cpQpl9(6h3_l9a6OUpbwBasCeCw^UB6we!&h9Ik@1zvJ`j4i=tvG9X8o34+N|y(ay~ho$f=l z514~mP>Z>#6+UxM<6@4z*|hFJ?KnkQBs_9{H(-v!_#Vm6Z4(xV5WgWMd3mB9A(>@XE292#k(HdI7P zJkQ2)`bQXTKlr}{VrhSF5rK9TsjtGs0Rs&nUMcH@$ZX_`Hh$Uje*)(Wd&oLW($hZQ z_tPt`{O@f8hZ<}?aQc6~|9iHt>=!%We3=F9yIfiqhXqp=QUVa!@UY@IF5^dr5H8$R zIh{=%S{$BHG+>~a=vQ={!B9B=<-ID=nyjfA0V8->gN{jRL>Qc4Rc<86;~aY+R!~Vs zV7MI~gVzGIY`B*Tt@rZk#Lg}H8sL39OE31wr_Bm%mn}8n773R&N)8B;l+-eOD@N$l zh&~Wz`m1qavVdxwtZLACS(U{rAa0;}KzPq9r76xL?c{&GaG5hX_NK!?)iq`t7q*F# zFoKI{h{*8lb>&sOeHXoAiqm*vV6?C~5U%tXR8^XQ9Y|(XQvcz*>a?%HQ(Vy<2UhNf zVmGeOO#v159KV@1g`m%gJ)XGPLa`a|?9HSzSSX{j;)xg>G(Ncc7+C>AyAWYa(k}5B3mtzg4tsA=C^Wfezb1&LlyrBE1~kNfeiubLls{C)!<%#m@f}v^o+7<VZ6!FZ;JeiAG@5vw7Li{flC8q1%jD_WP2ApBI{fQ}kN zhvhmdZ0bb5(qK@VS5-)G+@GK(tuF6eJuuV5>)Odgmt?i_`tB69DWpC~e8gqh!>jr_ zL1~L0xw@CbMSTmQflpRyjif*Y*O-IVQ_OFhUw-zhPrXXW>6X}+73IoMsu2?uuK3lT>;W#38#qG5tDl66A7Y{mYh=jK8Se!+f=N7%nv zYSHr6a~Nxd`jqov9VgII{%EpC_jFCEc>>SND0;}*Ja8Kv;G)MK7?T~h((c&FEBcQq zvUU1hW2^TX(dDCeU@~a1LF-(+#lz3997A@pipD53&Dr@III2tlw>=!iGabjXzbyUJ z4Hi~M1KCT-5!NR#I%!2Q*A>mqI{dpmUa_mW)%SDs{Iw1LG}0y=wbj@0ba-`q=0!`5 zr(9q1p{#;Rv2CY!L#uTbs(UHVR5+hB@m*zEf4jNu3(Kj$WwW|v?YL*F_0x)GtQC~! zzrnZRmBmwt+i@uXnk05>uR5&1Ddsx1*WwMrIbPD3yU*2By`71pk@gt{|H0D<#B7&8 z2dVmXp*;B)SWY)U1VSNs4ds!yBAj;P=xtatUx^7_gC5tHsF#vvdV;NmKwmNa1GNWZ zi_Jn-B4GnJ%xcYWD5h$*z^haku#_Irh818x^KB)3-;ufjf)D0TE#6>|zFf@~pU;Rs zNw+}c9S+6aPzxkEA6R%s*xhJ37wmgc)-{Zd1&mD5QT}4BQvczWr-Xim>(P^)52`@R z9+Z}44203T5}`AM_G^Snp<_KKc!OrA(5h7{MT^$ZeDsSr(R@^kI?O;}QF)OU zQ9-`t^ys=6DzgLcWt0U{Q(FBs22=r zKD%fLQ^5ZF24c-Z)J{xv?x$&4VhO^mswyb4QTIofCvzq+27*WlYm;h@;Bq%i;{hZA zM97mHI6pP}XFo|^pRTuWQzQs3B-8kY@ajLV!Fb?OYAO3jFv*W-_;AXd;G!CbpZt04iW`Ie^_+cQZGY_Zd@P<*J9EdRsc>c=edf$K|;voXRJ zk*aC@@=MKwR120(%I_HX`3pJ+8GMeO>%30t?~uXT0O-Tu-S{JA;zHoSyXs?Z;fy58 zi>sFtI7hoxNAdOt#3#AWFDW)4EPr4kDYq^`s%JkuO7^efX+u#-qZ56aoRM!tC^P6O zP(cFuBnQGjhX(^LJ(^rVe4-_Vk*3PkBCj!?SsULdmVr0cGJM^=?8b0^DuOFq>0*yA zk1g|C7n%pMS0A8@Aintd$fvRbH?SNdRaFrfoAJ=NoX)G5Gr}3-$^IGF+eI&t{I-GT zp=1fj)2|*ur1Td)+s&w%p#E6tDXX3YYOC{HGHLiCvv?!%%3DO$B$>A}aC;8D0Ef#b z{7NNqC8j+%1n95zq8|hFY`afAB4E)w_&7?oqG0IPJZv)lr{MT}>9p?}Y`=n+^CZ6E zKkjIXPub5!82(B-O2xQojW^P(#Q*;ETpEr^+Wa=qDJ9_k=Wm@fZB6?b(u?LUzX(}+ zE6OyapdG$HC& z&;oa*ALoyIxVvB2cm_N&h&{3ZTuU|aBrJlGOLtZc3KDx)<{ z27@)~GtQF@%6B@w3emrGe?Cv_{iC@a#YO8~OyGRIvp@%RRKC?fclXMP*6GzBFO z5U4QK?~>AR>?KF@I;|(rx(rKxdT9-k-anYS+#S#e1SzKPslK!Z&r8iomPsWG#>`Ld zJ<#+8GFHE!^wsXt(s=CGfVz5K+FHYP5T0E*?0A-z*lNBf)${Y`>Gwc@?j5{Q|6;Bl zkHG1%r$r&O!N^><8AEL+=y(P$7E6hd=>BZ4ZZ9ukJ2*~HR4KGvUR~MUOe$d>E5UK3 z*~O2LK4AnED}4t1Fs$JgvPa*O+WeCji_cn1@Tv7XQ6l@($F1K%{E$!naeX)`bfCG> z8iD<%_M6aeD?a-(Qqu61&fzQqC(E8ksa%CulMnPvR35d{<`VsmaHyzF+B zF6a@1$CT0xGVjofcct4SyxA40uQ`b#9kI)& z?B67-12X-$v#Im4CVUGZHXvPWwuspJ610ITG*A4xMoRVXJl5xbk;OL(;}=+$9?H`b z>u2~yd~gFZ*V}-Q0K6E@p}mtsri&%Zep?ZrPJmv`Qo1>94Lo||Yl)nqwHXEbe)!g( zo`w|LU@H14VvmBjjkl~=(?b{w^G$~q_G(HL`>|aQR%}A64mv0xGHa`S8!*Wb*eB}` zZh)&rkjLK!Rqar)UH)fM<&h&@v*YyOr!Xk2OOMV%$S2mCRdJxKO1RL7xP_Assw)bb z9$sQ30bapFfYTS`i1PihJZYA#0AWNmp>x(;C!?}kZG7Aq?zp!B+gGyJ^FrXQ0E<>2 zCjqZ(wDs-$#pVYP3NGA=en<@_uz!FjFvn1&w1_Igvqs_sL>ExMbcGx4X5f%`Wrri@ z{&vDs)V!rd=pS?G(ricfwPSg(w<8P_6=Qj`qBC7_XNE}1_5>+GBjpURPmvTNE7)~r)Y>ZZecMS7Ro2` z0}nC_GYo3O7j|Wux?6-LFZs%1IV0H`f`l9or-8y0=5VGzjPqO2cd$RRHJIY06Cnh- ztg@Pn1OeY=W`1Mv3`Ti6!@QIT{qcC*&vptnX4Pt1O|dWv8u2s|(CkV`)vBjAC_U5` zCw1f&c4o;LbBSp0=*q z3Y^horBAnR)u=3t?!}e}14%K>^562K!)Vy6r~v({5{t#iRh8WIL|U9H6H97qX09xp zjb0IJ^9Lqxop<-P*VA0By@In*5dq8Pr3bTPu|ArID*4tWM7w+mjit0PgmwLV4&2PW z3MnIzbdR`3tPqtUICEuAH^MR$K_u8~-U2=N1)R=l>zhygus44>6V^6nJFbW-`^)f} zI&h$FK)Mo*x?2`0npTD~jRd}5G~-h8=wL#Y-G+a^C?d>OzsVl7BFAaM==(H zR;ARWa^C3J)`p~_&FRsxt|@e+M&!84`eq)@aO9yBj8iifJv0xVW4F&N-(#E=k`AwJ z3EFXWcpsRlB%l_0Vdu`0G(11F7( zsl~*@XP{jS@?M#ec~%Pr~h z2`M*lIQaolzWN&;hkR2*<=!ORL(>YUMxOzj(60rQfr#wTrkLO!t{h~qg% zv$R}0IqVIg1v|YRu9w7RN&Uh7z$ijV=3U_M(sa`ZF=SIg$uY|=NdC-@%HtkUSEqJv zg|c}mKTCM=Z8YmsFQu7k{VrXtL^!Cts-eb@*v0B3M#3A7JE*)MeW1cfFqz~^S6OXFOIP&iL;Vpy z4dWKsw_1Wn%Y;eW1YOfeP_r1s4*p1C(iDG_hrr~-I%kA>ErxnMWRYu{IcG{sAW;*t z9T|i4bI*g)FXPpKM@~!@a7LDVVGqF}C@mePD$ai|I>73B+9!Ks7W$pw;$W1B%-rb; zJ*-q&ljb=&41dJ^*A0)7>Wa@khGZ;q1fL(2qW=|38j43mTl_;`PEEw07VKY%71l6p z@F|jp88XEnm1p~<5c*cVXvKlj0{THF=n3sU7g>Ki&(ErR;!KSmfH=?49R5(|c_*xw z4$jhCJ1gWT6-g5EV)Ahg?Nw=}`iCyQ6@0DqUb%AZEM^C#?B-@Hmw?LhJ^^VU>&phJ zlB!n5&>I>@sndh~v$2I2Ue23F?0!0}+9H~jg7E`?CS_ERu75^jSwm%!FTAegT`6s7 z^$|%sj2?8wtPQR>@D3sA0-M-g-vL@47YCnxdvd|1mPymvk!j5W1jHnVB&F-0R5e-vs`@u8a5GKdv`LF7uCfKncI4+??Z4iG@AxuX7 z6+@nP^TZ5HX#*z(!y+-KJ3+Ku0M90BTY{SC^{ z&y2#RZPjfX_PE<<>XwGp;g4&wcXsQ0T&XTi(^f+}4qSFH1%^GYi+!rJo~t#ChTeAX zmR0w(iODzQOL+b&{1OqTh*psAb;wT*drr^LKdN?c?HJ*gJl+%kEH&48&S{s28P=%p z7*?(xFW_RYxJxxILS!kdLIJYu@p#mnQ(?moGD1)AxQd66X6b*KN?o&e`u9#N4wu8% z^Gw#G!@|>c740RXziOR=tdbkqf(v~wS_N^CS^1hN-N4{Dww1lvSWcBTX*&9}Cz|s@ z*{O@jZ4RVHq19(HC9xSBZI0M)E;daza+Q*zayrX~N5H4xJ33BD4gn5Ka^Hj{995z4 zzm#Eo?ntC$q1a?)dD$qaC_M{NW!5R!vVZ(XQqS67xR3KP?rA1^+s3M$60WRTVHeTH z6BJO$_jVx0EGPXy}XK_&x597 zt(o6ArN8vZX0?~(lFGHRtHP{gO0y^$iU6Xt2e&v&ugLxfsl;GD)nf~3R^ACqSFLQ< zV7`cXgry((wDMJB55a6D4J;13$z6pupC{-F+wpToW%k1qKjUS^$Mo zN3@}T!ZdpiV7rkNvqP3KbpEn|9aB;@V;gMS1iSb@ zwyD7!5mfj)q+4jE1dq3H`sEKgrVqk|y8{_vmn8bMOi873!rmnu5S=1=-DFx+Oj)Hi zx?~ToiJqOrvSou?RVALltvMADodC7BOg7pOyc4m&6yd(qIuV5?dYUpYzpTe!BuWKi zpTg(JHBYzO&X1e{5o|ZVU-X5e?<}mh=|eMY{ldm>V3NsOGwyxO2h)l#)rH@BI*TN; z`yW26bMSp=k6C4Ja{xB}s`dNp zE+41IwEwo>7*PA|7v-F#jLN>h#a`Er9_86!fwPl{6yWR|fh?c%qc44uP~Ocm2V*(* zICMpS*&aJjxutxKC0Tm8+FBz;3;R^=ajXQUB*nTN*Lb;mruQHUE<&=I7pZ@F-O*VMkJbI#FOrBM8`QEL5Uy=q5e2 z_BwVH%c0^uIWO0*_qD;0jlPoA@sI7BPwOr-mrp7y`|EF)j;$GYdOtEPFRAKyUuUZS z(N4)*6R*ux8s@pMdC*TP?Hx`Zh{{Ser;clg&}CXriXZCr2A!wIoh;j=_eq3_%n7V} za?{KhXg2cXPpKHc90t6=`>s@QF-DNcTJRvLTS)E2FTb+og(wTV7?$kI?QZYgVBn)& zdpJf@tZ{j>B;<MVHiPl_U&KlqBT)$ic+M0uUQWK|N1 zCMl~@o|}!!7yyT%7p#G4?T^Azxt=D(KP{tyx^lD_(q&|zNFgO%!i%7T`>mUuU^FeR zHP&uClWgXm6iXgI8*DEA!O&X#X(zdrNctF{T#pyax16EZ5Lt5Z=RtAja!x+0Z31U8 zjfaky?W)wzd+66$L>o`n;DISQNs09g{GAv%8q2k>2n8q)O^M}=5r#^WR^=se#WSCt zQ`7E1w4qdChz4r@v6hgR?nsaE7pg2B6~+i5 zcTTbBQ2ghUbC-PV(@xvIR(a>Kh?{%YAsMV#4gt1nxBF?$FZ2~nFLKMS!aK=(`WllA zHS<_7ugqKw!#0aUtQwd#A$8|kPN3Af?Tkn)dHF?_?r#X68Wj;|$aw)Wj2Dkw{6)*^ zZfy!TWwh=%g~ECDCy1s8tTgWCi}F1BvTJ9p3H6IFq&zn#3FjZoecA_L_bxGWgeQup zAAs~1IPCnI@H>g|6Lp^Bk)mjrA3_qD4(D(65}l=2RzF-8@h>|Aq!2K-qxt(Q9w7c^ z;gtx`I+=gKOl;h=#fzSgw-V*YT~2_nnSz|!9hIxFb{~dKB!{H zSi??dnmr@%(1w^Be=*Jz5bZeofEKKN&@@uHUMFr-DHS!pb1I&;x9*${bmg6=2I4Zt zHb5LSvojY7ubCNGhp)=95jQ00sMAC{IZdAFsN!lAVQDeiec^HAu=8);2AKqNTT!&E zo+FAR`!A1#T6w@0A+o%&*yzkvxsrqbrfVTG+@z8l4+mRi@j<&)U9n6L>uZoezW>qS zA4YfO;_9dQSyEYpkWnsk0IY}Nr2m(ql@KuQjLgY-@g z4=$uai6^)A5+~^TvLdvhgfd+y?@+tRE^AJabamheJFnpA#O*5_B%s=t8<;?I;qJ}j z&g-9?hbwWEez-!GIhqpB>nFvyi{>Yv>dPU=)qXnr;3v-cd`l}BV?6!v{|cHDOx@IG z;TSiQQ(8=vlH^rCEaZ@Yw}?4#a_Qvx=}BJuxACxm(E7tP4hki^jU@8A zUS|4tTLd)gr@T|F$1eQXPY%fXb7u}(>&9gsd3It^B{W#6F2_g40cgo1^)@-xO&R5X z>qKon+Nvp!4v?-rGQu#M_J2v+3e+?N-WbgPQWf`ZL{Xd9KO^s{uIHTJ6~@d=mc7i z+##ya1p+ZHELmi%3C>g5V#yZt*jMv( zc{m*Y;7v*sjVZ-3mBuaT{$g+^sbs8Rp7BU%Ypi+c%JxtC4O}|9pkF-p-}F{Z7-+45 zDaJQx&CNR)8x~0Yf&M|-1rw%KW3ScjWmKH%J1fBxUp(;F%E+w!U470e_3%+U_q7~P zJm9VSWmZ->K`NfswW(|~fGdMQ!K2z%k-XS?Bh`zrjZDyBMu74Fb4q^A=j6+Vg@{Wc zPRd5Vy*-RS4p1OE-&8f^Fo}^yDj$rb+^>``iDy%t)^pHSV=En5B5~*|32#VkH6S%9 zxgIbsG+|{-$v7mhOww#v-ejaS>u(9KV9_*X!AY#N*LXIxor9hDv%aie@+??X6@Et=xz>6ev9U>6Pn$g4^!}w2Z%Kpqpp+M%mk~?GE-jL&0xLC zy(`*|&gm#mLeoRU8IU?Ujsv=;ab*URmsCl+r?%xcS1BVF*rP}XRR%MO_C!a9J^fOe>U;Y&3aj3 zX`3?i12*^W_|D@VEYR;h&b^s#Kd;JMNbZ#*x8*ZXm(jgw3!jyeHo14Zq!@_Q`V;Dv zKik~!-&%xx`F|l^z2A92aCt4x*I|_oMH9oeqsQgQDgI0j2p!W@BOtCTK8Jp#txi}7 z9kz);EX-2~XmxF5kyAa@n_$YYP^Hd4UPQ>O0-U^-pw1*n{*kdX`Jhz6{!W=V8a$0S z9mYboj#o)!d$gs6vf8I$OVOdZu7L5%)Vo0NhN`SwrQFhP3y4iXe2uV@(G{N{yjNG( zKvcN{k@pXkxyB~9ucR(uPSZ7{~sC=lQtz&V(^A^HppuN!@B4 zS>B=kb14>M-sR>{`teApuHlca6YXs6&sRvRV;9G!XI08CHS~M$=%T~g5Xt~$exVk` zWP^*0h{W%`>K{BktGr@+?ZP}2t0&smjKEVw@3=!rSjw5$gzlx`{dEajg$A58m|Okx zG8@BTPODSk@iqLbS*6>FdVqk}KKHuAHb0UJNnPm!(XO{zg--&@#!niF4T!dGVdNif z3_&r^3+rfQuV^8}2U?bkI5Ng*;&G>(O4&M<86GNxZK{IgKNbRfpg>+32I>(h`T&uv zUN{PRP&onFj$tn1+Yh|0AF330en{b~R+#i9^QIbl9fBv>pN|k&IL2W~j7xbkPyTL^ z*TFONZUS2f33w3)fdzr?)Yg;(s|||=aWZV(nkDaACGSxNCF>XLJSZ=W@?$*` z#sUftY&KqTV+l@2AP5$P-k^N`Bme-xcWPS|5O~arUq~%(z8z87JFB|llS&h>a>Som zC34(_uDViE!H2jI3<@d+F)LYhY)hoW6)i=9u~lM*WH?hI(yA$X#ip}yYld3RAv#1+sBt<)V_9c4(SN9Fn#$}_F}A-}P>N+8io}I3mh!}> z*~*N}ZF4Zergb;`R_g49>ZtTCaEsCHiFb(V{9c@X0`YV2O^@c6~LXg2AE zhA=a~!ALnP6aO9XOC^X15(1T)3!1lNXBEVj5s*G|Wm4YBPV`EOhU&)tTI9-KoLI-U zFI@adu6{w$dvT(zu*#aW*4F=i=!7`P!?hZy(9iL;Z^De3?AW`-gYTPALhrZ*K2|3_ zfz;6xQN9?|;#_U=4t^uS2VkQ8$|?Ub5CgKOj#Ni5j|(zX>x#K(h7LgDP-QHwok~-I zOu9rn%y97qrtKdG=ep)4MKF=TY9^n6CugQ3#G2yx;{))hvlxZGE~rzZ$qEHy-8?pU#G;bwufgSN6?*BeA!7N3RZEh{xS>>-G1!C(e1^ zzd#;39~PE_wFX3Tv;zo>5cc=md{Q}(Rb?37{;YPtAUGZo7j*yHfGH|TOVR#4ACaM2 z;1R0hO(Gl}+0gm9Bo}e@lW)J2OU4nukOTVKshHy7u)tLH^9@QI-jAnDBp(|J8&{fKu=_97$v&F67Z zq+QsJ=gUx3_h_%=+q47msQ*Ub=gMzoSa@S2>`Y9Cj*@Op4plTc!jDhu51nSGI z^sfZ(4=yzlR}kP2rcHRzAY9@T7f`z>fdCU0zibx^gVg&fMkcl)-0bRyWe12bT0}<@ z^h(RgGqS|1y#M;mER;8!CVmX!j=rfNa6>#_^j{^C+SxGhbSJ_a0O|ae!ZxiQCN2qA zKs_Z#Zy|9BOw6x{0*APNm$6tYVG2F$K~JNZ!6>}gJ_NLRYhcIsxY1z~)mt#Yl0pvC zO8#Nod;iow5{B*rUn(0WnN_~~M4|guwfkT(xv;z)olmj=f=aH#Y|#f_*d1H!o( z!EXNxKxth9w1oRr0+1laQceWfgi8z`YS#uzg#s9-QlTT7y2O^^M1PZx z3YS7iegfp6Cs0-ixlG93(JW4wuE7)mfihw}G~Uue{Xb+#F!BkDWs#*cHX^%(We}3% zT%^;m&Juw{hLp^6eyM}J({luCL_$7iRFA6^8B!v|B9P{$42F>|M`4Z_yA{kK()WcM zu#xAZWG%QtiANfX?@+QQOtbU;Avr*_>Yu0C2>=u}zhH9VLp6M>fS&yp*-7}yo8ZWB z{h>ce@HgV?^HgwRThCYnHt{Py0MS=Ja{nIj5%z;0S@?nGQ`z`*EVs&WWNwbzlk`(t zxDSc)$dD+4G6N(p?K>iEKXIk>GlGKTH{08WvrehnHhh%tgpp&8db4*FLN zETA@<$V=I7S^_KxvYv$Em4S{gO>(J#(Wf;Y%(NeECoG3n+o;d~Bjme-4dldKukd`S zRVAnKxOGjWc;L#OL{*BDEA8T=zL8^`J=2N)d&E#?OMUqk&9j_`GX*A9?V-G zdA5QQ#(_Eb^+wDkDiZ6RXL`fck|rVy%)BVv;dvY#`msZ}{x5fmd! zInmWSxvRgXbJ{unxAi*7=Lt&7_e0B#8M5a=Ad0yX#0rvMacnKnXgh>4iiRq<&wit93n!&p zeq~-o37qf)L{KJo3!{l9l9AQb;&>)^-QO4RhG>j`rBlJ09~cbfNMR_~pJD1$UzcGp zOEGTzz01j$=-kLC+O$r8B|VzBotz}sj(rUGOa7PDYwX~9Tum^sW^xjjoncxSz;kqz z$Pz$Ze|sBCTjk7oM&`b5g2mFtuTx>xl{dj*U$L%y-xeQL~|i>KzdUHeep-Yd@}p&L*ig< zgg__3l9T=nbM3bw0Sq&Z2*FA)P~sx0h634BXz0AxV69cED7QGTbK3?P?MENkiy-mV zZ1xV5ry3zIpy>xmThBL0Q!g+Wz@#?6fYvzmEczs(rcujrfCN=^!iWQ6$EM zaCnRThqt~gI-&6v@KZ78unqgv9j6-%TOxpbV`tK{KaoBbhc}$h+rK)5h|bT6wY*t6st-4$e99+Egb#3ip+ERbve08G@Ref&hP)qB&?>B94?eq5i3k;dOuU#!y-@+&5>~!FZik=z4&4|YHy=~!F254 zQAOTZr26}Nc7jzgJ;V~+9ry#?7Z0o*;|Q)k+@a^87lC}}1C)S))f5tk+lMNqw>vh( z`A9E~5m#b9!ZDBltf7QIuMh+VheCoD7nCFhuzThlhA?|8NCt3w?oWW|NDin&&eDU6 zwH`aY=))lpWG?{fda=-auXYp1WIPu&3 zwK|t(Qiqvc@<;1_W#ALDJ}bR;3&v4$9rP)eAg`-~iCte`O^MY+SaP!w%~+{{1tMo` zbp?T%ENs|mHP)Lsxno=nWL&qizR+!Ib=9i%4=B@(Umf$|7!WVxkD%hfRjvxV`Co<; zG*g4QG_>;RE{3V_DOblu$GYm&!+}%>G*yO{-|V9GYG|bH2JIU2iO}ZvY>}Fl%1!OE zZFsirH^$G>BDIy`8;R?lZl|uu@qWj2T5}((RG``6*05AWsVVa2Iu>!F5U>~7_Tlv{ zt=Dpgm~0QVa5mxta+fUt)I0gToeEm9eJX{yYZ~3sLR&nCuyuFWuiDIVJ+-lwViO(E zH+@Rg$&GLueMR$*K8kOl>+aF84Hss5p+dZ8hbW$=bWNIk0paB!qEK$xIm5{*^ad&( zgtA&gb&6FwaaR2G&+L+Pp>t^LrG*-B&Hv;-s(h0QTuYWdnUObu8LRSZoAVd7SJ;%$ zh%V?58mD~3G2X<$H7I)@x?lmbeeSY7X~QiE`dfQ5&K^FB#9e!6!@d9vrSt!);@ZQZ zO#84N5yH$kjm9X4iY#f+U`FKhg=x*FiDoUeu1O5LcC2w&$~5hKB9ZnH+8BpbTGh5T zi_nfmyQY$vQh%ildbR7T;7TKPxSs#vhKR|uup`qi1PufMa(tNCjRbllakshQgn1)a8OO-j8W&aBc_#q1hKDF5-X$h`!CeT z+c#Ial~fDsGAenv7~f@!icm(~)a3OKi((=^zcOb^qH$#DVciGXslUwTd$gt{7)&#a`&Lp ze%AnL0#U?lAl8vUkv$n>bxH*`qOujO0HZkPWZnE0;}0DSEu1O!hg-d9#{&#B1Dm)L zvN%r^hdEt1vR<4zwshg*0_BNrDWjo65be1&_82SW8#iKWs7>TCjUT;-K~*NxpG2P% zovXUo@S|fMGudVSRQrP}J3-Wxq;4xIxJJC|Y#TQBr>pwfy*%=`EUNE*dr-Y?9y9xK zmh1zS@z{^|UL}v**LNYY!?1qIRPTvr!gNXzE{%=-`oKclPrfMKwn` zUwPeIvLcxkIV>(SZ-SeBo-yw~{p!<&_}eELG?wxp zee-V59%@BtB+Z&Xs=O(@P$}v_qy1m=+`!~r^aT> zY+l?+6(L-=P%m4ScfAYR8;f9dyVw)@(;v{|nO#lAPI1xDHXMYt~-BGiP&9y2OQsYdh7-Q1(vL<$u6W0nxVn-qh=nwuRk}{d!uACozccRGx6~xZQ;=#JCE?OuA@;4 zadp$sm}jfgW4?La(pb!3f0B=HUI{5A4b$2rsB|ZGb?3@CTA{|zBf07pYpQ$NM({C6Srv6%_{rVkCndT=1nS}qyEf}Wjtg$e{ng7Wgz$7itYy0sWW_$qld);iUm85GBH)fk3b=2|5mvflm?~inoVo zDH_%e;y`DzoNj|NgZ`U%a9(N*=~8!qqy0Etkxo#`r!!{|(NyT0;5= z8nVZ6AiM+SjMG8J@6c4_f-KXd_}{My?Se1GWP|@wROFpD^5_lu?I%CBzpwi(`x~xh B8dv}T delta 17845 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 X49Luk)baa85H9$5YCsTPT`SVRWMtMW diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f371643e..05679dc3 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 index 4f906e0c..744e882e --- a/gradlew +++ b/gradlew @@ -72,7 +72,7 @@ case "`uname`" in Darwin* ) darwin=true ;; - MINGW* ) + MSYS* | MINGW* ) msys=true ;; NONSTOP* ) From 426c1ff990b6e115b73602ddba8c5ec2f9794bdd Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Fri, 6 Aug 2021 10:43:13 +0300 Subject: [PATCH 009/109] Update docs/tutorial.md Co-authored-by: Iaroslav Postovalov <38042667+CommanderTvis@users.noreply.github.com> --- docs/tutorial.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index d70d306d..924b62c5 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -244,18 +244,19 @@ Let's make classic parallelepiped. Now, let's make a custom hexagon. ```kotlin - hexagon( - Point3D(5, 30, 5), - Point3D(24, 30, 8), - Point3D(20, 30, -10), - Point3D(5, 30, -7), - Point3D(8, 16, 0), - Point3D(12, 16, 0), - Point3D(10, 16, -5), - Point3D(6.5, 12, -3), - name = "custom_hexagon"){ - color("brown") - } +hexagon( + Point3D(5, 30, 5), + Point3D(24, 30, 8), + Point3D(20, 30, -10), + Point3D(5, 30, -7), + Point3D(8, 16, 0), + Point3D(12, 16, 0), + Point3D(10, 16, -5), + Point3D(6.5, 12, -3), + name = "custom_hexagon" +) { + color("brown") +} ``` ![](../docs/images/custom-hexagon.png) ### 3) Cone @@ -370,4 +371,3 @@ tube(50, 40, 20, 0f, PI, name = "fragmented tube"){ `extruded` is set by two values: `shape`, and `layer`. * `shape` is a value of `List` type. It' s just a list of all points of the solid. *`shape` has to consist of not less than two points!* * `layer` is `MutableList` types variable. (here is a sentence with description of the work of this function). *The amount of `layer`-s has to be more than one* - From b3ecc2136e0eb922f4953339c6c53152ddcf6b25 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Fri, 6 Aug 2021 10:43:20 +0300 Subject: [PATCH 010/109] Update docs/tutorial.md Co-authored-by: Iaroslav Postovalov <38042667+CommanderTvis@users.noreply.github.com> --- docs/tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index 924b62c5..83da43d9 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -1,6 +1,6 @@ # Tutorial -#### The main goal of this tutorial is to show main capabilities of the visualization instrument. +#### The main goal of this tutorial is to show the main capabilities of the visualization instrument. The simple visualization can be made with function `main`. (this part will be supplemented) ```kotlin From 2c2b7a5fa2ec555a388d33414ff72a264bde163c Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Fri, 6 Aug 2021 10:43:34 +0300 Subject: [PATCH 011/109] Update docs/tutorial.md Co-authored-by: Iaroslav Postovalov <38042667+CommanderTvis@users.noreply.github.com> --- docs/tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index 83da43d9..aeef2aa1 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -120,7 +120,7 @@ fun main(){ Now, let's see which solids can be visualized: ### 1) PolyLine -It's scarcely a solid, but it can be visualized, so we mention it. +It's scarcely a solid, but it can be visualized, so we mention it. `polyline` build lines, obviously. Let's take a look at it's work. `polyline` requires two values - `points`, and `name`: From d5c0afd8c0f641a68870777081c75af0858d9403 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Fri, 6 Aug 2021 10:43:51 +0300 Subject: [PATCH 012/109] Update docs/tutorial.md Co-authored-by: Iaroslav Postovalov <38042667+CommanderTvis@users.noreply.github.com> --- docs/tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index aeef2aa1..dfb5f65f 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -369,5 +369,5 @@ tube(50, 40, 20, 0f, PI, name = "fragmented tube"){ ### 7) Extruded `extruded` is set by two values: `shape`, and `layer`. -* `shape` is a value of `List` type. It' s just a list of all points of the solid. *`shape` has to consist of not less than two points!* +* `shape` is a value of `List` type. It's just a list of all points of the solid. *`shape` has to consist of not less than two points!* * `layer` is `MutableList` types variable. (here is a sentence with description of the work of this function). *The amount of `layer`-s has to be more than one* From 6d7356f08c7d0601d401ba50b5dc6a79c6f05ac0 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Fri, 6 Aug 2021 10:43:57 +0300 Subject: [PATCH 013/109] Update docs/tutorial.md Co-authored-by: Iaroslav Postovalov <38042667+CommanderTvis@users.noreply.github.com> --- docs/tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index dfb5f65f..97d4a00e 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -187,7 +187,7 @@ For final trial, let's create `box` with bigger `x` value. color("black") } ``` -Predictably, only `x-axis` rib bigger than other ribs. +Predictably, only the `x-axis` rib is bigger than other ribs. ![](../docs/images/wide-box.png) From 689071d0da4a0ee647bac17b7febdcbed9df7841 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Fri, 6 Aug 2021 10:44:28 +0300 Subject: [PATCH 014/109] Update docs/tutorial.md Co-authored-by: Iaroslav Postovalov <38042667+CommanderTvis@users.noreply.github.com> --- docs/tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index 97d4a00e..0052f3e9 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -196,7 +196,7 @@ Predictably, only the `x-axis` rib is bigger than other ribs. It takes in two values: `radius`, and `name`. We bring you to mind that `name` is a general value for all solids, so do not wonder, since all solids need their own identifier. -As for `radius`, it has `Float` type, and, as you can guess, it sets radius of the sphere, which will be created. +As for `radius`, it has `Float` type, and, as you can guess, it sets the radius of the sphere which will be created. ```kotlin sphere(50, name = "sphere") { x = 0 From 1d7776807183aa9ac8a05f665d4619f297754601 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Fri, 6 Aug 2021 10:44:38 +0300 Subject: [PATCH 015/109] Update docs/tutorial.md Co-authored-by: Iaroslav Postovalov <38042667+CommanderTvis@users.noreply.github.com> --- docs/tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index 0052f3e9..e8b8a5b0 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -262,7 +262,7 @@ hexagon( ### 3) Cone It takes in six values: `bottomRadius`, `height`, `upperRadius`, `startAngle`, `angle`, and `name`. -Obviously, `bottomRadius` is responsible for radius of a bottom base, and `height` sets height of a cone along the `z-axis`. +Obviously, `bottomRadius` is responsible for the radius of a bottom base, and `height` sets the height of a cone along the `z-axis`. As it takes such values as `upperRadius`, `startAngle`, `angle`, `cone` can build not only usual cones, but also cone segments. Initially, `upperRadius` will have `0.0` value, `startAngle` - `0f`, `angle` - `PI2`, so if you don't set them, you'll get just a simple cone. From f71130ea0bd700a8dd139ba491d85dd346f1f11e Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Fri, 6 Aug 2021 10:44:44 +0300 Subject: [PATCH 016/109] Update docs/tutorial.md Co-authored-by: Iaroslav Postovalov <38042667+CommanderTvis@users.noreply.github.com> --- docs/tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index e8b8a5b0..ba302ff9 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -370,4 +370,4 @@ tube(50, 40, 20, 0f, PI, name = "fragmented tube"){ `extruded` is set by two values: `shape`, and `layer`. * `shape` is a value of `List` type. It's just a list of all points of the solid. *`shape` has to consist of not less than two points!* -* `layer` is `MutableList` types variable. (here is a sentence with description of the work of this function). *The amount of `layer`-s has to be more than one* +* `layer` is `MutableList` types variable. (here is a sentence with a description of the work of this function). *The amount of `layer`-s has to be more than one* From 133de264c11020be5733408a8072ff7fa2225836 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Fri, 6 Aug 2021 10:48:26 +0300 Subject: [PATCH 017/109] Update docs/tutorial.md Co-authored-by: Iaroslav Postovalov <38042667+CommanderTvis@users.noreply.github.com> --- docs/tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index ba302ff9..3bdab769 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -222,7 +222,7 @@ It is solid which has six edges. It is set by eight values: `node1`,..., `node8` ![](../docs/images/scheme.png) -As hexagon takes in specific points, we understand that this solid cannot be moved, it fixed in space, and it can't make pivots. +As the hexagon takes in specific points, we understand that this solid cannot be moved, it is fixed in space, and it can't make pivots. Let's make classic parallelepiped. ```kotlin From cb057db93bb3a7306a0a345342da14efd6c5728e Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Fri, 6 Aug 2021 10:48:38 +0300 Subject: [PATCH 018/109] Update docs/tutorial.md Co-authored-by: Iaroslav Postovalov <38042667+CommanderTvis@users.noreply.github.com> --- docs/tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index 3bdab769..f2c13af0 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -42,7 +42,7 @@ fun main(){ *Basic properties:* 1. `opacity` - It is set in `float`. It takes on values from 0 to 1, which represent percents of solid opacity. It's initial value is 1. 2. `color` - It can be specified as `Int`, `String`, or as three `Ubytes`, which represent color in `rgb`. Elementally, the solid will have `green` color. -3. `rotation` - it's the point, which set rotations along axes. Initially, the value is `Point3D(0, 0, 0)`. Changing `x` coordinate of the point, you make pivot around `x axis`. The same for other coordinates: changing `y` - pivot around `y axis`, changing `z` - pivot around `z axis`. +3. `rotation` - it's the point, which sets rotations along axes. Initially, the value is `Point3D(0, 0, 0)`. Changing `x` coordinate of the point, you make pivot around `x axis`. The same for other coordinates: changing `y` - pivot around `y axis`, changing `z` - pivot around `z axis`. 4. position, which is given by values `x`, `y`, `z`. Initial values are `x = 0`, `y = 0`, `z = 0`. The coordinate system is Cartesian. It's elemental position is this - vertical `y` axis and horizontal `Oxz` plane. Let's see how properties are set in solids. From 2d6be6629a6f88f59f70ef988410cd43fe6ee735 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Fri, 6 Aug 2021 10:48:56 +0300 Subject: [PATCH 019/109] Update docs/tutorial.md Co-authored-by: Iaroslav Postovalov <38042667+CommanderTvis@users.noreply.github.com> --- docs/tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index f2c13af0..fbe064c2 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -114,7 +114,7 @@ fun main(){ ![](../docs/images/two-boxes-1.png) ![](../docs/images/two-boxes-2.png) -***There is plenty of other properties, especially of those, which you can create by yourself. Here we mention just small part.*** +***There is plenty of other properties, especially those, which you can create by yourself. Here we mention just a small part.*** ## Basic Solids Now, let's see which solids can be visualized: From 9c6d646b53cac8037c714c523e69b336eed0c0d0 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Fri, 6 Aug 2021 10:49:11 +0300 Subject: [PATCH 020/109] Update docs/tutorial.md Co-authored-by: Iaroslav Postovalov <38042667+CommanderTvis@users.noreply.github.com> --- docs/tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index fbe064c2..3ce8848e 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -125,7 +125,7 @@ It's scarcely a solid, but it can be visualized, so we mention it. `polyline` requires two values - `points`, and `name`: * `points` is a `vararg` with `Point3D` type. It takes pairs of points, which you want to connect. -* `name` is an identifier of *any solid*, but in this case it is an identifier of `polyline`. +* `name` is an identifier of *any solid*; but in this case, it is an identifier of `polyline`. It's type is `String`. **This value can be required by any solid; you can set it, you can not to set it, but without you won't be able to control solid, since it won't be inherited.** From 16c3144b45a767a58784a6865c12751fc9b1d99b Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Fri, 6 Aug 2021 10:49:21 +0300 Subject: [PATCH 021/109] Update docs/tutorial.md Co-authored-by: Iaroslav Postovalov <38042667+CommanderTvis@users.noreply.github.com> --- docs/tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index 3ce8848e..d21286a9 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -173,7 +173,7 @@ Now, let's make `box` with bigger `y` value. color("black") } ``` -As you can see, only rib of `y-axis` differs from other ribs. +As you can see, only the rib of `y-axis` differs from other ribs. ![](../docs/images/high-box.png) From 84e0211b54ec1f420c989879e1dda1db03747a9e Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Fri, 6 Aug 2021 10:49:37 +0300 Subject: [PATCH 022/109] Update docs/tutorial.md Co-authored-by: Iaroslav Postovalov <38042667+CommanderTvis@users.noreply.github.com> --- docs/tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index d21286a9..02344e2f 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -177,7 +177,7 @@ As you can see, only the rib of `y-axis` differs from other ribs. ![](../docs/images/high-box.png) -For final trial, let's create `box` with bigger `x` value. +For a final trial, let's create a `box` with a bigger `x` value. ```kotlin box(65, 40, 40, name = "wide box") { From 99c6d0e14ce3c8515db4e1f248c0c8768ed0eee9 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Fri, 6 Aug 2021 10:56:44 +0300 Subject: [PATCH 023/109] Update tutorial.md --- docs/tutorial.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index 02344e2f..8989bd49 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -40,10 +40,10 @@ fun main(){ **We will analyze which basic properties solids have using `box` solid.** *Basic properties:* -1. `opacity` - It is set in `float`. It takes on values from 0 to 1, which represent percents of solid opacity. It's initial value is 1. -2. `color` - It can be specified as `Int`, `String`, or as three `Ubytes`, which represent color in `rgb`. Elementally, the solid will have `green` color. -3. `rotation` - it's the point, which sets rotations along axes. Initially, the value is `Point3D(0, 0, 0)`. Changing `x` coordinate of the point, you make pivot around `x axis`. The same for other coordinates: changing `y` - pivot around `y axis`, changing `z` - pivot around `z axis`. -4. position, which is given by values `x`, `y`, `z`. Initial values are `x = 0`, `y = 0`, `z = 0`. The coordinate system is Cartesian. It's elemental position is this - vertical `y` axis and horizontal `Oxz` plane. +1. `opacity` — It is set in `float`. It takes on values from 0 to 1, which represent percents of solid opacity. It's initial value is 1. +2. `color` — It can be specified as `Int`, `String`, or as three `Ubytes`, which represent color in `rgb`. Elementally, the solid will have `green` color. +3. `rotation` — it's the point, which sets rotations along axes. Initially, the value is `Point3D(0, 0, 0)`. Changing `x` coordinate of the point, you make pivot around `x axis`. The same for other coordinates: changing `y` — pivot around `y axis`, changing `z` — pivot around `z axis`. +4. position, which is given by values `x`, `y`, `z`. Initial values are `x = 0`, `y = 0`, `z = 0`. The coordinate system is Cartesian. It's elemental position is this — vertical `y` axis and horizontal `Oxz` plane. Let's see how properties are set in solids. The `small box` will have elemental values of properties. If you don't set properties, it will have the same `position`, `color`, `rotation`, and `opacity` values. @@ -123,7 +123,7 @@ Now, let's see which solids can be visualized: It's scarcely a solid, but it can be visualized, so we mention it. `polyline` build lines, obviously. Let's take a look at it's work. -`polyline` requires two values - `points`, and `name`: +`polyline` requires two values — `points`, and `name`: * `points` is a `vararg` with `Point3D` type. It takes pairs of points, which you want to connect. * `name` is an identifier of *any solid*; but in this case, it is an identifier of `polyline`. It's type is `String`. **This value can be required by any solid; @@ -148,15 +148,15 @@ polyline(Point3D(30, 20, 10), Point3D(30, -100, 30), Point3D(30, -100, 30), Poin ### 2) Box First thing which has to be mentioned is that `box` takes four values: `box(x, y, z, name)` -* `x` - x-axis length of the `box` -* `y` - y-axis length of the `box` -* `z` - z-axis length of the `box` +* `x` — x-axis length of the `box` +* `y` — y-axis length of the `box` +* `z` — z-axis length of the `box` These values have `Float` type. *`x`, `y`, and `z` are necessary values, which cannot be ignored. You have to set them.* -* `name` - `box`'es identifier. You've already met it. +* `name` — `box`'es identifier. You've already met it. Let's create just usual `box` with equal ribs. @@ -264,9 +264,9 @@ It takes in six values: `bottomRadius`, `height`, `upperRadius`, `startAngle`, ` Obviously, `bottomRadius` is responsible for the radius of a bottom base, and `height` sets the height of a cone along the `z-axis`. -As it takes such values as `upperRadius`, `startAngle`, `angle`, `cone` can build not only usual cones, but also cone segments. Initially, `upperRadius` will have `0.0` value, `startAngle` - `0f`, `angle` - `PI2`, so if you don't set them, you'll get just a simple cone. +As it takes such values as `upperRadius`, `startAngle`, `angle`, `cone` can build not only usual cones, but also cone segments. Initially, `upperRadius` will have `0.0` value, `startAngle` — `0f`, `angle` — `PI2`, so if you don't set them, you'll get just a simple cone. -Setting `upperRadius`, you make a frustum cone, since it sets a radius of the upper base of a cone. Set `startAngle`, and `angle` let to cut off segments by planes perpendicular to the base. `startAngle` - an angle, starting with which segment will be left, `angle` - an angle of cone, which will be set from `startAngle`. +Setting `upperRadius`, you make a frustum cone, since it sets a radius of the upper base of a cone. Set `startAngle`, and `angle` let to cut off segments by planes perpendicular to the base. `startAngle` — an angle, starting with which segment will be left, `angle` — an angle of cone, which will be set from `startAngle`. Let's build a classic cone: ```kotlin @@ -307,7 +307,7 @@ cone(60, 100, 20, PI*3/4, angle = PI/3, name = "cone") { This solid is set by seven values:`bottomOuterRadius`, `bottomInnerRadius`, `height`, `topOuterRadius`, `topInnerRadius`, `startAngle`, and `angle`. In addition to `height`, `startAngle`, and `angle`, which work as they work in `cone`, there are some new values. -`bottomOuterRadius`, and `bottomInnerRadius` set properties of the bottom circle, `topOuterRadius`, `topInnerRadius` - of the upper circle. They have no initial value, so that means they have to be set. +`bottomOuterRadius`, and `bottomInnerRadius` set properties of the bottom circle, `topOuterRadius`, `topInnerRadius` — of the upper circle. They have no initial value, so that means they have to be set. Generally, `cone`, and `coneSurface` buildings work in the same way, it's possible to make `coneSurface`'s fragments as in `cone` From 623d1e7e3ede7de22c6e87da10e53c1ce3c04da5 Mon Sep 17 00:00:00 2001 From: kiruma524 Date: Fri, 6 Aug 2021 11:26:09 +0300 Subject: [PATCH 024/109] demo renamings --- .../kotlin/space/kscience/visionforge/solid/demo/demo.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt index 2385fef1..f0235266 100644 --- a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt +++ b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt @@ -108,7 +108,7 @@ fun VisionLayout.showcase() { } demo("extrude", "extruded shape") { - extrude { + extruded { shape { polygon(8, 50) } From 60da696785382d321763369429bf90003c9ee1d5 Mon Sep 17 00:00:00 2001 From: kiruma524 Date: Fri, 6 Aug 2021 17:03:47 +0300 Subject: [PATCH 025/109] dashes --- docs/tutorial.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index d70d306d..f1ad2711 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -40,10 +40,10 @@ fun main(){ **We will analyze which basic properties solids have using `box` solid.** *Basic properties:* -1. `opacity` - It is set in `float`. It takes on values from 0 to 1, which represent percents of solid opacity. It's initial value is 1. -2. `color` - It can be specified as `Int`, `String`, or as three `Ubytes`, which represent color in `rgb`. Elementally, the solid will have `green` color. -3. `rotation` - it's the point, which set rotations along axes. Initially, the value is `Point3D(0, 0, 0)`. Changing `x` coordinate of the point, you make pivot around `x axis`. The same for other coordinates: changing `y` - pivot around `y axis`, changing `z` - pivot around `z axis`. -4. position, which is given by values `x`, `y`, `z`. Initial values are `x = 0`, `y = 0`, `z = 0`. The coordinate system is Cartesian. It's elemental position is this - vertical `y` axis and horizontal `Oxz` plane. +1. `opacity` — It is set in `float`. It takes on values from 0 to 1, which represent percents of solid opacity. It's initial value is 1. +2. `color` — It can be specified as `Int`, `String`, or as three `Ubytes`, which represent color in `rgb`. Elementally, the solid will have `green` color. +3. `rotation` — it's the point, which set rotations along axes. Initially, the value is `Point3D(0, 0, 0)`. Changing `x` coordinate of the point, you make pivot around `x axis`. The same for other coordinates: changing `y` — pivot around `y axis`, changing `z` — pivot around `z axis`. +4. position, which is given by values `x`, `y`, `z`. Initial values are `x = 0`, `y = 0`, `z = 0`. The coordinate system is Cartesian. It's elemental position is this — vertical `y` axis and horizontal `Oxz` plane. Let's see how properties are set in solids. The `small box` will have elemental values of properties. If you don't set properties, it will have the same `position`, `color`, `rotation`, and `opacity` values. @@ -123,7 +123,7 @@ Now, let's see which solids can be visualized: It's scarcely a solid, but it can be visualized, so we mention it. `polyline` build lines, obviously. Let's take a look at it's work. -`polyline` requires two values - `points`, and `name`: +`polyline` requires two values — `points`, and `name`: * `points` is a `vararg` with `Point3D` type. It takes pairs of points, which you want to connect. * `name` is an identifier of *any solid*, but in this case it is an identifier of `polyline`. It's type is `String`. **This value can be required by any solid; @@ -148,15 +148,15 @@ polyline(Point3D(30, 20, 10), Point3D(30, -100, 30), Point3D(30, -100, 30), Poin ### 2) Box First thing which has to be mentioned is that `box` takes four values: `box(x, y, z, name)` -* `x` - x-axis length of the `box` -* `y` - y-axis length of the `box` -* `z` - z-axis length of the `box` +* `x` — x-axis length of the `box` +* `y` — y-axis length of the `box` +* `z` — z-axis length of the `box` These values have `Float` type. *`x`, `y`, and `z` are necessary values, which cannot be ignored. You have to set them.* -* `name` - `box`'es identifier. You've already met it. +* `name` — `box`'es identifier. You've already met it. Let's create just usual `box` with equal ribs. @@ -263,9 +263,9 @@ It takes in six values: `bottomRadius`, `height`, `upperRadius`, `startAngle`, ` Obviously, `bottomRadius` is responsible for radius of a bottom base, and `height` sets height of a cone along the `z-axis`. -As it takes such values as `upperRadius`, `startAngle`, `angle`, `cone` can build not only usual cones, but also cone segments. Initially, `upperRadius` will have `0.0` value, `startAngle` - `0f`, `angle` - `PI2`, so if you don't set them, you'll get just a simple cone. +As it takes such values as `upperRadius`, `startAngle`, `angle`, `cone` can build not only usual cones, but also cone segments. Initially, `upperRadius` will have `0.0` value, `startAngle` — `0f`, `angle` — `PI2`, so if you don't set them, you'll get just a simple cone. -Setting `upperRadius`, you make a frustum cone, since it sets a radius of the upper base of a cone. Set `startAngle`, and `angle` let to cut off segments by planes perpendicular to the base. `startAngle` - an angle, starting with which segment will be left, `angle` - an angle of cone, which will be set from `startAngle`. +Setting `upperRadius`, you make a frustum cone, since it sets a radius of the upper base of a cone. Set `startAngle`, and `angle` let to cut off segments by planes perpendicular to the base. `startAngle` — an angle, starting with which segment will be left, `angle` — an angle of cone, which will be set from `startAngle`. Let's build a classic cone: ```kotlin @@ -306,7 +306,7 @@ cone(60, 100, 20, PI*3/4, angle = PI/3, name = "cone") { This solid is set by seven values:`bottomOuterRadius`, `bottomInnerRadius`, `height`, `topOuterRadius`, `topInnerRadius`, `startAngle`, and `angle`. In addition to `height`, `startAngle`, and `angle`, which work as they work in `cone`, there are some new values. -`bottomOuterRadius`, and `bottomInnerRadius` set properties of the bottom circle, `topOuterRadius`, `topInnerRadius` - of the upper circle. They have no initial value, so that means they have to be set. +`bottomOuterRadius`, and `bottomInnerRadius` set properties of the bottom circle, `topOuterRadius`, `topInnerRadius` — of the upper circle. They have no initial value, so that means they have to be set. Generally, `cone`, and `coneSurface` buildings work in the same way, it's possible to make `coneSurface`'s fragments as in `cone` From 052336700a0f22cabe79d7937656d800e5b47db5 Mon Sep 17 00:00:00 2001 From: kiruma524 Date: Fri, 6 Aug 2021 17:17:17 +0300 Subject: [PATCH 026/109] spaces --- docs/tutorial.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index 886fe641..8989bd49 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -42,9 +42,7 @@ fun main(){ *Basic properties:* 1. `opacity` — It is set in `float`. It takes on values from 0 to 1, which represent percents of solid opacity. It's initial value is 1. 2. `color` — It can be specified as `Int`, `String`, or as three `Ubytes`, which represent color in `rgb`. Elementally, the solid will have `green` color. - 3. `rotation` — it's the point, which sets rotations along axes. Initially, the value is `Point3D(0, 0, 0)`. Changing `x` coordinate of the point, you make pivot around `x axis`. The same for other coordinates: changing `y` — pivot around `y axis`, changing `z` — pivot around `z axis`. - 4. position, which is given by values `x`, `y`, `z`. Initial values are `x = 0`, `y = 0`, `z = 0`. The coordinate system is Cartesian. It's elemental position is this — vertical `y` axis and horizontal `Oxz` plane. Let's see how properties are set in solids. From 8d21d3cd740ac9808f2292120eee405605b7ea5a Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sat, 7 Aug 2021 11:27:57 +0300 Subject: [PATCH 027/109] Adjust property editors --- build.gradle.kts | 11 +- .../visionforge/gdml/GDMLVisionTest.kt | 4 +- .../visionforge/gdml/demo/GdmlFxDemoApp.kt | 11 +- .../kotlin/ru/mipt/npm/muon/monitor/Model.kt | 1 + demo/playground/build.gradle.kts | 1 + .../src/jvmMain/kotlin/markdownDemo.kt | 91 +++++++ .../src/jvmMain/kotlin/serverExtensions.kt | 2 +- .../src/jvmMain/kotlin/simpleCube.kt | 7 +- .../main/kotlin/ru/mipt/npm/sat/satServer.kt | 4 +- .../visionforge/solid/demo}/VisionLayout.kt | 3 +- .../kscience/visionforge/solid/demo/demo.kt | 5 +- .../visionforge/solid/demo/ThreeDemoGrid.kt | 1 - .../visionforge/solid/demo/FXDemoGrid.kt | 1 - .../visionforge/solid/demo/MetaEditorDemo.kt | 33 +-- docs/design.md | 2 +- docs/uml/Vision.puml | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- settings.gradle.kts | 2 +- ui/bootstrap/build.gradle.kts | 2 +- .../visionforge/bootstrap/outputConfig.kt | 5 +- .../visionforge/bootstrap/tabComponent.kt | 4 +- .../bootstrap/visionPropertyEditor.kt | 15 +- .../kscience/visionforge/react/MetaViewer.kt | 137 +++++------ .../visionforge/react/MultiSelectChooser.kt | 10 +- .../visionforge/react/PropertyEditor.kt | 155 ++++++------ .../visionforge/react/RangeValueChooser.kt | 4 +- .../visionforge/react/ThreeCanvasComponent.kt | 2 +- .../kscience/visionforge/react/VisionTree.kt | 2 +- .../visionforge/react/valueChooser.kt | 43 ++-- ui/ring/build.gradle.kts | 9 +- .../ThreeViewWithControls.kt | 17 +- .../ringPropertyEditor.kt | 15 +- .../ringThreeControls.kt | 7 +- .../space/kscience/visionforge/Colors.kt | 33 ++- .../kscience/visionforge/StyleReference.kt | 4 +- .../space/kscience/visionforge/StyleSheet.kt | 21 +- .../space/kscience/visionforge/Vision.kt | 88 ++++--- .../space/kscience/visionforge/VisionBase.kt | 76 +++--- .../kscience/visionforge/VisionChange.kt | 10 +- .../space/kscience/visionforge/VisionGroup.kt | 4 +- .../kscience/visionforge/VisionGroupBase.kt | 6 +- .../kscience/visionforge/VisionManager.kt | 15 +- .../kscience/visionforge/VisionProperties.kt | 38 +++ .../visionforge/VisionPropertyContainer.kt | 33 ++- .../visionforge/html/VisionTagConsumer.kt | 13 +- .../kotlin/space/kscience/visionforge/misc.kt | 24 +- .../kscience/visionforge/schemeDesctiptors.kt | 54 ++--- .../kscience/visionforge/visionDelegates.kt | 93 ++++++++ .../kscience/visionforge/visionDescriptor.kt | 64 ++--- .../kscience/visionforge/html/HtmlTagTest.kt | 2 +- .../kscience/visionforge/VisionClient.kt | 2 +- .../space/kscience/visionforge/FXPlugin.kt | 2 +- .../editor/ComboBoxValueChooser.kt | 4 +- .../visionforge/editor/ConfigEditor.kt | 189 --------------- .../kscience/visionforge/editor/FXMeta.kt | 223 ------------------ .../visionforge/editor/FXMetaModel.kt | 217 +++++++++++++++++ .../kscience/visionforge/editor/MetaViewer.kt | 41 ++-- .../visionforge/editor/MutableMetaEditor.kt | 193 +++++++++++++++ .../visionforge/editor/TextValueChooser.kt | 7 +- .../visionforge/editor/ValueCallback.kt | 4 +- .../visionforge/editor/ValueChooser.kt | 22 +- .../visionforge/editor/ValueChooserBase.kt | 16 +- ...torFragment.kt => VisionEditorFragment.kt} | 39 ++- ...tTreeFragment.kt => VisionTreeFragment.kt} | 11 +- .../kscience/visionforge/solid/FXMaterials.kt | 49 ++-- .../visionforge/solid/FXReferenceFactory.kt | 7 +- .../solid/VisualObjectFXBinding.kt | 38 ++- .../visionforge/gdml/GdmlTransformer.kt | 10 +- .../src/commonTest/kotlin/TestCubes.kt | 6 +- .../visionforge/gdml/TestConvertor.kt | 4 +- .../visionforge/markup/VisionOfMarkup.kt | 4 +- visionforge-plotly/build.gradle.kts | 2 +- .../visionforge/plotly/VisionOfPlotly.kt | 6 +- .../kscience/visionforge/plotly/plotlyJs.kt | 2 +- .../visionforge/three/server/VisionServer.kt | 21 +- .../visionforge/solid/ColorAccessor.kt | 16 +- .../kscience/visionforge/solid/Composite.kt | 2 +- .../kscience/visionforge/solid/Extruded.kt | 7 +- .../kscience/visionforge/solid/PolyLine.kt | 7 +- .../space/kscience/visionforge/solid/Solid.kt | 37 ++- .../kscience/visionforge/solid/SolidBase.kt | 8 +- .../kscience/visionforge/solid/SolidGroup.kt | 8 +- .../visionforge/solid/SolidMaterial.kt | 42 ++-- .../visionforge/solid/SolidReference.kt | 32 +-- .../kscience/visionforge/solid/geometry.kt | 10 +- .../visionforge/solid/specifications/Axes.kt | 6 +- .../solid/specifications/Camera.kt | 6 +- .../solid/specifications/Canvas3DOptions.kt | 39 ++- .../solid/transform/RemoveSingleChild.kt | 13 +- .../kscience/visionforge/solid/ConvexTest.kt | 7 +- .../visionforge/solid/DescriptorTest.kt | 3 +- .../visionforge/solid/PropertyTest.kt | 2 +- .../visionforge/solid/SerializationTest.kt | 15 +- .../visionforge/solid/VisionUpdateTest.kt | 15 +- .../solid/three/MeshThreeFactory.kt | 2 +- .../visionforge/solid/three/ThreeCanvas.kt | 10 +- .../solid/three/ThreeLineFactory.kt | 6 +- .../visionforge/solid/three/ThreeMaterials.kt | 42 ++-- .../visionforge/solid/three/ThreePlugin.kt | 6 +- .../solid/three/ThreeReferenceFactory.kt | 4 +- .../kscience/visionforge/solid/three/three.kt | 4 +- 101 files changed, 1410 insertions(+), 1246 deletions(-) create mode 100644 demo/playground/src/jvmMain/kotlin/markdownDemo.kt rename {visionforge-core/src/commonMain/kotlin/space/kscience/visionforge => demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo}/VisionLayout.kt (69%) create mode 100644 visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt create mode 100644 visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visionDelegates.kt delete mode 100644 visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ConfigEditor.kt delete mode 100644 visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/FXMeta.kt create mode 100644 visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/FXMetaModel.kt create mode 100644 visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/MutableMetaEditor.kt rename visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/{VisualObjectEditorFragment.kt => VisionEditorFragment.kt} (57%) rename visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/{VisualObjectTreeFragment.kt => VisionTreeFragment.kt} (82%) diff --git a/build.gradle.kts b/build.gradle.kts index c7fbc2d8..22615a5d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,18 +1,13 @@ plugins { id("ru.mipt.npm.gradle.project") - - //Override kotlin version -// val kotlinVersion = "1.5.20-RC" -// kotlin("multiplatform") version(kotlinVersion) apply false -// kotlin("jvm") version(kotlinVersion) apply false -// kotlin("js") version(kotlinVersion) apply false } -val dataforgeVersion by extra("0.5.0-dev-2") +val dataforgeVersion by extra("0.5.0-dev-9") val fxVersion by extra("11") allprojects { repositories { + mavenLocal() mavenCentral() jcenter() maven("https://repo.kotlin.link") @@ -29,7 +24,7 @@ subprojects { } } -ksciencePublish{ +ksciencePublish { github("visionforge") space() sonatype() diff --git a/demo/gdml/src/commonTest/kotlin/space/kscience/visionforge/gdml/GDMLVisionTest.kt b/demo/gdml/src/commonTest/kotlin/space/kscience/visionforge/gdml/GDMLVisionTest.kt index 17bdc014..66332d9d 100644 --- a/demo/gdml/src/commonTest/kotlin/space/kscience/visionforge/gdml/GDMLVisionTest.kt +++ b/demo/gdml/src/commonTest/kotlin/space/kscience/visionforge/gdml/GDMLVisionTest.kt @@ -1,7 +1,7 @@ package space.kscience.visionforge.gdml import space.kscience.dataforge.meta.string -import space.kscience.dataforge.names.toName +import space.kscience.dataforge.names.Name import space.kscience.dataforge.values.asValue import space.kscience.gdml.GdmlShowCase import space.kscience.visionforge.setProperty @@ -24,7 +24,7 @@ class GDMLVisionTest { @Test fun testPrototypeProperty() { val vision = GdmlShowCase.cubes().toVision() - val child = vision["composite-000.segment-0".toName()] + val child = vision[Name.of("composite-000","segment-0")] assertNotNull(child) child.setProperty(SolidMaterial.MATERIAL_COLOR_KEY, "red".asValue()) assertEquals("red", child.getProperty(SolidMaterial.MATERIAL_COLOR_KEY).string) diff --git a/demo/gdml/src/jvmMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlFxDemoApp.kt b/demo/gdml/src/jvmMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlFxDemoApp.kt index 4fd1e2e7..d4cd85b0 100644 --- a/demo/gdml/src/jvmMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlFxDemoApp.kt +++ b/demo/gdml/src/jvmMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlFxDemoApp.kt @@ -8,8 +8,8 @@ import space.kscience.dataforge.context.fetch import space.kscience.gdml.GdmlShowCase import space.kscience.visionforge.VisionManager import space.kscience.visionforge.describedProperties -import space.kscience.visionforge.editor.VisualObjectEditorFragment -import space.kscience.visionforge.editor.VisualObjectTreeFragment +import space.kscience.visionforge.editor.VisionEditorFragment +import space.kscience.visionforge.editor.VisionTreeFragment import space.kscience.visionforge.gdml.toVision import space.kscience.visionforge.solid.FX3DPlugin import space.kscience.visionforge.solid.FXCanvas3D @@ -29,25 +29,24 @@ class GDMLView : View() { private val visionManager = context.fetch(VisionManager) private val canvas = FXCanvas3D(fx3d) - private val treeFragment = VisualObjectTreeFragment().apply { + private val treeFragment = VisionTreeFragment().apply { this.itemProperty.bind(canvas.rootObjectProperty) } - private val propertyEditor = VisualObjectEditorFragment { + private val propertyEditor = VisionEditorFragment { it.describedProperties }.apply { descriptorProperty.set(SolidMaterial.descriptor) itemProperty.bind(treeFragment.selectedProperty) } - override val root: Parent = borderpane { top { buttonbar { button("Load GDML/json") { action { val file = chooseFile("Select a GDML/json file", filters = fileNameFilter).firstOrNull() - if(file!= null) { + if (file != null) { runAsync { visionManager.readFile(file) as Solid } ui { diff --git a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt index c485a1e3..87065723 100644 --- a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt +++ b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt @@ -6,6 +6,7 @@ import ru.mipt.npm.muon.monitor.Monitor.UPPER_LAYER_Z import space.kscience.visionforge.VisionManager import space.kscience.visionforge.removeAll import space.kscience.visionforge.root +import space.kscience.visionforge.setProperty import space.kscience.visionforge.solid.* import kotlin.math.PI diff --git a/demo/playground/build.gradle.kts b/demo/playground/build.gradle.kts index 7c99d6fa..73fd2aa7 100644 --- a/demo/playground/build.gradle.kts +++ b/demo/playground/build.gradle.kts @@ -67,6 +67,7 @@ kotlin { val jvmMain by getting{ dependencies { api(project(":visionforge-server")) + api(project(":visionforge-markdown")) api("ch.qos.logback:logback-classic:1.2.3") implementation("com.github.Ricky12Awesome:json-schema-serialization:0.6.6") } diff --git a/demo/playground/src/jvmMain/kotlin/markdownDemo.kt b/demo/playground/src/jvmMain/kotlin/markdownDemo.kt new file mode 100644 index 00000000..cb4b7cf0 --- /dev/null +++ b/demo/playground/src/jvmMain/kotlin/markdownDemo.kt @@ -0,0 +1,91 @@ +package space.kscience.visionforge.examples + +import kotlinx.html.div +import kotlinx.html.h1 +import space.kscience.dataforge.context.Context +import space.kscience.plotly.layout +import space.kscience.plotly.models.ScatterMode +import space.kscience.plotly.models.TextPosition +import space.kscience.plotly.scatter +import space.kscience.visionforge.html.ResourceLocation +import space.kscience.visionforge.markup.markdown +import space.kscience.visionforge.plotly.PlotlyPlugin +import space.kscience.visionforge.plotly.plotly +import space.kscience.visionforge.solid.* + +fun main() { + val context = Context { + plugin(Solids) + plugin(PlotlyPlugin) + } + + context.makeVisionFile(resourceLocation = ResourceLocation.SYSTEM) { + markdown { + //language=markdown + """ + # Section + + **TBD** + + ## Subsection + """.trimIndent() + } + + div { + h1 { +"Canvas" } + vision("canvas") { + solid { + box(100, 100, 100) + material { + emissiveColor("red") + } + } + } + } + + vision("plot") { + plotly { + scatter { + x(1, 2, 3, 4) + y(10, 15, 13, 17) + mode = ScatterMode.markers + name = "Team A" + text("A-1", "A-2", "A-3", "A-4", "A-5") + textposition = TextPosition.`top center` + textfont { + family = "Raleway, sans-serif" + } + marker { size = 12 } + } + + scatter { + x(2, 3, 4, 5) + y(10, 15, 13, 17) + mode = ScatterMode.lines + name = "Team B" + text("B-a", "B-b", "B-c", "B-d", "B-e") + textposition = TextPosition.`bottom center` + textfont { + family = "Times New Roman" + } + marker { size = 12 } + } + + layout { + title = "Data Labels Hover" + xaxis { + range(0.75..5.25) + } + legend { + y = 0.5 + font { + family = "Arial, sans-serif" + size = 20 + color("grey") + } + } + } + } + } + } +} \ No newline at end of file diff --git a/demo/playground/src/jvmMain/kotlin/serverExtensions.kt b/demo/playground/src/jvmMain/kotlin/serverExtensions.kt index b71b1873..e4111afc 100644 --- a/demo/playground/src/jvmMain/kotlin/serverExtensions.kt +++ b/demo/playground/src/jvmMain/kotlin/serverExtensions.kt @@ -26,7 +26,7 @@ public fun Context.makeVisionFile( content: VisionTagConsumer<*>.() -> Unit ): Unit { val actualPath = page(title, content = content).makeFile(path) { actualPath -> - mapOf("threeJs" to scriptHeader("js/visionforge-playground.js", resourceLocation, actualPath)) + mapOf("playground" to scriptHeader("js/visionforge-playground.js", resourceLocation, actualPath)) } if (show) Desktop.getDesktop().browse(actualPath.toFile().toURI()) } diff --git a/demo/playground/src/jvmMain/kotlin/simpleCube.kt b/demo/playground/src/jvmMain/kotlin/simpleCube.kt index e98d1ff1..f804228b 100644 --- a/demo/playground/src/jvmMain/kotlin/simpleCube.kt +++ b/demo/playground/src/jvmMain/kotlin/simpleCube.kt @@ -2,9 +2,7 @@ package space.kscience.visionforge.examples import space.kscience.dataforge.context.Context import space.kscience.visionforge.html.ResourceLocation -import space.kscience.visionforge.solid.Solids -import space.kscience.visionforge.solid.box -import space.kscience.visionforge.solid.solid +import space.kscience.visionforge.solid.* fun main() { val context = Context { @@ -15,6 +13,9 @@ fun main() { vision("canvas") { solid { box(100, 100, 100) + material { + emissiveColor("red") + } } } } diff --git a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt index 6d80c691..8b286e07 100644 --- a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt +++ b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt @@ -8,7 +8,7 @@ import kotlinx.coroutines.launch import kotlinx.html.div import kotlinx.html.h1 import space.kscience.dataforge.context.Global -import space.kscience.dataforge.names.toName +import space.kscience.dataforge.names.Name import space.kscience.visionforge.solid.* import space.kscience.visionforge.three.server.* import space.kscience.visionforge.visionManager @@ -42,7 +42,7 @@ fun main() { val randomLayer = Random.nextInt(1, 11) val randomI = Random.nextInt(1, 4) val randomJ = Random.nextInt(1, 4) - val target = "layer[$randomLayer].segment[$randomI,$randomJ]".toName() + val target = Name.parse("layer[$randomLayer].segment[$randomI,$randomJ]") val targetVision = sat[target] as Solid targetVision.color("red") delay(1000) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionLayout.kt b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/VisionLayout.kt similarity index 69% rename from visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionLayout.kt rename to demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/VisionLayout.kt index 1a0fddfc..016f2ecf 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionLayout.kt +++ b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/VisionLayout.kt @@ -1,7 +1,8 @@ -package space.kscience.visionforge +package space.kscience.visionforge.solid.demo import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.names.Name +import space.kscience.visionforge.Vision public interface VisionLayout { public fun render(name: Name, vision: V, meta: Meta = Meta.EMPTY) diff --git a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt index 2385fef1..fcf94589 100644 --- a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt +++ b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt @@ -6,9 +6,8 @@ import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.invoke -import space.kscience.dataforge.names.toName +import space.kscience.dataforge.names.Name import space.kscience.visionforge.Colors -import space.kscience.visionforge.VisionLayout import space.kscience.visionforge.solid.* import space.kscience.visionforge.solid.specifications.Canvas3DOptions import space.kscience.visionforge.visible @@ -23,7 +22,7 @@ fun VisionLayout.demo(name: String, title: String = name, block: SolidGro "title" put title } val vision = SolidGroup(block) - render(name.toName(), vision) + render(Name.parse(name), vision) } val canvasOptions = Canvas3DOptions { diff --git a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/ThreeDemoGrid.kt b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/ThreeDemoGrid.kt index bef5404f..6dcfa36f 100644 --- a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/ThreeDemoGrid.kt +++ b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/ThreeDemoGrid.kt @@ -15,7 +15,6 @@ import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.string import space.kscience.dataforge.names.Name -import space.kscience.visionforge.VisionLayout import space.kscience.visionforge.solid.Solid import space.kscience.visionforge.solid.three.ThreeCanvas import space.kscience.visionforge.solid.three.ThreePlugin diff --git a/demo/solid-showcase/src/jvmMain/kotlin/space/kscience/visionforge/solid/demo/FXDemoGrid.kt b/demo/solid-showcase/src/jvmMain/kotlin/space/kscience/visionforge/solid/demo/FXDemoGrid.kt index 4e727bb6..ef03092a 100644 --- a/demo/solid-showcase/src/jvmMain/kotlin/space/kscience/visionforge/solid/demo/FXDemoGrid.kt +++ b/demo/solid-showcase/src/jvmMain/kotlin/space/kscience/visionforge/solid/demo/FXDemoGrid.kt @@ -7,7 +7,6 @@ import space.kscience.dataforge.context.Global import space.kscience.dataforge.context.fetch import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.names.Name -import space.kscience.visionforge.VisionLayout import space.kscience.visionforge.solid.FX3DPlugin import space.kscience.visionforge.solid.FXCanvas3D import space.kscience.visionforge.solid.Solid diff --git a/demo/solid-showcase/src/jvmMain/kotlin/space/kscience/visionforge/solid/demo/MetaEditorDemo.kt b/demo/solid-showcase/src/jvmMain/kotlin/space/kscience/visionforge/solid/demo/MetaEditorDemo.kt index fc231c38..b00ef055 100644 --- a/demo/solid-showcase/src/jvmMain/kotlin/space/kscience/visionforge/solid/demo/MetaEditorDemo.kt +++ b/demo/solid-showcase/src/jvmMain/kotlin/space/kscience/visionforge/solid/demo/MetaEditorDemo.kt @@ -2,12 +2,14 @@ package space.kscience.visionforge.demo import javafx.geometry.Orientation import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.asConfig -import space.kscience.dataforge.meta.descriptors.NodeDescriptor +import space.kscience.dataforge.meta.MutableMeta +import space.kscience.dataforge.meta.descriptors.MetaDescriptor +import space.kscience.dataforge.meta.descriptors.node +import space.kscience.dataforge.meta.descriptors.value import space.kscience.dataforge.values.ValueType -import space.kscience.visionforge.editor.ConfigEditor -import space.kscience.visionforge.editor.FXMeta +import space.kscience.visionforge.editor.FXMetaModel import space.kscience.visionforge.editor.MetaViewer +import space.kscience.visionforge.editor.MutableMetaEditor import tornadofx.* @@ -15,7 +17,7 @@ class MetaEditorDemoApp : App(MetaEditorDemo::class) class MetaEditorDemo : View("Meta editor demo") { - val meta = Meta { + val meta = MutableMeta { "aNode" put { "innerNode" put { "innerValue" put true @@ -23,18 +25,16 @@ class MetaEditorDemo : View("Meta editor demo") { "b" put 223 "c" put "StringValue" } - }.asConfig() + } - val descriptor = NodeDescriptor { + val descriptor = MetaDescriptor { node("aNode") { info = "A root demo node" - value("b") { + value("b", ValueType.NUMBER) { info = "b number value" - type(ValueType.NUMBER) } node("otherNode") { - value("otherValue") { - type(ValueType.BOOLEAN) + value("otherValue", ValueType.BOOLEAN) { default(false) info = "default value" } @@ -46,12 +46,13 @@ class MetaEditorDemo : View("Meta editor demo") { } } - private val rootNode = FXMeta.root(meta, descriptor) + private val rootNode = FXMetaModel.root(meta, descriptor) - override val root = - splitpane(Orientation.HORIZONTAL, MetaViewer(rootNode).root, ConfigEditor( - rootNode - ).root) + override val root = splitpane( + Orientation.HORIZONTAL, + MetaViewer(rootNode as Meta).root, + MutableMetaEditor(rootNode as FXMetaModel).root + ) } fun main() { diff --git a/docs/design.md b/docs/design.md index 79014d73..c6b1b64b 100644 --- a/docs/design.md +++ b/docs/design.md @@ -1,5 +1,5 @@ ## Library design -The central point of the library design is the `Vision` interface. The `Vision` stores an optional reference to its parent and is able to store a number of mutable or read-only properties. Each property is represented by its `Name`, and a `MetaItem` value-tree, both following DataForge library specification (discussed in the [Appendix](appendix.md)). The `Vision` objects are organized in a tree using `VisionGroup` as nodes. `VisionGroup` additionally to all `Vision` properties holds a `children` container that holds named references to its direct children `Vision`s. Thus, `Vision`s form a doubly linked tree (a parent stores references to all its children and children store a reference to the parent). +The central point of the library design is the `Vision` interface. The `Vision` stores an optional reference to its parent and is able to store a number of mutable or read-only properties. Each property is represented by its `Name`, and a `Meta` value-tree, both following DataForge library specification (discussed in the [Appendix](appendix.md)). The `Vision` objects are organized in a tree using `VisionGroup` as nodes. `VisionGroup` additionally to all `Vision` properties holds a `children` container that holds named references to its direct children `Vision`s. Thus, `Vision`s form a doubly linked tree (a parent stores references to all its children and children store a reference to the parent). An important concept using in the VisionForge is the property layering mechanism. It means that if the property with a given name is not found in the `Vision` it is requested from, it could be requested from the parent `Vision`, form the style declaration, the prototype for the vision or any other place defined by the component author. For example, let's take a `color` attribute used in 3D visualization. When one draws a group of objects, he usually wants to make the color of all objects in the group to be defined by a single handle in the group common ancestor. So when the parent color changes, all children color must follow suite, but we also want to change children color individually without changing the parent. In this case two property layers are defined: diff --git a/docs/uml/Vision.puml b/docs/uml/Vision.puml index 2028b097..079ca82c 100644 --- a/docs/uml/Vision.puml +++ b/docs/uml/Vision.puml @@ -3,7 +3,7 @@ interface Vision{ val parent: Vision? - fun getProperty(name): MetaItem? + fun getProperty(name): Meta? fun setProperty(name, value) } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f371643e..05679dc3 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/settings.gradle.kts b/settings.gradle.kts index 70f3606a..d88c9b81 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,6 +1,6 @@ pluginManagement { - val toolsVersion = "0.10.0" + val toolsVersion = "0.10.2" repositories { maven("https://repo.kotlin.link") diff --git a/ui/bootstrap/build.gradle.kts b/ui/bootstrap/build.gradle.kts index b1b0588e..af4ec727 100644 --- a/ui/bootstrap/build.gradle.kts +++ b/ui/bootstrap/build.gradle.kts @@ -11,5 +11,5 @@ dependencies { implementation(npm("file-saver", "2.0.2")) implementation(npm("bootstrap","4.6.0")) implementation(npm("jquery","3.5.1")) - implementation(npm("popper.js","1.16.1")) + implementation(npm("@popperjs/core","2.9.3")) } \ No newline at end of file diff --git a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt index 3423baf8..f16985c5 100644 --- a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt +++ b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt @@ -12,6 +12,7 @@ import org.w3c.files.BlobPropertyBag import react.* import react.dom.attrs import react.dom.button +import space.kscience.dataforge.meta.descriptors.defaultNode import space.kscience.dataforge.meta.withDefault import space.kscience.visionforge.Vision import space.kscience.visionforge.react.flexColumn @@ -43,7 +44,7 @@ public external interface CanvasControlsProps : RProps { public var vision: Vision? } -public val CanvasControls: FunctionalComponent = functionalComponent("CanvasControls") { props -> +public val CanvasControls: FunctionComponent = functionalComponent("CanvasControls") { props -> flexColumn { flexRow { css { @@ -66,7 +67,7 @@ public val CanvasControls: FunctionalComponent = functional } propertyEditor( ownProperties = props.canvasOptions, - allProperties = props.canvasOptions.withDefault(Canvas3DOptions.descriptor.defaultMeta), + allProperties = props.canvasOptions.meta.withDefault(Canvas3DOptions.descriptor.defaultNode), descriptor = Canvas3DOptions.descriptor, expanded = false ) diff --git a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/tabComponent.kt b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/tabComponent.kt index 5ff0d5e8..987dbc0e 100644 --- a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/tabComponent.kt +++ b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/tabComponent.kt @@ -18,7 +18,7 @@ public external class TabProps : RProps { } @JsExport -public val Tab: FunctionalComponent = functionalComponent { props -> +public val Tab: FunctionComponent = functionalComponent { props -> props.children() } @@ -27,7 +27,7 @@ public external class TabPaneProps : RProps { } @JsExport -public val TabPane: FunctionalComponent = functionalComponent("TabPane") { props -> +public val TabPane: FunctionComponent = functionalComponent("TabPane") { props -> var activeTab: String? by useState(props.activeTab) val children: Array = Children.map(props.children) { diff --git a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt index 7f28473e..9c2206f1 100644 --- a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt +++ b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt @@ -3,22 +3,25 @@ package space.kscience.visionforge.bootstrap import org.w3c.dom.Element import react.RBuilder import react.dom.render -import space.kscience.dataforge.meta.descriptors.NodeDescriptor -import space.kscience.visionforge.* +import space.kscience.dataforge.meta.descriptors.MetaDescriptor +import space.kscience.visionforge.Vision +import space.kscience.visionforge.getStyle +import space.kscience.visionforge.meta import space.kscience.visionforge.react.metaViewer import space.kscience.visionforge.react.propertyEditor import space.kscience.visionforge.solid.SolidReference +import space.kscience.visionforge.styles public fun RBuilder.visionPropertyEditor( vision: Vision, - descriptor: NodeDescriptor? = vision.descriptor, + descriptor: MetaDescriptor? = vision.descriptor, key: Any? = null, ) { card("Properties") { propertyEditor( - ownProperties = vision.ownProperties, - allProperties = vision.allProperties(), + ownProperties = vision.meta(false,false,false), + allProperties = vision.meta(), updateFlow = vision.propertyChanges, descriptor = descriptor, key = key @@ -47,7 +50,7 @@ public fun RBuilder.visionPropertyEditor( public fun Element.visionPropertyEditor( item: Vision, - descriptor: NodeDescriptor? = item.descriptor, + descriptor: MetaDescriptor? = item.descriptor, ): Unit = render(this) { visionPropertyEditor(item, descriptor = descriptor) } \ No newline at end of file diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MetaViewer.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MetaViewer.kt index a3972612..288251e0 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MetaViewer.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MetaViewer.kt @@ -8,12 +8,11 @@ import react.* import react.dom.a import react.dom.attrs import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.MetaItemNode -import space.kscience.dataforge.meta.MetaItemValue -import space.kscience.dataforge.meta.descriptors.ItemDescriptor -import space.kscience.dataforge.meta.descriptors.NodeDescriptor +import space.kscience.dataforge.meta.descriptors.MetaDescriptor +import space.kscience.dataforge.meta.descriptors.defaultNode import space.kscience.dataforge.meta.descriptors.get import space.kscience.dataforge.meta.get +import space.kscience.dataforge.meta.isLeaf import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.NameToken import space.kscience.dataforge.names.lastOrNull @@ -41,18 +40,19 @@ public external interface MetaViewerProps : RProps { /** * Root descriptor */ - public var descriptor: NodeDescriptor? + public var descriptor: MetaDescriptor? } -private val MetaViewerItem: FunctionalComponent = functionalComponent("MetaViewerItem") { props -> +private val MetaViewerItem: FunctionComponent = functionalComponent("MetaViewerItem") { props -> metaViewerItem(props) } private fun RBuilder.metaViewerItem(props: MetaViewerProps) { var expanded: Boolean by useState { true } val item = props.root[props.name] - val descriptorItem: ItemDescriptor? = props.descriptor?.get(props.name) - val actualItem = item ?: descriptorItem?.defaultValue + val descriptorItem: MetaDescriptor? = props.descriptor?.get(props.name) + val actualValue = item?.value ?: descriptorItem?.defaultValue + val actualMeta = item ?: descriptorItem?.defaultNode val token = props.name.lastOrNull()?.toString() ?: props.rootName ?: "" @@ -60,90 +60,75 @@ private fun RBuilder.metaViewerItem(props: MetaViewerProps) { expanded = !expanded } - when (actualItem) { - is MetaItemNode -> { - flexRow { + flexRow { + css { + alignItems = Align.center + } + if (actualMeta?.isLeaf == false) { + styledSpan { css { - alignItems = Align.center - } - styledSpan { - css { - +TreeStyles.treeCaret - if (expanded) { - +TreeStyles.treeCaredDown - } - } - attrs { - onClickFunction = expanderClick + +TreeStyles.treeCaret + if (expanded) { + +TreeStyles.treeCaredDown } } - styledSpan { - css { - +TreeStyles.treeLabel - if (item == null) { - +TreeStyles.treeLabelInactive - } - } - +token - } - } - if (expanded) { - flexColumn { - css { - +TreeStyles.tree - } - val keys = buildSet { - (descriptorItem as? NodeDescriptor)?.items?.keys?.forEach { - add(NameToken(it)) - } - actualItem.node.items.keys.let { addAll(it) } - } - - keys.filter { !it.body.startsWith("@") }.forEach { token -> - styledDiv { - css { - +TreeStyles.treeItem - } - child(MetaViewerItem) { - attrs { - this.key = props.name.toString() - this.root = props.root - this.name = props.name + token - this.descriptor = props.descriptor - } - } - //configEditor(props.root, props.name + token, props.descriptor, props.default) - } - } + attrs { + onClickFunction = expanderClick } } } - is MetaItemValue -> { - flexRow { - css { - alignItems = Align.center + + styledSpan { + css { + +TreeStyles.treeLabel + if (item == null) { + +TreeStyles.treeLabelInactive } - styledSpan { + } + +token + } + styledDiv { + a { + +actualValue.toString() + } + } + } + if (expanded) { + flexColumn { + css { + +TreeStyles.tree + } + val keys = buildSet { + descriptorItem?.children?.keys?.forEach { + add(NameToken(it)) + } + actualMeta!!.items.keys.let { addAll(it) } + } + + keys.filter { !it.body.startsWith("@") }.forEach { token -> + styledDiv { css { - +TreeStyles.treeLabel - if (item == null) { - +TreeStyles.treeLabelInactive + +TreeStyles.treeItem + } + child(MetaViewerItem) { + attrs { + this.key = props.name.toString() + this.root = props.root + this.name = props.name + token + this.descriptor = props.descriptor } } - +token - } - styledDiv { - a { - +actualItem.value.toString() - } + //configEditor(props.root, props.name + token, props.descriptor, props.default) } } } } + + } @JsExport -public val MetaViewer: FunctionalComponent = +public val MetaViewer: FunctionComponent = functionalComponent("MetaViewer") { props -> child(MetaViewerItem) { attrs { @@ -155,7 +140,7 @@ public val MetaViewer: FunctionalComponent = } } -public fun RBuilder.metaViewer(meta: Meta, descriptor: NodeDescriptor? = null, key: Any? = null) { +public fun RBuilder.metaViewer(meta: Meta, descriptor: MetaDescriptor? = null, key: Any? = null) { child(MetaViewer) { attrs { this.key = key?.toString() ?: "" diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt index a363fcd5..9f698df7 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt @@ -5,23 +5,23 @@ import org.w3c.dom.HTMLOptionElement import org.w3c.dom.HTMLSelectElement import org.w3c.dom.asList import org.w3c.dom.events.Event -import react.FunctionalComponent +import react.FunctionComponent import react.dom.attrs import react.dom.option import react.dom.select import react.functionalComponent import react.useState -import space.kscience.dataforge.meta.value +import space.kscience.dataforge.meta.descriptors.allowedValues import space.kscience.dataforge.values.asValue import space.kscience.dataforge.values.string @JsExport -public val MultiSelectChooser: FunctionalComponent = +public val MultiSelectChooser: FunctionComponent = functionalComponent("MultiSelectChooser") { props -> - var selectedItems by useState { props.item.value?.list ?: emptyList() } + var selectedItems by useState { props.item?.value?.list ?: emptyList() } val onChange: (Event) -> Unit = { event: Event -> - val newSelected= (event.target as HTMLSelectElement).selectedOptions.asList() + val newSelected = (event.target as HTMLSelectElement).selectedOptions.asList() .map { (it as HTMLOptionElement).value.asValue() } props.valueChanged?.invoke(newSelected.asValue()) selectedItems = newSelected diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt index 6e41555b..cdb1bf30 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt @@ -18,14 +18,10 @@ import react.* import react.dom.attrs import react.dom.render import space.kscience.dataforge.meta.* -import space.kscience.dataforge.meta.descriptors.ItemDescriptor -import space.kscience.dataforge.meta.descriptors.NodeDescriptor -import space.kscience.dataforge.meta.descriptors.ValueDescriptor +import space.kscience.dataforge.meta.descriptors.MetaDescriptor +import space.kscience.dataforge.meta.descriptors.ValueRequirement import space.kscience.dataforge.meta.descriptors.get -import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.NameToken -import space.kscience.dataforge.names.lastOrNull -import space.kscience.dataforge.names.plus +import space.kscience.dataforge.names.* import space.kscience.dataforge.values.Value import space.kscience.visionforge.hidden import styled.css @@ -38,12 +34,12 @@ public external interface PropertyEditorProps : RProps { /** * Root config object - always non null */ - public var ownProperties: MutableItemProvider + public var ownProperties: MutableMetaProvider /** * Provide default item (greyed out if used) */ - public var allProperties: ItemProvider? + public var allProperties: MetaProvider? /** * Full path to the displayed node in [ownProperties]. Could be empty @@ -53,7 +49,7 @@ public external interface PropertyEditorProps : RProps { /** * Root descriptor */ - public var descriptor: NodeDescriptor? + public var descriptor: MetaDescriptor? /** * A coroutine scope for updates @@ -71,21 +67,21 @@ public external interface PropertyEditorProps : RProps { public var expanded: Boolean? } -private val PropertyEditorItem: FunctionalComponent = +private val PropertyEditorItem: FunctionComponent = functionalComponent("ConfigEditorItem") { props -> propertyEditorItem(props) } private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { var expanded: Boolean by useState { props.expanded ?: true } - val descriptorItem: ItemDescriptor? = props.descriptor?.get(props.name) - var ownProperty: MetaItem? by useState { props.ownProperties.getItem(props.name) } - val actualItem: MetaItem? = props.allProperties?.getItem(props.name) + val descriptor: MetaDescriptor? = props.descriptor?.get(props.name) + var ownProperty: Meta? by useState { props.ownProperties.getMeta(props.name) } + val actualMeta = props.allProperties?.getMeta(props.name) val token = props.name.lastOrNull()?.toString() ?: "Properties" fun update() { - ownProperty = props.ownProperties.getItem(props.name) + ownProperty = props.ownProperties.getMeta(props.name) } if (props.updateFlow != null) { @@ -109,7 +105,7 @@ private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { if (it == null) { props.ownProperties.remove(props.name) } else { - props.ownProperties[props.name] = it + props.ownProperties.setValue(props.name, it) } update() } @@ -119,19 +115,20 @@ private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { update() } - if (actualItem is MetaItemNode) { - val keys = buildSet { - (descriptorItem as? NodeDescriptor)?.items?.filterNot { - it.key.startsWith("@") || it.value.hidden - }?.forEach { - add(NameToken(it.key)) - } - ownProperty?.node?.items?.keys?.filterNot { it.body.startsWith("@") }?.let { addAll(it) } + val keys = buildSet { + descriptor?.children?.filterNot { + it.key.startsWith("@") || it.value.hidden + }?.forEach { + add(NameToken(it.key)) } - // Do not show nodes without visible children - if (keys.isEmpty()) return + ownProperty?.items?.keys?.filterNot { it.body.startsWith("@") }?.let { addAll(it) } + } - flexRow { + flexRow { + css { + alignItems = Align.center + } + if(keys.isNotEmpty()) { styledSpan { css { +TreeStyles.treeCaret @@ -143,55 +140,17 @@ private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { onClickFunction = expanderClick } } - styledSpan { - css { - +TreeStyles.treeLabel - if (ownProperty == null) { - +TreeStyles.treeLabelInactive - } - } - +token - } } - if (expanded) { - flexColumn { - css { - +TreeStyles.tree - } - keys.forEach { token -> - styledDiv { - css { - +TreeStyles.treeItem - } - child(PropertyEditorItem) { - attrs { - this.key = props.name.toString() - this.ownProperties = props.ownProperties - this.allProperties = props.allProperties - this.name = props.name + token - this.descriptor = props.descriptor - } - } - //configEditor(props.root, props.name + token, props.descriptor, props.default) - } - } - } - } - } else { - flexRow { + styledSpan { css { - alignItems = Align.center - } - styledSpan { - css { - +TreeStyles.treeLabel - if (ownProperty == null) { - +TreeStyles.treeLabelInactive - } + +TreeStyles.treeLabel + if (ownProperty == null) { + +TreeStyles.treeLabelInactive } - +token } - + +token + } + if(!props.name.isEmpty() && descriptor?.valueRequirement != ValueRequirement.ABSENT) { styledDiv { css { //+TreeStyles.resizeableInput @@ -200,8 +159,8 @@ private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { } valueChooser( props.name, - actualItem, - descriptorItem as? ValueDescriptor, + actualMeta, + descriptor, valueChanged ) } @@ -232,14 +191,38 @@ private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { } } } - } } + if (expanded) { + flexColumn { + css { + +TreeStyles.tree + } + keys.forEach { token -> + styledDiv { + css { + +TreeStyles.treeItem + } + child(PropertyEditorItem) { + attrs { + this.key = props.name.toString() + this.ownProperties = props.ownProperties + this.allProperties = props.allProperties + this.name = props.name + token + this.descriptor = props.descriptor + } + } + //configEditor(props.root, props.name + token, props.descriptor, props.default) + } + } + } + } + } @JsExport -public val PropertyEditor: FunctionalComponent = functionalComponent("PropertyEditor") { props -> +public val PropertyEditor: FunctionComponent = functionalComponent("PropertyEditor") { props -> child(PropertyEditorItem) { attrs { this.key = "" @@ -254,10 +237,10 @@ public val PropertyEditor: FunctionalComponent = functional } public fun RBuilder.propertyEditor( - ownProperties: MutableItemProvider, - allProperties: ItemProvider? = ownProperties, + ownProperties: MutableMetaProvider, + allProperties: MetaProvider? = ownProperties, updateFlow: Flow? = null, - descriptor: NodeDescriptor? = null, + descriptor: MetaDescriptor? = null, scope: CoroutineScope? = null, key: Any? = null, expanded: Boolean? = null @@ -276,8 +259,8 @@ public fun RBuilder.propertyEditor( } @OptIn(ExperimentalCoroutinesApi::class) -private fun Config.flowUpdates(): Flow = callbackFlow { - onChange(this) { name, _, _ -> +private fun ObservableMutableMeta.flowUpdates(): Flow = callbackFlow { + onChange(this) { name -> launch { send(name) } @@ -289,16 +272,16 @@ private fun Config.flowUpdates(): Flow = callbackFlow { public fun RBuilder.configEditor( - config: Config, - default: ItemProvider? = null, - descriptor: NodeDescriptor? = null, + config: ObservableMutableMeta, + default: MetaProvider? = null, + descriptor: MetaDescriptor? = null, key: Any? = null, scope: CoroutineScope? = null, ): Unit = propertyEditor(config, default, config.flowUpdates(), descriptor, scope, key = key) public fun Element.configEditor( - config: Config, - descriptor: NodeDescriptor? = null, + config: ObservableMutableMeta, + descriptor: MetaDescriptor? = null, default: Meta? = null, key: Any? = null, scope: CoroutineScope? = null, diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt index 2b11143b..28513416 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt @@ -6,7 +6,7 @@ import kotlinx.html.InputType import kotlinx.html.js.onChangeFunction import org.w3c.dom.HTMLInputElement import org.w3c.dom.events.Event -import react.FunctionalComponent +import react.FunctionComponent import react.dom.attrs import react.functionalComponent import react.useState @@ -18,7 +18,7 @@ import styled.css import styled.styledInput @JsExport -public val RangeValueChooser: FunctionalComponent = +public val RangeValueChooser: FunctionComponent = functionalComponent("RangeValueChooser") { props -> var innerValue by useState(props.item.double) var rangeDisabled: Boolean by useState(props.item == null) diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt index 6dd563de..41034773 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt @@ -21,7 +21,7 @@ public external interface ThreeCanvasProps : RProps { public var selected: Name? } -public val ThreeCanvasComponent: FunctionalComponent = functionalComponent( +public val ThreeCanvasComponent: FunctionComponent = functionalComponent( "ThreeCanvasComponent" ) { props -> val elementRef = useRef(null) diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt index bcb7e84a..6be045d6 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt @@ -107,7 +107,7 @@ private fun RBuilder.visionTree(props: ObjectTreeProps): Unit { } @JsExport -public val ObjectTree: FunctionalComponent = functionalComponent("ObjectTree") { props -> +public val ObjectTree: FunctionComponent = functionalComponent("ObjectTree") { props -> visionTree(props) } diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt index 2147b191..2cfcc976 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt @@ -13,8 +13,12 @@ import org.w3c.dom.events.Event import react.* import react.dom.attrs import react.dom.option -import space.kscience.dataforge.meta.* -import space.kscience.dataforge.meta.descriptors.ValueDescriptor +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.boolean +import space.kscience.dataforge.meta.descriptors.MetaDescriptor +import space.kscience.dataforge.meta.descriptors.allowedValues +import space.kscience.dataforge.meta.get +import space.kscience.dataforge.meta.string import space.kscience.dataforge.names.Name import space.kscience.dataforge.values.* import space.kscience.visionforge.Colors @@ -24,14 +28,15 @@ import styled.styledInput import styled.styledSelect public external interface ValueChooserProps : RProps { - public var item: MetaItem? - public var descriptor: ValueDescriptor? + public var item: Meta? + public var descriptor: MetaDescriptor? + //public var nullable: Boolean? public var valueChanged: ((Value?) -> Unit)? } @JsExport -public val StringValueChooser: FunctionalComponent = +public val StringValueChooser: FunctionComponent = functionalComponent("StringValueChooser") { props -> var value by useState(props.item.string ?: "") val keyDown: (Event) -> Unit = { event -> @@ -46,7 +51,7 @@ public val StringValueChooser: FunctionalComponent = value = (it.target as HTMLInputElement).value } styledInput(type = InputType.text) { - css{ + css { width = 100.pct } attrs { @@ -58,14 +63,14 @@ public val StringValueChooser: FunctionalComponent = } @JsExport -public val BooleanValueChooser: FunctionalComponent = +public val BooleanValueChooser: FunctionComponent = functionalComponent("BooleanValueChooser") { props -> val handleChange: (Event) -> Unit = { val newValue = (it.target as HTMLInputElement).checked props.valueChanged?.invoke(newValue.asValue()) } styledInput(type = InputType.checkBox) { - css{ + css { width = 100.pct } attrs { @@ -77,7 +82,7 @@ public val BooleanValueChooser: FunctionalComponent = } @JsExport -public val NumberValueChooser: FunctionalComponent = +public val NumberValueChooser: FunctionComponent = functionalComponent("NumberValueChooser") { props -> var innerValue by useState(props.item.string ?: "") val keyDown: (Event) -> Unit = { event -> @@ -95,7 +100,7 @@ public val NumberValueChooser: FunctionalComponent = innerValue = (it.target as HTMLInputElement).value } styledInput(type = InputType.number) { - css{ + css { width = 100.pct } attrs { @@ -116,7 +121,7 @@ public val NumberValueChooser: FunctionalComponent = } @JsExport -public val ComboValueChooser: FunctionalComponent = +public val ComboValueChooser: FunctionComponent = functionalComponent("ComboValueChooser") { props -> var selected by useState(props.item.string ?: "") val handleChange: (Event) -> Unit = { @@ -124,7 +129,7 @@ public val ComboValueChooser: FunctionalComponent = props.valueChanged?.invoke(selected.asValue()) } styledSelect { - css{ + css { width = 100.pct } props.descriptor?.allowedValues?.forEach { @@ -141,10 +146,10 @@ public val ComboValueChooser: FunctionalComponent = } @JsExport -public val ColorValueChooser: FunctionalComponent = +public val ColorValueChooser: FunctionComponent = functionalComponent("ColorValueChooser") { props -> var value by useState( - props.item.value?.let { value -> + props.item?.value?.let { value -> if (value.type == ValueType.NUMBER) Colors.rgbToString(value.int) else value.string } ?: "#000000" @@ -154,7 +159,7 @@ public val ColorValueChooser: FunctionalComponent = props.valueChanged?.invoke(value.asValue()) } styledInput(type = InputType.color) { - css{ + css { width = 100.pct margin(0.px) } @@ -166,11 +171,11 @@ public val ColorValueChooser: FunctionalComponent = } @JsExport -public val ValueChooser: FunctionalComponent = functionalComponent("ValueChooser") { props -> +public val ValueChooser: FunctionComponent = functionalComponent("ValueChooser") { props -> val rawInput by useState(false) val descriptor = props.descriptor - val type = descriptor?.type?.firstOrNull() + val type = descriptor?.valueTypes?.firstOrNull() when { rawInput -> child(StringValueChooser, props) @@ -187,8 +192,8 @@ public val ValueChooser: FunctionalComponent = functionalComp internal fun RBuilder.valueChooser( name: Name, - item: MetaItem?, - descriptor: ValueDescriptor? = null, + item: Meta?, + descriptor: MetaDescriptor? = null, callback: (Value?) -> Unit, ) { child(ValueChooser) { diff --git a/ui/ring/build.gradle.kts b/ui/ring/build.gradle.kts index 84d33b43..84b4112f 100644 --- a/ui/ring/build.gradle.kts +++ b/ui/ring/build.gradle.kts @@ -17,14 +17,13 @@ kotlin{ dependencies{ api(project(":ui:react")) - //TODO replace by kotlin-wrappers - api("ru.mipt.npm:ring-ui:0.1.0") + //api("ru.mipt.npm:ring-ui:0.1.0") + api("org.jetbrains.kotlin-wrappers:kotlin-ring-ui") implementation(npm("@jetbrains/icons", "3.14.1")) implementation(npm("@jetbrains/ring-ui", "4.0.7")) implementation(npm("core-js","3.12.1")) implementation(npm("file-saver", "2.0.2")) - compileOnly(npm("url-loader","4.1.1")) - compileOnly(npm("postcss-loader","5.2.0")) - compileOnly(npm("source-map-loader","2.0.1")) +// compileOnly(npm("url-loader","4.1.1")) +// compileOnly(npm("postcss-loader","5.2.0")) } \ No newline at end of file diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt index 7b427fba..d0aa2ed8 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt @@ -14,8 +14,7 @@ import space.kscience.dataforge.names.NameToken import space.kscience.dataforge.names.isEmpty import space.kscience.dataforge.names.length import space.kscience.visionforge.VisionGroup -import space.kscience.visionforge.allProperties -import space.kscience.visionforge.ownProperties +import space.kscience.visionforge.meta import space.kscience.visionforge.react.ThreeCanvasComponent import space.kscience.visionforge.react.flexColumn import space.kscience.visionforge.react.flexRow @@ -70,7 +69,7 @@ public fun RBuilder.nameCrumbs(name: Name?, link: (Name) -> Unit): ReactElement } @JsExport -public val ThreeCanvasWithControls: FunctionalComponent = +public val ThreeCanvasWithControls: FunctionComponent = functionalComponent("ThreeViewWithControls") { props -> var selected by useState { props.selected } @@ -120,23 +119,23 @@ public val ThreeCanvasWithControls: FunctionalComponent styledDiv { - css{ + css { position = Position.absolute top = 5.px right = 5.px width = 450.px } - Island{ - IslandHeader{ + Island { + IslandHeader { attrs { border = true } nameCrumbs(selected) { selected = it } } - IslandContent{ + IslandContent { propertyEditor( - ownProperties = vision.ownProperties, - allProperties = vision.allProperties(), + ownProperties = vision.meta(false, false, false), + allProperties = vision.meta(), updateFlow = vision.propertyChanges, descriptor = vision.descriptor, key = selected diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringPropertyEditor.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringPropertyEditor.kt index e33dfb2b..f7783898 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringPropertyEditor.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringPropertyEditor.kt @@ -7,16 +7,19 @@ import react.dom.render import ringui.Island import ringui.SmartTabs import ringui.Tab -import space.kscience.dataforge.meta.descriptors.NodeDescriptor -import space.kscience.visionforge.* +import space.kscience.dataforge.meta.descriptors.MetaDescriptor +import space.kscience.visionforge.Vision +import space.kscience.visionforge.getStyle +import space.kscience.visionforge.meta import space.kscience.visionforge.react.flexColumn import space.kscience.visionforge.react.metaViewer import space.kscience.visionforge.react.propertyEditor import space.kscience.visionforge.solid.SolidReference +import space.kscience.visionforge.styles public fun RBuilder.ringPropertyEditor( vision: Vision, - descriptor: NodeDescriptor? = vision.descriptor, + descriptor: MetaDescriptor? = vision.descriptor, key: Any? = null, ) { val styles = if (vision is SolidReference) { @@ -28,8 +31,8 @@ public fun RBuilder.ringPropertyEditor( flexColumn { Island("Properties") { propertyEditor( - ownProperties = vision.ownProperties, - allProperties = vision.allProperties(), + ownProperties = vision.meta(false,false,false), + allProperties = vision.meta(), updateFlow = vision.propertyChanges, descriptor = descriptor, key = key @@ -69,7 +72,7 @@ public fun RBuilder.ringPropertyEditor( public fun Element.ringPropertyEditor( item: Vision, - descriptor: NodeDescriptor? = item.descriptor, + descriptor: MetaDescriptor? = item.descriptor, ): Unit = render(this) { ringPropertyEditor(item, descriptor = descriptor) } \ No newline at end of file diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt index b0fc188c..1d9626ed 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt @@ -15,6 +15,7 @@ import react.dom.button import ringui.Island import ringui.SmartTabs import ringui.Tab +import space.kscience.dataforge.meta.descriptors.defaultNode import space.kscience.dataforge.meta.withDefault import space.kscience.dataforge.names.Name import space.kscience.visionforge.Vision @@ -49,7 +50,7 @@ internal external interface CanvasControlsProps : RProps { public var vision: Vision? } -internal val CanvasControls: FunctionalComponent = functionalComponent("CanvasControls") { props -> +internal val CanvasControls: FunctionComponent = functionalComponent("CanvasControls") { props -> flexColumn { flexRow { css { @@ -73,7 +74,7 @@ internal val CanvasControls: FunctionalComponent = function } propertyEditor( ownProperties = props.options, - allProperties = props.options.withDefault(Canvas3DOptions.descriptor.defaultMeta), + allProperties = props.options.meta.withDefault(Canvas3DOptions.descriptor.defaultNode), descriptor = Canvas3DOptions.descriptor, expanded = false ) @@ -91,7 +92,7 @@ public external interface ThreeControlsProps : RProps { } @JsExport -public val ThreeControls: FunctionalComponent = functionalComponent { props -> +public val ThreeControls: FunctionComponent = functionalComponent { props -> SmartTabs("Tree") { props.vision?.let { Tab("Tree") { diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Colors.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Colors.kt index 3f228272..58be399e 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Colors.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Colors.kt @@ -1,6 +1,8 @@ package space.kscience.visionforge -import space.kscience.dataforge.meta.* +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.get +import space.kscience.dataforge.meta.number import space.kscience.dataforge.values.ValueType import space.kscience.dataforge.values.int import space.kscience.dataforge.values.string @@ -190,25 +192,18 @@ public object Colors { /** * Convert color represented as Meta to string of format #rrggbb */ - fun fromMeta(item: MetaItem): String { - return when (item) { - is MetaItemNode -> { - val node = item.node - rgbToString( - node[RED_KEY].number?.toByte()?.toUByte() ?: 0u, - node[GREEN_KEY].number?.toByte()?.toUByte() ?: 0u, - node[BLUE_KEY].number?.toByte()?.toUByte() ?: 0u - ) - } - is MetaItemValue -> { - if (item.value.type == ValueType.NUMBER) { - rgbToString(item.value.int) - } else { - item.value.string - } - } + fun fromMeta(meta: Meta): String = meta.value?.let { value -> + //if value is present, use it + if (value.type == ValueType.NUMBER) { + rgbToString(value.int) + } else { + value.string } - } + } ?: rgbToString( + meta[RED_KEY].number?.toByte()?.toUByte() ?: 0u, + meta[GREEN_KEY].number?.toByte()?.toUByte() ?: 0u, + meta[BLUE_KEY].number?.toByte()?.toUByte() ?: 0u + ) /** * Convert Int color to string of format #rrggbb diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleReference.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleReference.kt index 961e937a..d5dfac6e 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleReference.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleReference.kt @@ -1,7 +1,7 @@ package space.kscience.visionforge import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.MetaBuilder +import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.meta.Scheme import space.kscience.dataforge.meta.Specification import kotlin.properties.ReadOnlyProperty @@ -27,7 +27,7 @@ public fun Vision.useStyle(reference: StyleReference) { @VisionBuilder public fun VisionGroup.style( styleKey: String? = null, - builder: MetaBuilder.() -> Unit, + builder: MutableMeta.() -> Unit, ): ReadOnlyProperty = ReadOnlyProperty { _, property -> val styleName = styleKey ?: property.name styleSheet.define(styleName, Meta(builder)) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt index 655cb0f3..e2869df8 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt @@ -5,6 +5,7 @@ import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.NameToken import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus +import space.kscience.dataforge.values.asValue import kotlin.jvm.JvmInline /** @@ -13,9 +14,9 @@ import kotlin.jvm.JvmInline @JvmInline public value class StyleSheet(private val owner: VisionGroup) { - private val styleNode get() = owner.ownProperties[STYLESHEET_KEY].node + private val styleNode: Meta? get() = owner.getOwnProperty(STYLESHEET_KEY) - public val items: Map? get() = styleNode?.items?.mapValues { it.value.node ?: Meta.EMPTY } + public val items: Map? get() = styleNode?.items public operator fun get(key: String): Meta? = owner.getStyle(key) @@ -23,7 +24,7 @@ public value class StyleSheet(private val owner: VisionGroup) { * Define a style without notifying owner */ public fun define(key: String, style: Meta?) { - owner.setProperty(STYLESHEET_KEY + key, style) + owner.setPropertyNode(STYLESHEET_KEY + key, style) } /** @@ -40,7 +41,7 @@ public value class StyleSheet(private val owner: VisionGroup) { /** * Create and set a style */ - public operator fun set(key: String, builder: MetaBuilder.() -> Unit) { + public operator fun set(key: String, builder: MutableMeta.() -> Unit) { val newStyle = get(key)?.toMutableMeta()?.apply(builder) ?: Meta(builder) set(key, newStyle.seal()) } @@ -70,9 +71,9 @@ internal fun Vision.styleChanged(key: String, oldStyle: Meta?, newStyle: Meta?) * List of names of styles applied to this object. Order matters. Not inherited. */ public var Vision.styles: List - get() = ownProperties[Vision.STYLE_KEY]?.stringList ?: emptyList() + get() = getOwnProperty(Vision.STYLE_KEY)?.stringList ?: emptyList() set(value) { - setProperty(Vision.STYLE_KEY, value) + setPropertyValue(Vision.STYLE_KEY, value.map { it.asValue() }.asValue()) } /** @@ -85,7 +86,7 @@ public val VisionGroup.styleSheet: StyleSheet get() = StyleSheet(this) * Add style name to the list of styles to be resolved later. The style with given name does not necessary exist at the moment. */ public fun Vision.useStyle(name: String) { - styles = (ownProperties[Vision.STYLE_KEY]?.stringList ?: emptyList()) + name + styles = (getOwnProperty(Vision.STYLE_KEY)?.stringList ?: emptyList()) + name } @@ -93,13 +94,13 @@ public fun Vision.useStyle(name: String) { * Find a style with given name for given [Vision]. The style is not necessary applied to this [Vision]. */ public tailrec fun Vision.getStyle(name: String): Meta? = - ownProperties[StyleSheet.STYLESHEET_KEY + name].node ?: parent?.getStyle(name) + getOwnProperty(StyleSheet.STYLESHEET_KEY + name) ?: parent?.getStyle(name) /** * Resolve an item in all style layers */ -public fun Vision.getStyleItems(name: Name): List = styles.mapNotNull { - getStyle(it)[name] +public fun Vision.getStyleItems(name: Name): List = styles.mapNotNull { + getStyle(it)?.get(name) } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt index 07f063ca..daa854a5 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt @@ -4,14 +4,15 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach -import space.kscience.dataforge.meta.* +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.meta.descriptors.Described -import space.kscience.dataforge.meta.descriptors.NodeDescriptor -import space.kscience.dataforge.meta.descriptors.get +import space.kscience.dataforge.meta.descriptors.MetaDescriptor +import space.kscience.dataforge.meta.update import space.kscience.dataforge.misc.Type import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName -import space.kscience.dataforge.names.toName +import space.kscience.dataforge.values.Value import space.kscience.visionforge.Vision.Companion.TYPE import kotlin.coroutines.CoroutineContext import kotlin.coroutines.EmptyCoroutineContext @@ -45,13 +46,13 @@ public interface Vision : Described, CoroutineScope { inherit: Boolean = false, includeStyles: Boolean = true, includeDefaults: Boolean = true, - ): MetaItem? + ): Meta? /** * Get an intrinsic property of this Vision excluding any inheritance or defaults. In most cases should be the same as * `getProperty(name, false, false, false`. */ - public fun getOwnProperty(name: Name): MetaItem? = getProperty( + public fun getOwnProperty(name: Name): Meta? = getProperty( name, inherit = false, includeStyles = false, @@ -59,9 +60,14 @@ public interface Vision : Described, CoroutineScope { ) /** - * Set the property value + * Replace the property node. If [node] is null remove node and its descendants */ - public fun setProperty(name: Name, item: MetaItem?, notify: Boolean = true) + public fun setPropertyNode(name: Name, node: Meta?, notify: Boolean = true) + + /** + * Set a value of specific property node + */ + public fun setPropertyValue(name: Name, value: Value?, notify: Boolean = true) /** * Flow of property invalidation events. It does not contain property values after invalidation since it is not clear @@ -77,9 +83,9 @@ public interface Vision : Described, CoroutineScope { /** * Update this vision using a dif represented by [VisionChange]. */ - public fun update(change: VisionChange) + public fun change(change: VisionChange) - override val descriptor: NodeDescriptor? + override val descriptor: MetaDescriptor? public companion object { public const val TYPE: String = "vision" @@ -89,11 +95,6 @@ public interface Vision : Described, CoroutineScope { } } -/** - * Root property node - */ -public val Vision.meta: Meta get() = ownProperties[Name.EMPTY]?.node ?: Meta.EMPTY - /** * Subscribe on property updates. The subscription is bound to the given [scope] and canceled when the scope is canceled */ @@ -105,31 +106,26 @@ public fun Vision.onPropertyChange(scope: CoroutineScope, callback: suspend (Nam /** * Own properties, excluding inheritance, styles and descriptor */ -public val Vision.ownProperties: MutableItemProvider - get() = object : MutableItemProvider { - override fun getItem(name: Name): MetaItem? = getOwnProperty(name) - override fun setItem(name: Name, item: MetaItem?): Unit = setProperty(name, item) - } - -/** - * Convenient accessor for all properties of a vision. - * @param inherit - inherit property value from the parent by default. If null, inheritance is inferred from descriptor - */ -public fun Vision.allProperties( - inherit: Boolean? = null, - includeStyles: Boolean? = null, +public fun Vision.meta( + inherit: Boolean = false, + includeStyles: Boolean = true, includeDefaults: Boolean = true, -): MutableItemProvider = object : MutableItemProvider { - override fun getItem(name: Name): MetaItem? = getProperty( - name, - inherit = inherit ?: (descriptor?.get(name)?.inherited == true), - includeStyles = includeStyles ?: (descriptor?.get(name)?.usesStyles != false), - includeDefaults = includeDefaults - ) +): MutableMeta = VisionProperties(this, Name.EMPTY, inherit, includeStyles, includeDefaults) - override fun setItem(name: Name, item: MetaItem?): Unit = setProperty(name, item) +public fun Vision.configure(target: Name = Name.EMPTY, block: MutableMeta.() -> Unit): Unit { + VisionProperties(this, target).apply(block) } +public fun Vision.configure(meta: Meta) { + configure(Name.EMPTY) { + update(meta) + } +} + +public fun Vision.configure(block: MutableMeta.() -> Unit): Unit = configure(Meta(block)) + +public fun Vision.getOwnProperty(key: String): Meta? = getOwnProperty(Name.parse(key)) + /** * Get [Vision] property using key as a String */ @@ -138,18 +134,20 @@ public fun Vision.getProperty( inherit: Boolean = false, includeStyles: Boolean = true, includeDefaults: Boolean = true, -): MetaItem? = getProperty(key.toName(), inherit, includeStyles, includeDefaults) +): Meta? = getProperty(Name.parse(key), inherit, includeStyles, includeDefaults) + /** - * A convenience method to pair [getProperty] + * A convenience method to set property node or value. If Item is null, then node is removed, not a value */ -public fun Vision.setProperty(key: Name, item: Any?) { - setProperty(key, MetaItem.of(item)) +public fun Vision.setProperty(name: Name, item: Any?) { + when (item) { + null -> setPropertyNode(name, null) + is Meta -> setPropertyNode(name, item) + is Value -> setPropertyValue(name, item) + } } -/** - * A convenience method to pair [getProperty] - */ -public fun Vision.setProperty(key: String, item: Any?) { - setProperty(key.toName(), MetaItem.of(item)) +public fun Vision.setPropertyNode(key: String, item: Any?) { + setProperty(Name.parse(key), item) } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt index 4dcffbca..46e5f62a 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt @@ -7,21 +7,18 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.Transient import space.kscience.dataforge.meta.* -import space.kscience.dataforge.meta.descriptors.NodeDescriptor +import space.kscience.dataforge.meta.descriptors.MetaDescriptor +import space.kscience.dataforge.meta.descriptors.defaultNode +import space.kscience.dataforge.meta.descriptors.value import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus -import space.kscience.dataforge.values.Null +import space.kscience.dataforge.values.Value import space.kscience.dataforge.values.ValueType import space.kscience.visionforge.Vision.Companion.STYLE_KEY import kotlin.jvm.Synchronized -internal data class PropertyListener( - val owner: Any? = null, - val action: (name: Name) -> Unit, -) - /** * A full base implementation for a [Vision] * @param properties Object own properties excluding styles and inheritance @@ -29,14 +26,17 @@ internal data class PropertyListener( @Serializable @SerialName("vision") public open class VisionBase( - override @Transient var parent: VisionGroup? = null, - protected var properties: MutableItemProvider? = null + @Transient override var parent: VisionGroup? = null, + @Serializable(MutableMetaSerializer::class) + protected var properties: MutableMeta? = null ) : Vision { + //protected val observableProperties: ObservableMutableMeta by lazy { properties.asObservable() } + @Synchronized - protected fun getOrCreateProperties(): MutableItemProvider { + protected fun getOrCreateProperties(): MutableMeta { if (properties == null) { - val newProperties = MetaBuilder() + val newProperties = MutableMeta() properties = newProperties } return properties!! @@ -45,18 +45,14 @@ public open class VisionBase( /** * A fast accessor method to get own property (no inheritance or styles */ - override fun getOwnProperty(name: Name): MetaItem? = if (name == Name.EMPTY) { - properties?.rootItem - } else { - properties?.getItem(name) - } + override fun getOwnProperty(name: Name): Meta? = properties?.getMeta(name) override fun getProperty( name: Name, inherit: Boolean, includeStyles: Boolean, includeDefaults: Boolean, - ): MetaItem? = if (!inherit && !includeStyles && !includeDefaults) { + ): Meta? = if (!inherit && !includeStyles && !includeDefaults) { getOwnProperty(name) } else { buildList { @@ -68,22 +64,32 @@ public open class VisionBase( add(parent?.getProperty(name, inherit, includeStyles, includeDefaults)) } if (includeDefaults) { - add(descriptor?.defaultMeta?.get(name)) + add(descriptor?.defaultNode?.get(name)) } }.merge() } - override fun setProperty(name: Name, item: MetaItem?, notify: Boolean) { - val oldItem = properties?.getItem(name) - if(oldItem!= item) { - getOrCreateProperties().setItem(name, item) + override fun setPropertyNode(name: Name, node: Meta?, notify: Boolean) { + val oldItem = properties?.get(name) + if (oldItem != node) { + getOrCreateProperties().setMeta(name, node) if (notify) { invalidateProperty(name) } } } - override val descriptor: NodeDescriptor? get() = null + override fun setPropertyValue(name: Name, value: Value?, notify: Boolean) { + val oldItem = properties?.get(name)?.value + if (oldItem != value) { + getOrCreateProperties()[name] = value + if (notify) { + invalidateProperty(name) + } + } + } + + override val descriptor: MetaDescriptor? get() = null private suspend fun updateStyles(names: List) { names.mapNotNull { getStyle(it) }.asSequence() @@ -111,31 +117,23 @@ public open class VisionBase( } } - override fun update(change: VisionChange) { + override fun change(change: VisionChange) { change.properties?.let { - updateProperties(Name.EMPTY, it.asMetaItem()) + updateProperties(Name.EMPTY, it) } } public companion object { - public val descriptor: NodeDescriptor = NodeDescriptor { - value(STYLE_KEY) { - type(ValueType.STRING) + public val descriptor: MetaDescriptor = MetaDescriptor { + value(STYLE_KEY, ValueType.STRING) { multiple = true } } - public fun Vision.updateProperties(at: Name, item: MetaItem) { - when (item) { - is MetaItemValue -> { - if (item.value == Null) { - setProperty(at, null) - } else - setProperty(at, item) - } - is MetaItemNode -> item.node.items.forEach { (token, childItem) -> - updateProperties(at + token, childItem) - } + public fun Vision.updateProperties(at: Name, item: Meta) { + setPropertyValue(at, item.value) + item.items.forEach { (token, item) -> + updateProperties(at + token, item) } } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt index aa50001a..e538a89c 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt @@ -21,7 +21,7 @@ public class VisionChangeBuilder : VisionContainerBuilder { private var reset: Boolean = false private var vision: Vision? = null - private val propertyChange = MetaBuilder() + private val propertyChange = MutableMeta() private val children: HashMap = HashMap() public fun isEmpty(): Boolean = propertyChange.isEmpty() && propertyChange.isEmpty() && children.isEmpty() @@ -30,17 +30,17 @@ public class VisionChangeBuilder : VisionContainerBuilder { private fun getOrPutChild(visionName: Name): VisionChangeBuilder = children.getOrPut(visionName) { VisionChangeBuilder() } - public fun propertyChanged(visionName: Name, propertyName: Name, item: MetaItem?) { + public fun propertyChanged(visionName: Name, propertyName: Name, item: Meta?) { if (visionName == Name.EMPTY) { //Write property removal as [Null] - propertyChange[propertyName] = (item ?: Null.asMetaItem()) + propertyChange[propertyName] = (item ?: Meta(Null)) } else { getOrPutChild(visionName).propertyChanged(Name.EMPTY, propertyName, item) } } override fun set(name: Name?, child: Vision?) { - if(name == null) error("Static children are not allowed in VisionChange") + if (name == null) error("Static children are not allowed in VisionChange") getOrPutChild(name).apply { vision = child reset = vision == null @@ -90,7 +90,7 @@ private fun CoroutineScope.collectChange( //Collect properties change source.onPropertyChange(this) { propertyName -> - val newItem = source.ownProperties[propertyName] + val newItem = source.getOwnProperty(propertyName) collector().propertyChanged(name, propertyName, newItem) } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt index 6b35d971..c7c47901 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt @@ -75,12 +75,12 @@ public interface MutableVisionGroup : VisionGroup, VisionContainerBuilder } -public operator fun VisionContainer.get(str: String): V? = get(str.toName()) +public operator fun VisionContainer.get(str: String): V? = get(Name.parse(str)) public operator fun VisionContainerBuilder.set(token: NameToken, child: V?): Unit = set(token.asName(), child) public operator fun VisionContainerBuilder.set(key: String?, child: V?): Unit = - set(key?.toName(), child) + set(key?.let(Name::parse), child) public fun MutableVisionGroup.removeAll(): Unit = children.keys.map { it.asName() }.forEach { this[it] = null } \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt index 933b55cd..aab27bc5 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt @@ -131,15 +131,15 @@ public open class VisionGroupBase( } } - override fun update(change: VisionChange) { + override fun change(change: VisionChange) { change.children?.forEach { (name, change) -> when { change.delete -> set(name, null) change.vision != null -> set(name, change.vision) - else -> get(name)?.update(change) + else -> get(name)?.change(change) } } - super.update(change) + super.change(change) } } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt index 4f01e839..3f9bfaa8 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt @@ -8,12 +8,10 @@ import kotlinx.serialization.modules.polymorphic import kotlinx.serialization.modules.subclass import space.kscience.dataforge.context.* import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.descriptors.NodeDescriptor -import space.kscience.dataforge.meta.node +import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.toJson -import space.kscience.dataforge.meta.toMetaItem +import space.kscience.dataforge.meta.toMeta import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.toName import kotlin.reflect.KClass public class VisionManager(meta: Meta) : AbstractPlugin(meta) { @@ -48,12 +46,11 @@ public class VisionManager(meta: Meta) : AbstractPlugin(meta) { jsonFormat.encodeToJsonElement(visionSerializer, vision) //TODO remove double transformation with dedicated Meta serial format - public fun decodeFromMeta(meta: Meta, descriptor: NodeDescriptor? = null): Vision = + public fun decodeFromMeta(meta: Meta, descriptor: MetaDescriptor? = null): Vision = decodeFromJson(meta.toJson(descriptor)) - public fun encodeToMeta(vision: Vision, descriptor: NodeDescriptor? = null): Meta = - encodeToJsonElement(vision).toMetaItem(descriptor).node - ?: error("Expected node, but value found. Check your serializer!") + public fun encodeToMeta(vision: Vision, descriptor: MetaDescriptor? = null): Meta = + encodeToJsonElement(vision).toMeta(descriptor) public companion object : PluginFactory { override val tag: PluginTag = PluginTag(name = "vision", group = PluginTag.DATAFORGE_GROUP) @@ -89,7 +86,7 @@ public abstract class VisionPlugin(meta: Meta = Meta.EMPTY) : AbstractPlugin(met protected abstract val visionSerializersModule: SerializersModule override fun content(target: String): Map = when (target) { - VisionManager.VISION_SERIALIZER_MODULE_TARGET -> mapOf(tag.toString().toName() to visionSerializersModule) + VisionManager.VISION_SERIALIZER_MODULE_TARGET -> mapOf(Name.parse(tag.toString()) to visionSerializersModule) else -> super.content(target) } } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt new file mode 100644 index 00000000..363ad729 --- /dev/null +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt @@ -0,0 +1,38 @@ +package space.kscience.visionforge + +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.MutableMeta +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.NameToken +import space.kscience.dataforge.names.plus +import space.kscience.dataforge.values.Value + +internal class VisionProperties( + val vision: Vision, + val rootName: Name, + val inherit: Boolean = false, + val includeStyles: Boolean = true, + val includeDefaults: Boolean = true, +) : MutableMeta { + + override val items: Map + get() = vision.getProperty(rootName, inherit, includeStyles, includeDefaults)?.items?.mapValues { + VisionProperties(vision, rootName + it.key, inherit, includeStyles, includeDefaults) + } ?: emptyMap() + + override var value: Value? + get() = vision.getProperty(rootName, inherit, includeStyles, includeDefaults)?.value + set(value) { + vision.setPropertyValue(rootName, value) + } + + override fun getOrCreate(name: Name): MutableMeta = VisionProperties(vision, rootName + name) + + override fun setMeta(name: Name, node: Meta?) { + vision.setPropertyNode(rootName + name, node) + } + + override fun equals(other: Any?): Boolean = Meta.equals(this, other as? Meta) + override fun hashCode(): Int = Meta.hashCode(this) + override fun toString(): String = Meta.toString(this) +} \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionPropertyContainer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionPropertyContainer.kt index 3710175c..f6f822b7 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionPropertyContainer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionPropertyContainer.kt @@ -1,32 +1,49 @@ package space.kscience.visionforge -import space.kscience.dataforge.meta.* +import space.kscience.dataforge.meta.Configurable +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.ObservableMutableMeta +import space.kscience.dataforge.meta.get import space.kscience.dataforge.names.Name +import space.kscience.dataforge.values.Value /** * Property containers are used to create a symmetric behaviors for vision properties and style builders */ -public interface VisionPropertyContainer { +public interface VisionPropertyContainer { public fun getProperty( name: Name, inherit: Boolean = false, includeStyles: Boolean = true, includeDefaults: Boolean = true, - ): MetaItem? + ): Meta? - public fun setProperty(name: Name, item: MetaItem?, notify: Boolean = true) + /** + * Replace the property node. If [node] is null remove node and its descendants + */ + public fun setPropertyNode(name: Name, node: Meta?, notify: Boolean = true) + + /** + * Set a value of specific property node + */ + public fun setPropertyValue(name: Name, value: Value?, notify: Boolean = true) } -public open class SimpleVisionPropertyContainer(protected val config: ObservableMeta): VisionPropertyContainer{ +public open class SimpleVisionPropertyContainer( + override val meta: ObservableMutableMeta, +) : VisionPropertyContainer, Configurable { override fun getProperty( name: Name, inherit: Boolean, includeStyles: Boolean, includeDefaults: Boolean - ): MetaItem? = config[name] + ): Meta? = meta[name] - override fun setProperty(name: Name, item: MetaItem?, notify: Boolean) { - config[name] = item + override fun setPropertyNode(name: Name, node: Meta?, notify: Boolean) { + this.meta.setMeta(name, node) } + override fun setPropertyValue(name: Name, value: Value?, notify: Boolean) { + this.meta.setValue(name, value) + } } \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt index 287f32bc..a0b64d8b 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt @@ -2,12 +2,13 @@ package space.kscience.visionforge.html import kotlinx.html.* import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.MetaBuilder import space.kscience.dataforge.meta.MetaSerializer +import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.meta.isEmpty import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.toName +import space.kscience.dataforge.names.NameToken +import space.kscience.dataforge.names.asName import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionManager import kotlin.collections.set @@ -25,7 +26,7 @@ public class VisionOutput @PublishedApi internal constructor(public val manager: //TODO expose a way to define required plugins. - public inline fun meta(block: MetaBuilder.() -> Unit) { + public inline fun meta(block: MutableMeta.() -> Unit) { this.meta = Meta(block) } } @@ -36,7 +37,7 @@ public class VisionOutput @PublishedApi internal constructor(public val manager: @VisionDSL public abstract class VisionTagConsumer( private val root: TagConsumer, - public val manager:VisionManager, + public val manager: VisionManager, private val idPrefix: String? = null, ) : TagConsumer by root { @@ -94,11 +95,11 @@ public abstract class VisionTagConsumer( public inline fun TagConsumer.vision( name: String = DEFAULT_VISION_NAME, visionProvider: VisionOutput.() -> Vision, - ): T = vision(name.toName(), visionProvider) + ): T = vision(Name.parse(name), visionProvider) public fun TagConsumer.vision( vision: Vision, - ): T = vision("vision[${vision.hashCode()}]".toName(), vision) + ): T = vision(NameToken("vision", vision.hashCode().toString()).asName(), vision) /** * Process the resulting object produced by [TagConsumer] diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/misc.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/misc.kt index f471b234..900f6f1c 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/misc.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/misc.kt @@ -1,18 +1,20 @@ package space.kscience.visionforge -import space.kscience.dataforge.meta.* +import space.kscience.dataforge.meta.Laminate +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.boolean +import space.kscience.dataforge.meta.isLeaf import space.kscience.dataforge.values.asValue @DslMarker public annotation class VisionBuilder -public fun List.merge(): MetaItem? = when (val first = firstOrNull { it != null }) { - null -> null - is MetaItemValue -> first //fast search for first entry if it is value - is MetaItemNode -> { - //merge nodes if first encountered node is meta - val laminate: Laminate = Laminate(mapNotNull { it.node }) - MetaItemNode(laminate) +public fun List.merge(): Meta? { + val first = firstOrNull { it != null } + return when { + first == null -> null + first.isLeaf -> first //fast search for first entry if it is value + else -> Laminate(filterNotNull()) //merge nodes if first encountered node is meta } } @@ -21,8 +23,4 @@ public fun List.merge(): MetaItem? = when (val first = firstOrNull { */ public var Vision.visible: Boolean? get() = getProperty(Vision.VISIBLE_KEY).boolean - set(value) = setProperty(Vision.VISIBLE_KEY, value?.asValue()) - -public fun Vision.configure(meta: Meta?): Unit = update(VisionChange(properties = meta)) - -public fun Vision.configure(block: MetaBuilder.() -> Unit): Unit = configure(Meta(block)) \ No newline at end of file + set(value) = setPropertyValue(Vision.VISIBLE_KEY, value?.asValue()) \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/schemeDesctiptors.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/schemeDesctiptors.kt index 4187843f..403312ea 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/schemeDesctiptors.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/schemeDesctiptors.kt @@ -2,11 +2,11 @@ package space.kscience.visionforge import space.kscience.dataforge.meta.Scheme import space.kscience.dataforge.meta.SchemeSpec -import space.kscience.dataforge.meta.asObservable -import space.kscience.dataforge.meta.descriptors.NodeDescriptor -import space.kscience.dataforge.meta.descriptors.NodeDescriptorBuilder -import space.kscience.dataforge.meta.descriptors.ValueDescriptorBuilder -import space.kscience.dataforge.meta.toMutableMeta +import space.kscience.dataforge.meta.descriptors.Described +import space.kscience.dataforge.meta.descriptors.MetaDescriptorBuilder +import space.kscience.dataforge.meta.descriptors.item +import space.kscience.dataforge.meta.descriptors.value +import space.kscience.dataforge.names.Name import space.kscience.dataforge.values.ValueType import kotlin.reflect.KProperty1 import kotlin.reflect.typeOf @@ -14,55 +14,53 @@ import kotlin.reflect.typeOf /** * TODO to be moved into the core */ -public inline fun NodeDescriptorBuilder.value( +public inline fun MetaDescriptorBuilder.value( property: KProperty1, - noinline block: ValueDescriptorBuilder.() -> Unit = {}, + noinline block: MetaDescriptorBuilder.() -> Unit = {}, ) { when (typeOf()) { typeOf(), typeOf(), typeOf(), typeOf(), typeOf(), typeOf() -> - value(property.name) { - type(ValueType.NUMBER) + value(property.name, ValueType.NUMBER) { block() } typeOf(), typeOf(), typeOf(), typeOf(), typeOf(), typeOf() -> - value(property.name) { - type(ValueType.NUMBER) + value(property.name, ValueType.NUMBER) { block() } - typeOf() -> value(property.name) { - type(ValueType.BOOLEAN) + typeOf() -> value(property.name, ValueType.BOOLEAN) { block() } typeOf>(), typeOf>(), typeOf>(), typeOf>(), typeOf>(), typeOf>(), typeOf(), typeOf(), typeOf(), typeOf(), typeOf(), - -> value(property.name) { - type(ValueType.NUMBER) + -> value(property.name, ValueType.NUMBER) { multiple = true block() } - typeOf() -> value(property.name) { - type(ValueType.STRING) + typeOf() -> value(property.name, ValueType.STRING) { block() } - typeOf>(), typeOf>() -> value(property.name) { - type(ValueType.STRING) + typeOf>(), typeOf>() -> value(property.name, ValueType.STRING) { multiple = true block() } - else -> value(property.name, block) + else -> item(property.name, block) } } -public fun NodeDescriptor.copy(block: NodeDescriptorBuilder.() -> Unit = {}): NodeDescriptor { - return NodeDescriptorBuilder(toMeta().toMutableMeta().asObservable()).apply(block) +public fun MetaDescriptorBuilder.item( + key: String, + described: Described, + block: MetaDescriptorBuilder.() -> Unit = {}, +) { + described.descriptor?.let { + item(Name.parse(key), it, block) + } } -public inline fun NodeDescriptorBuilder.scheme( +public inline fun MetaDescriptorBuilder.scheme( property: KProperty1, spec: SchemeSpec, - noinline block: NodeDescriptorBuilder.() -> Unit = {}, + noinline block: MetaDescriptorBuilder.() -> Unit = {}, ) { - spec.descriptor?.let { descriptor -> - item(property.name, descriptor.copy(block)) - } -} \ No newline at end of file + item(property.name, spec, block) +} diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visionDelegates.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visionDelegates.kt new file mode 100644 index 00000000..524363d7 --- /dev/null +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visionDelegates.kt @@ -0,0 +1,93 @@ +package space.kscience.visionforge + +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.transformations.MetaConverter +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.values.Value +import space.kscience.dataforge.values.number +import kotlin.properties.ReadWriteProperty +import kotlin.reflect.KProperty + +public fun Vision.propertyNode( + name: Name? = null, + inherit: Boolean = false, + includeStyles: Boolean = true, + includeDefaults: Boolean = true, +): ReadWriteProperty = object : ReadWriteProperty { + override fun getValue(thisRef: Any?, property: KProperty<*>): Meta? = + getProperty(name ?: Name.parse(property.name), inherit, includeStyles, includeDefaults) + + override fun setValue(thisRef: Any?, property: KProperty<*>, value: Meta?) { + setPropertyNode(name ?: Name.parse(property.name), value) + } +} + +public fun Vision.propertyNode( + converter: MetaConverter, + name: Name? = null, + inherit: Boolean = false, + includeStyles: Boolean = true, + includeDefaults: Boolean = true, +): ReadWriteProperty = object : ReadWriteProperty { + override fun getValue(thisRef: Any?, property: KProperty<*>): T? = getProperty( + name ?: Name.parse(property.name), + inherit, + includeStyles, + includeDefaults + )?.let(converter::metaToObject) + + override fun setValue(thisRef: Any?, property: KProperty<*>, value: T?) { + setPropertyNode(name ?: Name.parse(property.name), value?.let(converter::objectToMeta)) + } +} + +public fun Vision.propertyValue( + name: Name? = null, + inherit: Boolean = false, + includeStyles: Boolean = true, + includeDefaults: Boolean = true, +): ReadWriteProperty = object : ReadWriteProperty { + override fun getValue(thisRef: Any?, property: KProperty<*>): Value? = + getProperty(name ?: Name.parse(property.name), inherit, includeStyles, includeDefaults)?.value + + override fun setValue(thisRef: Any?, property: KProperty<*>, value: Value?) { + setPropertyValue(name ?: Name.parse(property.name), value) + } +} + +public fun Vision.propertyValue( + name: Name? = null, + inherit: Boolean = false, + includeStyles: Boolean = true, + includeDefaults: Boolean = true, + setter: (T) -> Value? = { it?.let(Value::of) }, + getter: (Value?) -> T, +): ReadWriteProperty = object : ReadWriteProperty { + override fun getValue(thisRef: Any?, property: KProperty<*>): T = getProperty( + name ?: Name.parse(property.name), + inherit, + includeStyles, + includeDefaults + )?.value.let(getter) + + override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) { + setPropertyValue(name ?: Name.parse(property.name), value?.let(setter)) + } +} + +public fun Vision.numberProperty( + name: Name? = null, + inherit: Boolean = false, + includeStyles: Boolean = true, + includeDefaults: Boolean = true +): ReadWriteProperty = propertyValue(name, inherit, includeStyles, includeDefaults) { it?.number } + +public fun Vision.numberProperty( + name: Name? = null, + inherit: Boolean = false, + includeStyles: Boolean = true, + includeDefaults: Boolean = true, + default: () -> Number +): ReadWriteProperty = propertyValue(name, inherit, includeStyles, includeDefaults) { + it?.number ?: default() +} \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visionDescriptor.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visionDescriptor.kt index c56b495e..de505c50 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visionDescriptor.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visionDescriptor.kt @@ -2,87 +2,63 @@ package space.kscience.visionforge import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.* -import space.kscience.dataforge.names.Name -import space.kscience.dataforge.values.ValueType +import space.kscience.dataforge.names.asName import space.kscience.dataforge.values.asValue private const val INHERITED_DESCRIPTOR_ATTRIBUTE = "inherited" private const val STYLE_DESCRIPTOR_ATTRIBUTE = "useStyles" -public val ItemDescriptor.inherited: Boolean +public val MetaDescriptor.inherited: Boolean get() = attributes[INHERITED_DESCRIPTOR_ATTRIBUTE].boolean ?: false -public var ItemDescriptorBuilder.inherited: Boolean +public var MetaDescriptorBuilder.inherited: Boolean get() = attributes[INHERITED_DESCRIPTOR_ATTRIBUTE].boolean ?: false - set(value) = attributes { - set(INHERITED_DESCRIPTOR_ATTRIBUTE, value) - } + set(value) = attributes.set(INHERITED_DESCRIPTOR_ATTRIBUTE, value) -public val ItemDescriptor.usesStyles: Boolean + +public val MetaDescriptor.usesStyles: Boolean get() = attributes[STYLE_DESCRIPTOR_ATTRIBUTE].boolean ?: true -public var ItemDescriptorBuilder.usesStyles: Boolean +public var MetaDescriptorBuilder.usesStyles: Boolean get() = attributes[STYLE_DESCRIPTOR_ATTRIBUTE].boolean ?: true - set(value) = attributes { - set(STYLE_DESCRIPTOR_ATTRIBUTE, value) - } + set(value) = attributes.set(STYLE_DESCRIPTOR_ATTRIBUTE, value) public val Vision.describedProperties: Meta get() = Meta { - descriptor?.items?.forEach { (key, descriptor) -> - key put getProperty(key, inherit = descriptor.inherited) + descriptor?.children?.forEach { (key, descriptor) -> + this.setMeta(key.asName(), getProperty(key, inherit = descriptor.inherited)) } } -public val ValueDescriptor.widget: Meta - get() = attributes["widget"].node ?: Meta.EMPTY +public val MetaDescriptor.widget: Meta + get() = attributes["widget"] ?: Meta.EMPTY /** * Extension property to access the "widget" key of [ValueDescriptor] */ -public var ValueDescriptorBuilder.widget: Meta - get() = attributes["widget"].node ?: Meta.EMPTY +public var MetaDescriptorBuilder.widget: Meta + get() = attributes["widget"] ?: Meta.EMPTY set(value) { - attributes { - set("widget", value) - } + attributes["widget"] = value } -public val ValueDescriptor.widgetType: String? +public val MetaDescriptor.widgetType: String? get() = attributes["widget.type"].string /** * Extension property to access the "widget.type" key of [ValueDescriptor] */ -public var ValueDescriptorBuilder.widgetType: String? +public var MetaDescriptorBuilder.widgetType: String? get() = attributes["widget.type"].string set(value) { - attributes { - set("widget.type", value) - } + attributes["widget.type"] = value?.asValue() } /** * If true, this item is hidden in property editor. Default is false */ -public val ItemDescriptor.hidden: Boolean +public val MetaDescriptor.hidden: Boolean get() = attributes["widget.hide"].boolean ?: false -public fun ItemDescriptorBuilder.hide(): Unit = attributes { - set("widget.hide", true) -} - - -public inline fun > NodeDescriptorBuilder.enum( - key: Name, - default: E?, - crossinline modifier: ValueDescriptorBuilder.() -> Unit = {}, -): Unit = value(key) { - type(ValueType.STRING) - default?.let { - default(default) - } - allowedValues = enumValues().map { it.asValue() } - modifier() -} \ No newline at end of file +public fun MetaDescriptorBuilder.hide(): Unit = attributes.set("widget.hide", true) \ No newline at end of file diff --git a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt index 1199b89b..2a7c6d28 100644 --- a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt +++ b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt @@ -57,7 +57,7 @@ class HtmlTagTest { div { h2 { +"Properties" } ul { - (vision as? VisionBase)?.meta?.items?.forEach { + (vision as? VisionBase)?.meta()?.items?.forEach { li { a { +it.key.toString() } p { +it.value.toString() } diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt index 017c615d..ae691d4b 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt @@ -92,7 +92,7 @@ public class VisionClient : AbstractPlugin() { } logger.debug { "Got update $change for output with name $name" } - vision.update(change) + vision.change(change) } else { console.error("WebSocket message data is not a string") } diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/FXPlugin.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/FXPlugin.kt index 5e7994ef..d8210a13 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/FXPlugin.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/FXPlugin.kt @@ -115,5 +115,5 @@ public class ApplicationSurrogate : App() { } public fun Context.display(width: Double = 800.0, height: Double = 600.0, component: () -> UIComponent) { - plugins.fetch(FXPlugin).display(component(), width, height) + fetch(FXPlugin).display(component(), width, height) } \ No newline at end of file diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ComboBoxValueChooser.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ComboBoxValueChooser.kt index a3d5c942..a99599ee 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ComboBoxValueChooser.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ComboBoxValueChooser.kt @@ -9,8 +9,8 @@ import javafx.collections.FXCollections import javafx.scene.control.ComboBox import javafx.util.StringConverter import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.descriptors.allowedValues import space.kscience.dataforge.meta.get -import space.kscience.dataforge.meta.value import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.dataforge.values.Value @@ -56,7 +56,7 @@ public class ComboBoxValueChooser(public val values: Collection? = null) override val name: Name = "combo".asName() override fun invoke(meta: Meta): ValueChooser = - ComboBoxValueChooser(meta["values"].value?.list) + ComboBoxValueChooser(meta["values"]?.value?.list) } } diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ConfigEditor.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ConfigEditor.kt deleted file mode 100644 index 76d32f57..00000000 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ConfigEditor.kt +++ /dev/null @@ -1,189 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package space.kscience.visionforge.editor - -import de.jensd.fx.glyphs.fontawesome.FontAwesomeIcon -import de.jensd.fx.glyphs.fontawesome.FontAwesomeIconView -import javafx.scene.Node -import javafx.scene.control.* -import javafx.scene.control.cell.TextFieldTreeTableCell -import javafx.scene.layout.BorderPane -import javafx.scene.layout.HBox -import javafx.scene.layout.Priority -import javafx.scene.paint.Color -import javafx.scene.text.Text -import space.kscience.dataforge.context.Global -import space.kscience.dataforge.meta.Config -import space.kscience.dataforge.meta.descriptors.NodeDescriptor -import space.kscience.dataforge.names.NameToken -import space.kscience.visionforge.dfIconView -import tornadofx.* - -/** - * A configuration editor fragment - * - * @author Alexander Nozik - */ -public class ConfigEditor( - public val rootNode: FXMetaNode, - public val allowNew: Boolean = true, - title: String = "Configuration editor" -) : Fragment(title = title, icon = dfIconView) { - //TODO replace parameters by properties - - public constructor(config: Config, descriptor: NodeDescriptor?, title: String = "Configuration editor") : - this(FXMeta.root(config, descriptor = descriptor), title = title) - - override val root: BorderPane = borderpane { - center = treetableview> { - root = TreeItem(rootNode) - root.isExpanded = true - sortMode = TreeSortMode.ALL_DESCENDANTS - columnResizePolicy = TreeTableView.CONSTRAINED_RESIZE_POLICY - populate { - when (val fxMeta = it.value) { - is FXMetaNode -> { - fxMeta.children - } - is FXMetaValue -> null - } - } - column("Name", FXMeta::name) { - setCellFactory { - object : TextFieldTreeTableCell, NameToken>() { - override fun updateItem(item: NameToken?, empty: Boolean) { - super.updateItem(item, empty) - contextMenu?.items?.removeIf { it.text == "Remove" } - if (!empty) { - if (treeTableRow.item != null) { - textFillProperty().bind(treeTableRow.item.hasValue.objectBinding { - if (it == true) { - Color.BLACK - } else { - Color.GRAY - } - }) - if (treeTableRow.treeItem.value.parent != null && treeTableRow.treeItem.value.hasValue.get()) { - contextmenu { - item("Remove") { - action { - treeTableRow.item.remove() - } - } - } - } - } - } - } - } - } - } - - column("Value") { param: TreeTableColumn.CellDataFeatures, FXMeta> -> - param.value.valueProperty() - }.setCellFactory { - ValueCell() - } - - column("Description") { param: TreeTableColumn.CellDataFeatures, String> -> param.value.value.descriptionProperty } - .setCellFactory { param: TreeTableColumn, String> -> - val cell = TreeTableCell, String>() - val text = Text() - cell.graphic = text - cell.prefHeight = Control.USE_COMPUTED_SIZE - text.wrappingWidthProperty().bind(param.widthProperty()) - text.textProperty().bind(cell.itemProperty()) - cell - } - } - } - - private fun showNodeDialog(): String? { - val dialog = TextInputDialog() - dialog.title = "Node name selection" - dialog.contentText = "Enter a name for new node: " - dialog.headerText = null - - val result = dialog.showAndWait() - return result.orElse(null) - } - - private fun showValueDialog(): String? { - val dialog = TextInputDialog() - dialog.title = "Value name selection" - dialog.contentText = "Enter a name for new value: " - dialog.headerText = null - - val result = dialog.showAndWait() - return result.orElse(null) - } - - private inner class ValueCell : TreeTableCell, FXMeta?>() { - - public override fun updateItem(item: FXMeta?, empty: Boolean) { - if (!empty) { - if (item != null) { - when (item) { - is FXMetaValue -> { - text = null - val chooser = ValueChooser.build( - Global, - item.valueProperty, - item.descriptor - ) { - item.set(it) - } - graphic = chooser.node - } - is FXMetaNode -> { - if (allowNew) { - text = null - graphic = HBox().apply { - val glyph: Node = FontAwesomeIconView(FontAwesomeIcon.PLUS_CIRCLE) - button("node", graphic = glyph) { - hgrow = Priority.ALWAYS - maxWidth = Double.POSITIVE_INFINITY - action { - showNodeDialog()?.let { - item.addNode(it) - } - } - } - button("value", graphic = FontAwesomeIconView(FontAwesomeIcon.PLUS_SQUARE)) { - hgrow = Priority.ALWAYS - maxWidth = Double.POSITIVE_INFINITY - action { - showValueDialog()?.let { - item.addValue(it) - } - } - } - } - } else { - text = "" - } - } - } - - } else { - text = null - graphic = null - } - } else { - text = null - graphic = null - } - } - - } - - companion object { - /** - * The tag not to display node or value in configurator - */ - const val NO_CONFIGURATOR_TAG = "nocfg" - } -} diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/FXMeta.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/FXMeta.kt deleted file mode 100644 index 3e2cfc8d..00000000 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/FXMeta.kt +++ /dev/null @@ -1,223 +0,0 @@ -package space.kscience.visionforge.editor - -import javafx.beans.binding.ListBinding -import javafx.beans.binding.ObjectBinding -import javafx.beans.property.SimpleObjectProperty -import javafx.beans.value.ObservableBooleanValue -import javafx.beans.value.ObservableStringValue -import javafx.collections.ObservableList -import space.kscience.dataforge.meta.* -import space.kscience.dataforge.meta.descriptors.ItemDescriptor -import space.kscience.dataforge.meta.descriptors.NodeDescriptor -import space.kscience.dataforge.meta.descriptors.ValueDescriptor -import space.kscience.dataforge.names.* -import space.kscience.dataforge.values.Null -import space.kscience.dataforge.values.Value -import tornadofx.* - -/** - * A display for meta and descriptor - */ -sealed class FXMeta> : Comparable> { - abstract val name: NameToken - abstract val parent: FXMetaNode? - abstract val descriptionProperty: ObservableStringValue - abstract val descriptor: ItemDescriptor? - - abstract val hasValue: ObservableBooleanValue - - override fun compareTo(other: FXMeta<*>): Int { - return if (this.hasValue.get() == other.hasValue.get()) { - this.name.toString().compareTo(other.name.toString()) - } else { - this.hasValue.get().compareTo(other.hasValue.get()) - } - } - - companion object { - fun > root( - node: M, - descriptor: NodeDescriptor? = null, - rootName: String = "root" - ): FXMetaNode = - FXMetaNode(NameToken(rootName), null, node, descriptor) - - fun root(node: Meta, descriptor: NodeDescriptor? = null, rootName: String = "root"): FXMetaNode = - root(node.seal(), descriptor, rootName) - } -} - -class FXMetaNode>( - override val name: NameToken, - override val parent: FXMetaNode?, - nodeValue: M? = null, - descriptorValue: NodeDescriptor? = null -) : FXMeta() { - - /** - * A descriptor that could be manually set to the node - */ - private val innerDescriptorProperty = SimpleObjectProperty(descriptorValue) - - /** - * Actual descriptor which holds value inferred from parrent - */ - val descriptorProperty = objectBinding(innerDescriptorProperty) { - value ?: parent?.descriptor?.nodes?.get(this@FXMetaNode.name.body) - } - - override val descriptor: NodeDescriptor? by descriptorProperty - - private val innerNodeProperty = SimpleObjectProperty(nodeValue) - - val nodeProperty: ObjectBinding = objectBinding(innerNodeProperty) { - value ?: parent?.node?.get(this@FXMetaNode.name).node - } - - val node: M? by nodeProperty - - override val descriptionProperty = innerDescriptorProperty.stringBinding { it?.info ?: "" } - - override val hasValue: ObservableBooleanValue = nodeProperty.booleanBinding { it != null } - - private val filter: (FXMeta) -> Boolean = { cfg -> - !(cfg.descriptor?.attributes?.get(ConfigEditor.NO_CONFIGURATOR_TAG)?.boolean ?: false) - } - - val children = object : ListBinding>() { - - init { - bind(nodeProperty, descriptorProperty) - - val listener: (Name, MetaItem?, MetaItem?) -> Unit = { name, _, _ -> - if (name.length == 1) invalidate() - } - - (node as? Config)?.onChange(this, listener) - - nodeProperty.addListener { _, oldValue, newValue -> - if (newValue == null) { - (oldValue as? Config)?.removeListener(this) - } - - if (newValue is Config) { - newValue.onChange(this, listener) - } - } - } - - override fun computeValue(): ObservableList> { - val nodeKeys = node?.items?.keys?.toSet() ?: emptySet() - val descriptorKeys = descriptor?.items?.keys?.map { NameToken(it) } ?: emptyList() - val keys: Set = nodeKeys + descriptorKeys - - val items = keys.map { token -> - val actualItem = node?.items?.get(token) - val actualDescriptor = descriptor?.items?.get(token.body) - - if (actualItem is MetaItemNode || actualDescriptor is NodeDescriptor) { - FXMetaNode(token, this@FXMetaNode) - } else { - FXMetaValue(token, this@FXMetaNode) - } - } - - return items.filter(filter).asObservable() - } - } - - init { - if (parent != null) { - parent.descriptorProperty.onChange { descriptorProperty.invalidate() } - parent.nodeProperty.onChange { nodeProperty.invalidate() } - } - } -} - -public class FXMetaValue>( - override val name: NameToken, - override val parent: FXMetaNode -) : FXMeta() { - - public val descriptorProperty = parent.descriptorProperty.objectBinding { - it?.values?.get(name.body) - } - - /** - * A descriptor that could be manually set to the node - */ - override val descriptor: ValueDescriptor? by descriptorProperty - - //private val innerValueProperty = SimpleObjectProperty(value) - - public val valueProperty = descriptorProperty.objectBinding { descriptor -> - parent.node?.get(name).value ?: descriptor?.default - } - - override val hasValue: ObservableBooleanValue = parent.nodeProperty.booleanBinding { it?.get(name) != null } - - public val value by valueProperty - - override val descriptionProperty = descriptorProperty.stringBinding { it?.info ?: "" } -} - -public fun > FXMetaNode.remove(name: NameToken) { - node?.remove(name.asName()) - children.invalidate() -} - -private fun > M.createEmptyNode(token: NameToken, append: Boolean): M { - return if (append && token.hasIndex()) { - val name = token.asName() - val index = (getIndexed(name).keys.mapNotNull { it?.toIntOrNull() }.maxOrNull() ?: -1) + 1 - val newName = name.withIndex(index.toString()) - set(newName, Meta.EMPTY) - get(newName).node!! - } else { - this.set(token.asName(), Meta.EMPTY) - //FIXME possible concurrency bug - get(token).node!! - } -} - -fun > FXMetaNode.getOrCreateNode(): M { - val node = node - return when { - node != null -> node - parent != null -> parent.getOrCreateNode().createEmptyNode(this.name, descriptor?.multiple == true).also { - parent.children.invalidate() - } - else -> kotlin.error("Orphan empty node is not allowed") - } - -} - -fun > FXMeta.remove() { - parent?.node?.remove(name.asName()) -} - -fun > FXMetaNode.addValue(key: String) { - val parent = getOrCreateNode() - if (descriptor?.multiple == true) { - parent.append(key, Null) - } else { - parent[key] = Null - } -} - -fun > FXMetaNode.addNode(key: String) { - val parent = getOrCreateNode() - if (descriptor?.multiple == true) { - parent.append(key, Meta.EMPTY) - } else { - parent[key] = Meta.EMPTY - } -} - -fun > FXMetaValue.set(value: Value?) { - if (descriptor?.multiple == true) { - parent.getOrCreateNode().append(this.name.body, value) - } else { - parent.getOrCreateNode()[this.name] = value - } -} \ No newline at end of file diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/FXMetaModel.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/FXMetaModel.kt new file mode 100644 index 00000000..a3509221 --- /dev/null +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/FXMetaModel.kt @@ -0,0 +1,217 @@ +package space.kscience.visionforge.editor + +import javafx.beans.binding.Binding +import javafx.beans.binding.BooleanBinding +import javafx.beans.binding.ListBinding +import javafx.beans.property.SimpleObjectProperty +import javafx.collections.ObservableList +import space.kscience.dataforge.meta.* +import space.kscience.dataforge.meta.descriptors.MetaDescriptor +import space.kscience.dataforge.meta.descriptors.get +import space.kscience.dataforge.names.* +import space.kscience.dataforge.values.Value +import tornadofx.* + +/** + * A display for meta and descriptor + */ +public class FXMetaModel( + public val root: M, + public val rootDescriptor: MetaDescriptor?, + public val nodeName: Name, + public val title: String = nodeName.lastOrNull()?.toString() ?: "Meta" +) : Comparable> { + + private val existingNode = SimpleObjectProperty(root[nodeName]) + + public val children: ListBinding> = object : ListBinding>() { + override fun computeValue(): ObservableList> { + val nodeKeys = existingNode.get().items.keys + val descriptorKeys = descriptor?.children?.keys?.map { NameToken(it) } ?: emptySet() + return (nodeKeys + descriptorKeys).map { + FXMetaModel( + root, + rootDescriptor, + nodeName + it + ) + }.filter(filter).asObservable() + } + } + + init { + //add listener to the root node if possible + if (root is ObservableMeta) { + root.onChange(this) { changed -> + if (changed.startsWith(nodeName)) { + if (nodeName.length == changed.length) existingNode.set(root[nodeName]) + else if (changed.length == nodeName.length + 1) children.invalidate() + } + } + } + } + + public val descriptor: MetaDescriptor? = rootDescriptor?.get(nodeName) + + public val existsProperty: BooleanBinding = existingNode.isNotNull + + public val exists: Boolean by existsProperty + + public val valueProperty: Binding = existingNode.objectBinding { + existingNode.get().value ?: descriptor?.defaultValue + } + + override fun compareTo(other: FXMetaModel<*>): Int = if (this.exists == other.exists) { + this.nodeName.toString().compareTo(other.nodeName.toString()) + } else { + this.exists.compareTo(other.exists) + } + + public companion object { + private val filter: (FXMetaModel<*>) -> Boolean = { cfg -> + !(cfg.descriptor?.attributes?.get(MutableMetaEditor.NO_CONFIGURATOR_TAG)?.boolean ?: false) + } + + public fun root( + node: M, + descriptor: MetaDescriptor? = null, + rootName: String = "root" + ): FXMetaModel = FXMetaModel(node, descriptor, Name.EMPTY, title = rootName) + } + +// /** +// * A descriptor that could be manually set to the node +// */ +// private val innerDescriptorProperty = SimpleObjectProperty(descriptorValue) +// +// /** +// * Actual descriptor which holds value inferred from parrent +// */ +// val descriptorProperty: ObjectBinding = objectBinding(innerDescriptorProperty) { +// value ?: parent?.descriptor?.get(this@FXMeta.name.body) +// } +// +// val descriptor: MetaDescriptor? by descriptorProperty +// +// private val innerNodeProperty = SimpleObjectProperty(nodeValue) +// +// val nodeProperty: ObjectBinding = objectBinding(innerNodeProperty) { +// value ?: parent?.node?.get(this@FXMeta.name) +// } +// +// val node by nodeProperty +// +// val hasValue: ObservableBooleanValue = nodeProperty.booleanBinding { it != null } +// +// private val filter: (FXMeta) -> Boolean = { cfg -> +// !(cfg.descriptor?.attributes?.get(MutableMetaEditor.NO_CONFIGURATOR_TAG)?.boolean ?: false) +// } +// +// val children: ListBinding> = object : ListBinding>() { +// +// init { +// bind(nodeProperty, descriptorProperty) +// +// val listener: Meta.(Name) -> Unit = { name -> +// if (name.length == 1) invalidate() +// } +// +// (node as? ObservableMeta)?.onChange(this, listener) +// +// nodeProperty.addListener { _, oldValue, newValue -> +// if (newValue == null) { +// (oldValue as? ObservableMeta)?.removeListener(this) +// } +// +// if (newValue is ObservableMeta) { +// newValue.onChange(this, listener) +// } +// } +// } +// +// override fun computeValue(): ObservableList> { +// val nodeKeys = node?.items?.keys?.toSet() ?: emptySet() +// val descriptorKeys = descriptor?.children?.keys?.map { NameToken(it) } ?: emptyList() +// val keys: Set = nodeKeys + descriptorKeys +// +// val items = keys.map { token -> +// val actualItem = node?.items?.get(token) +// val actualDescriptor = descriptor?.children?.get(token.body) +// +// if (actualItem is MetaNode) { +// FXMetaNode(token, this@FXMetaNode) +// } else { +// FXMetaValue(token, this@FXMetaNode) +// } +// } +// +// return items.filter(filter).asObservable() +// } +// } +// +// init { +// if (parent != null) { +// parent.descriptorProperty.onChange { descriptorProperty.invalidate() } +// parent.nodeProperty.onChange { nodeProperty.invalidate() } +// } +// } +// +} + +// +//internal fun FXMeta.remove(name: NameToken) { +// node?.remove(name.asName()) +// children.invalidate() +//} +// +//private fun M.createEmptyNode(token: NameToken, append: Boolean): M { +// return if (append && token.hasIndex()) { +// val name = token.asName() +// val index = (getIndexed(name).keys.mapNotNull { it?.toIntOrNull() }.maxOrNull() ?: -1) + 1 +// val newName = name.withIndex(index.toString()) +// set(newName, Meta.EMPTY) +// get(newName).node +// } else { +// this.set(token.asName(), Meta.EMPTY) +// //FIXME possible concurrency bug +// get(token).node +// } +//} +// +//internal fun FXMeta.getOrCreateNode(): M { +// val node = node +// return when { +// node != null -> node +// parent != null -> parent.getOrCreateNode().createEmptyNode(this.name, descriptor?.multiple == true).also { +// parent.children.invalidate() +// } +// else -> kotlin.error("Orphan empty node is not allowed") +// } +// +//} + +internal fun FXMetaModel.remove() { + root.remove(nodeName) +} + +// +//internal fun FXMeta.addValue(key: String) { +// val parent = getOrCreateNode() +// if (descriptor?.multiple == true) { +// parent.append(key, Null) +// } else { +// parent[key] = Null +// } +//} +// +//internal fun FXMeta.addNode(key: String) { +// val parent = getOrCreateNode() +// if (descriptor?.multiple == true) { +// parent.append(key, Meta.EMPTY) +// } else { +// parent[key] = Meta.EMPTY +// } +//} +// +internal fun FXMetaModel.setValue(value: Value?) { + root.setValue(nodeName, value) +} \ No newline at end of file diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/MetaViewer.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/MetaViewer.kt index 1a822793..92c1222f 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/MetaViewer.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/MetaViewer.kt @@ -16,45 +16,42 @@ package space.kscience.visionforge.editor -import javafx.beans.property.SimpleStringProperty import javafx.scene.control.TreeItem import javafx.scene.control.TreeSortMode import javafx.scene.control.TreeTableView +import javafx.scene.layout.BorderPane import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.values.string import space.kscience.visionforge.dfIconView import tornadofx.* -class MetaViewer(val rootNode: FXMetaNode<*>, title: String = "Meta viewer") : Fragment(title, - dfIconView -) { - constructor(meta: Meta, title: String = "Meta viewer"): this( - FXMeta.root( - meta - ),title = title) +public class MetaViewer( + private val rootNode: FXMetaModel, + title: String = "Meta viewer" +) : Fragment(title, dfIconView) { - override val root = borderpane { + public constructor(meta: Meta, title: String = "Meta viewer") : this( + FXMetaModel.root( + meta + ), title = title + ) + + override val root: BorderPane = borderpane { center { - treetableview> { + treetableview> { isShowRoot = false root = TreeItem(rootNode) populate { - when (val fxMeta = it.value) { - is FXMetaNode -> { - fxMeta.children - } - is FXMetaValue -> null - } + val fxMeta = it.value + fxMeta.children } root.isExpanded = true sortMode = TreeSortMode.ALL_DESCENDANTS columnResizePolicy = TreeTableView.CONSTRAINED_RESIZE_POLICY - column("Name", FXMeta<*>::name) - column, String>("Value") { cellDataFeatures -> - when (val item = cellDataFeatures.value.value) { - is FXMetaValue -> item.valueProperty.stringBinding { it?.string ?: "" } - is FXMetaNode -> SimpleStringProperty("[node]") - } + column("Name", FXMetaModel<*>::title) + column, String>("Value") { cellDataFeatures -> + val item = cellDataFeatures.value.value + item.valueProperty.stringBinding { it?.string ?: "" } } } } diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/MutableMetaEditor.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/MutableMetaEditor.kt new file mode 100644 index 00000000..c7238b44 --- /dev/null +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/MutableMetaEditor.kt @@ -0,0 +1,193 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package space.kscience.visionforge.editor + +import javafx.scene.control.* +import javafx.scene.control.cell.TextFieldTreeTableCell +import javafx.scene.layout.BorderPane +import javafx.scene.paint.Color +import javafx.scene.text.Text +import space.kscience.dataforge.context.Global +import space.kscience.dataforge.meta.MutableMeta +import space.kscience.dataforge.meta.descriptors.MetaDescriptor +import space.kscience.visionforge.dfIconView +import tornadofx.* + +/** + * A Configuration editor fragment + * + * @author Alexander Nozik + */ +public class MutableMetaEditor( + public val rootNode: FXMetaModel, + public val allowNew: Boolean = true, + title: String = "Configuration editor" +) : Fragment(title = title, icon = dfIconView) { + //TODO replace parameters by properties + + public constructor( + MutableMeta: MutableMeta, + descriptor: MetaDescriptor?, + title: String = "Configuration editor" + ) : + this(FXMetaModel.root(MutableMeta, descriptor = descriptor), title = title) + + override val root: BorderPane = borderpane { + center = treetableview> { + root = TreeItem(rootNode) + root.isExpanded = true + sortMode = TreeSortMode.ALL_DESCENDANTS + columnResizePolicy = TreeTableView.CONSTRAINED_RESIZE_POLICY + populate { + it.value.children + } + column("Name", FXMetaModel::title) { + setCellFactory { + object : TextFieldTreeTableCell, String>() { + override fun updateItem(item: String?, empty: Boolean) { + super.updateItem(item, empty) + contextMenu?.items?.removeIf { it.text == "Remove" } + val content = treeTableRow.item + if (!empty) { + if (treeTableRow.item != null) { + textFillProperty().bind(content.existsProperty.objectBinding { + if (it == true) { + Color.BLACK + } else { + Color.GRAY + } + }) + if (content.exists) { + contextmenu { + item("Remove") { + action { + content.remove() + } + } + } + } + } + } + } + } + } + } + + column("Value") { param: TreeTableColumn.CellDataFeatures, FXMetaModel> -> + param.value.valueProperty() + }.setCellFactory { + ValueCell() + } + + column("Description") { param: TreeTableColumn.CellDataFeatures, String> -> + (param.value.value.descriptor?.info ?: "").observable() + }.setCellFactory { param: TreeTableColumn, String> -> + val cell = TreeTableCell, String>() + val text = Text() + cell.graphic = text + cell.prefHeight = Control.USE_COMPUTED_SIZE + text.wrappingWidthProperty().bind(param.widthProperty()) + text.textProperty().bind(cell.itemProperty()) + cell + } + } + } + + private fun showNodeDialog(): String? { + val dialog = TextInputDialog() + dialog.title = "Node name selection" + dialog.contentText = "Enter a name for new node: " + dialog.headerText = null + + val result = dialog.showAndWait() + return result.orElse(null) + } + + private fun showValueDialog(): String? { + val dialog = TextInputDialog() + dialog.title = "Value name selection" + dialog.contentText = "Enter a name for new value: " + dialog.headerText = null + + val result = dialog.showAndWait() + return result.orElse(null) + } + + private inner class ValueCell : TreeTableCell, FXMetaModel?>() { + + public override fun updateItem(item: FXMetaModel?, empty: Boolean) { + if (!empty) { + if (item != null) { + text = null + val chooser = ValueChooser.build( + Global, + item.valueProperty, + item.descriptor + ) { + item.setValue(it) + } + graphic = chooser.node +// when (item) { +// is FXMetaValue -> { +// text = null +// val chooser = ValueChooser.build( +// Global, +// item.valueProperty, +// item.descriptor +// ) { +// item.set(it) +// } +// graphic = chooser.node +// } +// is FXMetaNode -> { +// if (allowNew) { +// text = null +// graphic = HBox().apply { +// val glyph: Node = FontAwesomeIconView(FontAwesomeIcon.PLUS_CIRCLE) +// button("node", graphic = glyph) { +// hgrow = Priority.ALWAYS +// maxWidth = Double.POSITIVE_INFINITY +// action { +// showNodeDialog()?.let { +// item.addNode(it) +// } +// } +// } +// button("value", graphic = FontAwesomeIconView(FontAwesomeIcon.PLUS_SQUARE)) { +// hgrow = Priority.ALWAYS +// maxWidth = Double.POSITIVE_INFINITY +// action { +// showValueDialog()?.let { +// item.addValue(it) +// } +// } +// } +// } +// } else { +// text = "" +// } +// } +// } + + } else { + text = null + graphic = null + } + } else { + text = null + graphic = null + } + } + + } + + public companion object { + /** + * The tag not to display node or value in MutableMetaurator + */ + public const val NO_CONFIGURATOR_TAG: String = "nocfg" + } +} diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/TextValueChooser.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/TextValueChooser.kt index ea55fc83..9a1840ce 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/TextValueChooser.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/TextValueChooser.kt @@ -10,12 +10,13 @@ import javafx.scene.control.TextField import javafx.scene.input.KeyCode import javafx.scene.input.KeyEvent import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.descriptors.validate import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.dataforge.values.* import tornadofx.* -class TextValueChooser : ValueChooserBase() { +public class TextValueChooser : ValueChooserBase() { private val displayText: String get() = currentValue().let { @@ -85,7 +86,7 @@ class TextValueChooser : ValueChooserBase() { } private fun validate(value: Value): Boolean { - return descriptor?.isAllowedValue(value) ?: true + return descriptor?.validate(value) ?: true } // @Override @@ -101,7 +102,7 @@ class TextValueChooser : ValueChooserBase() { } } - companion object : ValueChooser.Factory { + public companion object : ValueChooser.Factory { override val name: Name = "text".asName() override fun invoke(meta: Meta): ValueChooser = TextValueChooser() diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueCallback.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueCallback.kt index 32a0d741..a4e72871 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueCallback.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueCallback.kt @@ -13,11 +13,11 @@ import space.kscience.dataforge.values.Value * @param value Value after change * @param message Message on unsuccessful change */ -class ValueCallbackResponse(val success: Boolean, val value: Value, val message: String) +public class ValueCallbackResponse(public val success: Boolean, public val value: Value, public val message: String) /** * A callback for some visual object trying to change some value * @author [Alexander Nozik](mailto:altavir@gmail.com) */ -typealias ValueCallback = (Value) -> ValueCallbackResponse +public typealias ValueCallback = (Value) -> ValueCallbackResponse diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooser.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooser.kt index c3796fa0..99616b61 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooser.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooser.kt @@ -10,10 +10,12 @@ import javafx.beans.value.ObservableValue import javafx.scene.Node import space.kscience.dataforge.context.Context import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.descriptors.ValueDescriptor +import space.kscience.dataforge.meta.descriptors.MetaDescriptor +import space.kscience.dataforge.meta.descriptors.allowedValues +import space.kscience.dataforge.meta.descriptors.validate import space.kscience.dataforge.misc.Named import space.kscience.dataforge.misc.Type -import space.kscience.dataforge.names.toName +import space.kscience.dataforge.names.Name import space.kscience.dataforge.provider.provideByType import space.kscience.dataforge.values.Null import space.kscience.dataforge.values.Value @@ -42,8 +44,8 @@ public interface ValueChooser { * * @return */ - public val descriptorProperty: ObjectProperty - public var descriptor: ValueDescriptor? + public val descriptorProperty: ObjectProperty + public var descriptor: MetaDescriptor? public val valueProperty: ObjectProperty public var value: Value? @@ -71,7 +73,7 @@ public interface ValueChooser { public companion object { private fun findWidgetByType(context: Context, type: String): Factory? { - return when (type.toName()) { + return when (Name.parse(type)) { TextValueChooser.name -> TextValueChooser ColorValueChooser.name -> ColorValueChooser ComboBoxValueChooser.name -> ComboBoxValueChooser @@ -79,7 +81,7 @@ public interface ValueChooser { } } - private fun build(context: Context, descriptor: ValueDescriptor?): ValueChooser { + private fun build(context: Context, descriptor: MetaDescriptor?): ValueChooser { return if (descriptor == null) { TextValueChooser(); } else { @@ -93,7 +95,7 @@ public interface ValueChooser { descriptor.widget ) ?: TextValueChooser() } - descriptor.allowedValues.isNotEmpty() -> ComboBoxValueChooser() + !descriptor.allowedValues.isNullOrEmpty() -> ComboBoxValueChooser() else -> TextValueChooser() } chooser.descriptor = descriptor @@ -101,10 +103,10 @@ public interface ValueChooser { } } - fun build( + public fun build( context: Context, value: ObservableValue, - descriptor: ValueDescriptor? = null, + descriptor: MetaDescriptor? = null, setter: (Value) -> Unit, ): ValueChooser { val chooser = build(context, descriptor) @@ -113,7 +115,7 @@ public interface ValueChooser { chooser.setDisplayValue(it ?: Null) } chooser.setCallback { result -> - if (descriptor?.isAllowedValue(result) != false) { + if (descriptor?.validate(result) != false) { setter(result) ValueCallbackResponse(true, result, "OK") } else { diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooserBase.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooserBase.kt index 81dc42ac..e9b61886 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooserBase.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooserBase.kt @@ -8,7 +8,7 @@ package space.kscience.visionforge.editor import javafx.beans.property.SimpleObjectProperty import javafx.scene.Node import org.slf4j.LoggerFactory -import space.kscience.dataforge.meta.descriptors.ValueDescriptor +import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.values.Null import space.kscience.dataforge.values.Value import tornadofx.* @@ -18,16 +18,16 @@ import tornadofx.* * * @author Alexander Nozik */ -abstract class ValueChooserBase : ValueChooser { +public abstract class ValueChooserBase : ValueChooser { - override val node by lazy { buildNode() } - final override val valueProperty = SimpleObjectProperty(Null) - final override val descriptorProperty = SimpleObjectProperty() + override val node: T by lazy { buildNode() } + final override val valueProperty: SimpleObjectProperty = SimpleObjectProperty(Null) + final override val descriptorProperty: SimpleObjectProperty = SimpleObjectProperty() - override var descriptor: ValueDescriptor? by descriptorProperty + override var descriptor: MetaDescriptor? by descriptorProperty override var value: Value? by valueProperty - fun resetValue() { + public fun resetValue() { setDisplayValue(currentValue()) } @@ -36,7 +36,7 @@ abstract class ValueChooserBase : ValueChooser { * @return */ protected fun currentValue(): Value { - return value ?: descriptor?.default ?: Null + return value ?: descriptor?.defaultValue ?: Null } /** diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisualObjectEditorFragment.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisionEditorFragment.kt similarity index 57% rename from visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisualObjectEditorFragment.kt rename to visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisionEditorFragment.kt index 929c7e85..3ce3b2de 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisualObjectEditorFragment.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisionEditorFragment.kt @@ -5,39 +5,36 @@ import javafx.beans.property.SimpleObjectProperty import javafx.scene.Node import javafx.scene.Parent import javafx.scene.layout.VBox -import space.kscience.dataforge.meta.Config -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.MutableItemProvider -import space.kscience.dataforge.meta.descriptors.NodeDescriptor -import space.kscience.dataforge.meta.update +import space.kscience.dataforge.meta.* +import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.visionforge.* import tornadofx.* -class VisualObjectEditorFragment(val selector: (Vision) -> Meta) : Fragment() { +public class VisionEditorFragment(public val selector: (Vision) -> Meta) : Fragment() { - val itemProperty = SimpleObjectProperty() - var item: Vision? by itemProperty - val descriptorProperty = SimpleObjectProperty() + public val itemProperty: SimpleObjectProperty = SimpleObjectProperty() + public var item: Vision? by itemProperty + public val descriptorProperty: SimpleObjectProperty = SimpleObjectProperty() - constructor( + public constructor( item: Vision?, - descriptor: NodeDescriptor?, - selector: (Vision) -> MutableItemProvider = { it.allProperties() }, + descriptor: MetaDescriptor?, + selector: (Vision) -> MutableMetaProvider = { it.meta() }, ) : this({ it.describedProperties }) { this.item = item this.descriptorProperty.set(descriptor) } - private var currentConfig: Config? = null + private var currentConfig: ObservableMutableMeta? = null - private val configProperty: Binding = itemProperty.objectBinding { visualObject -> - if (visualObject == null) return@objectBinding null - val meta = selector(visualObject) - val config = Config().apply { + private val configProperty: Binding = itemProperty.objectBinding { vision -> + if (vision == null) return@objectBinding null + val meta = selector(vision) + val config = MutableMeta { update(meta) - onChange(this@VisualObjectEditorFragment) { key, _, after -> - visualObject.setProperty(key, after) - } + } + config.onChange(this@VisionEditorFragment) { key -> + vision.setPropertyNode(key, config[key]) } //remember old config reference to cleanup listeners currentConfig?.removeListener(this) @@ -47,7 +44,7 @@ class VisualObjectEditorFragment(val selector: (Vision) -> Meta) : Fragment() { private val configEditorProperty: Binding = configProperty.objectBinding(descriptorProperty) { it?.let { - ConfigEditor(it, descriptorProperty.get()).root + MutableMetaEditor(it, descriptorProperty.get()).root } } diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisualObjectTreeFragment.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisionTreeFragment.kt similarity index 82% rename from visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisualObjectTreeFragment.kt rename to visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisionTreeFragment.kt index f1faaf1a..65aa1b9c 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisualObjectTreeFragment.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisionTreeFragment.kt @@ -3,6 +3,7 @@ package space.kscience.visionforge.editor import javafx.beans.property.SimpleObjectProperty import javafx.scene.control.SelectionMode import javafx.scene.control.TreeItem +import javafx.scene.layout.VBox import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionGroup import tornadofx.* @@ -29,13 +30,13 @@ private fun toTreeItem(vision: Vision, title: String): TreeItem() - var item: Vision? by itemProperty +public class VisionTreeFragment : Fragment() { + public val itemProperty: SimpleObjectProperty = SimpleObjectProperty() + public var item: Vision? by itemProperty - val selectedProperty = SimpleObjectProperty() + public val selectedProperty: SimpleObjectProperty = SimpleObjectProperty() - override val root = vbox { + override val root: VBox = vbox { titledpane("Object tree", collapsible = false) { treeview> { cellFormat { diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXMaterials.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXMaterials.kt index aa02d1ca..0b205626 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXMaterials.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXMaterials.kt @@ -3,11 +3,15 @@ package space.kscience.visionforge.solid import javafx.scene.paint.Color import javafx.scene.paint.Material import javafx.scene.paint.PhongMaterial -import space.kscience.dataforge.meta.* +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.double +import space.kscience.dataforge.meta.get +import space.kscience.dataforge.meta.int import space.kscience.dataforge.values.ValueType import space.kscience.dataforge.values.int import space.kscience.dataforge.values.string import space.kscience.visionforge.Colors +import space.kscience.visionforge.solid.FXMaterials.GREY public object FXMaterials { public val RED: PhongMaterial = PhongMaterial().apply { @@ -26,46 +30,43 @@ public object FXMaterials { } public val BLUE: PhongMaterial = PhongMaterial(Color.BLUE) + } /** * Infer color based on meta item * @param opacity default opacity */ -public fun MetaItem.color(opacity: Double = 1.0): Color { - return when (this) { - is MetaItemValue -> if (this.value.type == ValueType.NUMBER) { - val int = value.int +public fun Meta.color(opacity: Double = 1.0): Color { + return value?.let { + if (it.type == ValueType.NUMBER) { + val int = it.int val red = int and 0x00ff0000 shr 16 val green = int and 0x0000ff00 shr 8 val blue = int and 0x000000ff Color.rgb(red, green, blue, opacity) } else { - Color.web(this.value.string) + Color.web(it.string) } - is MetaItemNode -> { - Color.rgb( - node[Colors.RED_KEY]?.int ?: 0, - node[Colors.GREEN_KEY]?.int ?: 0, - node[Colors.BLUE_KEY]?.int ?: 0, - node[SolidMaterial.OPACITY_KEY]?.double ?: opacity - ) - } - } + } ?: Color.rgb( + this[Colors.RED_KEY]?.int ?: 0, + this[Colors.GREEN_KEY]?.int ?: 0, + this[Colors.BLUE_KEY]?.int ?: 0, + this[SolidMaterial.OPACITY_KEY]?.double ?: opacity + ) } /** * Infer FX material based on meta item */ -public fun MetaItem?.material(): Material { - return when (this) { - null -> FXMaterials.GREY - is MetaItemValue -> PhongMaterial(color()) - is MetaItemNode -> PhongMaterial().apply { - val opacity = node[SolidMaterial.OPACITY_KEY].double ?: 1.0 - diffuseColor = node[SolidMaterial.COLOR_KEY]?.color(opacity) ?: Color.DARKGREY - specularColor = node[SolidMaterial.SPECULAR_COLOR_KEY]?.color(opacity) ?: Color.WHITE - } +public fun Meta?.material(): Material { + if (this == null) return GREY + return value?.let { + PhongMaterial(color()) + } ?: PhongMaterial().apply { + val opacity = get(SolidMaterial.OPACITY_KEY).double ?: 1.0 + diffuseColor = get(SolidMaterial.COLOR_KEY)?.color(opacity) ?: Color.DARKGREY + specularColor = get(SolidMaterial.SPECULAR_COLOR_KEY)?.color(opacity) ?: Color.WHITE } } diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXReferenceFactory.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXReferenceFactory.kt index dc72f7f1..d2863cea 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXReferenceFactory.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXReferenceFactory.kt @@ -2,7 +2,10 @@ package space.kscience.visionforge.solid import javafx.scene.Group import javafx.scene.Node -import space.kscience.dataforge.names.* +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.cutFirst +import space.kscience.dataforge.names.firstOrNull +import space.kscience.dataforge.names.isEmpty import space.kscience.visionforge.Vision import space.kscience.visionforge.onPropertyChange import kotlin.reflect.KClass @@ -16,7 +19,7 @@ class FXReferenceFactory(val plugin: FX3DPlugin) : FX3DFactory if (name.firstOrNull()?.body == SolidReferenceGroup.REFERENCE_CHILD_PROPERTY_PREFIX) { - val childName = name.firstOrNull()?.index?.toName() ?: error("Wrong syntax for reference child property: '$name'") + val childName = name.firstOrNull()?.index?.let(Name::parse) ?: error("Wrong syntax for reference child property: '$name'") val propertyName = name.cutFirst() val referenceChild = obj[childName] ?: error("Reference child with name '$childName' not found") val child = node.findChild(childName) ?: error("Object child with name '$childName' not found") diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisualObjectFXBinding.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisualObjectFXBinding.kt index 5045a375..492356ea 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisualObjectFXBinding.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisualObjectFXBinding.kt @@ -5,7 +5,6 @@ import javafx.beans.binding.* import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.startsWith -import space.kscience.dataforge.names.toName import space.kscience.dataforge.values.Value import space.kscience.visionforge.Vision import space.kscience.visionforge.onPropertyChange @@ -15,7 +14,7 @@ import tornadofx.* * A caching binding collection for [Vision] properties */ public class VisualObjectFXBinding(public val fx: FX3DPlugin, public val obj: Vision) { - private val bindings = HashMap>() + private val bindings = HashMap>() init { obj.onPropertyChange(fx.context) { name -> @@ -33,30 +32,29 @@ public class VisualObjectFXBinding(public val fx: FX3DPlugin, public val obj: Vi } } - public operator fun get(key: Name): ObjectBinding { + public operator fun get(key: Name): ObjectBinding { return bindings.getOrPut(key) { - object : ObjectBinding() { - override fun computeValue(): MetaItem? = obj.getProperty(key) + object : ObjectBinding() { + override fun computeValue(): Meta? = obj.getProperty(key) } } } - public operator fun get(key: String) = get(key.toName()) + public operator fun get(key: String): ObjectBinding = get(Name.parse(key)) } -public fun ObjectBinding.value(): Binding = objectBinding { it.value } -public fun ObjectBinding.string(): StringBinding = stringBinding { it.string } -public fun ObjectBinding.number(): Binding = objectBinding { it.number } -public fun ObjectBinding.double(): Binding = objectBinding { it.double } -public fun ObjectBinding.float(): Binding = objectBinding { it.float } -public fun ObjectBinding.int(): Binding = objectBinding { it.int } -public fun ObjectBinding.long(): Binding = objectBinding { it.long } -public fun ObjectBinding.node(): Binding = objectBinding { it.node } +public fun ObjectBinding.value(): Binding = objectBinding { it?.value } +public fun ObjectBinding.string(): StringBinding = stringBinding { it.string } +public fun ObjectBinding.number(): Binding = objectBinding { it.number } +public fun ObjectBinding.double(): Binding = objectBinding { it.double } +public fun ObjectBinding.float(): Binding = objectBinding { it.float } +public fun ObjectBinding.int(): Binding = objectBinding { it.int } +public fun ObjectBinding.long(): Binding = objectBinding { it.long } -public fun ObjectBinding.string(default: String): StringBinding = stringBinding { it.string ?: default } -public fun ObjectBinding.double(default: Double): DoubleBinding = doubleBinding { it.double ?: default } -public fun ObjectBinding.float(default: Float): FloatBinding = floatBinding { it.float ?: default } -public fun ObjectBinding.int(default: Int): IntegerBinding = integerBinding { it.int ?: default } -public fun ObjectBinding.long(default: Long): LongBinding = longBinding { it.long ?: default } +public fun ObjectBinding.string(default: String): StringBinding = stringBinding { it.string ?: default } +public fun ObjectBinding.double(default: Double): DoubleBinding = doubleBinding { it.double ?: default } +public fun ObjectBinding.float(default: Float): FloatBinding = floatBinding { it.float ?: default } +public fun ObjectBinding.int(default: Int): IntegerBinding = integerBinding { it.int ?: default } +public fun ObjectBinding.long(default: Long): LongBinding = longBinding { it.long ?: default } -public fun ObjectBinding.transform(transform: (MetaItem) -> T): Binding = objectBinding { it?.let(transform) } +public fun ObjectBinding.transform(transform: (Meta) -> T): Binding = objectBinding { it?.let(transform) } diff --git a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlTransformer.kt b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlTransformer.kt index 98b4509e..0a837919 100644 --- a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlTransformer.kt +++ b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlTransformer.kt @@ -1,12 +1,12 @@ package space.kscience.visionforge.gdml import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.MetaBuilder +import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus -import space.kscience.dataforge.names.toName + import space.kscience.gdml.* import space.kscience.visionforge.* import space.kscience.visionforge.html.VisionOutput @@ -41,8 +41,8 @@ public class GdmlTransformer { internal val styleCache = HashMap() - public fun Solid.registerAndUseStyle(name: String, builder: MetaBuilder.() -> Unit) { - styleCache.getOrPut(name.toName()) { + public fun Solid.registerAndUseStyle(name: String, builder: MutableMeta.() -> Unit) { + styleCache.getOrPut(Name.parse(name)) { Meta(builder) } useStyle(name) @@ -118,7 +118,7 @@ private class GdmlTransformerEnv(val settings: GdmlTransformer) { private val proto = SolidGroup() private val solids = proto.group(solidsName) { - setProperty("edges.enabled", false) + setPropertyNode("edges.enabled", false) } private val referenceStore = HashMap>() diff --git a/visionforge-gdml/src/commonTest/kotlin/TestCubes.kt b/visionforge-gdml/src/commonTest/kotlin/TestCubes.kt index 9fb80095..0ca76fd1 100644 --- a/visionforge-gdml/src/commonTest/kotlin/TestCubes.kt +++ b/visionforge-gdml/src/commonTest/kotlin/TestCubes.kt @@ -1,7 +1,7 @@ package space.kscience.visionforge.gdml import space.kscience.dataforge.context.Context -import space.kscience.dataforge.names.toName +import space.kscience.dataforge.names.Name import space.kscience.gdml.* import space.kscience.visionforge.Vision import space.kscience.visionforge.get @@ -23,7 +23,7 @@ class TestCubes { fun testCubesDirect() { val vision = cubes.toVision() // println(Solids.encodeToString(vision)) - val smallBoxPrototype = vision.getPrototype("solids.smallBox".toName()) as? Box + val smallBoxPrototype = vision.getPrototype(Name.parse("solids.smallBox")) as? Box assertNotNull(smallBoxPrototype) assertEquals(30.0, smallBoxPrototype.xSize.toDouble()) val smallBoxVision = vision["composite-111.smallBox"]?.unref as? Box @@ -46,7 +46,7 @@ class TestCubes { val vision = cubes.toVision() val serialized = Solids.encodeToString(vision) val deserialized = testContext.visionManager.decodeFromString(serialized) as SolidGroup - val smallBox = deserialized.getPrototype("solids.smallBox".toName()) as? Box + val smallBox = deserialized.getPrototype(Name.parse("solids.smallBox")) as? Box assertNotNull(smallBox) assertEquals(30.0, smallBox.xSize.toDouble()) //println(testContext.visionManager.encodeToString(deserialized)) diff --git a/visionforge-gdml/src/jvmTest/kotlin/space/kscience/visionforge/gdml/TestConvertor.kt b/visionforge-gdml/src/jvmTest/kotlin/space/kscience/visionforge/gdml/TestConvertor.kt index 730adfa9..a8a078a8 100644 --- a/visionforge-gdml/src/jvmTest/kotlin/space/kscience/visionforge/gdml/TestConvertor.kt +++ b/visionforge-gdml/src/jvmTest/kotlin/space/kscience/visionforge/gdml/TestConvertor.kt @@ -1,7 +1,7 @@ package space.kscience.visionforge.gdml import org.junit.jupiter.api.Test -import space.kscience.dataforge.names.toName +import space.kscience.dataforge.names.Name import space.kscience.gdml.Gdml import space.kscience.gdml.decodeFromStream import space.kscience.visionforge.solid.Solids @@ -23,7 +23,7 @@ class TestConvertor { val stream = javaClass.getResourceAsStream("/gdml/cubes.gdml")!! val gdml = Gdml.decodeFromStream(stream) val vision = gdml.toVision() - assertNotNull(vision.getPrototype("solids.box".toName())) + assertNotNull(vision.getPrototype(Name.parse("solids.box"))) println(Solids.encodeToString(vision)) } diff --git a/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt b/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt index 689ed221..2103078d 100644 --- a/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt +++ b/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt @@ -7,7 +7,7 @@ import kotlinx.serialization.modules.polymorphic import kotlinx.serialization.modules.subclass import space.kscience.dataforge.meta.string import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.toName +import space.kscience.dataforge.names.asName import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionBase import space.kscience.visionforge.setProperty @@ -27,7 +27,7 @@ public class VisionOfMarkup( } public companion object { - public val CONTENT_PROPERTY_KEY: Name = "content".toName() + public val CONTENT_PROPERTY_KEY: Name = "content".asName() public const val COMMONMARK_FORMAT: String = "markdown.commonmark" public const val GFM_FORMAT: String = "markdown.gfm" } diff --git a/visionforge-plotly/build.gradle.kts b/visionforge-plotly/build.gradle.kts index b62876ab..41e541db 100644 --- a/visionforge-plotly/build.gradle.kts +++ b/visionforge-plotly/build.gradle.kts @@ -2,7 +2,7 @@ plugins { id("ru.mipt.npm.gradle.mpp") } -val plotlyVersion = "0.4.3" +val plotlyVersion = "0.5.0-dev-1" kscience { useSerialization() diff --git a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt index 8603971e..7b2f1c25 100644 --- a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt +++ b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt @@ -2,6 +2,8 @@ package space.kscience.visionforge.plotly import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import space.kscience.dataforge.meta.MutableMeta +import space.kscience.dataforge.meta.asObservable import space.kscience.dataforge.misc.DFExperimental import space.kscience.plotly.Plot import space.kscience.plotly.Plotly @@ -13,10 +15,10 @@ import space.kscience.visionforge.root @SerialName("vision.plotly") public class VisionOfPlotly private constructor() : VisionBase() { public constructor(plot: Plot) : this() { - properties = plot.config + properties = plot.meta } - public val plot: Plot get() = Plot(properties ?: Config()) + public val plot: Plot get() = Plot(properties?.asObservable() ?: MutableMeta()) } public fun Plot.asVision(): VisionOfPlotly = VisionOfPlotly(this) diff --git a/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt b/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt index be9e1e08..21b447ef 100644 --- a/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt +++ b/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt @@ -31,7 +31,7 @@ public actual class PlotlyPlugin : VisionPlugin(), ElementVisionRenderer { override fun render(element: Element, vision: Vision, meta: Meta) { val plot = (vision as? VisionOfPlotly)?.plot ?: error("VisionOfPlotly expected but ${vision::class} found") val config = PlotlyConfig.read(meta) - println(plot.config) + println(plot.meta) println(plot.data[0].toMeta()) element.plot(plot, config) } diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt b/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt index fabb0675..0a9c60e3 100644 --- a/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt +++ b/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt @@ -30,7 +30,6 @@ import space.kscience.dataforge.context.fetch import space.kscience.dataforge.meta.* import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.toName import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionChange import space.kscience.visionforge.VisionManager @@ -54,12 +53,12 @@ public class VisionServer internal constructor( private val application: Application, private val rootRoute: String, ) : Configurable, CoroutineScope by application { - override val config: ObservableMeta = ObservableMeta() - public var updateInterval: Long by config.long(300, key = UPDATE_INTERVAL_KEY) - public var cacheFragments: Boolean by config.boolean(true) - public var dataEmbed: Boolean by config.boolean(true, "data.embed".toName()) - public var dataFetch: Boolean by config.boolean(false, "data.fetch".toName()) - public var dataConnect: Boolean by config.boolean(true, "data.connect".toName()) + override val meta: ObservableMutableMeta = MutableMeta() + public var updateInterval: Long by meta.long(300, key = UPDATE_INTERVAL_KEY) + public var cacheFragments: Boolean by meta.boolean(true) + public var dataEmbed: Boolean by meta.boolean(true, Name.parse("data.embed")) + public var dataFetch: Boolean by meta.boolean(false, Name.parse("data.fetch")) + public var dataConnect: Boolean by meta.boolean(true, Name.parse("data.connect")) /** * a list of headers that should be applied to all pages @@ -131,14 +130,14 @@ public class VisionServer internal constructor( ?: error("Vision name is not defined in parameters") application.log.debug("Opened server socket for $name") - val vision: Vision = visions[name.toName()] ?: error("Plot with id='$name' not registered") + val vision: Vision = visions[Name.parse(name)] ?: error("Plot with id='$name' not registered") launch { incoming.consumeEach { val change = visionManager.jsonFormat.decodeFromString( VisionChange.serializer(), it.data.decodeToString() ) - vision.update(change) + vision.change(change) } } @@ -161,7 +160,7 @@ public class VisionServer internal constructor( val name: String = call.request.queryParameters["name"] ?: error("Vision name is not defined in parameters") - val vision: Vision? = visions[name.toName()] + val vision: Vision? = visions[Name.parse(name)] if (vision == null) { call.respond(HttpStatusCode.NotFound, "Vision with name '$name' not found") } else { @@ -232,7 +231,7 @@ public class VisionServer internal constructor( public companion object { public const val DEFAULT_PAGE: String = "/" - public val UPDATE_INTERVAL_KEY: Name = "update.interval".toName() + public val UPDATE_INTERVAL_KEY: Name = Name.parse("update.interval") } } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt index 9232874c..66efe69b 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt @@ -1,8 +1,6 @@ package space.kscience.visionforge.solid -import space.kscience.dataforge.meta.MutableItemProvider -import space.kscience.dataforge.meta.set -import space.kscience.dataforge.meta.value +import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.Name import space.kscience.dataforge.values.Value import space.kscience.dataforge.values.asValue @@ -11,11 +9,17 @@ import space.kscience.visionforge.Colors import space.kscience.visionforge.VisionBuilder @VisionBuilder -public class ColorAccessor(private val parent: MutableItemProvider, private val colorKey: Name) { +public class ColorAccessor(private val parent: MutableMetaProvider, private val colorKey: Name) { public var value: Value? - get() = parent.getItem(colorKey).value + get() = parent.getMeta(colorKey)?.value set(value) { - parent[colorKey] = value + parent.setValue(colorKey,value) + } + + public var item: Meta? + get() = parent.getMeta(colorKey) + set(value) { + parent.setMeta(colorKey,value) } } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt index d1d41d09..4017b11b 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt @@ -31,7 +31,7 @@ public inline fun VisionContainerBuilder.composite( if (children.size != 2) error("Composite requires exactly two children") return Composite(type, children[0], children[1]).also { composite -> composite.configure { - update(group.meta) + update(group.meta()) } if (group.position != null) { composite.position = group.position diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt index d94062d8..0ecc02b0 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt @@ -2,7 +2,8 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import space.kscience.dataforge.meta.ObservableMeta +import space.kscience.dataforge.meta.MutableMeta +import space.kscience.dataforge.meta.ObservableMutableMeta import space.kscience.visionforge.* import kotlin.math.PI import kotlin.math.cos @@ -95,7 +96,7 @@ public class Extruded( public class ExtrudeBuilder( public var shape: List = emptyList(), public var layers: ArrayList = ArrayList(), - config: ObservableMeta = ObservableMeta() + config: ObservableMutableMeta = MutableMeta() ) : SimpleVisionPropertyContainer(config) { public fun shape(block: Shape2DBuilder.() -> Unit) { this.shape = Shape2DBuilder().apply(block).build() @@ -105,7 +106,7 @@ public class ExtrudeBuilder( layers.add(Layer(x.toFloat(), y.toFloat(), z.toFloat(), scale.toFloat())) } - internal fun build(): Extruded = Extruded(shape, layers).apply { configure(config) } + internal fun build(): Extruded = Extruded(shape, layers).apply { configure(meta()) } } @VisionBuilder diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/PolyLine.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/PolyLine.kt index cd9f2cbd..d8aa937c 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/PolyLine.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/PolyLine.kt @@ -2,13 +2,12 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import space.kscience.dataforge.meta.number import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus import space.kscience.visionforge.VisionBuilder import space.kscience.visionforge.VisionContainerBuilder -import space.kscience.visionforge.allProperties +import space.kscience.visionforge.numberProperty import space.kscience.visionforge.set @Serializable @@ -16,8 +15,8 @@ import space.kscience.visionforge.set public class PolyLine(public val points: List) : SolidBase(), Solid { //var lineType by string() - public var thickness: Number by allProperties(inherit = false).number(1.0, - key = SolidMaterial.MATERIAL_KEY + THICKNESS_KEY) + public var thickness: Number by numberProperty(name = SolidMaterial.MATERIAL_KEY + THICKNESS_KEY) { 1.0 } + public companion object { public val THICKNESS_KEY: Name = "thickness".asName() diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt index a4c8e69c..f2ad38fd 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt @@ -1,7 +1,7 @@ package space.kscience.visionforge.solid import space.kscience.dataforge.meta.* -import space.kscience.dataforge.meta.descriptors.NodeDescriptor +import space.kscience.dataforge.meta.descriptors.* import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus @@ -35,7 +35,7 @@ import kotlin.reflect.KProperty */ public interface Solid : Vision { - override val descriptor: NodeDescriptor get() = Companion.descriptor + override val descriptor: MetaDescriptor get() = Companion.descriptor public companion object { // val SELECTED_KEY = "selected".asName() @@ -69,39 +69,38 @@ public interface Solid : Vision { public val Y_SCALE_KEY: Name = SCALE_KEY + Y_KEY public val Z_SCALE_KEY: Name = SCALE_KEY + Z_KEY - public val descriptor: NodeDescriptor by lazy { - NodeDescriptor { - value(VISIBLE_KEY) { + public val descriptor: MetaDescriptor by lazy { + MetaDescriptor { + value(VISIBLE_KEY, ValueType.BOOLEAN) { inherited = false - type(ValueType.BOOLEAN) default(true) } //TODO replace by descriptor merge - value(Vision.STYLE_KEY) { - type(ValueType.STRING) + value(Vision.STYLE_KEY, ValueType.STRING) { multiple = true hide() } - node(POSITION_KEY){ + node(POSITION_KEY) { hide() } - node(ROTATION_KEY){ + node(ROTATION_KEY) { hide() } - node(SCALE_KEY){ + node(SCALE_KEY) { hide() } - value(DETAIL_KEY) { - type(ValueType.NUMBER) + value(DETAIL_KEY, ValueType.NUMBER) { hide() } - item(SolidMaterial.MATERIAL_KEY.toString(), SolidMaterial.descriptor) + item(SolidMaterial.MATERIAL_KEY.toString(), SolidMaterial){ + valueRequirement = ValueRequirement.ABSENT + } enum(ROTATION_ORDER_KEY, default = RotationOrder.XYZ) { hide() @@ -115,7 +114,7 @@ public interface Solid : Vision { * Get the layer number this solid belongs to. Return 0 if layer is not defined. */ public var Solid.layer: Int - get() = allProperties().getItem(LAYER_KEY).int ?: 0 + get() = getProperty(LAYER_KEY, inherit = true).int ?: 0 set(value) { setProperty(LAYER_KEY, value) } @@ -136,7 +135,7 @@ public enum class RotationOrder { */ public var Solid.rotationOrder: RotationOrder get() = getProperty(Solid.ROTATION_ORDER_KEY).enum() ?: RotationOrder.XYZ - set(value) = setProperty(Solid.ROTATION_ORDER_KEY, value.name.asValue()) + set(value) = setPropertyValue(Solid.ROTATION_ORDER_KEY, value.name.asValue()) /** @@ -144,7 +143,7 @@ public var Solid.rotationOrder: RotationOrder */ public var Solid.detail: Int? get() = getProperty(DETAIL_KEY, false).int - set(value) = setProperty(DETAIL_KEY, value?.asValue()) + set(value) = setPropertyValue(DETAIL_KEY, value?.asValue()) /** * If this property is true, the object will be ignored on render. @@ -152,7 +151,7 @@ public var Solid.detail: Int? */ public var Vision.ignore: Boolean? get() = getProperty(IGNORE_KEY, false).boolean - set(value) = setProperty(IGNORE_KEY, value?.asValue()) + set(value) = setPropertyValue(IGNORE_KEY, value?.asValue()) //var VisualObject.selected: Boolean? // get() = getProperty(SELECTED_KEY).boolean @@ -182,7 +181,7 @@ internal fun point(name: Name, default: Float): ReadWriteProperty, value: Point3D?) { if (value == null) { - thisRef.setProperty(name, null) + thisRef.setPropertyNode(name, null) } else { thisRef.setProperty(name + X_KEY, value.x) thisRef.setProperty(name + Y_KEY, value.y) diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidBase.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidBase.kt index d2fee33a..2beee1ed 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidBase.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidBase.kt @@ -2,17 +2,17 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import space.kscience.dataforge.meta.descriptors.NodeDescriptor +import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.visionforge.VisionBase import space.kscience.visionforge.VisionChange @Serializable @SerialName("solid") public open class SolidBase : VisionBase(), Solid { - override val descriptor: NodeDescriptor get() = Solid.descriptor + override val descriptor: MetaDescriptor get() = Solid.descriptor - override fun update(change: VisionChange) { + override fun change(change: VisionChange) { updatePosition(change.properties) - super.update(change) + super.change(change) } } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt index b78ec4a5..bc6676f6 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt @@ -2,7 +2,7 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import space.kscience.dataforge.meta.descriptors.NodeDescriptor +import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.NameToken import space.kscience.visionforge.* @@ -40,7 +40,7 @@ public class SolidGroup : VisionGroupBase(), Solid, PrototypeHolder { } - override val descriptor: NodeDescriptor get() = Solid.descriptor + override val descriptor: MetaDescriptor get() = Solid.descriptor /** * Get a prototype redirecting the request to the parent if prototype is not found. @@ -60,9 +60,9 @@ public class SolidGroup : VisionGroupBase(), Solid, PrototypeHolder { override fun createGroup(): SolidGroup = SolidGroup() - override fun update(change: VisionChange) { + override fun change(change: VisionChange) { updatePosition(change.properties) - super.update(change) + super.change(change) } public companion object { diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt index aa6c9301..3d9843a3 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt @@ -1,8 +1,8 @@ package space.kscience.visionforge.solid import space.kscience.dataforge.meta.* -import space.kscience.dataforge.meta.descriptors.NodeDescriptor -import space.kscience.dataforge.meta.descriptors.attributes +import space.kscience.dataforge.meta.descriptors.MetaDescriptor +import space.kscience.dataforge.meta.descriptors.value import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus @@ -26,6 +26,8 @@ public class SolidMaterial : Scheme() { */ public val specularColor: ColorAccessor = ColorAccessor(this, SPECULAR_COLOR_KEY) + public val emissiveColor: ColorAccessor = ColorAccessor(this, "emissiveColor".asName()) + /** * Opacity */ @@ -48,43 +50,37 @@ public class SolidMaterial : Scheme() { public val WIREFRAME_KEY: Name = "wireframe".asName() public val MATERIAL_WIREFRAME_KEY: Name = MATERIAL_KEY + WIREFRAME_KEY - public override val descriptor: NodeDescriptor by lazy { + public override val descriptor: MetaDescriptor by lazy { //must be lazy to avoid initialization bug - NodeDescriptor { + MetaDescriptor { inherited = true usesStyles = true - value(COLOR_KEY) { + value(COLOR_KEY, ValueType.STRING, ValueType.NUMBER) { inherited = true usesStyles = true - type(ValueType.STRING, ValueType.NUMBER) widgetType = "color" } - value(SPECULAR_COLOR_KEY) { + value(SPECULAR_COLOR_KEY, ValueType.STRING, ValueType.NUMBER) { inherited = true usesStyles = true - type(ValueType.STRING, ValueType.NUMBER) widgetType = "color" hide() } - value(OPACITY_KEY) { + value(OPACITY_KEY, ValueType.NUMBER) { inherited = true usesStyles = true - type(ValueType.NUMBER) default(1.0) - attributes { - this["min"] = 0.0 - this["max"] = 1.0 - this["step"] = 0.1 - } + attributes["min"] = 0.0 + attributes["max"] = 1.0 + attributes["step"] = 0.1 widgetType = "slider" } - value(WIREFRAME_KEY) { + value(WIREFRAME_KEY, ValueType.BOOLEAN) { inherited = true usesStyles = true - type(ValueType.BOOLEAN) default(false) } } @@ -94,21 +90,23 @@ public class SolidMaterial : Scheme() { public val Solid.color: ColorAccessor get() = ColorAccessor( - allProperties(inherit = true), + meta(inherit = true), MATERIAL_COLOR_KEY ) public var Solid.material: SolidMaterial? - get() = getProperty(MATERIAL_KEY, inherit = true).node?.let { SolidMaterial.read(it) } - set(value) = setProperty(MATERIAL_KEY, value?.rootNode) + get() = getProperty(MATERIAL_KEY, inherit = true)?.let { SolidMaterial.read(it) } + set(value) = setPropertyNode(MATERIAL_KEY, value?.meta) @VisionBuilder public fun Solid.material(builder: SolidMaterial.() -> Unit) { - ownProperties.getChild(MATERIAL_KEY).update(SolidMaterial, builder) + configure(MATERIAL_KEY){ + updateWith(SolidMaterial,builder) + } } public var Solid.opacity: Number? get() = getProperty(MATERIAL_OPACITY_KEY, inherit = true).number set(value) { - setProperty(MATERIAL_OPACITY_KEY, value?.asValue()) + setPropertyValue(MATERIAL_OPACITY_KEY, value?.asValue()) } \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt index 1cb5eac8..0149fc88 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt @@ -4,11 +4,11 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.mapNotNull import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import space.kscience.dataforge.meta.MetaItem -import space.kscience.dataforge.meta.asMetaItem -import space.kscience.dataforge.meta.descriptors.NodeDescriptor +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.* +import space.kscience.dataforge.values.Value import space.kscience.visionforge.* @@ -37,7 +37,7 @@ private fun SolidReference.getRefProperty( inherit: Boolean, includeStyles: Boolean, includeDefaults: Boolean, -): MetaItem? = if (!inherit && !includeStyles && !includeDefaults) { +): Meta? = if (!inherit && !includeStyles && !includeDefaults) { getOwnProperty(name) } else { buildList { @@ -88,9 +88,9 @@ public class SolidReferenceGroup( inherit: Boolean, includeStyles: Boolean, includeDefaults: Boolean, - ): MetaItem? = getRefProperty(name, inherit, includeStyles, includeDefaults) + ): Meta? = getRefProperty(name, inherit, includeStyles, includeDefaults) - override val descriptor: NodeDescriptor get() = prototype.descriptor + override val descriptor: MetaDescriptor get() = prototype.descriptor /** @@ -118,11 +118,15 @@ public class SolidReferenceGroup( ReferenceChild(owner, refName + key.asName()) } ?: emptyMap() - override fun getOwnProperty(name: Name): MetaItem? = + override fun getOwnProperty(name: Name): Meta? = owner.getOwnProperty(childPropertyName(refName, name)) - override fun setProperty(name: Name, item: MetaItem?, notify: Boolean) { - owner.setProperty(childPropertyName(refName, name), item, notify) + override fun setPropertyNode(name: Name, node: Meta?, notify: Boolean) { + owner.setPropertyNode(childPropertyName(refName, name), node, notify) + } + + override fun setPropertyValue(name: Name, value: Value?, notify: Boolean) { + owner.setPropertyValue(childPropertyName(refName, name), value, notify) } override fun getProperty( @@ -130,7 +134,7 @@ public class SolidReferenceGroup( inherit: Boolean, includeStyles: Boolean, includeDefaults: Boolean, - ): MetaItem? = getRefProperty(name, inherit, includeStyles, includeDefaults) + ): Meta? = getRefProperty(name, inherit, includeStyles, includeDefaults) override var parent: VisionGroup? get() { @@ -155,13 +159,13 @@ public class SolidReferenceGroup( owner.invalidateProperty(childPropertyName(refName, propertyName)) } - override fun update(change: VisionChange) { + override fun change(change: VisionChange) { change.properties?.let { - updateProperties(Name.EMPTY, it.asMetaItem()) + updateProperties(Name.EMPTY, it) } } - override val descriptor: NodeDescriptor get() = prototype.descriptor + override val descriptor: MetaDescriptor get() = prototype.descriptor } @@ -184,7 +188,7 @@ public fun SolidGroup.ref( public fun SolidGroup.ref( name: String, obj: Solid, - templateName: Name = name.toName(), + templateName: Name = Name.parse(name), ): SolidReferenceGroup { val existing = getPrototype(templateName) if (existing == null) { diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt index f5aa2d4a..31611dc9 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt @@ -95,13 +95,13 @@ public fun MutablePoint3D.normalizeInPlace() { z /= norm } -internal fun ItemProvider.point3D(default: Float = 0f) = object : Point3D { +internal fun MetaProvider.point3D(default: Float = 0f) = object : Point3D { override val x: Float by float(default) override val y: Float by float(default) override val z: Float by float(default) } -public fun Point3D.toMeta(): MetaBuilder = Meta { +public fun Point3D.toMeta(): Meta = Meta { X_KEY put x Y_KEY put y Z_KEY put z @@ -115,7 +115,7 @@ internal fun Meta.toVector(default: Float = 0f) = Point3D( ) internal fun Solid.updatePosition(meta: Meta?) { - meta[Solid.POSITION_KEY].node?.toVector()?.let { position = it } - meta[Solid.ROTATION_KEY].node?.toVector()?.let { rotation = it } - meta[Solid.SCALE_KEY].node?.toVector(1f)?.let { scale = it } + meta?.get(Solid.POSITION_KEY)?.toVector()?.let { position = it } + meta?.get(Solid.ROTATION_KEY)?.toVector()?.let { rotation = it } + meta?.get(Solid.SCALE_KEY)?.toVector(1f)?.let { scale = it } } \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Axes.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Axes.kt index 2f3e1645..8f980dad 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Axes.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Axes.kt @@ -3,7 +3,7 @@ package space.kscience.visionforge.solid.specifications import space.kscience.dataforge.meta.Scheme import space.kscience.dataforge.meta.SchemeSpec import space.kscience.dataforge.meta.boolean -import space.kscience.dataforge.meta.descriptors.NodeDescriptor +import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.double import space.kscience.visionforge.value @@ -16,8 +16,8 @@ public class Axes : Scheme() { public const val AXIS_SIZE: Double = 1000.0 public const val AXIS_WIDTH: Double = 3.0 - override val descriptor: NodeDescriptor by lazy { - NodeDescriptor { + override val descriptor: MetaDescriptor by lazy { + MetaDescriptor { value(Axes::visible){ default(false) } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Camera.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Camera.kt index 905fa234..2319fa69 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Camera.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Camera.kt @@ -2,7 +2,7 @@ package space.kscience.visionforge.solid.specifications import space.kscience.dataforge.meta.Scheme import space.kscience.dataforge.meta.SchemeSpec -import space.kscience.dataforge.meta.descriptors.NodeDescriptor +import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.double import space.kscience.dataforge.meta.int import space.kscience.visionforge.value @@ -27,8 +27,8 @@ public class Camera : Scheme() { public const val FAR_CLIP: Double = 10000.0 public const val FIELD_OF_VIEW: Int = 75 - override val descriptor: NodeDescriptor by lazy { - NodeDescriptor { + override val descriptor: MetaDescriptor by lazy { + MetaDescriptor { value(Camera::fov){ default(FIELD_OF_VIEW) } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt index 11dd5800..ea546821 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt @@ -1,8 +1,7 @@ package space.kscience.visionforge.solid.specifications import space.kscience.dataforge.meta.* -import space.kscience.dataforge.meta.descriptors.NodeDescriptor -import space.kscience.dataforge.meta.descriptors.attributes +import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.names.Name import space.kscience.dataforge.values.ValueType import space.kscience.visionforge.hide @@ -16,30 +15,26 @@ public class Clipping : Scheme() { public var z: Double? by double() public companion object : SchemeSpec(::Clipping) { - override val descriptor: NodeDescriptor = NodeDescriptor { + override val descriptor: MetaDescriptor = MetaDescriptor { value(Clipping::x) { widgetType = "range" - attributes { - set("min", 0.0) - set("max", 1.0) - set("step", 0.01) - } + attributes["min"] = 0.0 + attributes["max"] = 1.0 + attributes["step"] = 0.01 } value(Clipping::y) { widgetType = "range" - attributes { - set("min", 0.0) - set("max", 1.0) - set("step", 0.01) - } + attributes["min"] = 0.0 + attributes["max"] = 1.0 + attributes["step"] = 0.01 + } value(Clipping::z) { widgetType = "range" - attributes { - set("min", 0.0) - set("max", 1.0) - set("step", 0.01) - } + attributes["min"] = 0.0 + attributes["max"] = 1.0 + attributes["step"] = 0.01 + } } } @@ -55,7 +50,7 @@ public class CanvasSize : Scheme() { public var maxHeight: Number by number { maxSize } public companion object : SchemeSpec(::CanvasSize) { - override val descriptor: NodeDescriptor = NodeDescriptor { + override val descriptor: MetaDescriptor = MetaDescriptor { value(CanvasSize::minSize) value(CanvasSize::minWith) value(CanvasSize::minHeight) @@ -82,8 +77,8 @@ public class Canvas3DOptions : Scheme() { public companion object : SchemeSpec(::Canvas3DOptions) { - override val descriptor: NodeDescriptor by lazy { - NodeDescriptor { + override val descriptor: MetaDescriptor by lazy { + MetaDescriptor { scheme(Canvas3DOptions::axes, Axes) scheme(Canvas3DOptions::light, Light) @@ -104,7 +99,7 @@ public class Canvas3DOptions : Scheme() { multiple = true default(listOf(0)) widgetType = "multiSelect" - allow(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10) + allowedValues(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10) } scheme(Canvas3DOptions::clipping, Clipping) } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/RemoveSingleChild.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/RemoveSingleChild.kt index a51aaa25..e623ef46 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/RemoveSingleChild.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/RemoveSingleChild.kt @@ -1,12 +1,9 @@ package space.kscience.visionforge.solid.transform -import space.kscience.dataforge.meta.itemSequence +import space.kscience.dataforge.meta.update import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.asName -import space.kscience.visionforge.MutableVisionGroup -import space.kscience.visionforge.Vision -import space.kscience.visionforge.VisionGroup -import space.kscience.visionforge.meta +import space.kscience.visionforge.* import space.kscience.visionforge.solid.* private operator fun Number.plus(other: Number) = toFloat() + other.toFloat() @@ -24,10 +21,8 @@ internal fun Vision.updateFrom(other: Vision): Vision { scaleX *= other.scaleX scaleY *= other.scaleY scaleZ *= other.scaleZ - other.meta.itemSequence().forEach { (name, item) -> - if (getProperty(name) == null) { - setProperty(name, item) - } + configure{ + update(other.meta()) } } return this diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/ConvexTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/ConvexTest.kt index 58cde48e..a7133006 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/ConvexTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/ConvexTest.kt @@ -1,9 +1,8 @@ package space.kscience.visionforge.solid -import space.kscience.dataforge.meta.MetaItemNode import space.kscience.dataforge.meta.getIndexed import space.kscience.dataforge.meta.node -import space.kscience.dataforge.meta.toMetaItem +import space.kscience.dataforge.meta.toMeta import space.kscience.dataforge.misc.DFExperimental import kotlin.test.Test import kotlin.test.assertEquals @@ -29,9 +28,9 @@ class ConvexTest { val convex = group.children.values.first() as Convex val json = Solids.jsonForSolids.encodeToJsonElement(Convex.serializer(), convex) - val meta = json.toMetaItem().node!! + val meta = json.toMeta() - val points = meta.getIndexed("points").values.map { (it as MetaItemNode<*>).node.point3D() } + val points = meta.getIndexed("points").values.map { it.point3D() } assertEquals(8, points.count()) assertEquals(8, convex.points.size) diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/DescriptorTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/DescriptorTest.kt index 95f6b23e..6f004f5c 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/DescriptorTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/DescriptorTest.kt @@ -1,6 +1,5 @@ package space.kscience.visionforge.solid -import space.kscience.dataforge.meta.descriptors.ValueDescriptor import space.kscience.dataforge.meta.descriptors.get import space.kscience.dataforge.values.ValueType import space.kscience.visionforge.solid.specifications.Canvas3DOptions @@ -16,7 +15,7 @@ class DescriptorTest { val axesSize = descriptor["axes.size"] assertNotNull(axesSize) assertTrue { - ValueType.NUMBER in (axesSize as ValueDescriptor).type!! + ValueType.NUMBER in axesSize.valueTypes!! } } } \ No newline at end of file diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/PropertyTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/PropertyTest.kt index 1a9aa45b..a31ed9f8 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/PropertyTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/PropertyTest.kt @@ -12,7 +12,7 @@ class PropertyTest { fun testInheritedProperty() { var box: Box? = null val group = SolidGroup().apply { - setProperty("test", 22) + setPropertyNode("test", 22) group { box = box(100, 100, 100) } diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt index 6df7b285..d878881f 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt @@ -1,7 +1,6 @@ package space.kscience.visionforge.solid import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.toName import space.kscience.visionforge.MutableVisionGroup import space.kscience.visionforge.get import space.kscience.visionforge.meta @@ -14,7 +13,7 @@ import kotlin.test.assertEquals */ fun SolidGroup.refGroup( name: String, - templateName: Name = name.toName(), + templateName: Name = Name.parse(name), block: MutableVisionGroup.() -> Unit ): SolidReferenceGroup { val group = SolidGroup().apply(block) @@ -30,10 +29,10 @@ class SerializationTest { x = 100 z = -100 } - val string = Solids.encodeToString(cube) + val string = Solids.encodeToString(cube) println(string) val newCube = Solids.decodeFromString(string) - assertEquals(cube.meta, newCube.meta) + assertEquals(cube.meta(), newCube.meta()) } @Test @@ -43,10 +42,10 @@ class SerializationTest { x = 100 z = -100 } - val group = SolidGroup{ + val group = SolidGroup { ref("cube", cube) - refGroup("pg", "pg.content".toName()){ - sphere(50){ + refGroup("pg", Name.parse("pg.content")) { + sphere(50) { x = -100 } } @@ -54,7 +53,7 @@ class SerializationTest { val string = Solids.encodeToString(group) println(string) val reconstructed = Solids.decodeFromString(string) as SolidGroup - assertEquals(group["cube"]?.meta, reconstructed["cube"]?.meta) + assertEquals(group["cube"]?.meta(), reconstructed["cube"]?.meta()) } } \ No newline at end of file diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt index 2e87adf8..821e7f04 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt @@ -2,8 +2,9 @@ package space.kscience.visionforge.solid import space.kscience.dataforge.context.Global import space.kscience.dataforge.context.fetch -import space.kscience.dataforge.meta.MetaItem -import space.kscience.dataforge.names.toName +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.names.asName +import space.kscience.dataforge.values.asValue import space.kscience.visionforge.VisionChange import space.kscience.visionforge.get import kotlin.test.Test @@ -24,10 +25,10 @@ class VisionUpdateTest { color(123) box(100,100,100) } - propertyChanged("top".toName(), SolidMaterial.MATERIAL_COLOR_KEY, MetaItem.of("red")) - propertyChanged("origin".toName(), SolidMaterial.MATERIAL_COLOR_KEY, MetaItem.of("red")) + propertyChanged("top".asName(), SolidMaterial.MATERIAL_COLOR_KEY, Meta("red".asValue())) + propertyChanged("origin".asName(), SolidMaterial.MATERIAL_COLOR_KEY, Meta("red".asValue())) } - targetVision.update(dif) + targetVision.change(dif) assertTrue { targetVision["top"] is SolidGroup } assertEquals("red", (targetVision["origin"] as Solid).color.string) // Should work assertEquals("#00007b", (targetVision["top"] as Solid).color.string) // new item always takes precedence @@ -40,8 +41,8 @@ class VisionUpdateTest { color(123) box(100,100,100) } - propertyChanged("top".toName(), SolidMaterial.MATERIAL_COLOR_KEY, MetaItem.of("red")) - propertyChanged("origin".toName(), SolidMaterial.MATERIAL_COLOR_KEY, MetaItem.of("red")) + propertyChanged("top".asName(), SolidMaterial.MATERIAL_COLOR_KEY, Meta("red".asValue())) + propertyChanged("origin".asName(), SolidMaterial.MATERIAL_COLOR_KEY, Meta("red".asValue())) } val serialized = visionManager.jsonFormat.encodeToString(VisionChange.serializer(), change) println(serialized) diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt index 7cbd4d3d..7e90a657 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt @@ -90,7 +90,7 @@ public fun Mesh.applyEdges(obj: Solid) { MeshThreeFactory.EDGES_MATERIAL_KEY, inherit = true, includeStyles = true - ).node, + ), true ) if (edges == null) { diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt index 3afb6776..2cfcadf5 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt @@ -168,10 +168,10 @@ public class ThreeCanvas( } //Clipping planes - options.onChange(this@ThreeCanvas) { name, _, _ -> + options.meta.onChange(this@ThreeCanvas) { name-> if (name.startsWith(Canvas3DOptions::clipping.name.asName())) { val clipping = options.clipping - if (!clipping.isEmpty()) { + if (!clipping.meta.isEmpty()) { renderer.localClippingEnabled = true boundingBox?.let { boundingBox -> val xClippingPlane = clipping.x?.let { @@ -212,9 +212,9 @@ public class ThreeCanvas( private fun Object3D.fullName(): Name { if (root == null) error("Can't resolve element name without the root") return if (parent == root) { - name.toName() + Name.parse(name) } else { - (parent?.fullName() ?: Name.EMPTY) + name.toName() + (parent?.fullName() ?: Name.EMPTY) + Name.parse(name) } } @@ -237,7 +237,7 @@ public class ThreeCanvas( private fun buildLight(spec: Light?): info.laht.threekt.lights.Light = AmbientLight(0x404040) private fun addControls(element: Node, controls: Controls) { - when (controls["type"].string) { + when (controls.meta["type"].string) { "trackball" -> TrackballControls(camera, element) else -> OrbitControls(camera, element) } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt index b2858fdb..bc369086 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt @@ -4,7 +4,6 @@ import info.laht.threekt.core.BufferGeometry import info.laht.threekt.core.Object3D import info.laht.threekt.math.Color import info.laht.threekt.objects.LineSegments -import space.kscience.dataforge.meta.node import space.kscience.visionforge.onPropertyChange import space.kscience.visionforge.solid.PolyLine import space.kscience.visionforge.solid.color @@ -20,7 +19,10 @@ public object ThreeLineFactory : ThreeFactory { setFromPoints(Array(obj.points.size) { obj.points[it].toVector() }) } - val material = ThreeMaterials.getLineMaterial(obj.getProperty(MeshThreeFactory.EDGES_MATERIAL_KEY).node, true) + val material = ThreeMaterials.getLineMaterial( + obj.getProperty(MeshThreeFactory.EDGES_MATERIAL_KEY), + true + ) material.linewidth = obj.thickness.toDouble() material.color = obj.color.string?.let { Color(it) } ?: DEFAULT_LINE_COLOR diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt index 5f7ef051..258df5ff 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt @@ -13,7 +13,7 @@ import space.kscience.dataforge.values.int import space.kscience.dataforge.values.string import space.kscience.visionforge.Colors import space.kscience.visionforge.Vision -import space.kscience.visionforge.ownProperties +import space.kscience.visionforge.meta import space.kscience.visionforge.solid.SolidMaterial @@ -41,7 +41,7 @@ public object ThreeMaterials { private val lineMaterialCache = HashMap() private fun buildLineMaterial(meta: Meta): LineBasicMaterial = LineBasicMaterial().apply { - color = meta[SolidMaterial.COLOR_KEY]?.getColor() ?: DEFAULT_LINE_COLOR + color = meta[SolidMaterial.COLOR_KEY]?.threeColor() ?: DEFAULT_LINE_COLOR opacity = meta[SolidMaterial.OPACITY_KEY].double ?: 1.0 transparent = opacity < 1.0 linewidth = meta["thickness"].double ?: 1.0 @@ -59,11 +59,12 @@ public object ThreeMaterials { private val materialCache = HashMap() internal fun buildMaterial(meta: Meta): Material { + val material = SolidMaterial.read(meta) return meta[SolidMaterial.SPECULAR_COLOR_KEY]?.let { specularColor -> MeshPhongMaterial().apply { - color = meta[SolidMaterial.COLOR_KEY]?.getColor() ?: DEFAULT_COLOR - specular = specularColor.getColor() - emissive = specular + color = meta[SolidMaterial.COLOR_KEY]?.threeColor() ?: DEFAULT_COLOR + specular = specularColor.threeColor() + emissive = material.emissiveColor.item?.threeColor() ?: specular reflectivity = 0.5 refractionRatio = 1.0 shininess = 100.0 @@ -73,7 +74,7 @@ public object ThreeMaterials { needsUpdate = true } } ?: MeshBasicMaterial().apply { - color = meta[SolidMaterial.COLOR_KEY]?.getColor() ?: DEFAULT_COLOR + color = meta[SolidMaterial.COLOR_KEY]?.threeColor() ?: DEFAULT_COLOR opacity = meta[SolidMaterial.OPACITY_KEY]?.double ?: 1.0 transparent = opacity < 1.0 wireframe = meta[SolidMaterial.WIREFRAME_KEY].boolean ?: false @@ -93,22 +94,19 @@ public object ThreeMaterials { /** * Infer color based on meta item */ -public fun MetaItem.getColor(): Color { - return when (this) { - is MetaItemValue -> if (this.value.type == ValueType.NUMBER) { +public fun Meta.threeColor(): Color { + return value?.let { value -> + if (value.type == ValueType.NUMBER) { val int = value.int Color(int) } else { - Color(this.value.string) + Color(value.string) } - is MetaItemNode -> { - Color( - node[Colors.RED_KEY]?.int ?: 0, - node[Colors.GREEN_KEY]?.int ?: 0, - node[Colors.BLUE_KEY]?.int ?: 0 - ) - } - } + } ?: Color( + this[Colors.RED_KEY]?.int ?: 0, + this[Colors.GREEN_KEY]?.int ?: 0, + this[Colors.BLUE_KEY]?.int ?: 0 + ) } private var Material.cached: Boolean @@ -119,7 +117,7 @@ private var Material.cached: Boolean public fun Mesh.updateMaterial(vision: Vision) { //val meta = vision.getProperty(SolidMaterial.MATERIAL_KEY, inherit = true).node - val ownMaterialMeta = vision.ownProperties[SolidMaterial.MATERIAL_KEY] + val ownMaterialMeta = vision.meta()[SolidMaterial.MATERIAL_KEY] val parentMaterialMeta = vision.parent?.getProperty( SolidMaterial.MATERIAL_KEY, inherit = true, @@ -135,7 +133,7 @@ public fun Mesh.updateMaterial(vision: Vision) { inherit = false, includeStyles = true, includeDefaults = false - ).node?.let { + )?.let { ThreeMaterials.cacheMaterial(it) } ?: ThreeMaterials.DEFAULT } @@ -143,7 +141,7 @@ public fun Mesh.updateMaterial(vision: Vision) { vision.getProperty( SolidMaterial.MATERIAL_KEY, inherit = true - ).node?.let { + )?.let { ThreeMaterials.buildMaterial(it) } ?: ThreeMaterials.DEFAULT } @@ -162,7 +160,7 @@ public fun Mesh.updateMaterialProperty(vision: Vision, propertyName: Name) { inherit = true, includeStyles = true, includeDefaults = false - )?.getColor() ?: ThreeMaterials.DEFAULT_COLOR + )?.threeColor() ?: ThreeMaterials.DEFAULT_COLOR material.needsUpdate = true } SolidMaterial.MATERIAL_OPACITY_KEY -> { diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt index e6d85dc5..9c7c1f6b 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt @@ -143,7 +143,7 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { element, vision as? Solid ?: error("Solid expected but ${vision::class} found"), ).apply { - options.update(meta) + options.meta.update(meta) } } @@ -195,8 +195,4 @@ internal fun Object3D.findChild(name: Name): Object3D? { name.length == 1 -> this.children.find { it.name == name.tokens.first().toString() } else -> findChild(name.tokens.first().asName())?.findChild(name.cutFirst()) } -} - -public fun Context.withThreeJs(): Context = apply { - plugins.fetch(ThreePlugin) } \ No newline at end of file diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt index 33fd3ccb..4dca0eeb 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt @@ -3,9 +3,9 @@ package space.kscience.visionforge.solid.three import info.laht.threekt.core.BufferGeometry import info.laht.threekt.core.Object3D import info.laht.threekt.objects.Mesh +import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.cutFirst import space.kscience.dataforge.names.firstOrNull -import space.kscience.dataforge.names.toName import space.kscience.visionforge.onPropertyChange import space.kscience.visionforge.solid.Solid import space.kscience.visionforge.solid.SolidReferenceGroup @@ -49,7 +49,7 @@ public object ThreeReferenceFactory : ThreeFactory { obj.onPropertyChange(three.updateScope) { name-> if (name.firstOrNull()?.body == REFERENCE_CHILD_PROPERTY_PREFIX) { - val childName = name.firstOrNull()?.index?.toName() ?: error("Wrong syntax for reference child property: '$name'") + val childName = name.firstOrNull()?.index?.let(Name::parse) ?: error("Wrong syntax for reference child property: '$name'") val propertyName = name.cutFirst() val referenceChild = obj[childName] ?: error("Reference child with name '$childName' not found") val child = object3D.findChild(childName) ?: error("Object child with name '$childName' not found") diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/three.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/three.kt index 9e78800b..ea609e58 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/three.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/three.kt @@ -8,7 +8,7 @@ import info.laht.threekt.math.Euler import info.laht.threekt.math.Vector3 import info.laht.threekt.objects.Mesh import info.laht.threekt.textures.Texture -import space.kscience.dataforge.meta.MetaItem +import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.float import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.node @@ -17,7 +17,7 @@ import kotlin.math.PI public val Solid.euler: Euler get() = Euler(rotationX, rotationY, rotationZ, rotationOrder.name) -public val MetaItem.vector: Vector3 get() = Vector3(node["x"].float ?: 0f, node["y"].float ?: 0f, node["z"].float ?: 0f) +public val Meta.vector: Vector3 get() = Vector3(this["x"].float ?: 0f, this["y"].float ?: 0f, this["z"].float ?: 0f) internal fun Double.toRadians() = this * PI / 180 From 7b78052f617b6668dded0690e7540ea9c27c7e2c Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 8 Aug 2021 22:17:50 +0300 Subject: [PATCH 028/109] A lot of changes --- build.gradle.kts | 2 +- demo/gdml/build.gradle.kts | 5 +- .../visionforge/gdml/GDMLVisionTest.kt | 4 +- .../visionforge/gdml/demo/GdmlFxDemoApp.kt | 6 +- .../kscience/visionforge/solid/demo/demo.kt | 9 +- .../visionforge/solid/demo/VariableBox.kt | 9 +- ui/bootstrap/build.gradle.kts | 2 +- .../bootstrap/visionPropertyEditor.kt | 9 +- .../ThreeViewWithControls.kt | 7 +- .../ringPropertyEditor.kt | 9 +- .../visionforge/ComputedVisionProperties.kt | 53 ++++++ .../space/kscience/visionforge/StyleSheet.kt | 18 +- .../space/kscience/visionforge/Vision.kt | 122 ++++++------- .../space/kscience/visionforge/VisionBase.kt | 165 ++++++++++-------- .../kscience/visionforge/VisionChange.kt | 4 +- .../kscience/visionforge/VisionGroupBase.kt | 12 +- .../kscience/visionforge/VisionProperties.kt | 38 ---- .../visionforge/VisionPropertyContainer.kt | 31 +--- .../kotlin/space/kscience/visionforge/misc.kt | 11 +- .../kscience/visionforge/schemeDesctiptors.kt | 66 ------- .../kscience/visionforge/visionDelegates.kt | 76 ++++---- .../kscience/visionforge/visionDescriptor.kt | 9 - .../kscience/visionforge/html/HtmlTagTest.kt | 11 +- .../visionforge/meta/VisionPropertyTest.kt | 44 +++++ .../kscience/visionforge/VisionClient.kt | 2 +- .../visionforge/editor/FXMetaModel.kt | 154 ++-------------- .../visionforge/editor/MutableMetaEditor.kt | 54 +----- .../editor/VisionEditorFragment.kt | 45 ++--- .../kscience/visionforge/solid/FX3DPlugin.kt | 3 +- .../visionforge/solid/FXReferenceFactory.kt | 2 +- .../solid/VisualObjectFXBinding.kt | 5 +- .../visionforge/markup/VisionOfMarkup.kt | 2 +- .../visionforge/plotly/VisionOfPlotly.kt | 4 +- .../visionforge/three/server/VisionServer.kt | 2 +- .../visionforge/solid/ColorAccessor.kt | 13 +- .../kscience/visionforge/solid/Composite.kt | 15 +- .../kscience/visionforge/solid/Extruded.kt | 5 +- .../space/kscience/visionforge/solid/Solid.kt | 29 ++- .../kscience/visionforge/solid/SolidBase.kt | 4 +- .../kscience/visionforge/solid/SolidGroup.kt | 4 +- .../visionforge/solid/SolidMaterial.kt | 24 ++- .../visionforge/solid/SolidReference.kt | 81 +++------ .../visionforge/solid/specifications/Axes.kt | 2 +- .../solid/specifications/Camera.kt | 16 +- .../solid/specifications/Canvas3DOptions.kt | 27 +-- .../solid/transform/RemoveSingleChild.kt | 3 +- .../visionforge/solid/PropertyTest.kt | 19 +- .../visionforge/solid/SerializationTest.kt | 5 +- .../visionforge/solid/VisionUpdateTest.kt | 2 +- .../solid/three/MeshThreeFactory.kt | 15 +- .../solid/three/ThreeCompositeFactory.kt | 2 +- .../solid/three/ThreeGeometryBuilder.kt | 2 +- .../solid/three/ThreeLabelFactory.kt | 2 +- .../solid/three/ThreeLineFactory.kt | 5 +- .../visionforge/solid/three/ThreeMaterials.kt | 31 ++-- .../visionforge/solid/three/ThreePlugin.kt | 2 +- .../solid/three/ThreeReferenceFactory.kt | 2 +- .../kscience/visionforge/solid/three/csg.kt | 3 +- 58 files changed, 524 insertions(+), 784 deletions(-) create mode 100644 visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ComputedVisionProperties.kt delete mode 100644 visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt delete mode 100644 visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/schemeDesctiptors.kt create mode 100644 visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt diff --git a/build.gradle.kts b/build.gradle.kts index 22615a5d..ec691447 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,7 +2,7 @@ plugins { id("ru.mipt.npm.gradle.project") } -val dataforgeVersion by extra("0.5.0-dev-9") +val dataforgeVersion by extra("0.5.0-dev-10") val fxVersion by extra("11") allprojects { diff --git a/demo/gdml/build.gradle.kts b/demo/gdml/build.gradle.kts index 391db4f9..ead65970 100644 --- a/demo/gdml/build.gradle.kts +++ b/demo/gdml/build.gradle.kts @@ -16,7 +16,7 @@ kotlin { jvm { withJava() } - js{ + js { useCommonJs() browser { commonWebpackConfig { @@ -34,6 +34,7 @@ kotlin { jvmMain { dependencies { implementation(project(":visionforge-fx")) + implementation("ch.qos.logback:logback-classic:1.2.5") } } jsMain { @@ -53,5 +54,5 @@ application { val convertGdmlToJson by tasks.creating(JavaExec::class) { group = "application" classpath = sourceSets["main"].runtimeClasspath - main = "space.kscience.dataforge.vis.spatial.gdml.demo.SaveToJsonKt" + mainClass.set("space.kscience.dataforge.vis.spatial.gdml.demo.SaveToJsonKt") } \ No newline at end of file diff --git a/demo/gdml/src/commonTest/kotlin/space/kscience/visionforge/gdml/GDMLVisionTest.kt b/demo/gdml/src/commonTest/kotlin/space/kscience/visionforge/gdml/GDMLVisionTest.kt index 66332d9d..50ba6d12 100644 --- a/demo/gdml/src/commonTest/kotlin/space/kscience/visionforge/gdml/GDMLVisionTest.kt +++ b/demo/gdml/src/commonTest/kotlin/space/kscience/visionforge/gdml/GDMLVisionTest.kt @@ -1,8 +1,8 @@ package space.kscience.visionforge.gdml -import space.kscience.dataforge.meta.string import space.kscience.dataforge.names.Name import space.kscience.dataforge.values.asValue +import space.kscience.dataforge.values.string import space.kscience.gdml.GdmlShowCase import space.kscience.visionforge.setProperty import space.kscience.visionforge.solid.SolidMaterial @@ -27,6 +27,6 @@ class GDMLVisionTest { val child = vision[Name.of("composite-000","segment-0")] assertNotNull(child) child.setProperty(SolidMaterial.MATERIAL_COLOR_KEY, "red".asValue()) - assertEquals("red", child.getProperty(SolidMaterial.MATERIAL_COLOR_KEY).string) + assertEquals("red", child.getPropertyValue(SolidMaterial.MATERIAL_COLOR_KEY)?.string) } } \ No newline at end of file diff --git a/demo/gdml/src/jvmMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlFxDemoApp.kt b/demo/gdml/src/jvmMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlFxDemoApp.kt index d4cd85b0..cb40431c 100644 --- a/demo/gdml/src/jvmMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlFxDemoApp.kt +++ b/demo/gdml/src/jvmMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlFxDemoApp.kt @@ -7,7 +7,7 @@ import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.fetch import space.kscience.gdml.GdmlShowCase import space.kscience.visionforge.VisionManager -import space.kscience.visionforge.describedProperties +import space.kscience.visionforge.computeProperties import space.kscience.visionforge.editor.VisionEditorFragment import space.kscience.visionforge.editor.VisionTreeFragment import space.kscience.visionforge.gdml.toVision @@ -34,10 +34,10 @@ class GDMLView : View() { } private val propertyEditor = VisionEditorFragment { - it.describedProperties + it.computeProperties() }.apply { descriptorProperty.set(SolidMaterial.descriptor) - itemProperty.bind(treeFragment.selectedProperty) + visionProperty.bind(treeFragment.selectedProperty) } override val root: Parent = borderpane { diff --git a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt index fcf94589..c933c3ce 100644 --- a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt +++ b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt @@ -1,9 +1,6 @@ package space.kscience.visionforge.solid.demo -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.delay -import kotlinx.coroutines.isActive -import kotlinx.coroutines.launch +import kotlinx.coroutines.* import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.invoke import space.kscience.dataforge.names.Name @@ -76,7 +73,7 @@ fun VisionLayout.showcase() { //override color for this cube color(1530) - launch(Dispatchers.Main) { + GlobalScope.launch(Dispatchers.Main) { while (isActive) { delay(500) visible = !(visible ?: false) @@ -85,7 +82,7 @@ fun VisionLayout.showcase() { } } - launch(Dispatchers.Main) { + GlobalScope.launch(Dispatchers.Main) { val random = Random(111) while (isActive) { delay(1000) diff --git a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt index 22cac2c6..af828f46 100644 --- a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt +++ b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt @@ -3,6 +3,7 @@ package space.kscience.visionforge.solid.demo import info.laht.threekt.core.Object3D import info.laht.threekt.geometries.BoxGeometry import info.laht.threekt.objects.Mesh +import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.int import space.kscience.dataforge.meta.number import space.kscience.dataforge.names.asName @@ -43,13 +44,13 @@ internal class VariableBox(val xSize: Number, val ySize: Number) : ThreeJsVision it.layers.enable(this@VariableBox.layer) } } - mesh.scale.z = getOwnProperty(VALUE).number?.toDouble() ?: 1.0 + mesh.scale.z = meta[VALUE].number?.toDouble() ?: 1.0 //add listener to object properties - onPropertyChange(three.context) { name -> + onPropertyChange { name -> when { name == VALUE -> { - val value = getOwnProperty(VALUE).int ?: 0 + val value = meta.get(VALUE).int ?: 0 val size = value.toFloat() / 255f * 20f mesh.scale.z = size.toDouble() mesh.position.z = size.toDouble() / 2 @@ -69,7 +70,7 @@ internal class VariableBox(val xSize: Number, val ySize: Number) : ThreeJsVision } var value: Int - get() = getOwnProperty(VALUE).int ?: 0 + get() = meta[VALUE].int ?: 0 set(value) { setProperty(VALUE, value.asValue()) } diff --git a/ui/bootstrap/build.gradle.kts b/ui/bootstrap/build.gradle.kts index af4ec727..b1b0588e 100644 --- a/ui/bootstrap/build.gradle.kts +++ b/ui/bootstrap/build.gradle.kts @@ -11,5 +11,5 @@ dependencies { implementation(npm("file-saver", "2.0.2")) implementation(npm("bootstrap","4.6.0")) implementation(npm("jquery","3.5.1")) - implementation(npm("@popperjs/core","2.9.3")) + implementation(npm("popper.js","1.16.1")) } \ No newline at end of file diff --git a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt index 9c2206f1..65255af6 100644 --- a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt +++ b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt @@ -4,13 +4,10 @@ import org.w3c.dom.Element import react.RBuilder import react.dom.render import space.kscience.dataforge.meta.descriptors.MetaDescriptor -import space.kscience.visionforge.Vision -import space.kscience.visionforge.getStyle -import space.kscience.visionforge.meta +import space.kscience.visionforge.* import space.kscience.visionforge.react.metaViewer import space.kscience.visionforge.react.propertyEditor import space.kscience.visionforge.solid.SolidReference -import space.kscience.visionforge.styles public fun RBuilder.visionPropertyEditor( vision: Vision, @@ -20,8 +17,8 @@ public fun RBuilder.visionPropertyEditor( card("Properties") { propertyEditor( - ownProperties = vision.meta(false,false,false), - allProperties = vision.meta(), + ownProperties = vision.meta, + allProperties = vision.computeProperties(), updateFlow = vision.propertyChanges, descriptor = descriptor, key = key diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt index d0aa2ed8..f8439a07 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt @@ -14,7 +14,8 @@ import space.kscience.dataforge.names.NameToken import space.kscience.dataforge.names.isEmpty import space.kscience.dataforge.names.length import space.kscience.visionforge.VisionGroup -import space.kscience.visionforge.meta +import space.kscience.visionforge.computeProperties +import space.kscience.visionforge.propertyChanges import space.kscience.visionforge.react.ThreeCanvasComponent import space.kscience.visionforge.react.flexColumn import space.kscience.visionforge.react.flexRow @@ -134,8 +135,8 @@ public val ThreeCanvasWithControls: FunctionComponent + get() { + val metaKeys = vision.meta.items.keys + val descriptorKeys = descriptor?.children?.map { NameToken(it.key) } ?: emptySet() + return (metaKeys + descriptorKeys).associateWith { getMeta(rootName + it) } + } + + override var value: Value? + get() { + val inheritFlag = descriptor?.inherited ?: false + val stylesFlag = descriptor?.usesStyles ?: true + return vision.getPropertyValue(rootName, inheritFlag, stylesFlag, true) + } + set(value) { + vision.meta.setValue(rootName, value) + } + + override fun getMeta(name: Name): ObservableMutableMeta = + ComputedVisionProperties(vision, rootName + name, visionDescriptor) + + override fun getOrCreate(name: Name): ObservableMutableMeta = getMeta(name) + + override fun toMeta(): Meta = this +} + +/** + * Compute property node based on inheritance and style information from the descriptor + */ +public fun Vision.computeProperties(descriptor: MetaDescriptor? = this.descriptor): ObservableMutableMeta = + if (descriptor == null) meta else ComputedVisionProperties(this, Name.EMPTY, descriptor) + +public fun Vision.computePropertyNode(name: Name, descriptor: MetaDescriptor? = this.descriptor): ObservableMutableMeta? = + computeProperties(descriptor)[name] \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt index e2869df8..dacc09b1 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt @@ -5,6 +5,7 @@ import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.NameToken import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus +import space.kscience.dataforge.values.Value import space.kscience.dataforge.values.asValue import kotlin.jvm.JvmInline @@ -14,7 +15,7 @@ import kotlin.jvm.JvmInline @JvmInline public value class StyleSheet(private val owner: VisionGroup) { - private val styleNode: Meta? get() = owner.getOwnProperty(STYLESHEET_KEY) + private val styleNode: Meta? get() = owner.meta[STYLESHEET_KEY] public val items: Map? get() = styleNode?.items @@ -24,7 +25,7 @@ public value class StyleSheet(private val owner: VisionGroup) { * Define a style without notifying owner */ public fun define(key: String, style: Meta?) { - owner.setPropertyNode(STYLESHEET_KEY + key, style) + owner.meta.setMeta(STYLESHEET_KEY + key, style) } /** @@ -71,9 +72,9 @@ internal fun Vision.styleChanged(key: String, oldStyle: Meta?, newStyle: Meta?) * List of names of styles applied to this object. Order matters. Not inherited. */ public var Vision.styles: List - get() = getOwnProperty(Vision.STYLE_KEY)?.stringList ?: emptyList() + get() = meta.getMeta(Vision.STYLE_KEY)?.stringList ?: emptyList() set(value) { - setPropertyValue(Vision.STYLE_KEY, value.map { it.asValue() }.asValue()) + meta.setValue(Vision.STYLE_KEY, value.map { it.asValue() }.asValue()) } /** @@ -86,7 +87,7 @@ public val VisionGroup.styleSheet: StyleSheet get() = StyleSheet(this) * Add style name to the list of styles to be resolved later. The style with given name does not necessary exist at the moment. */ public fun Vision.useStyle(name: String) { - styles = (getOwnProperty(Vision.STYLE_KEY)?.stringList ?: emptyList()) + name + styles = (meta.getMeta(Vision.STYLE_KEY)?.stringList ?: emptyList()) + name } @@ -94,7 +95,12 @@ public fun Vision.useStyle(name: String) { * Find a style with given name for given [Vision]. The style is not necessary applied to this [Vision]. */ public tailrec fun Vision.getStyle(name: String): Meta? = - getOwnProperty(StyleSheet.STYLESHEET_KEY + name) ?: parent?.getStyle(name) + meta.getMeta(StyleSheet.STYLESHEET_KEY + name) ?: parent?.getStyle(name) + +/** + * Resolve a property from all styles + */ +public fun Vision.getStyleProperty(name: Name): Value? = styles.firstNotNullOfOrNull { getStyle(it)?.get(name)?.value } /** * Resolve an item in all style layers diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt index daa854a5..e7bdd301 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt @@ -1,27 +1,27 @@ package space.kscience.visionforge -import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.MutableMeta +import kotlinx.coroutines.flow.callbackFlow +import kotlinx.coroutines.launch +import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.Described import space.kscience.dataforge.meta.descriptors.MetaDescriptor -import space.kscience.dataforge.meta.update +import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.misc.Type import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.dataforge.values.Value +import space.kscience.dataforge.values.asValue +import space.kscience.dataforge.values.boolean import space.kscience.visionforge.Vision.Companion.TYPE -import kotlin.coroutines.CoroutineContext -import kotlin.coroutines.EmptyCoroutineContext /** * A root type for display hierarchy */ @Type(TYPE) -public interface Vision : Described, CoroutineScope { +public interface Vision : Described, Configurable { /** * The parent object of this one. If null, this one is a root. @@ -33,47 +33,23 @@ public interface Vision : Described, CoroutineScope { */ public val manager: VisionManager? get() = parent?.manager - override val coroutineContext: CoroutineContext - get() = manager?.context?.coroutineContext ?: EmptyCoroutineContext + /** + * This Vision own properties (ignoring inheritance, styles and defaults + */ + override val meta: ObservableMutableMeta /** - * Get property. + * Get property value with given layer flags. * @param inherit toggles parent node property lookup. Null means inference from descriptor. Default is false. - * @param includeStyles toggles inclusion of. Null means inference from descriptor. Default is true. + * @param includeStyles toggles inclusion of properties from styles. default is true */ - public fun getProperty( + public fun getPropertyValue( name: Name, inherit: Boolean = false, includeStyles: Boolean = true, includeDefaults: Boolean = true, - ): Meta? + ): Value? - /** - * Get an intrinsic property of this Vision excluding any inheritance or defaults. In most cases should be the same as - * `getProperty(name, false, false, false`. - */ - public fun getOwnProperty(name: Name): Meta? = getProperty( - name, - inherit = false, - includeStyles = false, - includeDefaults = false - ) - - /** - * Replace the property node. If [node] is null remove node and its descendants - */ - public fun setPropertyNode(name: Name, node: Meta?, notify: Boolean = true) - - /** - * Set a value of specific property node - */ - public fun setPropertyValue(name: Name, value: Value?, notify: Boolean = true) - - /** - * Flow of property invalidation events. It does not contain property values after invalidation since it is not clear - * if it should include inherited properties etc. - */ - public val propertyChanges: Flow /** * Notify all listeners that a property has been changed and should be invalidated @@ -83,7 +59,7 @@ public interface Vision : Described, CoroutineScope { /** * Update this vision using a dif represented by [VisionChange]. */ - public fun change(change: VisionChange) + public fun update(change: VisionChange) override val descriptor: MetaDescriptor? @@ -96,58 +72,60 @@ public interface Vision : Described, CoroutineScope { } /** - * Subscribe on property updates. The subscription is bound to the given [scope] and canceled when the scope is canceled + * Flow of property invalidation events. It does not contain property values after invalidation since it is not clear + * if it should include inherited properties etc. */ -public fun Vision.onPropertyChange(scope: CoroutineScope, callback: suspend (Name) -> Unit) { - propertyChanges.onEach(callback).launchIn(scope) -} - +@OptIn(ExperimentalCoroutinesApi::class) +@DFExperimental +public val Vision.propertyChanges: Flow + get() = callbackFlow { + meta.onChange(this) { name -> + launch { + send(name) + } + } + awaitClose { + meta.removeListener(this) + } + } /** - * Own properties, excluding inheritance, styles and descriptor + * Subscribe on property updates. The subscription is bound to the given [scope] and canceled when the scope is canceled */ -public fun Vision.meta( - inherit: Boolean = false, - includeStyles: Boolean = true, - includeDefaults: Boolean = true, -): MutableMeta = VisionProperties(this, Name.EMPTY, inherit, includeStyles, includeDefaults) - -public fun Vision.configure(target: Name = Name.EMPTY, block: MutableMeta.() -> Unit): Unit { - VisionProperties(this, target).apply(block) +public fun Vision.onPropertyChange(callback: Meta.(Name) -> Unit) { + meta.onChange(null, callback) } -public fun Vision.configure(meta: Meta) { - configure(Name.EMPTY) { - update(meta) - } -} - -public fun Vision.configure(block: MutableMeta.() -> Unit): Unit = configure(Meta(block)) - -public fun Vision.getOwnProperty(key: String): Meta? = getOwnProperty(Name.parse(key)) - /** * Get [Vision] property using key as a String */ -public fun Vision.getProperty( +public fun Vision.getPropertyValue( key: String, inherit: Boolean = false, includeStyles: Boolean = true, includeDefaults: Boolean = true, -): Meta? = getProperty(Name.parse(key), inherit, includeStyles, includeDefaults) - +): Value? = getPropertyValue(Name.parse(key), inherit, includeStyles, includeDefaults) /** * A convenience method to set property node or value. If Item is null, then node is removed, not a value */ public fun Vision.setProperty(name: Name, item: Any?) { when (item) { - null -> setPropertyNode(name, null) - is Meta -> setPropertyNode(name, item) - is Value -> setPropertyValue(name, item) + null -> meta.remove(name) + is Meta -> meta.setMeta(name, item) + is Value -> meta.setValue(name, item) + else -> meta.setValue(name, Value.of(item)) } } public fun Vision.setPropertyNode(key: String, item: Any?) { setProperty(Name.parse(key), item) } + +/** + * Control visibility of the element + */ +public var Vision.visible: Boolean? + get() = getPropertyValue(Vision.VISIBLE_KEY)?.boolean + set(value) = meta.setValue(Vision.VISIBLE_KEY, value?.asValue()) + diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt index 46e5f62a..c123938d 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt @@ -1,24 +1,27 @@ package space.kscience.visionforge -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.MutableSharedFlow -import kotlinx.coroutines.launch import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.Transient -import space.kscience.dataforge.meta.* +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.MutableMeta +import space.kscience.dataforge.meta.ObservableMutableMeta import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.defaultNode import space.kscience.dataforge.meta.descriptors.value +import space.kscience.dataforge.meta.get import space.kscience.dataforge.misc.DFExperimental -import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.asName -import space.kscience.dataforge.names.plus +import space.kscience.dataforge.names.* import space.kscience.dataforge.values.Value import space.kscience.dataforge.values.ValueType import space.kscience.visionforge.Vision.Companion.STYLE_KEY import kotlin.jvm.Synchronized +internal data class MetaListener( + val owner: Any? = null, + val callback: Meta.(name: Name) -> Unit, +) + /** * A full base implementation for a [Vision] * @param properties Object own properties excluding styles and inheritance @@ -27,12 +30,9 @@ import kotlin.jvm.Synchronized @SerialName("vision") public open class VisionBase( @Transient override var parent: VisionGroup? = null, - @Serializable(MutableMetaSerializer::class) protected var properties: MutableMeta? = null ) : Vision { - //protected val observableProperties: ObservableMutableMeta by lazy { properties.asObservable() } - @Synchronized protected fun getOrCreateProperties(): MutableMeta { if (properties == null) { @@ -42,82 +42,105 @@ public open class VisionBase( return properties!! } - /** - * A fast accessor method to get own property (no inheritance or styles - */ - override fun getOwnProperty(name: Name): Meta? = properties?.getMeta(name) + @Transient + private val listeners = HashSet() - override fun getProperty( + private inner class VisionBaseProperties(val rootName: Name) : ObservableMutableMeta { + + override val items: Map + get() = properties?.get(rootName)?.items?.mapValues { entry -> + VisionBaseProperties(rootName + entry.key) + } ?: emptyMap() + + override var value: Value? + get() = properties?.get(rootName)?.value + set(value) { + getOrCreateProperties().setValue(rootName, value) + } + + override fun getOrCreate(name: Name): ObservableMutableMeta = VisionBaseProperties(this.rootName + name) + + override fun setMeta(name: Name, node: Meta?) { + getOrCreateProperties().setMeta(name, node) + } + + @DFExperimental + override fun attach(name: Name, node: ObservableMutableMeta) { + val ownProperties = getOrCreateProperties() + if (ownProperties is ObservableMutableMeta) { + ownProperties.attach(rootName + name, node) + } else { + ownProperties.setMeta(rootName + name, node) + node.onChange(this) { childName -> + ownProperties.setMeta(rootName + name + childName, this[childName]) + } + } + } + + override fun invalidate(name: Name) { + invalidateProperty(rootName + name) + } + + @Synchronized + override fun onChange(owner: Any?, callback: Meta.(name: Name) -> Unit) { + if (rootName.isEmpty()) { + listeners.add((MetaListener(owner, callback))) + } else { + listeners.add(MetaListener(owner) { name -> + if (name.startsWith(rootName)) { + (get(rootName) ?: Meta.EMPTY).callback(name.removeHeadOrNull(rootName)!!) + } + }) + } + } + + @Synchronized + override fun removeListener(owner: Any?) { + listeners.removeAll { it.owner === owner } + } + + override fun toString(): String = Meta.toString(this) + override fun equals(other: Any?): Boolean = Meta.equals(this, other as? Meta) + override fun hashCode(): Int = Meta.hashCode(this) + } + + override val meta: ObservableMutableMeta get() = VisionBaseProperties(Name.EMPTY) + + override fun getPropertyValue( name: Name, inherit: Boolean, includeStyles: Boolean, includeDefaults: Boolean, - ): Meta? = if (!inherit && !includeStyles && !includeDefaults) { - getOwnProperty(name) - } else { - buildList { - add(getOwnProperty(name)) - if (includeStyles) { - addAll(getStyleItems(name)) - } - if (inherit) { - add(parent?.getProperty(name, inherit, includeStyles, includeDefaults)) - } - if (includeDefaults) { - add(descriptor?.defaultNode?.get(name)) - } - }.merge() - } - - override fun setPropertyNode(name: Name, node: Meta?, notify: Boolean) { - val oldItem = properties?.get(name) - if (oldItem != node) { - getOrCreateProperties().setMeta(name, node) - if (notify) { - invalidateProperty(name) - } + ): Value? { + properties?.get(name)?.value?.let { return it } + if (includeStyles) { + getStyleProperty(name)?.let { return it } } - } - - override fun setPropertyValue(name: Name, value: Value?, notify: Boolean) { - val oldItem = properties?.get(name)?.value - if (oldItem != value) { - getOrCreateProperties()[name] = value - if (notify) { - invalidateProperty(name) - } + if (inherit) { + parent?.getPropertyValue(name, inherit, includeStyles, includeDefaults)?.let { return it } } + if (includeDefaults) { + descriptor?.defaultNode?.get(name)?.value.let { return it } + } + return null } override val descriptor: MetaDescriptor? get() = null - private suspend fun updateStyles(names: List) { - names.mapNotNull { getStyle(it) }.asSequence() - .flatMap { it.items.asSequence() } - .distinctBy { it.key } - .forEach { - invalidateProperty(it.key.asName()) - } - } - - //TODO check memory consumption for the flow - @Transient - private val propertyInvalidationFlow: MutableSharedFlow = MutableSharedFlow() - - @DFExperimental - override val propertyChanges: Flow - get() = propertyInvalidationFlow override fun invalidateProperty(propertyName: Name) { - launch { - if (propertyName == STYLE_KEY) { - updateStyles(styles) - } - propertyInvalidationFlow.emit(propertyName) + if (propertyName == STYLE_KEY) { + styles.mapNotNull { getStyle(it) }.asSequence() + .flatMap { it.items.asSequence() } + .distinctBy { it.key } + .forEach { + invalidateProperty(it.key.asName()) + } } + listeners.forEach { it.callback(properties ?: Meta.EMPTY, propertyName) } } - override fun change(change: VisionChange) { + override fun update(change: VisionChange) { change.properties?.let { updateProperties(Name.EMPTY, it) } @@ -131,7 +154,7 @@ public open class VisionBase( } public fun Vision.updateProperties(at: Name, item: Meta) { - setPropertyValue(at, item.value) + meta.setValue(at, item.value) item.items.forEach { (token, item) -> updateProperties(at + token, item) } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt index e538a89c..0275934b 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt @@ -89,8 +89,8 @@ private fun CoroutineScope.collectChange( ) { //Collect properties change - source.onPropertyChange(this) { propertyName -> - val newItem = source.getOwnProperty(propertyName) + source.onPropertyChange { propertyName -> + val newItem = source.meta[propertyName] collector().propertyChanged(name, propertyName, newItem) } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt index aab27bc5..f4d25b08 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt @@ -1,5 +1,6 @@ package space.kscience.visionforge +import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.launch @@ -8,7 +9,6 @@ import kotlinx.serialization.Serializable import kotlinx.serialization.Transient import space.kscience.dataforge.names.* - /** * Abstract implementation of mutable group of [Vision] * @@ -48,7 +48,7 @@ public open class VisionGroupBase( * Propagate children change event upwards */ private fun childrenChanged(name: NameToken, before: Vision?, after: Vision?) { - launch { + (manager?.context?: GlobalScope).launch { _structureChanges.emit(MutableVisionGroup.StructureChange(name, before, after)) } } @@ -131,15 +131,15 @@ public open class VisionGroupBase( } } - override fun change(change: VisionChange) { + override fun update(change: VisionChange) { change.children?.forEach { (name, change) -> when { change.delete -> set(name, null) change.vision != null -> set(name, change.vision) - else -> get(name)?.change(change) + else -> get(name)?.update(change) } } - super.change(change) + super.update(change) } } @@ -151,6 +151,6 @@ internal class RootVisionGroup(override val manager: VisionManager) : VisionGrou /** * Designate this [VisionGroup] as a root group and assign a [VisionManager] as its parent */ -public fun Vision.root(manager: VisionManager){ +public fun Vision.root(manager: VisionManager) { parent = RootVisionGroup(manager) } \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt deleted file mode 100644 index 363ad729..00000000 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt +++ /dev/null @@ -1,38 +0,0 @@ -package space.kscience.visionforge - -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.MutableMeta -import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.NameToken -import space.kscience.dataforge.names.plus -import space.kscience.dataforge.values.Value - -internal class VisionProperties( - val vision: Vision, - val rootName: Name, - val inherit: Boolean = false, - val includeStyles: Boolean = true, - val includeDefaults: Boolean = true, -) : MutableMeta { - - override val items: Map - get() = vision.getProperty(rootName, inherit, includeStyles, includeDefaults)?.items?.mapValues { - VisionProperties(vision, rootName + it.key, inherit, includeStyles, includeDefaults) - } ?: emptyMap() - - override var value: Value? - get() = vision.getProperty(rootName, inherit, includeStyles, includeDefaults)?.value - set(value) { - vision.setPropertyValue(rootName, value) - } - - override fun getOrCreate(name: Name): MutableMeta = VisionProperties(vision, rootName + name) - - override fun setMeta(name: Name, node: Meta?) { - vision.setPropertyNode(rootName + name, node) - } - - override fun equals(other: Any?): Boolean = Meta.equals(this, other as? Meta) - override fun hashCode(): Int = Meta.hashCode(this) - override fun toString(): String = Meta.toString(this) -} \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionPropertyContainer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionPropertyContainer.kt index f6f822b7..fed474fc 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionPropertyContainer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionPropertyContainer.kt @@ -1,7 +1,7 @@ package space.kscience.visionforge import space.kscience.dataforge.meta.Configurable -import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.meta.ObservableMutableMeta import space.kscience.dataforge.meta.get import space.kscience.dataforge.names.Name @@ -11,39 +11,24 @@ import space.kscience.dataforge.values.Value * Property containers are used to create a symmetric behaviors for vision properties and style builders */ public interface VisionPropertyContainer { - public fun getProperty( + + public val meta: MutableMeta + + public fun getPropertyValue( name: Name, inherit: Boolean = false, includeStyles: Boolean = true, includeDefaults: Boolean = true, - ): Meta? - - /** - * Replace the property node. If [node] is null remove node and its descendants - */ - public fun setPropertyNode(name: Name, node: Meta?, notify: Boolean = true) - - /** - * Set a value of specific property node - */ - public fun setPropertyValue(name: Name, value: Value?, notify: Boolean = true) + ): Value? } public open class SimpleVisionPropertyContainer( override val meta: ObservableMutableMeta, ) : VisionPropertyContainer, Configurable { - override fun getProperty( + override fun getPropertyValue( name: Name, inherit: Boolean, includeStyles: Boolean, includeDefaults: Boolean - ): Meta? = meta[name] - - override fun setPropertyNode(name: Name, node: Meta?, notify: Boolean) { - this.meta.setMeta(name, node) - } - - override fun setPropertyValue(name: Name, value: Value?, notify: Boolean) { - this.meta.setValue(name, value) - } + ): Value? = meta[name]?.value } \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/misc.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/misc.kt index 900f6f1c..084416ac 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/misc.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/misc.kt @@ -2,9 +2,7 @@ package space.kscience.visionforge import space.kscience.dataforge.meta.Laminate import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.boolean import space.kscience.dataforge.meta.isLeaf -import space.kscience.dataforge.values.asValue @DslMarker public annotation class VisionBuilder @@ -16,11 +14,4 @@ public fun List.merge(): Meta? { first.isLeaf -> first //fast search for first entry if it is value else -> Laminate(filterNotNull()) //merge nodes if first encountered node is meta } -} - -/** - * Control visibility of the element - */ -public var Vision.visible: Boolean? - get() = getProperty(Vision.VISIBLE_KEY).boolean - set(value) = setPropertyValue(Vision.VISIBLE_KEY, value?.asValue()) \ No newline at end of file +} \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/schemeDesctiptors.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/schemeDesctiptors.kt deleted file mode 100644 index 403312ea..00000000 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/schemeDesctiptors.kt +++ /dev/null @@ -1,66 +0,0 @@ -package space.kscience.visionforge - -import space.kscience.dataforge.meta.Scheme -import space.kscience.dataforge.meta.SchemeSpec -import space.kscience.dataforge.meta.descriptors.Described -import space.kscience.dataforge.meta.descriptors.MetaDescriptorBuilder -import space.kscience.dataforge.meta.descriptors.item -import space.kscience.dataforge.meta.descriptors.value -import space.kscience.dataforge.names.Name -import space.kscience.dataforge.values.ValueType -import kotlin.reflect.KProperty1 -import kotlin.reflect.typeOf - -/** - * TODO to be moved into the core - */ -public inline fun MetaDescriptorBuilder.value( - property: KProperty1, - noinline block: MetaDescriptorBuilder.() -> Unit = {}, -) { - when (typeOf()) { - typeOf(), typeOf(), typeOf(), typeOf(), typeOf(), typeOf() -> - value(property.name, ValueType.NUMBER) { - block() - } - typeOf(), typeOf(), typeOf(), typeOf(), typeOf(), typeOf() -> - value(property.name, ValueType.NUMBER) { - block() - } - typeOf() -> value(property.name, ValueType.BOOLEAN) { - block() - } - typeOf>(), typeOf>(), typeOf>(), typeOf>(), typeOf>(), typeOf>(), - typeOf(), typeOf(), typeOf(), typeOf(), typeOf(), - -> value(property.name, ValueType.NUMBER) { - multiple = true - block() - } - typeOf() -> value(property.name, ValueType.STRING) { - block() - } - typeOf>(), typeOf>() -> value(property.name, ValueType.STRING) { - multiple = true - block() - } - else -> item(property.name, block) - } -} - -public fun MetaDescriptorBuilder.item( - key: String, - described: Described, - block: MetaDescriptorBuilder.() -> Unit = {}, -) { - described.descriptor?.let { - item(Name.parse(key), it, block) - } -} - -public inline fun MetaDescriptorBuilder.scheme( - property: KProperty1, - spec: SchemeSpec, - noinline block: MetaDescriptorBuilder.() -> Unit = {}, -) { - item(property.name, spec, block) -} diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visionDelegates.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visionDelegates.kt index 524363d7..999bbb45 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visionDelegates.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visionDelegates.kt @@ -1,45 +1,43 @@ package space.kscience.visionforge -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.transformations.MetaConverter import space.kscience.dataforge.names.Name import space.kscience.dataforge.values.Value import space.kscience.dataforge.values.number import kotlin.properties.ReadWriteProperty import kotlin.reflect.KProperty -public fun Vision.propertyNode( - name: Name? = null, - inherit: Boolean = false, - includeStyles: Boolean = true, - includeDefaults: Boolean = true, -): ReadWriteProperty = object : ReadWriteProperty { - override fun getValue(thisRef: Any?, property: KProperty<*>): Meta? = - getProperty(name ?: Name.parse(property.name), inherit, includeStyles, includeDefaults) - - override fun setValue(thisRef: Any?, property: KProperty<*>, value: Meta?) { - setPropertyNode(name ?: Name.parse(property.name), value) - } -} - -public fun Vision.propertyNode( - converter: MetaConverter, - name: Name? = null, - inherit: Boolean = false, - includeStyles: Boolean = true, - includeDefaults: Boolean = true, -): ReadWriteProperty = object : ReadWriteProperty { - override fun getValue(thisRef: Any?, property: KProperty<*>): T? = getProperty( - name ?: Name.parse(property.name), - inherit, - includeStyles, - includeDefaults - )?.let(converter::metaToObject) - - override fun setValue(thisRef: Any?, property: KProperty<*>, value: T?) { - setPropertyNode(name ?: Name.parse(property.name), value?.let(converter::objectToMeta)) - } -} +//public fun Vision.propertyNode( +// name: Name? = null, +// inherit: Boolean = false, +// includeStyles: Boolean = true, +// includeDefaults: Boolean = true, +//): ReadWriteProperty = object : ReadWriteProperty { +// override fun getValue(thisRef: Any?, property: KProperty<*>): Meta? = +// getProperty(name ?: Name.parse(property.name), inherit, includeStyles, includeDefaults) +// +// override fun setValue(thisRef: Any?, property: KProperty<*>, value: Meta?) { +// meta.setMeta(name ?: Name.parse(property.name), value) +// } +//} +// +//public fun Vision.propertyNode( +// converter: MetaConverter, +// name: Name? = null, +// inherit: Boolean = false, +// includeStyles: Boolean = true, +// includeDefaults: Boolean = true, +//): ReadWriteProperty = object : ReadWriteProperty { +// override fun getValue(thisRef: Any?, property: KProperty<*>): T? = getProperty( +// name ?: Name.parse(property.name), +// inherit, +// includeStyles, +// includeDefaults +// )?.let(converter::metaToObject) +// +// override fun setValue(thisRef: Any?, property: KProperty<*>, value: T?) { +// meta.setMeta(name ?: Name.parse(property.name), value?.let(converter::objectToMeta)) +// } +//} public fun Vision.propertyValue( name: Name? = null, @@ -48,10 +46,10 @@ public fun Vision.propertyValue( includeDefaults: Boolean = true, ): ReadWriteProperty = object : ReadWriteProperty { override fun getValue(thisRef: Any?, property: KProperty<*>): Value? = - getProperty(name ?: Name.parse(property.name), inherit, includeStyles, includeDefaults)?.value + getPropertyValue(name ?: Name.parse(property.name), inherit, includeStyles, includeDefaults) override fun setValue(thisRef: Any?, property: KProperty<*>, value: Value?) { - setPropertyValue(name ?: Name.parse(property.name), value) + meta.setValue(name ?: Name.parse(property.name), value) } } @@ -63,15 +61,15 @@ public fun Vision.propertyValue( setter: (T) -> Value? = { it?.let(Value::of) }, getter: (Value?) -> T, ): ReadWriteProperty = object : ReadWriteProperty { - override fun getValue(thisRef: Any?, property: KProperty<*>): T = getProperty( + override fun getValue(thisRef: Any?, property: KProperty<*>): T = getPropertyValue( name ?: Name.parse(property.name), inherit, includeStyles, includeDefaults - )?.value.let(getter) + ).let(getter) override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) { - setPropertyValue(name ?: Name.parse(property.name), value?.let(setter)) + meta.setValue(name ?: Name.parse(property.name), value?.let(setter)) } } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visionDescriptor.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visionDescriptor.kt index de505c50..a02a3b3e 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visionDescriptor.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visionDescriptor.kt @@ -2,7 +2,6 @@ package space.kscience.visionforge import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.* -import space.kscience.dataforge.names.asName import space.kscience.dataforge.values.asValue private const val INHERITED_DESCRIPTOR_ATTRIBUTE = "inherited" @@ -23,14 +22,6 @@ public var MetaDescriptorBuilder.usesStyles: Boolean get() = attributes[STYLE_DESCRIPTOR_ATTRIBUTE].boolean ?: true set(value) = attributes.set(STYLE_DESCRIPTOR_ATTRIBUTE, value) - -public val Vision.describedProperties: Meta - get() = Meta { - descriptor?.children?.forEach { (key, descriptor) -> - this.setMeta(key.asName(), getProperty(key, inherit = descriptor.inherited)) - } - } - public val MetaDescriptor.widget: Meta get() = attributes["widget"] ?: Meta.EMPTY diff --git a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt index 2a7c6d28..c09c7c6c 100644 --- a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt +++ b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt @@ -5,10 +5,17 @@ import kotlinx.html.stream.createHTML import space.kscience.dataforge.context.Global import space.kscience.dataforge.context.fetch import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.configure import space.kscience.dataforge.meta.set import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name -import space.kscience.visionforge.* +import space.kscience.visionforge.Vision +import space.kscience.visionforge.VisionBase +import space.kscience.visionforge.VisionManager +import kotlin.collections.HashMap +import kotlin.collections.Map +import kotlin.collections.forEach +import kotlin.collections.set import kotlin.test.Test typealias HtmlVisionRenderer = FlowContent.(name: Name, vision: Vision, meta: Meta) -> Unit @@ -57,7 +64,7 @@ class HtmlTagTest { div { h2 { +"Properties" } ul { - (vision as? VisionBase)?.meta()?.items?.forEach { + (vision as? VisionBase)?.meta?.items?.forEach { li { a { +it.key.toString() } p { +it.value.toString() } diff --git a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt new file mode 100644 index 00000000..40b4c96e --- /dev/null +++ b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt @@ -0,0 +1,44 @@ +package space.kscience.visionforge.meta + +import space.kscience.dataforge.meta.* +import space.kscience.dataforge.values.asValue +import space.kscience.visionforge.VisionBase +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertNotEquals + +class VisionPropertyTest { + @Test + fun testPropertyWrite(){ + val vision = VisionBase() + vision.meta["fff"] = 2 + vision.meta["fff.ddd"] = false + + assertEquals(2, vision.meta["fff"]?.int) + assertEquals(false, vision.meta["fff.ddd"]?.boolean) + } + + @Test + fun testPropertyEdit(){ + val vision = VisionBase() + vision.meta.getOrCreate("fff.ddd").apply { + value = 2.asValue() + } + assertEquals(2, vision.meta["fff.ddd"]?.int) + assertNotEquals(true, vision.meta["fff.ddd"]?.boolean) + } + + internal class TestScheme: Scheme(){ + var ddd by int() + companion object: SchemeSpec(::TestScheme) + } + + @Test + fun testPropertyUpdate(){ + val vision = VisionBase() + vision.meta.getOrCreate("fff").updateWith(TestScheme){ + ddd = 2 + } + assertEquals(2, vision.meta["fff.ddd"]?.int) + } +} \ No newline at end of file diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt index ae691d4b..017c615d 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt @@ -92,7 +92,7 @@ public class VisionClient : AbstractPlugin() { } logger.debug { "Got update $change for output with name $name" } - vision.change(change) + vision.update(change) } else { console.error("WebSocket message data is not a string") } diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/FXMetaModel.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/FXMetaModel.kt index a3509221..476890a6 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/FXMetaModel.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/FXMetaModel.kt @@ -3,11 +3,14 @@ package space.kscience.visionforge.editor import javafx.beans.binding.Binding import javafx.beans.binding.BooleanBinding import javafx.beans.binding.ListBinding -import javafx.beans.property.SimpleObjectProperty +import javafx.beans.binding.ObjectBinding import javafx.collections.ObservableList -import space.kscience.dataforge.meta.* +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.ObservableMeta +import space.kscience.dataforge.meta.boolean import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.get +import space.kscience.dataforge.meta.get import space.kscience.dataforge.names.* import space.kscience.dataforge.values.Value import tornadofx.* @@ -22,11 +25,13 @@ public class FXMetaModel( public val title: String = nodeName.lastOrNull()?.toString() ?: "Meta" ) : Comparable> { - private val existingNode = SimpleObjectProperty(root[nodeName]) + private val existingNode = object: ObjectBinding() { + override fun computeValue(): Meta? =root[nodeName] + } public val children: ListBinding> = object : ListBinding>() { override fun computeValue(): ObservableList> { - val nodeKeys = existingNode.get().items.keys + val nodeKeys = existingNode.get()?.items?.keys?: emptySet() val descriptorKeys = descriptor?.children?.keys?.map { NameToken(it) } ?: emptySet() return (nodeKeys + descriptorKeys).map { FXMetaModel( @@ -43,7 +48,7 @@ public class FXMetaModel( if (root is ObservableMeta) { root.onChange(this) { changed -> if (changed.startsWith(nodeName)) { - if (nodeName.length == changed.length) existingNode.set(root[nodeName]) + if (nodeName.length == changed.length) existingNode.invalidate() else if (changed.length == nodeName.length + 1) children.invalidate() } } @@ -57,7 +62,7 @@ public class FXMetaModel( public val exists: Boolean by existsProperty public val valueProperty: Binding = existingNode.objectBinding { - existingNode.get().value ?: descriptor?.defaultValue + existingNode.get()?.value ?: descriptor?.defaultValue } override fun compareTo(other: FXMetaModel<*>): Int = if (this.exists == other.exists) { @@ -77,141 +82,4 @@ public class FXMetaModel( rootName: String = "root" ): FXMetaModel = FXMetaModel(node, descriptor, Name.EMPTY, title = rootName) } - -// /** -// * A descriptor that could be manually set to the node -// */ -// private val innerDescriptorProperty = SimpleObjectProperty(descriptorValue) -// -// /** -// * Actual descriptor which holds value inferred from parrent -// */ -// val descriptorProperty: ObjectBinding = objectBinding(innerDescriptorProperty) { -// value ?: parent?.descriptor?.get(this@FXMeta.name.body) -// } -// -// val descriptor: MetaDescriptor? by descriptorProperty -// -// private val innerNodeProperty = SimpleObjectProperty(nodeValue) -// -// val nodeProperty: ObjectBinding = objectBinding(innerNodeProperty) { -// value ?: parent?.node?.get(this@FXMeta.name) -// } -// -// val node by nodeProperty -// -// val hasValue: ObservableBooleanValue = nodeProperty.booleanBinding { it != null } -// -// private val filter: (FXMeta) -> Boolean = { cfg -> -// !(cfg.descriptor?.attributes?.get(MutableMetaEditor.NO_CONFIGURATOR_TAG)?.boolean ?: false) -// } -// -// val children: ListBinding> = object : ListBinding>() { -// -// init { -// bind(nodeProperty, descriptorProperty) -// -// val listener: Meta.(Name) -> Unit = { name -> -// if (name.length == 1) invalidate() -// } -// -// (node as? ObservableMeta)?.onChange(this, listener) -// -// nodeProperty.addListener { _, oldValue, newValue -> -// if (newValue == null) { -// (oldValue as? ObservableMeta)?.removeListener(this) -// } -// -// if (newValue is ObservableMeta) { -// newValue.onChange(this, listener) -// } -// } -// } -// -// override fun computeValue(): ObservableList> { -// val nodeKeys = node?.items?.keys?.toSet() ?: emptySet() -// val descriptorKeys = descriptor?.children?.keys?.map { NameToken(it) } ?: emptyList() -// val keys: Set = nodeKeys + descriptorKeys -// -// val items = keys.map { token -> -// val actualItem = node?.items?.get(token) -// val actualDescriptor = descriptor?.children?.get(token.body) -// -// if (actualItem is MetaNode) { -// FXMetaNode(token, this@FXMetaNode) -// } else { -// FXMetaValue(token, this@FXMetaNode) -// } -// } -// -// return items.filter(filter).asObservable() -// } -// } -// -// init { -// if (parent != null) { -// parent.descriptorProperty.onChange { descriptorProperty.invalidate() } -// parent.nodeProperty.onChange { nodeProperty.invalidate() } -// } -// } -// -} - -// -//internal fun FXMeta.remove(name: NameToken) { -// node?.remove(name.asName()) -// children.invalidate() -//} -// -//private fun M.createEmptyNode(token: NameToken, append: Boolean): M { -// return if (append && token.hasIndex()) { -// val name = token.asName() -// val index = (getIndexed(name).keys.mapNotNull { it?.toIntOrNull() }.maxOrNull() ?: -1) + 1 -// val newName = name.withIndex(index.toString()) -// set(newName, Meta.EMPTY) -// get(newName).node -// } else { -// this.set(token.asName(), Meta.EMPTY) -// //FIXME possible concurrency bug -// get(token).node -// } -//} -// -//internal fun FXMeta.getOrCreateNode(): M { -// val node = node -// return when { -// node != null -> node -// parent != null -> parent.getOrCreateNode().createEmptyNode(this.name, descriptor?.multiple == true).also { -// parent.children.invalidate() -// } -// else -> kotlin.error("Orphan empty node is not allowed") -// } -// -//} - -internal fun FXMetaModel.remove() { - root.remove(nodeName) -} - -// -//internal fun FXMeta.addValue(key: String) { -// val parent = getOrCreateNode() -// if (descriptor?.multiple == true) { -// parent.append(key, Null) -// } else { -// parent[key] = Null -// } -//} -// -//internal fun FXMeta.addNode(key: String) { -// val parent = getOrCreateNode() -// if (descriptor?.multiple == true) { -// parent.append(key, Meta.EMPTY) -// } else { -// parent[key] = Meta.EMPTY -// } -//} -// -internal fun FXMetaModel.setValue(value: Value?) { - root.setValue(nodeName, value) } \ No newline at end of file diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/MutableMetaEditor.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/MutableMetaEditor.kt index c7238b44..59f49c38 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/MutableMetaEditor.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/MutableMetaEditor.kt @@ -5,6 +5,7 @@ */ package space.kscience.visionforge.editor +import javafx.beans.property.SimpleStringProperty import javafx.scene.control.* import javafx.scene.control.cell.TextFieldTreeTableCell import javafx.scene.layout.BorderPane @@ -13,6 +14,7 @@ import javafx.scene.text.Text import space.kscience.dataforge.context.Global import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.meta.descriptors.MetaDescriptor +import space.kscience.dataforge.meta.remove import space.kscience.visionforge.dfIconView import tornadofx.* @@ -32,8 +34,7 @@ public class MutableMetaEditor( MutableMeta: MutableMeta, descriptor: MetaDescriptor?, title: String = "Configuration editor" - ) : - this(FXMetaModel.root(MutableMeta, descriptor = descriptor), title = title) + ) : this(FXMetaModel.root(MutableMeta, descriptor = descriptor), title = title) override val root: BorderPane = borderpane { center = treetableview> { @@ -64,7 +65,7 @@ public class MutableMetaEditor( contextmenu { item("Remove") { action { - content.remove() + content.root.remove(content.nodeName) } } } @@ -83,7 +84,7 @@ public class MutableMetaEditor( } column("Description") { param: TreeTableColumn.CellDataFeatures, String> -> - (param.value.value.descriptor?.info ?: "").observable() + SimpleStringProperty(param.value.value.descriptor?.info ?: "") }.setCellFactory { param: TreeTableColumn, String> -> val cell = TreeTableCell, String>() val text = Text() @@ -126,51 +127,10 @@ public class MutableMetaEditor( Global, item.valueProperty, item.descriptor - ) { - item.setValue(it) + ) { value -> + item.root.setValue(item.nodeName, value) } graphic = chooser.node -// when (item) { -// is FXMetaValue -> { -// text = null -// val chooser = ValueChooser.build( -// Global, -// item.valueProperty, -// item.descriptor -// ) { -// item.set(it) -// } -// graphic = chooser.node -// } -// is FXMetaNode -> { -// if (allowNew) { -// text = null -// graphic = HBox().apply { -// val glyph: Node = FontAwesomeIconView(FontAwesomeIcon.PLUS_CIRCLE) -// button("node", graphic = glyph) { -// hgrow = Priority.ALWAYS -// maxWidth = Double.POSITIVE_INFINITY -// action { -// showNodeDialog()?.let { -// item.addNode(it) -// } -// } -// } -// button("value", graphic = FontAwesomeIconView(FontAwesomeIcon.PLUS_SQUARE)) { -// hgrow = Priority.ALWAYS -// maxWidth = Double.POSITIVE_INFINITY -// action { -// showValueDialog()?.let { -// item.addValue(it) -// } -// } -// } -// } -// } else { -// text = "" -// } -// } -// } } else { text = null diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisionEditorFragment.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisionEditorFragment.kt index 3ce3b2de..d159dd11 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisionEditorFragment.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisionEditorFragment.kt @@ -5,41 +5,22 @@ import javafx.beans.property.SimpleObjectProperty import javafx.scene.Node import javafx.scene.Parent import javafx.scene.layout.VBox -import space.kscience.dataforge.meta.* +import space.kscience.dataforge.meta.ObservableMutableMeta import space.kscience.dataforge.meta.descriptors.MetaDescriptor -import space.kscience.visionforge.* +import space.kscience.visionforge.Vision +import space.kscience.visionforge.computeProperties +import space.kscience.visionforge.getStyle +import space.kscience.visionforge.styles import tornadofx.* -public class VisionEditorFragment(public val selector: (Vision) -> Meta) : Fragment() { +public class VisionEditorFragment(public val selector: (Vision) -> ObservableMutableMeta = {it.computeProperties()}) : Fragment() { - public val itemProperty: SimpleObjectProperty = SimpleObjectProperty() - public var item: Vision? by itemProperty + public val visionProperty: SimpleObjectProperty = SimpleObjectProperty() + public var vision: Vision? by visionProperty public val descriptorProperty: SimpleObjectProperty = SimpleObjectProperty() - public constructor( - item: Vision?, - descriptor: MetaDescriptor?, - selector: (Vision) -> MutableMetaProvider = { it.meta() }, - ) : this({ it.describedProperties }) { - this.item = item - this.descriptorProperty.set(descriptor) - } - - private var currentConfig: ObservableMutableMeta? = null - - private val configProperty: Binding = itemProperty.objectBinding { vision -> - if (vision == null) return@objectBinding null - val meta = selector(vision) - val config = MutableMeta { - update(meta) - } - config.onChange(this@VisionEditorFragment) { key -> - vision.setPropertyNode(key, config[key]) - } - //remember old config reference to cleanup listeners - currentConfig?.removeListener(this) - currentConfig = config - config + private val configProperty: Binding = visionProperty.objectBinding { vision -> + vision?.let(selector) } private val configEditorProperty: Binding = configProperty.objectBinding(descriptorProperty) { @@ -50,8 +31,8 @@ public class VisionEditorFragment(public val selector: (Vision) -> Meta) : Fragm private val styleBoxProperty: Binding = configProperty.objectBinding() { VBox().apply { - item?.styles?.forEach { styleName -> - val styleMeta = item?.getStyle(styleName) + vision?.styles?.forEach { styleName -> + val styleMeta = vision?.getStyle(styleName) if (styleMeta != null) { titledpane(styleName, node = MetaViewer(styleMeta).root) } @@ -64,7 +45,7 @@ public class VisionEditorFragment(public val selector: (Vision) -> Meta) : Fragm contentProperty().bind(configEditorProperty) } titledpane("Styles", collapsible = false) { - visibleWhen(itemProperty.booleanBinding { it?.styles?.isNotEmpty() ?: false }) + visibleWhen(visionProperty.booleanBinding { it?.styles?.isNotEmpty() ?: false }) contentProperty().bind(styleBoxProperty) } } diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt index f843e02c..72a7ac8a 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt @@ -16,6 +16,7 @@ import space.kscience.dataforge.context.* import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.boolean import space.kscience.dataforge.misc.Type +import space.kscience.visionforge.computePropertyNode import space.kscience.visionforge.solid.FX3DFactory.Companion.TYPE import space.kscience.visionforge.solid.SolidMaterial.Companion.MATERIAL_KEY import space.kscience.visionforge.solid.SolidMaterial.Companion.MATERIAL_WIREFRAME_KEY @@ -73,7 +74,7 @@ class FX3DPlugin : AbstractPlugin() { is PolyLine -> PolyLine3D( obj.points.map { Point3D(it.x, it.y, it.z) }, obj.thickness.toFloat(), - obj.getProperty(SolidMaterial.MATERIAL_COLOR_KEY, inherit = true)?.color() + obj.computePropertyNode(SolidMaterial.MATERIAL_COLOR_KEY)?.color() ).apply { this.meshView.cullFace = CullFace.FRONT } diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXReferenceFactory.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXReferenceFactory.kt index d2863cea..ac05e8d5 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXReferenceFactory.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXReferenceFactory.kt @@ -17,7 +17,7 @@ class FXReferenceFactory(val plugin: FX3DPlugin) : FX3DFactory + obj.onPropertyChange { name-> if (name.firstOrNull()?.body == SolidReferenceGroup.REFERENCE_CHILD_PROPERTY_PREFIX) { val childName = name.firstOrNull()?.index?.let(Name::parse) ?: error("Wrong syntax for reference child property: '$name'") val propertyName = name.cutFirst() diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisualObjectFXBinding.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisualObjectFXBinding.kt index 492356ea..607913d7 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisualObjectFXBinding.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisualObjectFXBinding.kt @@ -7,6 +7,7 @@ import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.startsWith import space.kscience.dataforge.values.Value import space.kscience.visionforge.Vision +import space.kscience.visionforge.computePropertyNode import space.kscience.visionforge.onPropertyChange import tornadofx.* @@ -17,7 +18,7 @@ public class VisualObjectFXBinding(public val fx: FX3DPlugin, public val obj: Vi private val bindings = HashMap>() init { - obj.onPropertyChange(fx.context) { name -> + obj.onPropertyChange { name -> bindings.filter { it.key.startsWith(name) }.forEach { entry -> Platform.runLater { entry.value.invalidate() @@ -35,7 +36,7 @@ public class VisualObjectFXBinding(public val fx: FX3DPlugin, public val obj: Vi public operator fun get(key: Name): ObjectBinding { return bindings.getOrPut(key) { object : ObjectBinding() { - override fun computeValue(): Meta? = obj.getProperty(key) + override fun computeValue(): Meta? = obj.computePropertyNode(key) } } } diff --git a/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt b/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt index 2103078d..fd1dcd80 100644 --- a/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt +++ b/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt @@ -21,7 +21,7 @@ public class VisionOfMarkup( //TODO add templates public var content: String? - get() = getOwnProperty(CONTENT_PROPERTY_KEY).string + get() = meta.getMeta(CONTENT_PROPERTY_KEY).string set(value) { setProperty(CONTENT_PROPERTY_KEY, value) } diff --git a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt index 7b2f1c25..36102036 100644 --- a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt +++ b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt @@ -2,8 +2,6 @@ package space.kscience.visionforge.plotly import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import space.kscience.dataforge.meta.MutableMeta -import space.kscience.dataforge.meta.asObservable import space.kscience.dataforge.misc.DFExperimental import space.kscience.plotly.Plot import space.kscience.plotly.Plotly @@ -18,7 +16,7 @@ public class VisionOfPlotly private constructor() : VisionBase() { properties = plot.meta } - public val plot: Plot get() = Plot(properties?.asObservable() ?: MutableMeta()) + public val plot: Plot get() = Plot(meta) } public fun Plot.asVision(): VisionOfPlotly = VisionOfPlotly(this) diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt b/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt index 0a9c60e3..46cb2e66 100644 --- a/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt +++ b/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt @@ -137,7 +137,7 @@ public class VisionServer internal constructor( val change = visionManager.jsonFormat.decodeFromString( VisionChange.serializer(), it.data.decodeToString() ) - vision.change(change) + vision.update(change) } } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt index 66efe69b..25631c42 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt @@ -6,20 +6,23 @@ import space.kscience.dataforge.values.Value import space.kscience.dataforge.values.asValue import space.kscience.dataforge.values.string import space.kscience.visionforge.Colors +import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionBuilder +import space.kscience.visionforge.VisionPropertyContainer +import kotlin.jvm.JvmInline @VisionBuilder -public class ColorAccessor(private val parent: MutableMetaProvider, private val colorKey: Name) { +public class ColorAccessor(private val colorKey: Name, private val parent: () -> MutableMetaProvider) { public var value: Value? - get() = parent.getMeta(colorKey)?.value + get() = parent().getMeta(colorKey)?.value set(value) { - parent.setValue(colorKey,value) + parent().setValue(colorKey,value) } public var item: Meta? - get() = parent.getMeta(colorKey) + get() = parent().getMeta(colorKey) set(value) { - parent.setMeta(colorKey,value) + parent().setMeta(colorKey,value) } } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt index 4017b11b..b3770d37 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt @@ -2,6 +2,7 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import space.kscience.dataforge.meta.configure import space.kscience.dataforge.meta.update import space.kscience.visionforge.* @@ -29,20 +30,20 @@ public inline fun VisionContainerBuilder.composite( val group = SolidGroup().apply(builder) val children = group.children.values.filterIsInstance() if (children.size != 2) error("Composite requires exactly two children") - return Composite(type, children[0], children[1]).also { composite -> - composite.configure { - update(group.meta()) + return Composite(type, children[0], children[1]).apply { + configure { + update(group.meta) } if (group.position != null) { - composite.position = group.position + position = group.position } if (group.rotation != null) { - composite.rotation = group.rotation + rotation = group.rotation } if (group.scale != null) { - composite.scale = group.scale + scale = group.scale } - set(name, composite) + set(name, this) } } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt index 0ecc02b0..b9e32bee 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt @@ -4,6 +4,7 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.meta.ObservableMutableMeta +import space.kscience.dataforge.meta.configure import space.kscience.visionforge.* import kotlin.math.PI import kotlin.math.cos @@ -106,7 +107,9 @@ public class ExtrudeBuilder( layers.add(Layer(x.toFloat(), y.toFloat(), z.toFloat(), scale.toFloat())) } - internal fun build(): Extruded = Extruded(shape, layers).apply { configure(meta()) } + internal fun build(): Extruded = Extruded(shape, layers).apply { + configure(this@ExtrudeBuilder.meta) + } } @VisionBuilder diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt index f2ad38fd..39ed06ac 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt @@ -5,8 +5,7 @@ import space.kscience.dataforge.meta.descriptors.* import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus -import space.kscience.dataforge.values.ValueType -import space.kscience.dataforge.values.asValue +import space.kscience.dataforge.values.* import space.kscience.visionforge.* import space.kscience.visionforge.Vision.Companion.VISIBLE_KEY import space.kscience.visionforge.solid.Solid.Companion.DETAIL_KEY @@ -76,6 +75,8 @@ public interface Solid : Vision { default(true) } + node(SolidMaterial.MATERIAL_KEY.toString(), SolidMaterial) + //TODO replace by descriptor merge value(Vision.STYLE_KEY, ValueType.STRING) { multiple = true @@ -98,10 +99,6 @@ public interface Solid : Vision { hide() } - item(SolidMaterial.MATERIAL_KEY.toString(), SolidMaterial){ - valueRequirement = ValueRequirement.ABSENT - } - enum(ROTATION_ORDER_KEY, default = RotationOrder.XYZ) { hide() } @@ -114,7 +111,7 @@ public interface Solid : Vision { * Get the layer number this solid belongs to. Return 0 if layer is not defined. */ public var Solid.layer: Int - get() = getProperty(LAYER_KEY, inherit = true).int ?: 0 + get() = getPropertyValue(LAYER_KEY, inherit = true)?.int ?: 0 set(value) { setProperty(LAYER_KEY, value) } @@ -134,24 +131,24 @@ public enum class RotationOrder { * Rotation order */ public var Solid.rotationOrder: RotationOrder - get() = getProperty(Solid.ROTATION_ORDER_KEY).enum() ?: RotationOrder.XYZ - set(value) = setPropertyValue(Solid.ROTATION_ORDER_KEY, value.name.asValue()) + get() = getPropertyValue(Solid.ROTATION_ORDER_KEY)?.enum() ?: RotationOrder.XYZ + set(value) = meta.setValue(Solid.ROTATION_ORDER_KEY, value.name.asValue()) /** * Preferred number of polygons for displaying the object. If not defined, uses shape or renderer default. Not inherited */ public var Solid.detail: Int? - get() = getProperty(DETAIL_KEY, false).int - set(value) = setPropertyValue(DETAIL_KEY, value?.asValue()) + get() = getPropertyValue(DETAIL_KEY, false)?.int + set(value) = meta.setValue(DETAIL_KEY, value?.asValue()) /** * If this property is true, the object will be ignored on render. * Property is not inherited. */ public var Vision.ignore: Boolean? - get() = getProperty(IGNORE_KEY, false).boolean - set(value) = setPropertyValue(IGNORE_KEY, value?.asValue()) + get() = getPropertyValue(IGNORE_KEY, false)?.boolean + set(value) = meta.setValue(IGNORE_KEY, value?.asValue()) //var VisualObject.selected: Boolean? // get() = getProperty(SELECTED_KEY).boolean @@ -160,7 +157,7 @@ public var Vision.ignore: Boolean? internal fun float(name: Name, default: Number): ReadWriteProperty = object : ReadWriteProperty { override fun getValue(thisRef: Solid, property: KProperty<*>): Number { - return thisRef.getOwnProperty(name)?.number ?: default + return thisRef.meta.getMeta(name)?.number ?: default } override fun setValue(thisRef: Solid, property: KProperty<*>, value: Number) { @@ -171,7 +168,7 @@ internal fun float(name: Name, default: Number): ReadWriteProperty = object : ReadWriteProperty { override fun getValue(thisRef: Solid, property: KProperty<*>): Point3D? { - val item = thisRef.getOwnProperty(name) ?: return null + val item = thisRef.meta.getMeta(name) ?: return null return object : Point3D { override val x: Float get() = item[X_KEY]?.float ?: default override val y: Float get() = item[Y_KEY]?.float ?: default @@ -181,7 +178,7 @@ internal fun point(name: Name, default: Float): ReadWriteProperty, value: Point3D?) { if (value == null) { - thisRef.setPropertyNode(name, null) + thisRef.meta.setMeta(name, null) } else { thisRef.setProperty(name + X_KEY, value.x) thisRef.setProperty(name + Y_KEY, value.y) diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidBase.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidBase.kt index 2beee1ed..f18a3869 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidBase.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidBase.kt @@ -11,8 +11,8 @@ import space.kscience.visionforge.VisionChange public open class SolidBase : VisionBase(), Solid { override val descriptor: MetaDescriptor get() = Solid.descriptor - override fun change(change: VisionChange) { + override fun update(change: VisionChange) { updatePosition(change.properties) - super.change(change) + super.update(change) } } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt index bc6676f6..f0f28fc5 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt @@ -60,9 +60,9 @@ public class SolidGroup : VisionGroupBase(), Solid, PrototypeHolder { override fun createGroup(): SolidGroup = SolidGroup() - override fun change(change: VisionChange) { + override fun update(change: VisionChange) { updatePosition(change.properties) - super.change(change) + super.update(change) } public companion object { diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt index 3d9843a3..78d787a3 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt @@ -8,6 +8,7 @@ import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus import space.kscience.dataforge.values.ValueType import space.kscience.dataforge.values.asValue +import space.kscience.dataforge.values.number import space.kscience.visionforge.* import space.kscience.visionforge.solid.SolidMaterial.Companion.MATERIAL_COLOR_KEY import space.kscience.visionforge.solid.SolidMaterial.Companion.MATERIAL_KEY @@ -19,14 +20,14 @@ public class SolidMaterial : Scheme() { /** * Primary web-color for the material */ - public val color: ColorAccessor = ColorAccessor(this, COLOR_KEY) + public val color: ColorAccessor = ColorAccessor(COLOR_KEY) { meta } /** * Specular color for phong material */ - public val specularColor: ColorAccessor = ColorAccessor(this, SPECULAR_COLOR_KEY) + public val specularColor: ColorAccessor = ColorAccessor(SPECULAR_COLOR_KEY) { meta } - public val emissiveColor: ColorAccessor = ColorAccessor(this, "emissiveColor".asName()) + public val emissiveColor: ColorAccessor = ColorAccessor("emissiveColor".asName()) { meta } /** * Opacity @@ -89,24 +90,19 @@ public class SolidMaterial : Scheme() { } public val Solid.color: ColorAccessor - get() = ColorAccessor( - meta(inherit = true), - MATERIAL_COLOR_KEY - ) + get() = ColorAccessor(MATERIAL_COLOR_KEY) { computeProperties() } public var Solid.material: SolidMaterial? - get() = getProperty(MATERIAL_KEY, inherit = true)?.let { SolidMaterial.read(it) } - set(value) = setPropertyNode(MATERIAL_KEY, value?.meta) + get() = computePropertyNode(MATERIAL_KEY)?.let { SolidMaterial.read(it) } + set(value) = meta.setMeta(MATERIAL_KEY, value?.meta) @VisionBuilder public fun Solid.material(builder: SolidMaterial.() -> Unit) { - configure(MATERIAL_KEY){ - updateWith(SolidMaterial,builder) - } + meta.getOrCreate(MATERIAL_KEY).updateWith(SolidMaterial, builder) } public var Solid.opacity: Number? - get() = getProperty(MATERIAL_OPACITY_KEY, inherit = true).number + get() = getPropertyValue(MATERIAL_OPACITY_KEY, inherit = true)?.number set(value) { - setPropertyValue(MATERIAL_OPACITY_KEY, value?.asValue()) + meta.setValue(MATERIAL_OPACITY_KEY, value?.asValue()) } \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt index 0149fc88..427ef9a2 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt @@ -1,12 +1,10 @@ package space.kscience.visionforge.solid -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.mapNotNull import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.ObservableMutableMeta import space.kscience.dataforge.meta.descriptors.MetaDescriptor -import space.kscience.dataforge.misc.DFExperimental +import space.kscience.dataforge.meta.get import space.kscience.dataforge.names.* import space.kscience.dataforge.values.Value import space.kscience.visionforge.* @@ -17,6 +15,18 @@ public interface SolidReference : VisionGroup { * The prototype for this reference. Always returns a "real" prototype, not a reference */ public val prototype: Solid + + override fun getPropertyValue(name: Name, inherit: Boolean, includeStyles: Boolean, includeDefaults: Boolean): Value? { + meta[name]?.value?.let { return it } + if (includeStyles) { + getStyleProperty(name)?.let { return it } + } + prototype.getPropertyValue(name, inherit, includeStyles, includeDefaults)?.let { return it } + if (inherit) { + parent?.getPropertyValue(name, inherit, includeStyles, includeDefaults)?.let { return it } + } + return null + } } @@ -31,27 +41,6 @@ public val Vision.unref: Solid else -> error("This Vision is neither Solid nor SolidReference") } - -private fun SolidReference.getRefProperty( - name: Name, - inherit: Boolean, - includeStyles: Boolean, - includeDefaults: Boolean, -): Meta? = if (!inherit && !includeStyles && !includeDefaults) { - getOwnProperty(name) -} else { - buildList { - add(getOwnProperty(name)) - if (includeStyles) { - addAll(getStyleItems(name)) - } - add(prototype.getProperty(name, inherit, includeStyles, includeDefaults)) - if (inherit) { - add(parent?.getProperty(name, inherit)) - } - }.merge() -} - private fun childToken(childName: Name): NameToken = NameToken(SolidReferenceGroup.REFERENCE_CHILD_PROPERTY_PREFIX, childName.toString()) @@ -83,12 +72,8 @@ public class SolidReferenceGroup( ReferenceChild(this, it.key.asName()) } ?: emptyMap() - override fun getProperty( - name: Name, - inherit: Boolean, - includeStyles: Boolean, - includeDefaults: Boolean, - ): Meta? = getRefProperty(name, inherit, includeStyles, includeDefaults) + override fun getPropertyValue(name: Name, inherit: Boolean, includeStyles: Boolean, includeDefaults: Boolean): Value? = + super.getPropertyValue(name, inherit, includeStyles, includeDefaults) override val descriptor: MetaDescriptor get() = prototype.descriptor @@ -111,6 +96,10 @@ public class SolidReferenceGroup( } } + override val meta: ObservableMutableMeta by lazy { + owner.meta.getOrCreate(childToken(refName).asName()) + } + override val children: Map get() = (prototype as? VisionGroup)?.children ?.filter { it.key != SolidGroup.PROTOTYPES_TOKEN } @@ -118,24 +107,6 @@ public class SolidReferenceGroup( ReferenceChild(owner, refName + key.asName()) } ?: emptyMap() - override fun getOwnProperty(name: Name): Meta? = - owner.getOwnProperty(childPropertyName(refName, name)) - - override fun setPropertyNode(name: Name, node: Meta?, notify: Boolean) { - owner.setPropertyNode(childPropertyName(refName, name), node, notify) - } - - override fun setPropertyValue(name: Name, value: Value?, notify: Boolean) { - owner.setPropertyValue(childPropertyName(refName, name), value, notify) - } - - override fun getProperty( - name: Name, - inherit: Boolean, - includeStyles: Boolean, - includeDefaults: Boolean, - ): Meta? = getRefProperty(name, inherit, includeStyles, includeDefaults) - override var parent: VisionGroup? get() { val parentName = refName.cutLast() @@ -145,21 +116,11 @@ public class SolidReferenceGroup( error("Setting a parent for a reference child is not possible") } - @DFExperimental - override val propertyChanges: Flow - get() = owner.propertyChanges.mapNotNull { name -> - if (name.startsWith(childToken(refName))) { - name.cutFirst() - } else { - null - } - } - override fun invalidateProperty(propertyName: Name) { owner.invalidateProperty(childPropertyName(refName, propertyName)) } - override fun change(change: VisionChange) { + override fun update(change: VisionChange) { change.properties?.let { updateProperties(Name.EMPTY, it) } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Axes.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Axes.kt index 8f980dad..485cc8bd 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Axes.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Axes.kt @@ -4,8 +4,8 @@ import space.kscience.dataforge.meta.Scheme import space.kscience.dataforge.meta.SchemeSpec import space.kscience.dataforge.meta.boolean import space.kscience.dataforge.meta.descriptors.MetaDescriptor +import space.kscience.dataforge.meta.descriptors.value import space.kscience.dataforge.meta.double -import space.kscience.visionforge.value public class Axes : Scheme() { public var visible: Boolean by boolean(false) diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Camera.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Camera.kt index 2319fa69..b8cb05d4 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Camera.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Camera.kt @@ -3,9 +3,9 @@ package space.kscience.visionforge.solid.specifications import space.kscience.dataforge.meta.Scheme import space.kscience.dataforge.meta.SchemeSpec import space.kscience.dataforge.meta.descriptors.MetaDescriptor +import space.kscience.dataforge.meta.descriptors.value import space.kscience.dataforge.meta.double import space.kscience.dataforge.meta.int -import space.kscience.visionforge.value import kotlin.math.PI public class Camera : Scheme() { @@ -27,24 +27,24 @@ public class Camera : Scheme() { public const val FAR_CLIP: Double = 10000.0 public const val FIELD_OF_VIEW: Int = 75 - override val descriptor: MetaDescriptor by lazy { + override val descriptor: MetaDescriptor by lazy { MetaDescriptor { - value(Camera::fov){ + value(Camera::fov) { default(FIELD_OF_VIEW) } - value(Camera::nearClip){ + value(Camera::nearClip) { default(NEAR_CLIP) } - value(Camera::farClip){ + value(Camera::farClip) { default(FAR_CLIP) } - value(Camera::distance){ + value(Camera::distance) { default(INITIAL_DISTANCE) } - value(Camera::azimuth){ + value(Camera::azimuth) { default(INITIAL_AZIMUTH) } - value(Camera::latitude){ + value(Camera::latitude) { default(INITIAL_LATITUDE) } } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt index ea546821..01f6e74e 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt @@ -2,11 +2,11 @@ package space.kscience.visionforge.solid.specifications import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.MetaDescriptor +import space.kscience.dataforge.meta.descriptors.scheme +import space.kscience.dataforge.meta.descriptors.value import space.kscience.dataforge.names.Name import space.kscience.dataforge.values.ValueType import space.kscience.visionforge.hide -import space.kscience.visionforge.scheme -import space.kscience.visionforge.value import space.kscience.visionforge.widgetType public class Clipping : Scheme() { @@ -80,7 +80,19 @@ public class Canvas3DOptions : Scheme() { override val descriptor: MetaDescriptor by lazy { MetaDescriptor { scheme(Canvas3DOptions::axes, Axes) - scheme(Canvas3DOptions::light, Light) + + value(Canvas3DOptions::layers) { + multiple = true + default(listOf(0)) + widgetType = "multiSelect" + allowedValues(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10) + } + + scheme(Canvas3DOptions::clipping, Clipping) + + scheme(Canvas3DOptions::light, Light){ + hide() + } scheme(Canvas3DOptions::camera, Camera) { hide() @@ -93,15 +105,6 @@ public class Canvas3DOptions : Scheme() { scheme(Canvas3DOptions::size, CanvasSize) { hide() } - - value(Canvas3DOptions::layers) { - type(ValueType.NUMBER) - multiple = true - default(listOf(0)) - widgetType = "multiSelect" - allowedValues(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10) - } - scheme(Canvas3DOptions::clipping, Clipping) } } } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/RemoveSingleChild.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/RemoveSingleChild.kt index e623ef46..39aadbf1 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/RemoveSingleChild.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/RemoveSingleChild.kt @@ -1,5 +1,6 @@ package space.kscience.visionforge.solid.transform +import space.kscience.dataforge.meta.configure import space.kscience.dataforge.meta.update import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.asName @@ -22,7 +23,7 @@ internal fun Vision.updateFrom(other: Vision): Vision { scaleY *= other.scaleY scaleZ *= other.scaleZ configure{ - update(other.meta()) + update(other.meta) } } return this diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/PropertyTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/PropertyTest.kt index a31ed9f8..d146195a 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/PropertyTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/PropertyTest.kt @@ -1,13 +1,24 @@ package space.kscience.visionforge.solid -import space.kscience.dataforge.meta.int +import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.asName +import space.kscience.dataforge.values.int import space.kscience.visionforge.* import kotlin.test.Test import kotlin.test.assertEquals @Suppress("UNUSED_VARIABLE") class PropertyTest { + @Test + fun testColorUpdate(){ + val box = Box(10.0f, 10.0f,10.0f) + box.material { + //meta["color"] = "pink" + color("pink") + } + assertEquals("pink", box.meta["material.color"]?.string) + } + @Test fun testInheritedProperty() { var box: Box? = null @@ -17,7 +28,7 @@ class PropertyTest { box = box(100, 100, 100) } } - assertEquals(22, box?.getProperty("test", inherit = true).int) + assertEquals(22, box?.getPropertyValue("test", inherit = true)?.int) } @Test @@ -35,11 +46,11 @@ class PropertyTest { } } } - assertEquals(22, box?.getProperty("test").int) + assertEquals(22, box?.getPropertyValue("test")?.int) } @Test - fun testColor() { + fun testStyleColor() { var box: Box? = null val group = SolidGroup().apply { styleSheet { diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt index d878881f..8f5c3f57 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt @@ -3,7 +3,6 @@ package space.kscience.visionforge.solid import space.kscience.dataforge.names.Name import space.kscience.visionforge.MutableVisionGroup import space.kscience.visionforge.get -import space.kscience.visionforge.meta import kotlin.test.Test import kotlin.test.assertEquals @@ -32,7 +31,7 @@ class SerializationTest { val string = Solids.encodeToString(cube) println(string) val newCube = Solids.decodeFromString(string) - assertEquals(cube.meta(), newCube.meta()) + assertEquals(cube.meta, newCube.meta) } @Test @@ -53,7 +52,7 @@ class SerializationTest { val string = Solids.encodeToString(group) println(string) val reconstructed = Solids.decodeFromString(string) as SolidGroup - assertEquals(group["cube"]?.meta(), reconstructed["cube"]?.meta()) + assertEquals(group["cube"]?.meta, reconstructed["cube"]?.meta) } } \ No newline at end of file diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt index 821e7f04..7a36ab3f 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt @@ -28,7 +28,7 @@ class VisionUpdateTest { propertyChanged("top".asName(), SolidMaterial.MATERIAL_COLOR_KEY, Meta("red".asValue())) propertyChanged("origin".asName(), SolidMaterial.MATERIAL_COLOR_KEY, Meta("red".asValue())) } - targetVision.change(dif) + targetVision.update(dif) assertTrue { targetVision["top"] is SolidGroup } assertEquals("red", (targetVision["origin"] as Solid).color.string) // Should work assertEquals("#00007b", (targetVision["top"] as Solid).color.string) // new item always takes precedence diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt index 7e90a657..992035a6 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt @@ -4,12 +4,13 @@ import info.laht.threekt.core.BufferGeometry import info.laht.threekt.geometries.EdgesGeometry import info.laht.threekt.objects.LineSegments import info.laht.threekt.objects.Mesh -import space.kscience.dataforge.meta.boolean -import space.kscience.dataforge.meta.node +import space.kscience.dataforge.meta.get import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus import space.kscience.dataforge.names.startsWith +import space.kscience.dataforge.values.boolean +import space.kscience.visionforge.computeProperties import space.kscience.visionforge.onPropertyChange import space.kscience.visionforge.solid.Solid import space.kscience.visionforge.solid.SolidMaterial @@ -40,7 +41,7 @@ public abstract class MeshThreeFactory( } //add listener to object properties - obj.onPropertyChange(three.updateScope) { name -> + obj.onPropertyChange { name -> when { name.startsWith(Solid.GEOMETRY_KEY) -> { val oldGeometry = mesh.geometry as BufferGeometry @@ -83,14 +84,10 @@ internal fun Mesh.applyProperties(obj: Solid): Mesh = apply { public fun Mesh.applyEdges(obj: Solid) { val edges = children.find { it.name == "@edges" } as? LineSegments //inherited edges definition, enabled by default - if (obj.getProperty(MeshThreeFactory.EDGES_ENABLED_KEY, inherit = true, includeStyles = true).boolean != false) { + if (obj.getPropertyValue(MeshThreeFactory.EDGES_ENABLED_KEY, inherit = true, includeStyles = true)?.boolean != false) { val bufferGeometry = geometry as? BufferGeometry ?: return val material = ThreeMaterials.getLineMaterial( - obj.getProperty( - MeshThreeFactory.EDGES_MATERIAL_KEY, - inherit = true, - includeStyles = true - ), + obj.computeProperties().get(MeshThreeFactory.EDGES_MATERIAL_KEY), true ) if (edges == null) { diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt index 2cdd12d3..5705459a 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt @@ -48,7 +48,7 @@ public class ThreeCompositeFactory(public val three: ThreePlugin) : ThreeFactory }.apply { updatePosition(obj) applyProperties(obj) - obj.onPropertyChange(three.updateScope) { name -> + obj.onPropertyChange { name -> when { //name.startsWith(WIREFRAME_KEY) -> mesh.applyWireFrame(obj) name.startsWith(MeshThreeFactory.EDGES_KEY) -> applyEdges(obj) diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeGeometryBuilder.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeGeometryBuilder.kt index c1c5aa72..fc226de6 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeGeometryBuilder.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeGeometryBuilder.kt @@ -40,7 +40,7 @@ public class ThreeGeometryBuilder : GeometryBuilder { } override fun face(vertex1: Point3D, vertex2: Point3D, vertex3: Point3D, normal: Point3D?, meta: Meta) { - val actualNormal: Point3D = normal ?: (vertex3 - vertex2) cross (vertex1 - vertex2) + val actualNormal: Point3D = normal ?: ((vertex3 - vertex2) cross (vertex1 - vertex2)) indices.add( vertex(vertex1, actualNormal), vertex(vertex2, actualNormal), diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt index d0c10605..34ee5ed1 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt @@ -27,7 +27,7 @@ public object ThreeLabelFactory : ThreeFactory { return Mesh(textGeo, ThreeMaterials.DEFAULT).apply { updateMaterial(obj) updatePosition(obj) - obj.onPropertyChange(three.updateScope) { _ -> + obj.onPropertyChange { _ -> //TODO three.logger.warn { "Label parameter change not implemented" } } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt index bc369086..49fca0d9 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt @@ -4,6 +4,7 @@ import info.laht.threekt.core.BufferGeometry import info.laht.threekt.core.Object3D import info.laht.threekt.math.Color import info.laht.threekt.objects.LineSegments +import space.kscience.visionforge.computePropertyNode import space.kscience.visionforge.onPropertyChange import space.kscience.visionforge.solid.PolyLine import space.kscience.visionforge.solid.color @@ -20,7 +21,7 @@ public object ThreeLineFactory : ThreeFactory { } val material = ThreeMaterials.getLineMaterial( - obj.getProperty(MeshThreeFactory.EDGES_MATERIAL_KEY), + obj.computePropertyNode(MeshThreeFactory.EDGES_MATERIAL_KEY), true ) @@ -31,7 +32,7 @@ public object ThreeLineFactory : ThreeFactory { updatePosition(obj) //layers.enable(obj.layer) //add listener to object properties - obj.onPropertyChange(three.updateScope) { propertyName -> + obj.onPropertyChange { propertyName -> updateProperty(obj, propertyName) } } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt index 258df5ff..9a3c6be9 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt @@ -8,12 +8,10 @@ import info.laht.threekt.math.Color import info.laht.threekt.objects.Mesh import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.Name -import space.kscience.dataforge.values.ValueType -import space.kscience.dataforge.values.int -import space.kscience.dataforge.values.string +import space.kscience.dataforge.values.* import space.kscience.visionforge.Colors import space.kscience.visionforge.Vision -import space.kscience.visionforge.meta +import space.kscience.visionforge.computePropertyNode import space.kscience.visionforge.solid.SolidMaterial @@ -117,8 +115,8 @@ private var Material.cached: Boolean public fun Mesh.updateMaterial(vision: Vision) { //val meta = vision.getProperty(SolidMaterial.MATERIAL_KEY, inherit = true).node - val ownMaterialMeta = vision.meta()[SolidMaterial.MATERIAL_KEY] - val parentMaterialMeta = vision.parent?.getProperty( + val ownMaterialMeta = vision.meta.getMeta(SolidMaterial.MATERIAL_KEY) + val parentMaterialMeta = vision.parent?.getPropertyValue( SolidMaterial.MATERIAL_KEY, inherit = true, includeStyles = false, @@ -128,19 +126,15 @@ public fun Mesh.updateMaterial(vision: Vision) { material = when { ownMaterialMeta == null && parentMaterialMeta == null -> { //If material is style-based, use cached - vision.getProperty( + vision.computePropertyNode( SolidMaterial.MATERIAL_KEY, - inherit = false, - includeStyles = true, - includeDefaults = false )?.let { ThreeMaterials.cacheMaterial(it) } ?: ThreeMaterials.DEFAULT } else -> { - vision.getProperty( + vision.computePropertyNode( SolidMaterial.MATERIAL_KEY, - inherit = true )?.let { ThreeMaterials.buildMaterial(it) } ?: ThreeMaterials.DEFAULT @@ -155,32 +149,29 @@ public fun Mesh.updateMaterialProperty(vision: Vision, propertyName: Name) { } else { when (propertyName) { SolidMaterial.MATERIAL_COLOR_KEY -> { - material.asDynamic().color = vision.getProperty( + material.asDynamic().color = vision.computePropertyNode( SolidMaterial.MATERIAL_COLOR_KEY, - inherit = true, - includeStyles = true, - includeDefaults = false )?.threeColor() ?: ThreeMaterials.DEFAULT_COLOR material.needsUpdate = true } SolidMaterial.MATERIAL_OPACITY_KEY -> { - val opacity = vision.getProperty( + val opacity = vision.getPropertyValue( SolidMaterial.MATERIAL_OPACITY_KEY, inherit = true, includeStyles = true, includeDefaults = false - ).double ?: 1.0 + )?.double ?: 1.0 material.opacity = opacity material.transparent = opacity < 1.0 material.needsUpdate = true } SolidMaterial.MATERIAL_WIREFRAME_KEY -> { - material.asDynamic().wireframe = vision.getProperty( + material.asDynamic().wireframe = vision.getPropertyValue( SolidMaterial.MATERIAL_WIREFRAME_KEY, inherit = true, includeStyles = true, includeDefaults = false - ).boolean ?: false + )?.boolean ?: false material.needsUpdate = true } else -> console.warn("Unrecognized material property: $propertyName") diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt index 9c7c1f6b..e7c2ac86 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt @@ -69,7 +69,7 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { updatePosition(obj) //obj.onChildrenChange() - obj.onPropertyChange(updateScope) { name -> + obj.onPropertyChange { name -> if ( name.startsWith(Solid.POSITION_KEY) || name.startsWith(Solid.ROTATION_KEY) || diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt index 4dca0eeb..53e9c2c9 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt @@ -47,7 +47,7 @@ public object ThreeReferenceFactory : ThreeFactory { //TODO apply child properties - obj.onPropertyChange(three.updateScope) { name-> + obj.onPropertyChange { name-> if (name.firstOrNull()?.body == REFERENCE_CHILD_PROPERTY_PREFIX) { val childName = name.firstOrNull()?.index?.let(Name::parse) ?: error("Wrong syntax for reference child property: '$name'") val propertyName = name.cutFirst() diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/csg.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/csg.kt index 50e48ee9..ac2fefc0 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/csg.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/csg.kt @@ -3,7 +3,8 @@ "OVERRIDING_FINAL_MEMBER", "RETURN_TYPE_MISMATCH_ON_OVERRIDE", "CONFLICTING_OVERLOADS", - "EXTERNAL_DELEGATION" + "EXTERNAL_DELEGATION", + "NO_EXPLICIT_VISIBILITY_IN_API_MODE_WARNING" ) @file:JsModule("three-csg-ts") From 004cdc049bf6067e47f47d6442fc99832ad42894 Mon Sep 17 00:00:00 2001 From: kiruma524 Date: Tue, 10 Aug 2021 13:21:35 +0300 Subject: [PATCH 029/109] Really Raw version of hierarchy documentation. --- docs/design.md | 2 +- docs/hierarchy.md | 32 ++++++++++++++++++ docs/images/hierarchy.png | Bin 0 -> 27217 bytes docs/uml/Vision.puml | 1 + .../space/kscience/visionforge/VisionBase.kt | 7 +--- 5 files changed, 35 insertions(+), 7 deletions(-) create mode 100644 docs/hierarchy.md create mode 100644 docs/images/hierarchy.png diff --git a/docs/design.md b/docs/design.md index 79014d73..17e52a35 100644 --- a/docs/design.md +++ b/docs/design.md @@ -14,6 +14,6 @@ The actual layering scheme is more complicated. All objects support styling. The ### Intermediate representation -An important thing about VisionForge is that it does not strictly bound to a single format representation. +An important thing about VisionForge is that it does not strictly bound to a single format representation. ### Kotlin DSL for creating vision-graphs \ No newline at end of file diff --git a/docs/hierarchy.md b/docs/hierarchy.md new file mode 100644 index 00000000..eee02697 --- /dev/null +++ b/docs/hierarchy.md @@ -0,0 +1,32 @@ +# Hierarchy + +![](../docs/images/hierarchy.png) + +### Vision + +* function `getProperty(name: Name, inherit: Boolean, includeStyles: Boolean, includeDefaults: Boolean)`. + +It gets properties of element with `name` identification. +`inherit` — toggles parent node property lookup. Null means inference from descriptor. Default is false. +`includeStyles` — toggles inclusion of. Null means inference from descriptor. Default is true. +`includeDefaults` — default is false. + +* function `setProperty(name: Name, item: MetaItem?, notify: Boolean = true)` + +Sets the `item` property to the element with the `name` identification. `notify` is a value which toggles the necessity of the change notification. Default is true. + +### About properties +**Properties have to be set in particular order:** + +* styles +* prototypes +* parent +* parent's styles +* defaults + + +## Inheritance + +Inheritance is a very useful ability of `children` elements to get the same property in default as his parent does have (to 'inherit' it). + + diff --git a/docs/images/hierarchy.png b/docs/images/hierarchy.png new file mode 100644 index 0000000000000000000000000000000000000000..e202c6afaa746ea54011d46fe48f1d0faae43c5a GIT binary patch literal 27217 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 F{{WiZ#M1x( literal 0 HcmV?d00001 diff --git a/docs/uml/Vision.puml b/docs/uml/Vision.puml index 2028b097..d7fd7103 100644 --- a/docs/uml/Vision.puml +++ b/docs/uml/Vision.puml @@ -5,6 +5,7 @@ interface Vision{ val parent: Vision? fun getProperty(name): MetaItem? fun setProperty(name, value) + } class VisionBase{ diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt index 78b75124..08927448 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt @@ -17,11 +17,6 @@ import space.kscience.dataforge.values.ValueType import space.kscience.visionforge.Vision.Companion.STYLE_KEY import kotlin.jvm.Synchronized -internal data class PropertyListener( - val owner: Any? = null, - val action: (name: Name) -> Unit, -) - /** * A full base implementation for a [Vision] * @param properties Object own properties excluding styles and inheritance @@ -43,7 +38,7 @@ public open class VisionBase( } /** - * A fast accessor method to get own property (no inheritance or styles + * A fast accessor method to get own property (no inheritance or styles) */ override fun getOwnProperty(name: Name): MetaItem? = if (name == Name.EMPTY) { properties?.asMetaItem() From 5721bb9456273fa37b2189bffe3cf182c9f9bcc7 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 11 Aug 2021 16:52:36 +0300 Subject: [PATCH 030/109] A lot of fixes --- build.gradle.kts | 3 +- .../visionforge/gdml/GDMLVisionTest.kt | 27 ++-- .../visionforge/gdml/demo/GdmlFxDemoApp.kt | 5 +- .../kotlin/ru/mipt/npm/muon/monitor/Model.kt | 5 + .../ru/mipt/npm/muon/monitor/Monitor.kt | 3 +- .../mipt/npm/muon/monitor/MMAppComponent.kt | 7 +- .../ru/mipt/npm/muon/monitor/MMDemoApp.kt | 16 ++- .../kscience/visionforge/solid/demo/demo.kt | 3 +- .../visionforge/solid/demo/FXDemoApp.kt | 2 +- .../visionforge/solid/demo/MetaEditorDemo.kt | 7 +- .../visionforge/bootstrap/outputConfig.kt | 6 +- .../visionforge/bootstrap/threeControls.kt | 2 +- .../kscience/visionforge/react/MetaViewer.kt | 1 - .../visionforge/react/PropertyEditor.kt | 2 +- .../ringThreeControls.kt | 1 - .../visionforge/ComputedVisionProperties.kt | 83 ++++++++---- .../space/kscience/visionforge/StyleSheet.kt | 5 +- .../space/kscience/visionforge/VisionBase.kt | 40 +++--- .../space/kscience/visionforge/VisionGroup.kt | 3 + .../kotlin/space/kscience/visionforge/misc.kt | 17 --- .../kscience/visionforge/visionDescriptor.kt | 22 +-- .../kscience/visionforge/html/HtmlTagTest.kt | 3 - visionforge-fx/build.gradle.kts | 9 +- .../visionforge/editor/FXMetaModel.kt | 31 +++-- .../kscience/visionforge/editor/MetaViewer.kt | 6 +- .../visionforge/editor/MutableMetaEditor.kt | 21 ++- .../editor/VisionEditorFragment.kt | 19 ++- .../kscience/visionforge/solid/FX3DPlugin.kt | 4 +- .../kscience/visionforge/solid/FXMaterials.kt | 34 +++-- .../visionforge/solid/FXReferenceFactory.kt | 2 +- .../visionforge/gdml/GdmlTransformer.kt | 14 -- .../visionforge/plotly/VisionOfPlotly.kt | 1 - .../visionforge/solid/ColorAccessor.kt | 23 ++-- .../kscience/visionforge/solid/Composite.kt | 49 ++++--- .../kscience/visionforge/solid/SolidBase.kt | 4 + .../kscience/visionforge/solid/SolidGroup.kt | 4 + .../visionforge/solid/SolidMaterial.kt | 14 +- .../visionforge/solid/SolidReference.kt | 29 +++- .../visionforge/solid/PropertyTest.kt | 24 +++- .../solid/three/MeshThreeFactory.kt | 20 ++- .../solid/three/ThreeCanvasLabelFactory.kt | 4 +- .../visionforge/solid/three/ThreeMaterials.kt | 127 ++++++++---------- .../solid/three/ThreeReferenceFactory.kt | 3 +- 43 files changed, 382 insertions(+), 323 deletions(-) delete mode 100644 visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/misc.kt diff --git a/build.gradle.kts b/build.gradle.kts index ec691447..08ad66d8 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,14 +2,13 @@ plugins { id("ru.mipt.npm.gradle.project") } -val dataforgeVersion by extra("0.5.0-dev-10") +val dataforgeVersion by extra("0.5.0-dev-11") val fxVersion by extra("11") allprojects { repositories { mavenLocal() mavenCentral() - jcenter() maven("https://repo.kotlin.link") maven("https://maven.jzy3d.org/releases") } diff --git a/demo/gdml/src/commonTest/kotlin/space/kscience/visionforge/gdml/GDMLVisionTest.kt b/demo/gdml/src/commonTest/kotlin/space/kscience/visionforge/gdml/GDMLVisionTest.kt index 50ba6d12..12918532 100644 --- a/demo/gdml/src/commonTest/kotlin/space/kscience/visionforge/gdml/GDMLVisionTest.kt +++ b/demo/gdml/src/commonTest/kotlin/space/kscience/visionforge/gdml/GDMLVisionTest.kt @@ -4,27 +4,36 @@ import space.kscience.dataforge.names.Name import space.kscience.dataforge.values.asValue import space.kscience.dataforge.values.string import space.kscience.gdml.GdmlShowCase +import space.kscience.visionforge.Vision +import space.kscience.visionforge.computeProperties +import space.kscience.visionforge.get import space.kscience.visionforge.setProperty +import space.kscience.visionforge.solid.Solid import space.kscience.visionforge.solid.SolidMaterial +import space.kscience.visionforge.solid.material import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertNotNull class GDMLVisionTest { + private val cubes = GdmlShowCase.cubes().toVision() -// @Test -// fun testCubesStyles(){ -// val cubes = gdml.toVision() -// val segment = cubes["composite000.segment_0".toName()] as Solid -// println(segment.styles) -// println(segment.material) -// } + @Test + fun testCubesStyles(){ + val segment = cubes["composite-000.segment-0"] as Solid + println(segment.computeProperties().getValue(Vision.STYLE_KEY)) +// println(segment.computePropertyNode(SolidMaterial.MATERIAL_KEY)) +// println(segment.computeProperty(SolidMaterial.MATERIAL_COLOR_KEY)) + + println(segment.material?.meta) + + //println(Solids.encodeToString(cubes)) + } @Test fun testPrototypeProperty() { - val vision = GdmlShowCase.cubes().toVision() - val child = vision[Name.of("composite-000","segment-0")] + val child = cubes[Name.of("composite-000","segment-0")] assertNotNull(child) child.setProperty(SolidMaterial.MATERIAL_COLOR_KEY, "red".asValue()) assertEquals("red", child.getPropertyValue(SolidMaterial.MATERIAL_COLOR_KEY)?.string) diff --git a/demo/gdml/src/jvmMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlFxDemoApp.kt b/demo/gdml/src/jvmMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlFxDemoApp.kt index cb40431c..f2371f44 100644 --- a/demo/gdml/src/jvmMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlFxDemoApp.kt +++ b/demo/gdml/src/jvmMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlFxDemoApp.kt @@ -7,7 +7,6 @@ import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.fetch import space.kscience.gdml.GdmlShowCase import space.kscience.visionforge.VisionManager -import space.kscience.visionforge.computeProperties import space.kscience.visionforge.editor.VisionEditorFragment import space.kscience.visionforge.editor.VisionTreeFragment import space.kscience.visionforge.gdml.toVision @@ -33,9 +32,7 @@ class GDMLView : View() { this.itemProperty.bind(canvas.rootObjectProperty) } - private val propertyEditor = VisionEditorFragment { - it.computeProperties() - }.apply { + private val propertyEditor = VisionEditorFragment().apply { descriptorProperty.set(SolidMaterial.descriptor) visionProperty.bind(treeFragment.selectedProperty) } diff --git a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt index 87065723..854e520c 100644 --- a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt +++ b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt @@ -28,6 +28,7 @@ class Model(val manager: VisionManager) { private fun SolidGroup.detector(detector: SC16) { group(detector.name) { + position = detector.center detector.pixels.forEach { pixel(it) } @@ -38,6 +39,10 @@ class Model(val manager: VisionManager) { val root: SolidGroup = SolidGroup().apply { root(this@Model.manager) + material { + wireframe + color("darkgreen") + } rotationX = PI / 2 group("bottom") { Monitor.detectors.filter { it.center.z == LOWER_LAYER_Z }.forEach { diff --git a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Monitor.kt b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Monitor.kt index 17d5ac86..3b64bb5a 100644 --- a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Monitor.kt +++ b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Monitor.kt @@ -3,7 +3,6 @@ package ru.mipt.npm.muon.monitor import ru.mipt.npm.muon.monitor.Monitor.PIXEL_XY_SIZE import ru.mipt.npm.muon.monitor.Monitor.PIXEL_Z_SIZE import space.kscience.visionforge.solid.Point3D -import space.kscience.visionforge.solid.plus /** * A single pixel @@ -98,7 +97,7 @@ class SC16( } val offset = Point3D(-y, x, 0)//rotateDetector(Point3D(x, y, 0.0)); val pixelName = "${name}_${index}" - SC1(pixelName, center + offset) + SC1(pixelName, offset) } } } diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt index 75b610ac..d981fa44 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt @@ -2,6 +2,7 @@ package ru.mipt.npm.muon.monitor import io.ktor.client.HttpClient import io.ktor.client.request.get +import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import kotlinx.css.* @@ -23,6 +24,7 @@ import space.kscience.visionforge.react.flexColumn import space.kscience.visionforge.react.visionTree import space.kscience.visionforge.solid.specifications.Camera import space.kscience.visionforge.solid.specifications.Canvas3DOptions +import space.kscience.visionforge.solid.three.edges import styled.css import styled.styledDiv import kotlin.math.PI @@ -34,6 +36,7 @@ external interface MMAppProps : RProps { var selected: Name? } +@OptIn(DelicateCoroutinesApi::class) @JsExport val MMApp = functionalComponent("Muon monitor") { props -> var selected by useState { props.selected } @@ -53,7 +56,9 @@ val MMApp = functionalComponent("Muon monitor") { props -> } } - val root = props.model.root + val root = props.model.root.apply { + edges() + } gridRow { flexColumn { diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt index 5c4a589a..9daa6213 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt @@ -7,18 +7,15 @@ import kotlinx.browser.document import react.child import react.dom.render import space.kscience.dataforge.context.Context -import space.kscience.dataforge.context.Global import space.kscience.dataforge.context.fetch import space.kscience.visionforge.Application import space.kscience.visionforge.VisionManager import space.kscience.visionforge.bootstrap.useBootstrap +import space.kscience.visionforge.solid.three.ThreePlugin import space.kscience.visionforge.startApplication private class MMDemoApp : Application { - private val visionManager = Global.fetch(VisionManager) - private val model = Model(visionManager) - private val connection = HttpClient { install(JsonFeature) { serializer = KotlinxSerializer() @@ -28,13 +25,18 @@ private class MMDemoApp : Application { override fun start(state: Map) { useBootstrap() - val element = document.getElementById("app") ?: error("Element with id 'app' not found on page") + val context = Context("MM-demo"){ + plugin(ThreePlugin) + } + val visionManager = context.fetch(VisionManager) - val context = Context("demo") + val model = Model(visionManager) + + val element = document.getElementById("app") ?: error("Element with id 'app' not found on page") render(element) { child(MMApp) { attrs { - this.model = this@MMDemoApp.model + this.model = model this.connection = this@MMDemoApp.connection this.context = context } diff --git a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt index c933c3ce..2f533c95 100644 --- a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt +++ b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt @@ -19,7 +19,7 @@ fun VisionLayout.demo(name: String, title: String = name, block: SolidGro "title" put title } val vision = SolidGroup(block) - render(Name.parse(name), vision) + render(Name.parse(name), vision, meta) } val canvasOptions = Canvas3DOptions { @@ -36,6 +36,7 @@ val canvasOptions = Canvas3DOptions { } } +@OptIn(DelicateCoroutinesApi::class) fun VisionLayout.showcase() { demo("shapes", "Basic shapes") { box(100.0, 100.0, 100.0) { diff --git a/demo/solid-showcase/src/jvmMain/kotlin/space/kscience/visionforge/solid/demo/FXDemoApp.kt b/demo/solid-showcase/src/jvmMain/kotlin/space/kscience/visionforge/solid/demo/FXDemoApp.kt index 3ce92f0f..7f278d28 100644 --- a/demo/solid-showcase/src/jvmMain/kotlin/space/kscience/visionforge/solid/demo/FXDemoApp.kt +++ b/demo/solid-showcase/src/jvmMain/kotlin/space/kscience/visionforge/solid/demo/FXDemoApp.kt @@ -14,7 +14,7 @@ class FXDemoApp : App(FXDemoGrid::class) { stage.height = 600.0 view.showcase() - view.showcaseCSG() + //view.showcaseCSG() } } diff --git a/demo/solid-showcase/src/jvmMain/kotlin/space/kscience/visionforge/solid/demo/MetaEditorDemo.kt b/demo/solid-showcase/src/jvmMain/kotlin/space/kscience/visionforge/solid/demo/MetaEditorDemo.kt index b00ef055..3cdf058e 100644 --- a/demo/solid-showcase/src/jvmMain/kotlin/space/kscience/visionforge/solid/demo/MetaEditorDemo.kt +++ b/demo/solid-showcase/src/jvmMain/kotlin/space/kscience/visionforge/solid/demo/MetaEditorDemo.kt @@ -1,7 +1,6 @@ package space.kscience.visionforge.demo import javafx.geometry.Orientation -import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.node @@ -46,12 +45,12 @@ class MetaEditorDemo : View("Meta editor demo") { } } - private val rootNode = FXMetaModel.root(meta, descriptor) + private val rootNode:FXMetaModel = FXMetaModel.root(meta, descriptor) override val root = splitpane( Orientation.HORIZONTAL, - MetaViewer(rootNode as Meta).root, - MutableMetaEditor(rootNode as FXMetaModel).root + MetaViewer(rootNode).root, + MutableMetaEditor(rootNode).root ) } diff --git a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt index f16985c5..8088d2fd 100644 --- a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt +++ b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt @@ -12,9 +12,9 @@ import org.w3c.files.BlobPropertyBag import react.* import react.dom.attrs import react.dom.button -import space.kscience.dataforge.meta.descriptors.defaultNode import space.kscience.dataforge.meta.withDefault import space.kscience.visionforge.Vision +import space.kscience.visionforge.encodeToString import space.kscience.visionforge.react.flexColumn import space.kscience.visionforge.react.flexRow import space.kscience.visionforge.react.propertyEditor @@ -51,12 +51,12 @@ public val CanvasControls: FunctionComponent = functionalCo border(1.px, BorderStyle.solid, Color.blue) padding(4.px) } - props.vision?.manager?.let { manager -> + props.vision?.let{ vision -> button { +"Export" attrs { onClickFunction = { - val json = manager.encodeToString(props.vision!!) + val json = vision.encodeToString() saveData(it, "object.json", "text/json") { json } diff --git a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/threeControls.kt b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/threeControls.kt index e8166f35..95219db1 100644 --- a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/threeControls.kt +++ b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/threeControls.kt @@ -21,7 +21,7 @@ public external interface ThreeControlsProps : RProps { } @JsExport -public val ThreeControls: FunctionalComponent = functionalComponent { props -> +public val ThreeControls: FunctionComponent = functionalComponent { props -> tabPane(if (props.selected != null) "Properties" else null) { tab("Canvas") { card("Canvas configuration") { diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MetaViewer.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MetaViewer.kt index 288251e0..69683bc5 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MetaViewer.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MetaViewer.kt @@ -9,7 +9,6 @@ import react.dom.a import react.dom.attrs import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.descriptors.MetaDescriptor -import space.kscience.dataforge.meta.descriptors.defaultNode import space.kscience.dataforge.meta.descriptors.get import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.isLeaf diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt index cdb1bf30..47b0d818 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt @@ -121,7 +121,7 @@ private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { }?.forEach { add(NameToken(it.key)) } - ownProperty?.items?.keys?.filterNot { it.body.startsWith("@") }?.let { addAll(it) } + //ownProperty?.items?.keys?.filterNot { it.body.startsWith("@") }?.let { addAll(it) } } flexRow { diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt index 1d9626ed..ca5ca00f 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt @@ -15,7 +15,6 @@ import react.dom.button import ringui.Island import ringui.SmartTabs import ringui.Tab -import space.kscience.dataforge.meta.descriptors.defaultNode import space.kscience.dataforge.meta.withDefault import space.kscience.dataforge.names.Name import space.kscience.visionforge.Vision diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ComputedVisionProperties.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ComputedVisionProperties.kt index 1007eee6..925eecfe 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ComputedVisionProperties.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ComputedVisionProperties.kt @@ -1,53 +1,84 @@ package space.kscience.visionforge import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.ObservableMutableMeta import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.get import space.kscience.dataforge.meta.get import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.NameToken import space.kscience.dataforge.names.plus +import space.kscience.dataforge.values.MutableValueProvider import space.kscience.dataforge.values.Value private class ComputedVisionProperties( - public val vision: Vision, - public val rootName: Name, - public val visionDescriptor: MetaDescriptor -) : ObservableMutableMeta by vision.meta { + val vision: Vision, + val pathName: Name, + val visionDescriptor: MetaDescriptor, + val parentInheritFlag: Boolean?, + val parentStylesFlag: Boolean? +) : Meta { - public val descriptor: MetaDescriptor? = visionDescriptor[rootName] + val descriptor: MetaDescriptor? by lazy { visionDescriptor[pathName] } - override val items: Map + override val items: Map get() { - val metaKeys = vision.meta.items.keys + val metaKeys = vision.meta.getMeta(pathName)?.items?.keys ?: emptySet() val descriptorKeys = descriptor?.children?.map { NameToken(it.key) } ?: emptySet() - return (metaKeys + descriptorKeys).associateWith { getMeta(rootName + it) } + val inheritFlag = descriptor?.inherited ?: parentInheritFlag + val stylesFlag = descriptor?.usesStyles ?: parentStylesFlag + return (metaKeys + descriptorKeys).associateWith { + ComputedVisionProperties( + vision, + pathName + it, + visionDescriptor, + inheritFlag, + stylesFlag + ) + } } - override var value: Value? + override val value: Value? get() { - val inheritFlag = descriptor?.inherited ?: false - val stylesFlag = descriptor?.usesStyles ?: true - return vision.getPropertyValue(rootName, inheritFlag, stylesFlag, true) - } - set(value) { - vision.meta.setValue(rootName, value) + val inheritFlag = descriptor?.inherited ?: parentInheritFlag ?: false + val stylesFlag = descriptor?.usesStyles ?: parentStylesFlag ?: true + return vision.getPropertyValue(pathName, inheritFlag, stylesFlag, true) } - override fun getMeta(name: Name): ObservableMutableMeta = - ComputedVisionProperties(vision, rootName + name, visionDescriptor) - - override fun getOrCreate(name: Name): ObservableMutableMeta = getMeta(name) - - override fun toMeta(): Meta = this + override fun toString(): String = Meta.toString(this) + override fun equals(other: Any?): Boolean = Meta.equals(this, other as? Meta) + override fun hashCode(): Int = Meta.hashCode(this) } /** * Compute property node based on inheritance and style information from the descriptor */ -public fun Vision.computeProperties(descriptor: MetaDescriptor? = this.descriptor): ObservableMutableMeta = - if (descriptor == null) meta else ComputedVisionProperties(this, Name.EMPTY, descriptor) +public fun Vision.computeProperties(descriptor: MetaDescriptor? = this.descriptor): Meta = + if (descriptor == null) meta else ComputedVisionProperties(this, Name.EMPTY, descriptor, null, null) + +public fun Vision.computePropertyNode( + name: Name, + descriptor: MetaDescriptor? = this.descriptor +): Meta? = computeProperties(descriptor)[name] + +/** + * Compute the property based on the provided value descriptor. By default, use Vision own descriptor + */ +public fun Vision.computeProperty(name: Name, valueDescriptor: MetaDescriptor? = descriptor?.get(name)): Value? { + val inheritFlag = valueDescriptor?.inherited ?: false + val stylesFlag = valueDescriptor?.usesStyles ?: true + return getPropertyValue(name, inheritFlag, stylesFlag) +} + +/** + * Accessor to all vision properties + */ +public fun Vision.computePropertyValues( + descriptor: MetaDescriptor? = this.descriptor +): MutableValueProvider = object : MutableValueProvider { + override fun getValue(name: Name): Value? = computeProperty(name, descriptor?.get(name)) + + override fun setValue(name: Name, value: Value?) { + setProperty(name, value) + } +} -public fun Vision.computePropertyNode(name: Name, descriptor: MetaDescriptor? = this.descriptor): ObservableMutableMeta? = - computeProperties(descriptor)[name] \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt index dacc09b1..52deee3c 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt @@ -7,6 +7,7 @@ import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus import space.kscience.dataforge.values.Value import space.kscience.dataforge.values.asValue +import space.kscience.dataforge.values.stringList import kotlin.jvm.JvmInline /** @@ -72,7 +73,7 @@ internal fun Vision.styleChanged(key: String, oldStyle: Meta?, newStyle: Meta?) * List of names of styles applied to this object. Order matters. Not inherited. */ public var Vision.styles: List - get() = meta.getMeta(Vision.STYLE_KEY)?.stringList ?: emptyList() + get() = meta.getValue(Vision.STYLE_KEY)?.stringList ?: emptyList() set(value) { meta.setValue(Vision.STYLE_KEY, value.map { it.asValue() }.asValue()) } @@ -105,7 +106,7 @@ public fun Vision.getStyleProperty(name: Name): Value? = styles.firstNotNullOfOr /** * Resolve an item in all style layers */ -public fun Vision.getStyleItems(name: Name): List = styles.mapNotNull { +public fun Vision.getStyleNodes(name: Name): List = styles.mapNotNull { getStyle(it)?.get(name) } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt index c123938d..77a682aa 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt @@ -7,7 +7,6 @@ import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.meta.ObservableMutableMeta import space.kscience.dataforge.meta.descriptors.MetaDescriptor -import space.kscience.dataforge.meta.descriptors.defaultNode import space.kscience.dataforge.meta.descriptors.value import space.kscience.dataforge.meta.get import space.kscience.dataforge.misc.DFExperimental @@ -30,9 +29,11 @@ internal data class MetaListener( @SerialName("vision") public open class VisionBase( @Transient override var parent: VisionGroup? = null, - protected var properties: MutableMeta? = null ) : Vision { + @Transient + protected open var properties: MutableMeta? = null + @Synchronized protected fun getOrCreateProperties(): MutableMeta { if (properties == null) { @@ -45,50 +46,55 @@ public open class VisionBase( @Transient private val listeners = HashSet() - private inner class VisionBaseProperties(val rootName: Name) : ObservableMutableMeta { + private inner class VisionProperties(val pathName: Name) : ObservableMutableMeta { override val items: Map - get() = properties?.get(rootName)?.items?.mapValues { entry -> - VisionBaseProperties(rootName + entry.key) + get() = properties?.get(pathName)?.items?.mapValues { entry -> + VisionProperties(pathName + entry.key) } ?: emptyMap() override var value: Value? - get() = properties?.get(rootName)?.value + get() = properties?.get(pathName)?.value set(value) { - getOrCreateProperties().setValue(rootName, value) + val oldValue = properties?.get(pathName)?.value + getOrCreateProperties().setValue(pathName, value) + if (oldValue != value) { + invalidate(Name.EMPTY) + } } - override fun getOrCreate(name: Name): ObservableMutableMeta = VisionBaseProperties(this.rootName + name) + override fun getOrCreate(name: Name): ObservableMutableMeta = VisionProperties(pathName + name) override fun setMeta(name: Name, node: Meta?) { - getOrCreateProperties().setMeta(name, node) + getOrCreateProperties().setMeta(pathName + name, node) + invalidate(name) } @DFExperimental override fun attach(name: Name, node: ObservableMutableMeta) { val ownProperties = getOrCreateProperties() if (ownProperties is ObservableMutableMeta) { - ownProperties.attach(rootName + name, node) + ownProperties.attach(pathName + name, node) } else { - ownProperties.setMeta(rootName + name, node) + ownProperties.setMeta(pathName + name, node) node.onChange(this) { childName -> - ownProperties.setMeta(rootName + name + childName, this[childName]) + ownProperties.setMeta(pathName + name + childName, this[childName]) } } } override fun invalidate(name: Name) { - invalidateProperty(rootName + name) + invalidateProperty(pathName + name) } @Synchronized override fun onChange(owner: Any?, callback: Meta.(name: Name) -> Unit) { - if (rootName.isEmpty()) { + if (pathName.isEmpty()) { listeners.add((MetaListener(owner, callback))) } else { listeners.add(MetaListener(owner) { name -> - if (name.startsWith(rootName)) { - (get(rootName) ?: Meta.EMPTY).callback(name.removeHeadOrNull(rootName)!!) + if (name.startsWith(pathName)) { + (this@MetaListener[pathName] ?: Meta.EMPTY).callback(name.removeHeadOrNull(pathName)!!) } }) } @@ -104,7 +110,7 @@ public open class VisionBase( override fun hashCode(): Int = Meta.hashCode(this) } - override val meta: ObservableMutableMeta get() = VisionBaseProperties(Name.EMPTY) + override val meta: ObservableMutableMeta get() = VisionProperties(Name.EMPTY) override fun getPropertyValue( name: Name, diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt index c7c47901..76640bee 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt @@ -4,6 +4,9 @@ import kotlinx.coroutines.flow.Flow import space.kscience.dataforge.names.* import space.kscience.dataforge.provider.Provider +@DslMarker +public annotation class VisionBuilder + public interface VisionContainer { public operator fun get(name: Name): V? } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/misc.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/misc.kt deleted file mode 100644 index 084416ac..00000000 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/misc.kt +++ /dev/null @@ -1,17 +0,0 @@ -package space.kscience.visionforge - -import space.kscience.dataforge.meta.Laminate -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.isLeaf - -@DslMarker -public annotation class VisionBuilder - -public fun List.merge(): Meta? { - val first = firstOrNull { it != null } - return when { - first == null -> null - first.isLeaf -> first //fast search for first entry if it is value - else -> Laminate(filterNotNull()) //merge nodes if first encountered node is meta - } -} \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visionDescriptor.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visionDescriptor.kt index a02a3b3e..15ef9229 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visionDescriptor.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/visionDescriptor.kt @@ -7,20 +7,20 @@ import space.kscience.dataforge.values.asValue private const val INHERITED_DESCRIPTOR_ATTRIBUTE = "inherited" private const val STYLE_DESCRIPTOR_ATTRIBUTE = "useStyles" -public val MetaDescriptor.inherited: Boolean - get() = attributes[INHERITED_DESCRIPTOR_ATTRIBUTE].boolean ?: false +public val MetaDescriptor.inherited: Boolean? + get() = attributes[INHERITED_DESCRIPTOR_ATTRIBUTE].boolean -public var MetaDescriptorBuilder.inherited: Boolean - get() = attributes[INHERITED_DESCRIPTOR_ATTRIBUTE].boolean ?: false - set(value) = attributes.set(INHERITED_DESCRIPTOR_ATTRIBUTE, value) +public var MetaDescriptorBuilder.inherited: Boolean? + get() = attributes[INHERITED_DESCRIPTOR_ATTRIBUTE].boolean + set(value) = attributes.set(INHERITED_DESCRIPTOR_ATTRIBUTE, value?.asValue()) -public val MetaDescriptor.usesStyles: Boolean - get() = attributes[STYLE_DESCRIPTOR_ATTRIBUTE].boolean ?: true +public val MetaDescriptor.usesStyles: Boolean? + get() = attributes[STYLE_DESCRIPTOR_ATTRIBUTE].boolean -public var MetaDescriptorBuilder.usesStyles: Boolean - get() = attributes[STYLE_DESCRIPTOR_ATTRIBUTE].boolean ?: true - set(value) = attributes.set(STYLE_DESCRIPTOR_ATTRIBUTE, value) +public var MetaDescriptorBuilder.usesStyles: Boolean? + get() = attributes[STYLE_DESCRIPTOR_ATTRIBUTE].boolean + set(value) = attributes.set(STYLE_DESCRIPTOR_ATTRIBUTE, value?.asValue()) public val MetaDescriptor.widget: Meta get() = attributes["widget"] ?: Meta.EMPTY @@ -38,7 +38,7 @@ public val MetaDescriptor.widgetType: String? get() = attributes["widget.type"].string /** - * Extension property to access the "widget.type" key of [ValueDescriptor] + * Extension property to access the "widget.type" key of [MetaDescriptorBuilder] */ public var MetaDescriptorBuilder.widgetType: String? get() = attributes["widget.type"].string diff --git a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt index c09c7c6c..3572dd42 100644 --- a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt +++ b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt @@ -12,9 +12,6 @@ import space.kscience.dataforge.names.Name import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionBase import space.kscience.visionforge.VisionManager -import kotlin.collections.HashMap -import kotlin.collections.Map -import kotlin.collections.forEach import kotlin.collections.set import kotlin.test.Test diff --git a/visionforge-fx/build.gradle.kts b/visionforge-fx/build.gradle.kts index 09adb66a..961d181d 100644 --- a/visionforge-fx/build.gradle.kts +++ b/visionforge-fx/build.gradle.kts @@ -14,17 +14,10 @@ dependencies { api("no.tornado:tornadofx:1.7.20") - api("de.jensd:fontawesomefx-fontawesome:4.7.0-11") { - exclude(group = "org.openjfx") - } - - api("de.jensd:fontawesomefx-commons:11.0") { - exclude(group = "org.openjfx") - } - api("org.fxyz3d:fxyz3d:0.5.4") { exclude(module = "slf4j-simple") } + api("org.jetbrains.kotlinx:kotlinx-coroutines-javafx:${ru.mipt.npm.gradle.KScienceVersions.coroutinesVersion}") implementation("eu.mihosoft.vrl.jcsg:jcsg:0.5.7") { diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/FXMetaModel.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/FXMetaModel.kt index 476890a6..7d8e71b2 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/FXMetaModel.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/FXMetaModel.kt @@ -21,23 +21,29 @@ import tornadofx.* public class FXMetaModel( public val root: M, public val rootDescriptor: MetaDescriptor?, - public val nodeName: Name, - public val title: String = nodeName.lastOrNull()?.toString() ?: "Meta" + public val defaultRoot: Meta?, + public val pathName: Name, + public val title: String = pathName.lastOrNull()?.toString() ?: "Meta" ) : Comparable> { private val existingNode = object: ObjectBinding() { - override fun computeValue(): Meta? =root[nodeName] + override fun computeValue(): Meta? = root[pathName] } + private val defaultNode: Meta? get() = defaultRoot?.getMeta(pathName) + + public val descriptor: MetaDescriptor? = rootDescriptor?.get(pathName) + public val children: ListBinding> = object : ListBinding>() { override fun computeValue(): ObservableList> { val nodeKeys = existingNode.get()?.items?.keys?: emptySet() - val descriptorKeys = descriptor?.children?.keys?.map { NameToken(it) } ?: emptySet() - return (nodeKeys + descriptorKeys).map { + val defaultKeys = defaultNode?.items?.keys ?: emptySet() + return (nodeKeys + defaultKeys).map { FXMetaModel( root, rootDescriptor, - nodeName + it + defaultRoot, + pathName + it ) }.filter(filter).asObservable() } @@ -47,16 +53,14 @@ public class FXMetaModel( //add listener to the root node if possible if (root is ObservableMeta) { root.onChange(this) { changed -> - if (changed.startsWith(nodeName)) { - if (nodeName.length == changed.length) existingNode.invalidate() - else if (changed.length == nodeName.length + 1) children.invalidate() + if (changed.startsWith(pathName)) { + if (pathName.length == changed.length) existingNode.invalidate() + else if (changed.length == pathName.length + 1) children.invalidate() } } } } - public val descriptor: MetaDescriptor? = rootDescriptor?.get(nodeName) - public val existsProperty: BooleanBinding = existingNode.isNotNull public val exists: Boolean by existsProperty @@ -66,7 +70,7 @@ public class FXMetaModel( } override fun compareTo(other: FXMetaModel<*>): Int = if (this.exists == other.exists) { - this.nodeName.toString().compareTo(other.nodeName.toString()) + this.pathName.toString().compareTo(other.pathName.toString()) } else { this.exists.compareTo(other.exists) } @@ -79,7 +83,8 @@ public class FXMetaModel( public fun root( node: M, descriptor: MetaDescriptor? = null, + defaultRoot: Meta? = null, rootName: String = "root" - ): FXMetaModel = FXMetaModel(node, descriptor, Name.EMPTY, title = rootName) + ): FXMetaModel = FXMetaModel(node, descriptor, defaultRoot, Name.EMPTY, title = rootName) } } \ No newline at end of file diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/MetaViewer.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/MetaViewer.kt index 92c1222f..4563ade5 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/MetaViewer.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/MetaViewer.kt @@ -26,14 +26,12 @@ import space.kscience.visionforge.dfIconView import tornadofx.* public class MetaViewer( - private val rootNode: FXMetaModel, + private val rootNode: FXMetaModel, title: String = "Meta viewer" ) : Fragment(title, dfIconView) { public constructor(meta: Meta, title: String = "Meta viewer") : this( - FXMetaModel.root( - meta - ), title = title + FXMetaModel.root(meta), title = title ) override val root: BorderPane = borderpane { diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/MutableMetaEditor.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/MutableMetaEditor.kt index 59f49c38..231029cb 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/MutableMetaEditor.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/MutableMetaEditor.kt @@ -13,7 +13,6 @@ import javafx.scene.paint.Color import javafx.scene.text.Text import space.kscience.dataforge.context.Global import space.kscience.dataforge.meta.MutableMeta -import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.remove import space.kscience.visionforge.dfIconView import tornadofx.* @@ -25,16 +24,16 @@ import tornadofx.* */ public class MutableMetaEditor( public val rootNode: FXMetaModel, - public val allowNew: Boolean = true, - title: String = "Configuration editor" + //public val allowNew: Boolean = true, + title: String = "Meta editor" ) : Fragment(title = title, icon = dfIconView) { //TODO replace parameters by properties - - public constructor( - MutableMeta: MutableMeta, - descriptor: MetaDescriptor?, - title: String = "Configuration editor" - ) : this(FXMetaModel.root(MutableMeta, descriptor = descriptor), title = title) +// +// public constructor( +// MutableMeta: MutableMeta, +// descriptor: MetaDescriptor?, +// title: String = "Configuration editor" +// ) : this(FXMetaModel.root(MutableMeta, descriptor = descriptor), title = title) override val root: BorderPane = borderpane { center = treetableview> { @@ -65,7 +64,7 @@ public class MutableMetaEditor( contextmenu { item("Remove") { action { - content.root.remove(content.nodeName) + content.root.remove(content.pathName) } } } @@ -128,7 +127,7 @@ public class MutableMetaEditor( item.valueProperty, item.descriptor ) { value -> - item.root.setValue(item.nodeName, value) + item.root.setValue(item.pathName, value) } graphic = chooser.node diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisionEditorFragment.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisionEditorFragment.kt index d159dd11..bf1033ba 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisionEditorFragment.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisionEditorFragment.kt @@ -5,31 +5,40 @@ import javafx.beans.property.SimpleObjectProperty import javafx.scene.Node import javafx.scene.Parent import javafx.scene.layout.VBox +import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.meta.ObservableMutableMeta import space.kscience.dataforge.meta.descriptors.MetaDescriptor +import space.kscience.dataforge.names.Name import space.kscience.visionforge.Vision import space.kscience.visionforge.computeProperties import space.kscience.visionforge.getStyle import space.kscience.visionforge.styles import tornadofx.* -public class VisionEditorFragment(public val selector: (Vision) -> ObservableMutableMeta = {it.computeProperties()}) : Fragment() { +public class VisionEditorFragment : Fragment() { public val visionProperty: SimpleObjectProperty = SimpleObjectProperty() public var vision: Vision? by visionProperty public val descriptorProperty: SimpleObjectProperty = SimpleObjectProperty() private val configProperty: Binding = visionProperty.objectBinding { vision -> - vision?.let(selector) + vision?.meta } private val configEditorProperty: Binding = configProperty.objectBinding(descriptorProperty) { - it?.let { - MutableMetaEditor(it, descriptorProperty.get()).root + it?.let { meta -> + val node:FXMetaModel = FXMetaModel( + meta, + vision?.descriptor, + vision?.computeProperties(), + Name.EMPTY, + "Vision properties" + ) + MutableMetaEditor(node).root } } - private val styleBoxProperty: Binding = configProperty.objectBinding() { + private val styleBoxProperty: Binding = configProperty.objectBinding { VBox().apply { vision?.styles?.forEach { styleName -> val styleMeta = vision?.getStyle(styleName) diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt index 72a7ac8a..84dcb31d 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt @@ -24,7 +24,7 @@ import kotlin.collections.set import kotlin.math.PI import kotlin.reflect.KClass -class FX3DPlugin : AbstractPlugin() { +public class FX3DPlugin : AbstractPlugin() { override val tag: PluginTag get() = Companion.tag private val objectFactories = HashMap, FX3DFactory<*>>() @@ -43,7 +43,7 @@ class FX3DPlugin : AbstractPlugin() { as FX3DFactory? } - fun buildNode(obj: Solid): Node { + public fun buildNode(obj: Solid): Node { val binding = VisualObjectFXBinding(this, obj) return when (obj) { is SolidReferenceGroup -> referenceFactory(obj, binding) diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXMaterials.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXMaterials.kt index 0b205626..ca5e6583 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXMaterials.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXMaterials.kt @@ -37,24 +37,22 @@ public object FXMaterials { * Infer color based on meta item * @param opacity default opacity */ -public fun Meta.color(opacity: Double = 1.0): Color { - return value?.let { - if (it.type == ValueType.NUMBER) { - val int = it.int - val red = int and 0x00ff0000 shr 16 - val green = int and 0x0000ff00 shr 8 - val blue = int and 0x000000ff - Color.rgb(red, green, blue, opacity) - } else { - Color.web(it.string) - } - } ?: Color.rgb( - this[Colors.RED_KEY]?.int ?: 0, - this[Colors.GREEN_KEY]?.int ?: 0, - this[Colors.BLUE_KEY]?.int ?: 0, - this[SolidMaterial.OPACITY_KEY]?.double ?: opacity - ) -} +public fun Meta.color(opacity: Double = 1.0): Color = value?.let { + if (it.type == ValueType.NUMBER) { + val int = it.int + val red = int and 0x00ff0000 shr 16 + val green = int and 0x0000ff00 shr 8 + val blue = int and 0x000000ff + Color.rgb(red, green, blue, opacity) + } else { + Color.web(it.string) + } +} ?: Color.rgb( + this[Colors.RED_KEY]?.int ?: 0, + this[Colors.GREEN_KEY]?.int ?: 0, + this[Colors.BLUE_KEY]?.int ?: 0, + this[SolidMaterial.OPACITY_KEY]?.double ?: opacity +) /** * Infer FX material based on meta item diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXReferenceFactory.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXReferenceFactory.kt index ac05e8d5..af00f7c5 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXReferenceFactory.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXReferenceFactory.kt @@ -10,7 +10,7 @@ import space.kscience.visionforge.Vision import space.kscience.visionforge.onPropertyChange import kotlin.reflect.KClass -class FXReferenceFactory(val plugin: FX3DPlugin) : FX3DFactory { +public class FXReferenceFactory(public val plugin: FX3DPlugin) : FX3DFactory { override val type: KClass get() = SolidReferenceGroup::class override fun invoke(obj: SolidReferenceGroup, binding: VisualObjectFXBinding): Node { diff --git a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlTransformer.kt b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlTransformer.kt index 0a837919..269df511 100644 --- a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlTransformer.kt +++ b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlTransformer.kt @@ -441,20 +441,6 @@ private class GdmlTransformerEnv(val settings: GdmlTransformer) { } final.useStyle(rootStyle) - //inline prototypes -// referenceStore.forEach { (protoName, list) -> -// val proxy = list.singleOrNull() ?: return@forEach -// val parent = proxy.parent as? MutableVisionGroup ?: return@forEach -// val token = parent.children.entries.find { it.value == proxy }?.key ?: error("Inconsistent reference cache") -// val prototype = proto[protoName] as? Solid ?: error("Inconsistent reference cache") -// prototype.parent = null -// parent[token] = prototype -// prototype.updateFrom(proxy) -// -// //FIXME update prototype -// proto[protoName] = null -// } - final.prototypes { proto.children.forEach { (token, item) -> item.parent = null diff --git a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt index 36102036..8874c694 100644 --- a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt +++ b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt @@ -15,7 +15,6 @@ public class VisionOfPlotly private constructor() : VisionBase() { public constructor(plot: Plot) : this() { properties = plot.meta } - public val plot: Plot get() = Plot(meta) } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt index 25631c42..f06a7c6f 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt @@ -1,29 +1,28 @@ package space.kscience.visionforge.solid -import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.plus +import space.kscience.dataforge.values.MutableValueProvider import space.kscience.dataforge.values.Value import space.kscience.dataforge.values.asValue import space.kscience.dataforge.values.string import space.kscience.visionforge.Colors -import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionBuilder -import space.kscience.visionforge.VisionPropertyContainer -import kotlin.jvm.JvmInline @VisionBuilder -public class ColorAccessor(private val colorKey: Name, private val parent: () -> MutableMetaProvider) { +public class ColorAccessor(private val provider: MutableValueProvider, private val colorKey: Name) : + MutableValueProvider { public var value: Value? - get() = parent().getMeta(colorKey)?.value + get() = provider.getValue(colorKey) set(value) { - parent().setValue(colorKey,value) + provider.setValue(colorKey, value) } - public var item: Meta? - get() = parent().getMeta(colorKey) - set(value) { - parent().setMeta(colorKey,value) - } + override fun getValue(name: Name): Value? = provider.getValue(colorKey + name) + + override fun setValue(name: Name, value: Value?) { + provider.setValue(colorKey + name, value) + } } public var ColorAccessor?.string: String? diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt index b3770d37..9debf612 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt @@ -2,9 +2,10 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import space.kscience.dataforge.meta.configure import space.kscience.dataforge.meta.update -import space.kscience.visionforge.* +import space.kscience.visionforge.VisionBuilder +import space.kscience.visionforge.VisionContainerBuilder +import space.kscience.visionforge.set public enum class CompositeType { SUM, // Dumb sum of meshes @@ -30,34 +31,38 @@ public inline fun VisionContainerBuilder.composite( val group = SolidGroup().apply(builder) val children = group.children.values.filterIsInstance() if (children.size != 2) error("Composite requires exactly two children") - return Composite(type, children[0], children[1]).apply { - configure { - update(group.meta) - } - if (group.position != null) { - position = group.position - } - if (group.rotation != null) { - rotation = group.rotation - } - if (group.scale != null) { - scale = group.scale - } - set(name, this) + val res = Composite(type, children[0], children[1]) + + res.meta.update(group.meta) + + if (group.position != null) { + res.position = group.position } + if (group.rotation != null) { + res.rotation = group.rotation + } + if (group.scale != null) { + res.scale = group.scale + } + + set(name, res) + return res } @VisionBuilder -public inline fun VisionContainerBuilder.union(name: String? = null, builder: SolidGroup.() -> Unit): Composite = - composite(CompositeType.UNION, name, builder = builder) +public inline fun VisionContainerBuilder.union( + name: String? = null, + builder: SolidGroup.() -> Unit +): Composite = composite(CompositeType.UNION, name, builder = builder) @VisionBuilder -public inline fun VisionContainerBuilder.subtract(name: String? = null, builder: SolidGroup.() -> Unit): Composite = - composite(CompositeType.SUBTRACT, name, builder = builder) +public inline fun VisionContainerBuilder.subtract( + name: String? = null, + builder: SolidGroup.() -> Unit +): Composite = composite(CompositeType.SUBTRACT, name, builder = builder) @VisionBuilder public inline fun VisionContainerBuilder.intersect( name: String? = null, builder: SolidGroup.() -> Unit, -): Composite = - composite(CompositeType.INTERSECT, name, builder = builder) \ No newline at end of file +): Composite = composite(CompositeType.INTERSECT, name, builder = builder) \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidBase.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidBase.kt index f18a3869..7ca5c45d 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidBase.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidBase.kt @@ -2,6 +2,7 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.visionforge.VisionBase import space.kscience.visionforge.VisionChange @@ -9,6 +10,9 @@ import space.kscience.visionforge.VisionChange @Serializable @SerialName("solid") public open class SolidBase : VisionBase(), Solid { + //FIXME to be removed after https://github.com/Kotlin/kotlinx.serialization/issues/1602 fix + override var properties: MutableMeta? = null + override val descriptor: MetaDescriptor get() = Solid.descriptor override fun update(change: VisionChange) { diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt index f0f28fc5..ec6dd5f1 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt @@ -2,6 +2,7 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.NameToken @@ -31,6 +32,9 @@ public interface PrototypeHolder { @SerialName("group.solid") public class SolidGroup : VisionGroupBase(), Solid, PrototypeHolder { + //FIXME to be removed after https://github.com/Kotlin/kotlinx.serialization/issues/1602 fix + override var properties: MutableMeta? = null + override val children: Map get() = super.childrenInternal.filter { it.key != PROTOTYPES_TOKEN } private var prototypes: MutableVisionGroup? diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt index 78d787a3..fa5b0d76 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt @@ -20,14 +20,14 @@ public class SolidMaterial : Scheme() { /** * Primary web-color for the material */ - public val color: ColorAccessor = ColorAccessor(COLOR_KEY) { meta } + public val color: ColorAccessor = ColorAccessor(meta, COLOR_KEY) /** * Specular color for phong material */ - public val specularColor: ColorAccessor = ColorAccessor(SPECULAR_COLOR_KEY) { meta } + public val specularColor: ColorAccessor = ColorAccessor(meta, SPECULAR_COLOR_KEY) - public val emissiveColor: ColorAccessor = ColorAccessor("emissiveColor".asName()) { meta } + public val emissiveColor: ColorAccessor = ColorAccessor(meta, "emissiveColor".asName()) /** * Opacity @@ -55,33 +55,29 @@ public class SolidMaterial : Scheme() { //must be lazy to avoid initialization bug MetaDescriptor { inherited = true - usesStyles = true value(COLOR_KEY, ValueType.STRING, ValueType.NUMBER) { inherited = true - usesStyles = true widgetType = "color" } value(SPECULAR_COLOR_KEY, ValueType.STRING, ValueType.NUMBER) { inherited = true - usesStyles = true widgetType = "color" hide() } value(OPACITY_KEY, ValueType.NUMBER) { inherited = true - usesStyles = true default(1.0) attributes["min"] = 0.0 attributes["max"] = 1.0 attributes["step"] = 0.1 widgetType = "slider" } + value(WIREFRAME_KEY, ValueType.BOOLEAN) { inherited = true - usesStyles = true default(false) } } @@ -90,7 +86,7 @@ public class SolidMaterial : Scheme() { } public val Solid.color: ColorAccessor - get() = ColorAccessor(MATERIAL_COLOR_KEY) { computeProperties() } + get() = ColorAccessor(computePropertyValues(), MATERIAL_COLOR_KEY) public var Solid.material: SolidMaterial? get() = computePropertyNode(MATERIAL_KEY)?.let { SolidMaterial.read(it) } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt index 427ef9a2..d2080924 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt @@ -2,6 +2,7 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.meta.ObservableMutableMeta import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.get @@ -12,11 +13,16 @@ import space.kscience.visionforge.* public interface SolidReference : VisionGroup { /** - * The prototype for this reference. Always returns a "real" prototype, not a reference + * The prototype for this reference. */ public val prototype: Solid - override fun getPropertyValue(name: Name, inherit: Boolean, includeStyles: Boolean, includeDefaults: Boolean): Value? { + override fun getPropertyValue( + name: Name, + inherit: Boolean, + includeStyles: Boolean, + includeDefaults: Boolean + ): Value? { meta[name]?.value?.let { return it } if (includeStyles) { getStyleProperty(name)?.let { return it } @@ -56,6 +62,8 @@ public class SolidReferenceGroup( public val refName: Name, ) : VisionBase(), SolidReference, VisionGroup, Solid { + override var properties: MutableMeta? = null + /** * Recursively search for defined template in the parent */ @@ -72,8 +80,12 @@ public class SolidReferenceGroup( ReferenceChild(this, it.key.asName()) } ?: emptyMap() - override fun getPropertyValue(name: Name, inherit: Boolean, includeStyles: Boolean, includeDefaults: Boolean): Value? = - super.getPropertyValue(name, inherit, includeStyles, includeDefaults) + override fun getPropertyValue( + name: Name, + inherit: Boolean, + includeStyles: Boolean, + includeDefaults: Boolean + ): Value? = super.getPropertyValue(name, inherit, includeStyles, includeDefaults) override val descriptor: MetaDescriptor get() = prototype.descriptor @@ -88,11 +100,14 @@ public class SolidReferenceGroup( ) : SolidReference, VisionGroup, Solid { override val prototype: Solid by lazy { - if (refName.isEmpty()) owner.prototype else { + if (refName.isEmpty()) { + owner.prototype + } else { val proto = (owner.prototype as? VisionGroup)?.get(refName) ?: error("Prototype with name $refName not found in SolidReferenceGroup ${owner.refName}") - proto.unref as? Solid - ?: error("Prototype with name $refName is ${proto::class} but expected Solid") + proto as? Solid ?: error("Prototype with name $refName is ${proto::class} but expected Solid") +// proto.unref as? Solid +// ?: error("Prototype with name $refName is ${proto::class} but expected Solid") } } diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/PropertyTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/PropertyTest.kt index d146195a..ec58e4d2 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/PropertyTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/PropertyTest.kt @@ -1,6 +1,7 @@ package space.kscience.visionforge.solid -import space.kscience.dataforge.meta.* +import space.kscience.dataforge.meta.get +import space.kscience.dataforge.meta.string import space.kscience.dataforge.names.asName import space.kscience.dataforge.values.int import space.kscience.visionforge.* @@ -10,13 +11,32 @@ import kotlin.test.assertEquals @Suppress("UNUSED_VARIABLE") class PropertyTest { @Test - fun testColorUpdate(){ + fun testColor(){ val box = Box(10.0f, 10.0f,10.0f) box.material { //meta["color"] = "pink" color("pink") } assertEquals("pink", box.meta["material.color"]?.string) + assertEquals("pink", box.color.string) + } + + @Test + fun testColorUpdate(){ + val box = Box(10.0f, 10.0f,10.0f) + + var c: String? = null + box.onPropertyChange { + if(it == SolidMaterial.MATERIAL_COLOR_KEY){ + c = box.color.string + } + } + + box.material { + color("pink") + } + + assertEquals("pink", c) } @Test diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt index 992035a6..8b1428ec 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt @@ -4,17 +4,20 @@ import info.laht.threekt.core.BufferGeometry import info.laht.threekt.geometries.EdgesGeometry import info.laht.threekt.objects.LineSegments import info.laht.threekt.objects.Mesh -import space.kscience.dataforge.meta.get +import space.kscience.dataforge.meta.updateWith import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus import space.kscience.dataforge.names.startsWith import space.kscience.dataforge.values.boolean -import space.kscience.visionforge.computeProperties +import space.kscience.visionforge.computePropertyNode import space.kscience.visionforge.onPropertyChange +import space.kscience.visionforge.setProperty import space.kscience.visionforge.solid.Solid import space.kscience.visionforge.solid.SolidMaterial import space.kscience.visionforge.solid.layer +import space.kscience.visionforge.solid.three.MeshThreeFactory.Companion.EDGES_ENABLED_KEY +import space.kscience.visionforge.solid.three.MeshThreeFactory.Companion.EDGES_MATERIAL_KEY import kotlin.reflect.KClass /** @@ -62,6 +65,7 @@ public abstract class MeshThreeFactory( public companion object { public val EDGES_KEY: Name = "edges".asName() + //public val WIREFRAME_KEY: Name = "wireframe".asName() public val ENABLED_KEY: Name = "enabled".asName() public val EDGES_ENABLED_KEY: Name = EDGES_KEY + ENABLED_KEY @@ -71,6 +75,11 @@ public abstract class MeshThreeFactory( } } +public fun Solid.edges(enabled: Boolean = true, block: SolidMaterial.() -> Unit = {}) { + setProperty(EDGES_ENABLED_KEY, enabled) + meta.getOrCreate(EDGES_MATERIAL_KEY).updateWith(SolidMaterial, block) +} + internal fun Mesh.applyProperties(obj: Solid): Mesh = apply { updateMaterial(obj) applyEdges(obj) @@ -84,12 +93,9 @@ internal fun Mesh.applyProperties(obj: Solid): Mesh = apply { public fun Mesh.applyEdges(obj: Solid) { val edges = children.find { it.name == "@edges" } as? LineSegments //inherited edges definition, enabled by default - if (obj.getPropertyValue(MeshThreeFactory.EDGES_ENABLED_KEY, inherit = true, includeStyles = true)?.boolean != false) { + if (obj.getPropertyValue(EDGES_ENABLED_KEY, inherit = true)?.boolean != false) { val bufferGeometry = geometry as? BufferGeometry ?: return - val material = ThreeMaterials.getLineMaterial( - obj.computeProperties().get(MeshThreeFactory.EDGES_MATERIAL_KEY), - true - ) + val material = ThreeMaterials.getLineMaterial(obj.computePropertyNode(EDGES_MATERIAL_KEY), true) if (edges == null) { add( LineSegments( diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt index 4855abcd..7dd30a34 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvasLabelFactory.kt @@ -12,7 +12,7 @@ import org.w3c.dom.CanvasTextBaseline import org.w3c.dom.HTMLCanvasElement import org.w3c.dom.MIDDLE import space.kscience.visionforge.solid.SolidLabel -import space.kscience.visionforge.solid.color +import space.kscience.visionforge.solid.SolidMaterial import space.kscience.visionforge.solid.three.ThreeCanvas.Companion.DO_NOT_HIGHLIGHT_TAG import kotlin.reflect.KClass @@ -26,7 +26,7 @@ public object ThreeCanvasLabelFactory : ThreeFactory { val canvas = document.createElement("canvas") as HTMLCanvasElement val context = canvas.getContext("2d") as CanvasRenderingContext2D context.font = "Bold ${obj.fontSize}pt ${obj.fontFamily}" - context.fillStyle = obj.color.value ?: "black" + context.fillStyle = obj.getPropertyValue(SolidMaterial.MATERIAL_COLOR_KEY)?.value ?: "black" context.textBaseline = CanvasTextBaseline.MIDDLE val metrics = context.measureText(obj.text) //canvas.width = metrics.width.toInt() diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt index 9a3c6be9..dc0ab967 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt @@ -3,16 +3,21 @@ package space.kscience.visionforge.solid.three import info.laht.threekt.materials.LineBasicMaterial import info.laht.threekt.materials.Material import info.laht.threekt.materials.MeshBasicMaterial -import info.laht.threekt.materials.MeshPhongMaterial import info.laht.threekt.math.Color import info.laht.threekt.objects.Mesh -import space.kscience.dataforge.meta.* +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.boolean +import space.kscience.dataforge.meta.double +import space.kscience.dataforge.meta.get import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.asName import space.kscience.dataforge.values.* import space.kscience.visionforge.Colors import space.kscience.visionforge.Vision import space.kscience.visionforge.computePropertyNode +import space.kscience.visionforge.getStyleNodes import space.kscience.visionforge.solid.SolidMaterial +import space.kscience.visionforge.solid.SolidReference public object ThreeMaterials { @@ -56,56 +61,57 @@ public object ThreeMaterials { private val materialCache = HashMap() - internal fun buildMaterial(meta: Meta): Material { - val material = SolidMaterial.read(meta) - return meta[SolidMaterial.SPECULAR_COLOR_KEY]?.let { specularColor -> - MeshPhongMaterial().apply { - color = meta[SolidMaterial.COLOR_KEY]?.threeColor() ?: DEFAULT_COLOR - specular = specularColor.threeColor() - emissive = material.emissiveColor.item?.threeColor() ?: specular - reflectivity = 0.5 - refractionRatio = 1.0 - shininess = 100.0 - opacity = meta[SolidMaterial.OPACITY_KEY]?.double ?: 1.0 - transparent = opacity < 1.0 - wireframe = meta[SolidMaterial.WIREFRAME_KEY].boolean ?: false - needsUpdate = true - } - } ?: MeshBasicMaterial().apply { - color = meta[SolidMaterial.COLOR_KEY]?.threeColor() ?: DEFAULT_COLOR - opacity = meta[SolidMaterial.OPACITY_KEY]?.double ?: 1.0 - transparent = opacity < 1.0 - wireframe = meta[SolidMaterial.WIREFRAME_KEY].boolean ?: false - needsUpdate = true - } - + internal fun buildMaterial(meta: Meta): Material = MeshBasicMaterial().apply { + color = meta[SolidMaterial.COLOR_KEY]?.threeColor() ?: DEFAULT_COLOR + opacity = meta[SolidMaterial.OPACITY_KEY]?.double ?: 1.0 + transparent = opacity < 1.0 + wireframe = meta[SolidMaterial.WIREFRAME_KEY].boolean ?: false + needsUpdate = true } +// val material = SolidMaterial.read(meta) +// return meta[SolidMaterial.SPECULAR_COLOR_KEY]?.let { specularColor -> +// MeshPhongMaterial().apply { +// color = meta[SolidMaterial.COLOR_KEY]?.threeColor() ?: DEFAULT_COLOR +// specular = specularColor.threeColor() +// emissive = material.emissiveColor.threeColor() ?: specular +// reflectivity = 0.5 +// refractionRatio = 1.0 +// shininess = 100.0 +// opacity = meta[SolidMaterial.OPACITY_KEY]?.double ?: 1.0 +// transparent = opacity < 1.0 +// wireframe = meta[SolidMaterial.WIREFRAME_KEY].boolean ?: false +// needsUpdate = true +// } +// } ?: MeshBasicMaterial().apply { +// color = meta[SolidMaterial.COLOR_KEY]?.threeColor() ?: DEFAULT_COLOR +// opacity = meta[SolidMaterial.OPACITY_KEY]?.double ?: 1.0 +// transparent = opacity < 1.0 +// wireframe = meta[SolidMaterial.WIREFRAME_KEY].boolean ?: false +// needsUpdate = true +// } internal fun cacheMaterial(meta: Meta): Material = materialCache.getOrPut(meta) { buildMaterial(meta).apply { cached = true } } - } /** - * Infer color based on meta item + * Compute color */ -public fun Meta.threeColor(): Color { - return value?.let { value -> - if (value.type == ValueType.NUMBER) { - val int = value.int - Color(int) - } else { - Color(value.string) - } - } ?: Color( - this[Colors.RED_KEY]?.int ?: 0, - this[Colors.GREEN_KEY]?.int ?: 0, - this[Colors.BLUE_KEY]?.int ?: 0 - ) -} +public fun Meta.threeColor(): Color = getValue(Name.EMPTY)?.let { value -> + if (value.type == ValueType.NUMBER) { + val int = value.int + Color(int) + } else { + Color(value.string) + } +} ?: Color( + getValue(Colors.RED_KEY.asName())?.int ?: 0, + getValue(Colors.GREEN_KEY.asName())?.int ?: 0, + getValue(Colors.BLUE_KEY.asName())?.int ?: 0 +) private var Material.cached: Boolean get() = userData["cached"] == true @@ -114,31 +120,19 @@ private var Material.cached: Boolean } public fun Mesh.updateMaterial(vision: Vision) { - //val meta = vision.getProperty(SolidMaterial.MATERIAL_KEY, inherit = true).node val ownMaterialMeta = vision.meta.getMeta(SolidMaterial.MATERIAL_KEY) - val parentMaterialMeta = vision.parent?.getPropertyValue( - SolidMaterial.MATERIAL_KEY, - inherit = true, - includeStyles = false, - includeDefaults = false - ) - - material = when { - ownMaterialMeta == null && parentMaterialMeta == null -> { - //If material is style-based, use cached - vision.computePropertyNode( - SolidMaterial.MATERIAL_KEY, - )?.let { + if (ownMaterialMeta == null) { + if (vision is SolidReference && vision.getStyleNodes(SolidMaterial.MATERIAL_KEY).isEmpty()) { + updateMaterial(vision.prototype) + } else { + material = vision.computePropertyNode(SolidMaterial.MATERIAL_KEY)?.let { ThreeMaterials.cacheMaterial(it) } ?: ThreeMaterials.DEFAULT } - else -> { - vision.computePropertyNode( - SolidMaterial.MATERIAL_KEY, - )?.let { - ThreeMaterials.buildMaterial(it) - } ?: ThreeMaterials.DEFAULT - } + } else { + material = vision.computePropertyNode(SolidMaterial.MATERIAL_KEY)?.let { + ThreeMaterials.buildMaterial(it) + } ?: ThreeMaterials.DEFAULT } } @@ -149,17 +143,14 @@ public fun Mesh.updateMaterialProperty(vision: Vision, propertyName: Name) { } else { when (propertyName) { SolidMaterial.MATERIAL_COLOR_KEY -> { - material.asDynamic().color = vision.computePropertyNode( - SolidMaterial.MATERIAL_COLOR_KEY, - )?.threeColor() ?: ThreeMaterials.DEFAULT_COLOR + material.asDynamic().color = vision.computePropertyNode(SolidMaterial.MATERIAL_COLOR_KEY)?.threeColor() + ?: ThreeMaterials.DEFAULT_COLOR material.needsUpdate = true } SolidMaterial.MATERIAL_OPACITY_KEY -> { val opacity = vision.getPropertyValue( SolidMaterial.MATERIAL_OPACITY_KEY, inherit = true, - includeStyles = true, - includeDefaults = false )?.double ?: 1.0 material.opacity = opacity material.transparent = opacity < 1.0 @@ -169,8 +160,6 @@ public fun Mesh.updateMaterialProperty(vision: Vision, propertyName: Name) { material.asDynamic().wireframe = vision.getPropertyValue( SolidMaterial.MATERIAL_WIREFRAME_KEY, inherit = true, - includeStyles = true, - includeDefaults = false )?.boolean ?: false material.needsUpdate = true } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt index 53e9c2c9..aa779e46 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeReferenceFactory.kt @@ -1,6 +1,5 @@ package space.kscience.visionforge.solid.three -import info.laht.threekt.core.BufferGeometry import info.laht.threekt.core.Object3D import info.laht.threekt.objects.Mesh import space.kscience.dataforge.names.Name @@ -19,7 +18,7 @@ public object ThreeReferenceFactory : ThreeFactory { private fun Object3D.replicate(): Object3D { return when (this) { - is Mesh -> Mesh(geometry as BufferGeometry, material).also { + is Mesh -> Mesh(geometry, material).also { it.applyMatrix4(matrix) } else -> clone(false) From 25e46a6c4730125d2cdf0a3902d6657e587bab9f Mon Sep 17 00:00:00 2001 From: kiruma524 Date: Wed, 11 Aug 2021 17:55:15 +0300 Subject: [PATCH 031/109] Really Raw version of hierarchy documentation. --- docs/hierarchy.md | 16 ------ docs/inheritance | 16 ++++++ docs/uml/Vision.puml | 120 ++++++++++++++++++++++++++++++++----------- 3 files changed, 106 insertions(+), 46 deletions(-) create mode 100644 docs/inheritance diff --git a/docs/hierarchy.md b/docs/hierarchy.md index eee02697..dbb2c6c1 100644 --- a/docs/hierarchy.md +++ b/docs/hierarchy.md @@ -14,19 +14,3 @@ It gets properties of element with `name` identification. * function `setProperty(name: Name, item: MetaItem?, notify: Boolean = true)` Sets the `item` property to the element with the `name` identification. `notify` is a value which toggles the necessity of the change notification. Default is true. - -### About properties -**Properties have to be set in particular order:** - -* styles -* prototypes -* parent -* parent's styles -* defaults - - -## Inheritance - -Inheritance is a very useful ability of `children` elements to get the same property in default as his parent does have (to 'inherit' it). - - diff --git a/docs/inheritance b/docs/inheritance new file mode 100644 index 00000000..37a4557c --- /dev/null +++ b/docs/inheritance @@ -0,0 +1,16 @@ +## Inheritance + +Inheritance is a very useful ability of `children` elements to get the same property in default as his parent does have (to 'inherit' it). + +### Main properties' inheritance: +* styles +* parents +* parent's styles +* defaults + +### Reference properties' inheritance: +* styles +* prototypes +* parents +* parent's styles +* defaults diff --git a/docs/uml/Vision.puml b/docs/uml/Vision.puml index d7fd7103..bf8caa88 100644 --- a/docs/uml/Vision.puml +++ b/docs/uml/Vision.puml @@ -1,46 +1,106 @@ @startuml 'https://plantuml.com/class-diagram +interface Vision -interface Vision{ - val parent: Vision? - fun getProperty(name): MetaItem? - fun setProperty(name, value) +interface Solid +Vision <-- Solid -} +class VisionGroup +Vision <-- VisionGroup -class VisionBase{ - basic vision - implementation -} -Vision <|-- VisionBase +class VisionBase +Vision <-- VisionBase -interface VisionGroup{ - A group of Visions -} -Vision <|-- VisionGroup -interface Solid{ - The base for 3D geometry -} - -Vision <|-- Solid +class SolidLabel +Solid <--- SolidLabel +SolidBase <-- SolidLabel class SolidGroup +Solid <--- SolidGroup +VisionGroupBase <-- SolidGroup -Solid <|-- SolidGroup -VisionGroup <|-- SolidGroup +class SolidBase +Solid <--- SolidBase +VisionBase <-- SolidBase -class Composite -Solid <|-- Composite -VisionGroup <|-- Composite -class Box -Solid <|-- Box - -class Tube -Solid <|-- Tube +class SphereLayer +SolidBase <-- SphereLayer +GeometrySolid <-- SphereLayer class Sphere -Solid <|-- Sphere +SolidBase <-- Sphere +GeometrySolid <-- Sphere +class Box +SolidBase <-- Box +Hexagon <-- Box + +class GenericHexagon +SolidBase <-- GenericHexagon +Hexagon <-- GenericHexagon + +class Extruded +SolidBase <-- Extruded +GeometrySolid <-- Extruded + + +class PolyLine +Solid <--- PolyLine +SolidBase <-- PolyLine + +interface GeometrySolid +Solid <--- GeometrySolid + + +interface Hexagon +GeometrySolid <-- Hexagon + +class ConeSegment +GeometrySolid <-- ConeSegment + +class ConeSurface +GeometrySolid <-- ConeSurface + + +class Convex +Solid <--- Convex +SolidBase <-- Convex + +class Composite +Solid <--- Composite +SolidBase <-- Composite + + +interface SolidReference +VisionGroup <---- SolidReference + +interface MutableVisionGroup +VisionGroup <---- MutableVisionGroup + +class SolidReferenceGroup +VisionGroup <-- SolidReferenceGroup +Solid <-- SolidReferenceGroup +VisionBase <-- SolidReferenceGroup +SolidReference <-- SolidReferenceGroup + +class ReferenceChild +VisionGroup <-- ReferenceChild +Solid <-- ReferenceChild +SolidReference <-- ReferenceChild + + +class VisionGroupBase +VisionBase <-- VisionGroupBase +MutableVisionGroup <-- VisionGroupBase + + + +class RootVisionGroup +VisionGroupBase <-- RootVisionGroup + + +class VisionOfPlotly +VisionBase <-- VisionOfPlotly @enduml \ No newline at end of file From e38bac8d230ba55324a4faf7ee94c2e749638959 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 11 Aug 2021 18:17:47 +0300 Subject: [PATCH 032/109] Fix MM model --- .../kotlin/ru/mipt/npm/muon/monitor/Model.kt | 4 +++- .../kotlin/ru/mipt/npm/muon/monitor/Monitor.kt | 3 ++- .../ru/mipt/npm/muon/monitor/MMAppComponent.kt | 6 ++++-- .../kotlin/ru/mipt/npm/muon/monitor/sim/Pixel.kt | 12 ++++++------ .../visionforge/solid/three/ThreeLineFactory.kt | 10 +++++++--- 5 files changed, 22 insertions(+), 13 deletions(-) diff --git a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt index 854e520c..0c5e0af0 100644 --- a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt +++ b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt @@ -28,7 +28,6 @@ class Model(val manager: VisionManager) { private fun SolidGroup.detector(detector: SC16) { group(detector.name) { - position = detector.center detector.pixels.forEach { pixel(it) } @@ -65,6 +64,7 @@ class Model(val manager: VisionManager) { } private fun highlight(pixel: String) { + println("highlight $pixel") map[pixel]?.color?.invoke("blue") } @@ -76,6 +76,7 @@ class Model(val manager: VisionManager) { } fun displayEvent(event: Event) { + println("Received event: $event") events.add(event) event.hits.forEach { highlight(it) @@ -83,6 +84,7 @@ class Model(val manager: VisionManager) { event.track?.let { tracks.polyline(*it.toTypedArray(), name = "track[${event.id}]") { thickness = 4 + color("red") } } } diff --git a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Monitor.kt b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Monitor.kt index 3b64bb5a..3e1db5bc 100644 --- a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Monitor.kt +++ b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Monitor.kt @@ -3,6 +3,7 @@ package ru.mipt.npm.muon.monitor import ru.mipt.npm.muon.monitor.Monitor.PIXEL_XY_SIZE import ru.mipt.npm.muon.monitor.Monitor.PIXEL_Z_SIZE import space.kscience.visionforge.solid.Point3D +import space.kscience.visionforge.solid.plus /** * A single pixel @@ -97,7 +98,7 @@ class SC16( } val offset = Point3D(-y, x, 0)//rotateDetector(Point3D(x, y, 0.0)); val pixelName = "${name}_${index}" - SC1(pixelName, offset) + SC1(pixelName, offset + center) } } } diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt index d981fa44..8450cb4a 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt @@ -56,8 +56,10 @@ val MMApp = functionalComponent("Muon monitor") { props -> } } - val root = props.model.root.apply { - edges() + val root = useMemo(props.model) { + props.model.root.apply { + edges() + } } gridRow { diff --git a/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/sim/Pixel.kt b/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/sim/Pixel.kt index 579bca15..7cd54417 100644 --- a/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/sim/Pixel.kt +++ b/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/sim/Pixel.kt @@ -16,10 +16,10 @@ import kotlin.random.Random */ internal class SC1Aux(val sc: SC1, var efficiency: Double = 1.0) { // val layer: Layer = findLayer(center.z); - private val upLayer = - findLayer(sc.center.z + sc.zSize / 2f)//Layer("${name}_up", center.z + zSize / 2.0); - private val bottomLayer = - findLayer(sc.center.z - sc.zSize / 2f)//Layer("${name}_bottom", center.z - zSize / 2.0); + private val upLayer = findLayer(sc.center.z + sc.zSize / 2f) + //Layer("${name}_up", center.z + zSize / 2.0); + private val bottomLayer = findLayer(sc.center.z - sc.zSize / 2f) + //Layer("${name}_bottom", center.z - zSize / 2.0); private val centralLayer = findLayer(sc.center.z) private val center = Vector3D(sc.center.x.toDouble(), sc.center.y.toDouble(), sc.center.z.toDouble()) @@ -115,8 +115,8 @@ internal class SC1Aux(val sc: SC1, var efficiency: Double = 1.0) { private val auxCache = HashMap() -fun SC1.isHit(track: Line): Boolean{ - return auxCache.getOrPut(this){ +fun SC1.isHit(track: Line): Boolean { + return auxCache.getOrPut(this) { SC1Aux(this) }.isHit(track) } \ No newline at end of file diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt index 49fca0d9..ee36d74b 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt @@ -7,9 +7,11 @@ import info.laht.threekt.objects.LineSegments import space.kscience.visionforge.computePropertyNode import space.kscience.visionforge.onPropertyChange import space.kscience.visionforge.solid.PolyLine +import space.kscience.visionforge.solid.SolidMaterial import space.kscience.visionforge.solid.color import space.kscience.visionforge.solid.string import space.kscience.visionforge.solid.three.ThreeMaterials.DEFAULT_LINE_COLOR +import kotlin.math.ceil import kotlin.reflect.KClass public object ThreeLineFactory : ThreeFactory { @@ -17,12 +19,14 @@ public object ThreeLineFactory : ThreeFactory { override fun invoke(three: ThreePlugin, obj: PolyLine): Object3D { val geometry = BufferGeometry().apply { - setFromPoints(Array(obj.points.size) { obj.points[it].toVector() }) + setFromPoints(Array((obj.points.size - 1) * 2) { + obj.points[ceil(it / 2.0).toInt()].toVector() + }) } val material = ThreeMaterials.getLineMaterial( - obj.computePropertyNode(MeshThreeFactory.EDGES_MATERIAL_KEY), - true + obj.computePropertyNode(SolidMaterial.MATERIAL_KEY), + false ) material.linewidth = obj.thickness.toDouble() From c425f3b36f9afd90662a23387e0badd6b9e69b94 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 11 Aug 2021 20:33:19 +0300 Subject: [PATCH 033/109] Merge branch 'dev' into feature/df-new # Conflicts: # visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooser.kt # visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooserBase.kt # visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisionTreeFragment.kt # visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisualObjectEditorFragment.kt # visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisualObjectFXBinding.kt --- .../main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt index 84dcb31d..9aed5d50 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt @@ -150,7 +150,7 @@ public interface FX3DFactory { public operator fun invoke(obj: T, binding: VisualObjectFXBinding): Node public companion object { - public const val TYPE = "fx3DFactory" + public const val TYPE: String = "fx3DFactory" } } From c44162671ffd7f0447adc8b2582b17ccf175f3ac Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 13 Aug 2021 20:40:28 +0300 Subject: [PATCH 034/109] Replace structure changes listener by callback. Fix review issues --- .../main/kotlin/ru/mipt/npm/sat/geometry.kt | 1 + .../space/kscience/visionforge/VisionBase.kt | 2 +- .../kscience/visionforge/VisionChange.kt | 9 ++++-- .../space/kscience/visionforge/VisionGroup.kt | 32 +++++++++++++++---- .../kscience/visionforge/VisionGroupBase.kt | 32 +++++++++++++------ .../visionforge/solid/VisionUpdateTest.kt | 24 -------------- .../visionforge/solid/three/ThreePlugin.kt | 13 ++++---- 7 files changed, 63 insertions(+), 50 deletions(-) diff --git a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/geometry.kt b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/geometry.kt index c747f89b..546c7b51 100644 --- a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/geometry.kt +++ b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/geometry.kt @@ -17,6 +17,7 @@ internal fun visionOfSatellite( ySegmentSize: Number = xSegmentSize, fiberDiameter: Number = 1.0, ): SolidGroup = SolidGroup { + color("darkgreen") val transparent by style { this[SolidMaterial.MATERIAL_OPACITY_KEY] = 0.3 } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt index 77a682aa..c7d9413c 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt @@ -23,7 +23,7 @@ internal data class MetaListener( /** * A full base implementation for a [Vision] - * @param properties Object own properties excluding styles and inheritance + * @param parent the parent object for this vision. Could ve set later. Not serialized. */ @Serializable @SerialName("vision") diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt index 0275934b..c4f18712 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt @@ -82,6 +82,7 @@ public inline fun VisionChange(manager: VisionManager, block: VisionChangeBuilde VisionChangeBuilder().apply(block).isolate(manager) +@OptIn(DFExperimental::class) private fun CoroutineScope.collectChange( name: Name, source: Vision, @@ -102,11 +103,13 @@ private fun CoroutineScope.collectChange( //Subscribe for structure change if (source is MutableVisionGroup) { - source.structureChanges.onEach { (token, _, after) -> + source.structureChanges.onEach { changedName -> + val after = source[changedName] + val fullName = name + changedName if (after != null) { - collectChange(name + token, after, collector) + collectChange(fullName, after, collector) } - collector()[name + token] = after + collector()[fullName] = after }.launchIn(this) } } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt index 76640bee..12fe243b 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt @@ -1,6 +1,11 @@ package space.kscience.visionforge +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.callbackFlow +import kotlinx.coroutines.launch +import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.* import space.kscience.dataforge.provider.Provider @@ -69,15 +74,30 @@ public interface VisionContainerBuilder { * Mutable version of [VisionGroup] */ public interface MutableVisionGroup : VisionGroup, VisionContainerBuilder { + public fun onStructureChanged(owner: Any?, block: VisionGroup.(Name) -> Unit) - public data class StructureChange(val token: NameToken, val before: Vision?, val after: Vision?) - - /** - * Flow structure changes of this group. Unconsumed changes are discarded - */ - public val structureChanges: Flow + public fun removeStructureListener(owner: Any?) } + +/** + * Flow structure changes of this group. Unconsumed changes are discarded + */ +@OptIn(ExperimentalCoroutinesApi::class) +@DFExperimental +public val MutableVisionGroup.structureChanges: Flow + get() = callbackFlow { + meta.onChange(this) { name -> + launch { + send(name) + } + } + awaitClose { + removeStructureListener(this) + } + } + + public operator fun VisionContainer.get(str: String): V? = get(Name.parse(str)) public operator fun VisionContainerBuilder.set(token: NameToken, child: V?): Unit = diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt index f4d25b08..7280ae1f 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt @@ -1,13 +1,12 @@ package space.kscience.visionforge -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.flow.MutableSharedFlow -import kotlinx.coroutines.flow.SharedFlow -import kotlinx.coroutines.launch import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.Transient import space.kscience.dataforge.names.* +import kotlin.jvm.Synchronized + +private class StructureChangeListener(val owner: Any?, val callback: VisionGroup.(Name) -> Unit) /** * Abstract implementation of mutable group of [Vision] @@ -40,16 +39,24 @@ public open class VisionGroupBase( } @Transient - private val _structureChanges: MutableSharedFlow = MutableSharedFlow() + private val structureListeners = HashSet() - override val structureChanges: SharedFlow get() = _structureChanges + @Synchronized + override fun onStructureChanged(owner: Any?, block: VisionGroup.(Name) -> Unit) { + structureListeners.add(StructureChangeListener(owner, block)) + } + + @Synchronized + override fun removeStructureListener(owner: Any?) { + structureListeners.removeAll { it.owner == owner } + } /** * Propagate children change event upwards */ - private fun childrenChanged(name: NameToken, before: Vision?, after: Vision?) { - (manager?.context?: GlobalScope).launch { - _structureChanges.emit(MutableVisionGroup.StructureChange(name, before, after)) + protected fun childrenChanged(name: Name) { + structureListeners.forEach { + it.callback(this, name) } } @@ -83,7 +90,12 @@ public open class VisionGroupBase( } } if (before != child) { - childrenChanged(token, before, child) + childrenChanged(token.asName()) + if (child is MutableVisionGroup) { + child.onStructureChanged(this) { changedName -> + this@VisionGroupBase.childrenChanged(token + changedName) + } + } } } diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt index 7a36ab3f..a08085d6 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt @@ -49,28 +49,4 @@ class VisionUpdateTest { val reconstructed = visionManager.jsonFormat.decodeFromString(VisionChange.serializer(), serialized) assertEquals(change.properties,reconstructed.properties) } - - @Test - fun testDeserialization(){ - val str = """ - { - "propertyChange": { - "layer[4]": { - "material": { - "color": 123 - } - }, - "layer[2]": { - "material": { - } - } - }, - "childrenChange": { - } - } - """.trimIndent() - - val reconstructed = visionManager.jsonFormat.decodeFromString(VisionChange.serializer(), str) - } - } \ No newline at end of file diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt index e7c2ac86..aa5c2a14 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt @@ -2,8 +2,6 @@ package space.kscience.visionforge.solid.three import info.laht.threekt.core.Object3D import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach import org.w3c.dom.Element import org.w3c.dom.HTMLElement import space.kscience.dataforge.context.* @@ -15,6 +13,7 @@ import space.kscience.visionforge.Vision import space.kscience.visionforge.onPropertyChange import space.kscience.visionforge.solid.* import space.kscience.visionforge.solid.specifications.Canvas3DOptions +import space.kscience.visionforge.solid.three.set import space.kscience.visionforge.visible import kotlin.collections.set import kotlin.reflect.KClass @@ -82,9 +81,11 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { } } - obj.structureChanges.onEach { (nameToken, _, child) -> + obj.onStructureChanged(this){ childName -> + val child = get(childName) + //removing old object - findChild(nameToken.asName())?.let { oldChild -> + findChild(childName)?.let { oldChild -> oldChild.parent?.remove(oldChild) } @@ -92,12 +93,12 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { if (child != null && child is Solid) { try { val object3D = buildObject3D(child) - set(nameToken, object3D) + set(childName, object3D) } catch (ex: Throwable) { logger.error(ex) { "Failed to render $child" } } } - }.launchIn(updateScope) + } } } is Composite -> compositeFactory(this, obj) From d916dde6a729f7ce33677f96b1db6addfa138ede Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 13 Aug 2021 22:14:43 +0300 Subject: [PATCH 035/109] Update to DataForge and plotly release versions --- build.gradle.kts | 2 +- visionforge-plotly/build.gradle.kts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 08ad66d8..c3f05f5f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,7 +2,7 @@ plugins { id("ru.mipt.npm.gradle.project") } -val dataforgeVersion by extra("0.5.0-dev-11") +val dataforgeVersion by extra("0.5.0") val fxVersion by extra("11") allprojects { diff --git a/visionforge-plotly/build.gradle.kts b/visionforge-plotly/build.gradle.kts index 41e541db..b0b5a9c2 100644 --- a/visionforge-plotly/build.gradle.kts +++ b/visionforge-plotly/build.gradle.kts @@ -2,7 +2,7 @@ plugins { id("ru.mipt.npm.gradle.mpp") } -val plotlyVersion = "0.5.0-dev-1" +val plotlyVersion = "0.5.0" kscience { useSerialization() From 60cec91ab8fab2b8ca0e7a00b92a775bb1ac50ba Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sat, 14 Aug 2021 14:17:54 +0300 Subject: [PATCH 036/109] Update js examples --- build.gradle.kts | 1 + .../src/main/kotlin/JsPlaygroundApp.kt | 57 +++++++++++++++++-- .../src/main/kotlin/plotlyComponent.kt | 36 ++++++++++++ .../kscience/visionforge/plotly/plotlyJs.kt | 4 +- 4 files changed, 91 insertions(+), 7 deletions(-) create mode 100644 demo/js-playground/src/main/kotlin/plotlyComponent.kt diff --git a/build.gradle.kts b/build.gradle.kts index c3f05f5f..5c2557bd 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,5 +1,6 @@ plugins { id("ru.mipt.npm.gradle.project") + kotlin("multiplatform") version "1.5.30-RC" apply false } val dataforgeVersion by extra("0.5.0") diff --git a/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt b/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt index ec28649c..509eb0ab 100644 --- a/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt +++ b/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt @@ -2,16 +2,22 @@ import kotlinx.browser.document import kotlinx.css.* import react.child import react.dom.render +import ringui.SmartTabs +import ringui.Tab import space.kscience.dataforge.context.Context import space.kscience.gdml.GdmlShowCase +import space.kscience.plotly.scatter import space.kscience.visionforge.Application import space.kscience.visionforge.VisionClient import space.kscience.visionforge.gdml.toVision +import space.kscience.visionforge.plotly.PlotlyPlugin import space.kscience.visionforge.ring.ThreeCanvasWithControls import space.kscience.visionforge.ring.ThreeWithControlsPlugin +import space.kscience.visionforge.solid.* import space.kscience.visionforge.startApplication import styled.css import styled.styledDiv +import kotlin.random.Random private class JsPlaygroundApp : Application { @@ -20,24 +26,65 @@ private class JsPlaygroundApp : Application { val playgroundContext = Context { plugin(ThreeWithControlsPlugin) plugin(VisionClient) + plugin(PlotlyPlugin) } val element = document.getElementById("playground") ?: error("Element with id 'playground' not found on page") val visionOfD0 = GdmlShowCase.babyIaxo().toVision() + val random = Random(112233) + val visionOfSpheres = SolidGroup { + repeat(100) { + sphere(5, name = "sphere[$it]") { + x = random.nextDouble(-300.0, 300.0) + y = random.nextDouble(-300.0, 300.0) + z = random.nextDouble(-300.0, 300.0) + material { + color(random.nextInt()) + } + detail = 16 + } + } + } + render(element) { styledDiv { - css{ + css { padding(0.pt) margin(0.pt) height = 100.vh width = 100.vw } - child(ThreeCanvasWithControls) { - attrs { - context = playgroundContext - solid = visionOfD0 + SmartTabs("D0") { + Tab("D0") { + child(ThreeCanvasWithControls) { + attrs { + context = playgroundContext + solid = visionOfD0 + } + } + } + Tab("spheres") { + child(ThreeCanvasWithControls) { + attrs { + context = playgroundContext + solid = visionOfSpheres + } + } + } + Tab("plotly"){ + Plotly{ + attrs { + context = playgroundContext + plot = space.kscience.plotly.Plotly.plot { + scatter { + x(1, 2, 3) + y(5, 8, 7) + } + } + } + } } } } diff --git a/demo/js-playground/src/main/kotlin/plotlyComponent.kt b/demo/js-playground/src/main/kotlin/plotlyComponent.kt new file mode 100644 index 00000000..7e456a69 --- /dev/null +++ b/demo/js-playground/src/main/kotlin/plotlyComponent.kt @@ -0,0 +1,36 @@ +import kotlinx.css.* +import org.w3c.dom.Element +import org.w3c.dom.HTMLElement +import react.RProps +import react.functionalComponent +import react.useEffect +import react.useRef +import space.kscience.dataforge.context.Context +import space.kscience.plotly.Plot +import space.kscience.plotly.plot +import styled.css +import styled.styledDiv + +external interface PlotlyProps: RProps{ + var context: Context + var plot: Plot? +} + + +val Plotly = functionalComponent("Plotly"){props -> + val elementRef = useRef(null) + + useEffect(props.plot, elementRef) { + val element = elementRef.current as? HTMLElement ?: error("Plotly element not found") + props.plot?.let { element.plot(it)} + } + + styledDiv { + css { + maxWidth = 100.vw + maxHeight = 100.vh + flex(1.0) + } + ref = elementRef + } +} \ No newline at end of file diff --git a/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt b/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt index 21b447ef..e0cea767 100644 --- a/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt +++ b/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt @@ -31,8 +31,8 @@ public actual class PlotlyPlugin : VisionPlugin(), ElementVisionRenderer { override fun render(element: Element, vision: Vision, meta: Meta) { val plot = (vision as? VisionOfPlotly)?.plot ?: error("VisionOfPlotly expected but ${vision::class} found") val config = PlotlyConfig.read(meta) - println(plot.meta) - println(plot.data[0].toMeta()) +// println(plot.meta) +// println(plot.data[0].toMeta()) element.plot(plot, config) } From a33d9d19464076e382210fa9e60a7e622d851894 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sat, 14 Aug 2021 15:54:16 +0300 Subject: [PATCH 037/109] fix for Plotly vision serialization --- .../space/kscience/visionforge/html/VisionTagConsumer.kt | 2 ++ .../space/kscience/visionforge/markup/VisionOfMarkup.kt | 4 ++++ .../space/kscience/visionforge/plotly/VisionOfPlotly.kt | 9 +++++---- .../kotlin/space/kscience/visionforge/solid/Solids.kt | 2 +- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt index a0b64d8b..035b6a6e 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt @@ -11,6 +11,7 @@ import space.kscience.dataforge.names.NameToken import space.kscience.dataforge.names.asName import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionManager +import space.kscience.visionforge.root import kotlin.collections.set @DslMarker @@ -84,6 +85,7 @@ public abstract class VisionTagConsumer( ): T { val output = VisionOutput(manager) val vision = output.visionProvider() + vision.root(manager) return vision(name, vision, output.meta) } diff --git a/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt b/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt index fd1dcd80..89a6836e 100644 --- a/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt +++ b/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt @@ -5,6 +5,7 @@ import kotlinx.serialization.Serializable import kotlinx.serialization.modules.SerializersModule import kotlinx.serialization.modules.polymorphic import kotlinx.serialization.modules.subclass +import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.meta.string import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName @@ -18,6 +19,9 @@ public class VisionOfMarkup( public val format: String = COMMONMARK_FORMAT ) : VisionBase() { + //FIXME to be removed after https://github.com/Kotlin/kotlinx.serialization/issues/1602 fix + override var properties: MutableMeta? = null + //TODO add templates public var content: String? diff --git a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt index 8874c694..99df2e84 100644 --- a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt +++ b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt @@ -2,16 +2,19 @@ package space.kscience.visionforge.plotly import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.misc.DFExperimental import space.kscience.plotly.Plot import space.kscience.plotly.Plotly import space.kscience.visionforge.VisionBase import space.kscience.visionforge.html.VisionOutput -import space.kscience.visionforge.root @Serializable @SerialName("vision.plotly") public class VisionOfPlotly private constructor() : VisionBase() { + //FIXME to be removed after https://github.com/Kotlin/kotlinx.serialization/issues/1602 fix + override var properties: MutableMeta? = null + public constructor(plot: Plot) : this() { properties = plot.meta } @@ -23,6 +26,4 @@ public fun Plot.asVision(): VisionOfPlotly = VisionOfPlotly(this) @DFExperimental public inline fun VisionOutput.plotly( block: Plot.() -> Unit, -): VisionOfPlotly = VisionOfPlotly(Plotly.plot(block)).apply { - root(this@plotly.manager) -} \ No newline at end of file +): VisionOfPlotly = VisionOfPlotly(Plotly.plot(block)) \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt index 67224699..ca83f00f 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt @@ -69,4 +69,4 @@ public class Solids(meta: Meta) : VisionPlugin(meta) { @VisionBuilder @DFExperimental public inline fun VisionOutput.solid(block: SolidGroup.() -> Unit): SolidGroup = - SolidGroup().apply(block).apply { root(this@solid.manager) } + SolidGroup().apply(block) From f99a359e246197b17a3cded07e05b4b08502d4ab Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sat, 14 Aug 2021 21:31:36 +0300 Subject: [PATCH 038/109] Fix color resolution --- build.gradle.kts | 4 +-- demo/playground/build.gradle.kts | 4 +-- .../src/jvmMain/kotlin/randomSpheres.kt | 2 +- .../visionforge/solid/ColorAccessor.kt | 13 ++++---- .../kscience/visionforge/solid/SolidBase.kt | 6 ---- .../visionforge/solid/three/ThreeMaterials.kt | 30 ++++++++++--------- 6 files changed, 27 insertions(+), 32 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 5c2557bd..2dc7926a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,9 +1,9 @@ plugins { id("ru.mipt.npm.gradle.project") - kotlin("multiplatform") version "1.5.30-RC" apply false +// kotlin("multiplatform") version "1.5.30-RC" apply false } -val dataforgeVersion by extra("0.5.0") +val dataforgeVersion by extra("0.5.1") val fxVersion by extra("11") allprojects { diff --git a/demo/playground/build.gradle.kts b/demo/playground/build.gradle.kts index 73fd2aa7..68ea5f9a 100644 --- a/demo/playground/build.gradle.kts +++ b/demo/playground/build.gradle.kts @@ -20,7 +20,7 @@ kotlin { this.outputFileName = "js/visionforge-playground.js" } commonWebpackConfig { - sourceMaps = false + sourceMaps = true cssSupport.enabled = false } } @@ -37,7 +37,7 @@ kotlin { } afterEvaluate { - val jsBrowserDistribution by tasks.getting + val jsBrowserDistribution = tasks.getByName("jsBrowserDevelopmentExecutableDistribution") tasks.getByName("jvmProcessResources") { dependsOn(jsBrowserDistribution) diff --git a/demo/playground/src/jvmMain/kotlin/randomSpheres.kt b/demo/playground/src/jvmMain/kotlin/randomSpheres.kt index 383f3d3a..0185bdc8 100644 --- a/demo/playground/src/jvmMain/kotlin/randomSpheres.kt +++ b/demo/playground/src/jvmMain/kotlin/randomSpheres.kt @@ -17,7 +17,7 @@ fun main() { context.makeVisionFile( Paths.get("randomSpheres.html"), - resourceLocation = ResourceLocation.EMBED + resourceLocation = ResourceLocation.SYSTEM ) { h1 { +"Happy new year!" } div { diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt index f06a7c6f..57f868f2 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ColorAccessor.kt @@ -2,16 +2,15 @@ package space.kscience.visionforge.solid import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.plus -import space.kscience.dataforge.values.MutableValueProvider -import space.kscience.dataforge.values.Value -import space.kscience.dataforge.values.asValue -import space.kscience.dataforge.values.string +import space.kscience.dataforge.values.* import space.kscience.visionforge.Colors import space.kscience.visionforge.VisionBuilder @VisionBuilder -public class ColorAccessor(private val provider: MutableValueProvider, private val colorKey: Name) : - MutableValueProvider { +public class ColorAccessor( + private val provider: MutableValueProvider, + private val colorKey: Name +) : MutableValueProvider { public var value: Value? get() = provider.getValue(colorKey) set(value) { @@ -26,7 +25,7 @@ public class ColorAccessor(private val provider: MutableValueProvider, private v } public var ColorAccessor?.string: String? - get() = this?.value?.string + get() = this?.value?.let { if(it == Null) null else it.string } set(value) { this?.value = value?.asValue() } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidBase.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidBase.kt index 7ca5c45d..021079d3 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidBase.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidBase.kt @@ -5,7 +5,6 @@ import kotlinx.serialization.Serializable import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.visionforge.VisionBase -import space.kscience.visionforge.VisionChange @Serializable @SerialName("solid") @@ -14,9 +13,4 @@ public open class SolidBase : VisionBase(), Solid { override var properties: MutableMeta? = null override val descriptor: MetaDescriptor get() = Solid.descriptor - - override fun update(change: VisionChange) { - updatePosition(change.properties) - super.update(change) - } } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt index dc0ab967..522c0362 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt @@ -5,10 +5,7 @@ import info.laht.threekt.materials.Material import info.laht.threekt.materials.MeshBasicMaterial import info.laht.threekt.math.Color import info.laht.threekt.objects.Mesh -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.boolean -import space.kscience.dataforge.meta.double -import space.kscience.dataforge.meta.get +import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.dataforge.values.* @@ -100,18 +97,23 @@ public object ThreeMaterials { /** * Compute color */ -public fun Meta.threeColor(): Color = getValue(Name.EMPTY)?.let { value -> - if (value.type == ValueType.NUMBER) { - val int = value.int - Color(int) +public fun Meta.threeColor(): Color? { + val value = getValue(Name.EMPTY) + return if (isLeaf) { + when { + value == null -> null + value === Null -> null + value.type == ValueType.NUMBER -> Color(value.int) + else -> Color(value.string) + } } else { - Color(value.string) + Color( + getValue(Colors.RED_KEY.asName())?.int ?: 0, + getValue(Colors.GREEN_KEY.asName())?.int ?: 0, + getValue(Colors.BLUE_KEY.asName())?.int ?: 0 + ) } -} ?: Color( - getValue(Colors.RED_KEY.asName())?.int ?: 0, - getValue(Colors.GREEN_KEY.asName())?.int ?: 0, - getValue(Colors.BLUE_KEY.asName())?.int ?: 0 -) +} private var Material.cached: Boolean get() = userData["cached"] == true From af327c17e3300fa4479a98f38db9f80bc247552e Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 15 Aug 2021 18:15:17 +0300 Subject: [PATCH 039/109] Fixes and bouncing ball demo. --- .../src/main/kotlin/JsPlaygroundApp.kt | 49 +++++- .../visionforge/bootstrap/outputConfig.kt | 2 +- .../bootstrap/visionPropertyEditor.kt | 6 +- .../visionforge/react/MultiSelectChooser.kt | 8 +- .../visionforge/react/PropertyEditor.kt | 151 ++++++------------ .../visionforge/react/RangeValueChooser.kt | 24 +-- .../visionforge/react/valueChooser.kt | 57 +++---- .../ThreeViewWithControls.kt | 2 - .../ringPropertyEditor.kt | 6 +- .../ringThreeControls.kt | 2 +- .../space/kscience/visionforge/Vision.kt | 16 ++ .../space/kscience/visionforge/VisionBase.kt | 2 +- .../visionforge/markup/VisionOfMarkup.kt | 9 +- .../visionforge/markup/MarkupPlugin.kt | 25 ++- .../solid/specifications/Canvas3DOptions.kt | 6 +- .../visionforge/solid/three/ThreeCanvas.kt | 64 ++++---- 16 files changed, 214 insertions(+), 215 deletions(-) diff --git a/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt b/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt index 509eb0ab..74ff9fd9 100644 --- a/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt +++ b/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt @@ -1,4 +1,8 @@ import kotlinx.browser.document +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.delay +import kotlinx.coroutines.isActive +import kotlinx.coroutines.launch import kotlinx.css.* import react.child import react.dom.render @@ -17,6 +21,7 @@ import space.kscience.visionforge.solid.* import space.kscience.visionforge.startApplication import styled.css import styled.styledDiv +import kotlin.math.sqrt import kotlin.random.Random private class JsPlaygroundApp : Application { @@ -31,9 +36,38 @@ private class JsPlaygroundApp : Application { val element = document.getElementById("playground") ?: error("Element with id 'playground' not found on page") + val bouncingSphere = SolidGroup { + sphere(5.0, "ball") { + detail = 16 + color("red") + val h = 100.0 + y = h + GlobalScope.launch { + val g = 10.0 + val dt = 0.1 + var time = 0.0 + var velocity = 0.0 + while (isActive) { + delay(20) + time += dt + velocity -= g * dt + y = y.toDouble() + velocity * dt + if (y.toDouble() <= 2.5){ + velocity = sqrt(2*g*h) + } + } + } + } + + box(200, 5, 200, name = "floor"){ + y = -2.5 + } + } + val visionOfD0 = GdmlShowCase.babyIaxo().toVision() val random = Random(112233) + val visionOfSpheres = SolidGroup { repeat(100) { sphere(5, name = "sphere[$it]") { @@ -56,7 +90,16 @@ private class JsPlaygroundApp : Application { height = 100.vh width = 100.vw } - SmartTabs("D0") { + SmartTabs("gravity") { + Tab("gravity") { + child(ThreeCanvasWithControls) { + attrs { + context = playgroundContext + solid = bouncingSphere + } + } + } + Tab("D0") { child(ThreeCanvasWithControls) { attrs { @@ -73,8 +116,8 @@ private class JsPlaygroundApp : Application { } } } - Tab("plotly"){ - Plotly{ + Tab("plotly") { + Plotly { attrs { context = playgroundContext plot = space.kscience.plotly.Plotly.plot { diff --git a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt index 8088d2fd..7c7e7b37 100644 --- a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt +++ b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt @@ -66,7 +66,7 @@ public val CanvasControls: FunctionComponent = functionalCo } } propertyEditor( - ownProperties = props.canvasOptions, + ownProperties = props.canvasOptions.meta, allProperties = props.canvasOptions.meta.withDefault(Canvas3DOptions.descriptor.defaultNode), descriptor = Canvas3DOptions.descriptor, expanded = false diff --git a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt index 65255af6..a65c1f42 100644 --- a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt +++ b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt @@ -4,10 +4,13 @@ import org.w3c.dom.Element import react.RBuilder import react.dom.render import space.kscience.dataforge.meta.descriptors.MetaDescriptor -import space.kscience.visionforge.* +import space.kscience.visionforge.Vision +import space.kscience.visionforge.computeProperties +import space.kscience.visionforge.getStyle import space.kscience.visionforge.react.metaViewer import space.kscience.visionforge.react.propertyEditor import space.kscience.visionforge.solid.SolidReference +import space.kscience.visionforge.styles public fun RBuilder.visionPropertyEditor( vision: Vision, @@ -19,7 +22,6 @@ public fun RBuilder.visionPropertyEditor( propertyEditor( ownProperties = vision.meta, allProperties = vision.computeProperties(), - updateFlow = vision.propertyChanges, descriptor = descriptor, key = key ) diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt index 9f698df7..84181340 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt @@ -10,7 +10,6 @@ import react.dom.attrs import react.dom.option import react.dom.select import react.functionalComponent -import react.useState import space.kscience.dataforge.meta.descriptors.allowedValues import space.kscience.dataforge.values.asValue import space.kscience.dataforge.values.string @@ -18,19 +17,16 @@ import space.kscience.dataforge.values.string @JsExport public val MultiSelectChooser: FunctionComponent = functionalComponent("MultiSelectChooser") { props -> - var selectedItems by useState { props.item?.value?.list ?: emptyList() } - val onChange: (Event) -> Unit = { event: Event -> val newSelected = (event.target as HTMLSelectElement).selectedOptions.asList() .map { (it as HTMLOptionElement).value.asValue() } - props.valueChanged?.invoke(newSelected.asValue()) - selectedItems = newSelected + props.meta.value = newSelected.asValue() } select { attrs { multiple = true - values = selectedItems.mapTo(HashSet()) { it.string } + values = (props.actual.value?.list ?: emptyList()).mapTo(HashSet()) { it.string } onChangeFunction = onChange } props.descriptor?.allowedValues?.forEach { optionValue -> diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt index 47b0d818..9ff77f2c 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt @@ -1,14 +1,5 @@ package space.kscience.visionforge.react -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.channels.awaitClose -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.callbackFlow -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach -import kotlinx.coroutines.launch import kotlinx.css.* import kotlinx.css.properties.TextDecoration import kotlinx.html.js.onClickFunction @@ -22,7 +13,6 @@ import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.ValueRequirement import space.kscience.dataforge.meta.descriptors.get import space.kscience.dataforge.names.* -import space.kscience.dataforge.values.Value import space.kscience.visionforge.hidden import styled.css import styled.styledButton @@ -32,17 +22,17 @@ import styled.styledSpan public external interface PropertyEditorProps : RProps { /** - * Root config object - always non null + * Root config object - always non-null */ - public var ownProperties: MutableMetaProvider + public var meta: ObservableMutableMeta /** * Provide default item (greyed out if used) */ - public var allProperties: MetaProvider? + public var withDefault: MetaProvider /** - * Full path to the displayed node in [ownProperties]. Could be empty + * Full path to the displayed node in [meta]. Could be empty */ public var name: Name @@ -51,16 +41,6 @@ public external interface PropertyEditorProps : RProps { */ public var descriptor: MetaDescriptor? - /** - * A coroutine scope for updates - */ - public var scope: CoroutineScope? - - /** - * Flow names of updated properties - */ - public var updateFlow: Flow? - /** * Initial expanded state */ @@ -68,67 +48,59 @@ public external interface PropertyEditorProps : RProps { } private val PropertyEditorItem: FunctionComponent = - functionalComponent("ConfigEditorItem") { props -> + functionalComponent("PropertyEditorItem") { props -> propertyEditorItem(props) } private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { var expanded: Boolean by useState { props.expanded ?: true } - val descriptor: MetaDescriptor? = props.descriptor?.get(props.name) - var ownProperty: Meta? by useState { props.ownProperties.getMeta(props.name) } - val actualMeta = props.allProperties?.getMeta(props.name) + val descriptor: MetaDescriptor? = useMemo(props.descriptor, props.name) { props.descriptor?.get(props.name) } + var ownProperty: ObservableMutableMeta by useState { props.meta.getOrCreate(props.name) } + + val keys = useMemo(descriptor) { + buildSet { + descriptor?.children?.filterNot { + it.key.startsWith("@") || it.value.hidden + }?.forEach { + add(NameToken(it.key)) + } + //ownProperty?.items?.keys?.filterNot { it.body.startsWith("@") }?.let { addAll(it) } + } + } val token = props.name.lastOrNull()?.toString() ?: "Properties" fun update() { - ownProperty = props.ownProperties.getMeta(props.name) + ownProperty = props.meta.getOrCreate(props.name) } - if (props.updateFlow != null) { - useEffect(props.ownProperties, props.updateFlow) { - val updateJob = props.updateFlow!!.onEach { updatedName -> - if (updatedName == props.name) { - update() - } - }.launchIn(props.scope ?: GlobalScope) - cleanup { - updateJob.cancel() + useEffect(props.meta) { + props.meta.onChange(props) { updatedName -> + if (updatedName == props.name) { + update() } } + cleanup { + props.meta.removeListener(props) + } } val expanderClick: (Event) -> Unit = { expanded = !expanded } - val valueChanged: (Value?) -> Unit = { - if (it == null) { - props.ownProperties.remove(props.name) - } else { - props.ownProperties.setValue(props.name, it) - } - update() - } - val removeClick: (Event) -> Unit = { - props.ownProperties.remove(props.name) + props.meta.remove(props.name) update() } - val keys = buildSet { - descriptor?.children?.filterNot { - it.key.startsWith("@") || it.value.hidden - }?.forEach { - add(NameToken(it.key)) - } - //ownProperty?.items?.keys?.filterNot { it.body.startsWith("@") }?.let { addAll(it) } - } + flexRow { css { alignItems = Align.center } - if(keys.isNotEmpty()) { + if (keys.isNotEmpty()) { styledSpan { css { +TreeStyles.treeCaret @@ -144,25 +116,26 @@ private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { styledSpan { css { +TreeStyles.treeLabel - if (ownProperty == null) { + if (ownProperty.isEmpty()) { +TreeStyles.treeLabelInactive } } +token } - if(!props.name.isEmpty() && descriptor?.valueRequirement != ValueRequirement.ABSENT) { + if (!props.name.isEmpty() && descriptor?.valueRequirement != ValueRequirement.ABSENT) { styledDiv { css { //+TreeStyles.resizeableInput width = 160.px margin(1.px, 5.px) } - valueChooser( - props.name, - actualMeta, - descriptor, - valueChanged - ) + ValueChooser{ + attrs { + this.descriptor = descriptor + this.meta = ownProperty + this.actual = props.withDefault.getMeta(props.name) ?: ownProperty + } + } } styledButton { @@ -184,7 +157,7 @@ private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { } +"\u00D7" attrs { - if (ownProperty == null) { + if (ownProperty.isEmpty()) { disabled = true } else { onClickFunction = removeClick @@ -206,8 +179,8 @@ private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { child(PropertyEditorItem) { attrs { this.key = props.name.toString() - this.ownProperties = props.ownProperties - this.allProperties = props.allProperties + this.meta = props.meta + this.withDefault = props.withDefault this.name = props.name + token this.descriptor = props.descriptor } @@ -217,74 +190,52 @@ private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { } } } - } - @JsExport public val PropertyEditor: FunctionComponent = functionalComponent("PropertyEditor") { props -> child(PropertyEditorItem) { attrs { this.key = "" - this.ownProperties = props.ownProperties - this.allProperties = props.allProperties + this.meta = props.meta + this.withDefault = props.withDefault this.name = Name.EMPTY this.descriptor = props.descriptor - this.scope = props.scope this.expanded = props.expanded } } } public fun RBuilder.propertyEditor( - ownProperties: MutableMetaProvider, - allProperties: MetaProvider? = ownProperties, - updateFlow: Flow? = null, + ownProperties: ObservableMutableMeta, + allProperties: MetaProvider = ownProperties, descriptor: MetaDescriptor? = null, - scope: CoroutineScope? = null, key: Any? = null, expanded: Boolean? = null ) { child(PropertyEditor) { attrs { - this.ownProperties = ownProperties - this.allProperties = allProperties - this.updateFlow = updateFlow + this.meta = ownProperties + this.withDefault = allProperties this.descriptor = descriptor this.key = key?.toString() ?: "" - this.scope = scope this.expanded = expanded } } } -@OptIn(ExperimentalCoroutinesApi::class) -private fun ObservableMutableMeta.flowUpdates(): Flow = callbackFlow { - onChange(this) { name -> - launch { - send(name) - } - } - awaitClose { - removeListener(this) - } -} - - public fun RBuilder.configEditor( config: ObservableMutableMeta, - default: MetaProvider? = null, + default: MetaProvider = config, descriptor: MetaDescriptor? = null, key: Any? = null, - scope: CoroutineScope? = null, -): Unit = propertyEditor(config, default, config.flowUpdates(), descriptor, scope, key = key) +): Unit = propertyEditor(config, default, descriptor, key = key) public fun Element.configEditor( config: ObservableMutableMeta, + default: Meta = config, descriptor: MetaDescriptor? = null, - default: Meta? = null, key: Any? = null, - scope: CoroutineScope? = null, ): Unit = render(this) { - configEditor(config, default, descriptor, key, scope) + configEditor(config, default, descriptor, key = key) } \ No newline at end of file diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt index 28513416..c753271f 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt @@ -10,6 +10,7 @@ import react.FunctionComponent import react.dom.attrs import react.functionalComponent import react.useState +import space.kscience.dataforge.meta.descriptors.ValueRequirement import space.kscience.dataforge.meta.double import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.string @@ -20,30 +21,32 @@ import styled.styledInput @JsExport public val RangeValueChooser: FunctionComponent = functionalComponent("RangeValueChooser") { props -> - var innerValue by useState(props.item.double) - var rangeDisabled: Boolean by useState(props.item == null) + var innerValue by useState(props.actual.double) + var rangeDisabled: Boolean by useState(props.meta.value == null) val handleDisable: (Event) -> Unit = { val checkBoxValue = (it.target as HTMLInputElement).checked rangeDisabled = !checkBoxValue - if(!checkBoxValue) { - props.valueChanged?.invoke(null) + props.meta.value = if(!checkBoxValue) { + null } else { - props.valueChanged?.invoke(innerValue?.asValue()) + innerValue?.asValue() } } val handleChange: (Event) -> Unit = { val newValue = (it.target as HTMLInputElement).value - props.valueChanged?.invoke(newValue.toDoubleOrNull()?.asValue()) + props.meta.value = newValue.toDoubleOrNull()?.asValue() innerValue = newValue.toDoubleOrNull() } flexRow { - styledInput(type = InputType.checkBox) { - attrs { - defaultChecked = rangeDisabled.not() - onChangeFunction = handleDisable + if(props.descriptor?.valueRequirement != ValueRequirement.REQUIRED) { + styledInput(type = InputType.checkBox) { + attrs { + defaultChecked = rangeDisabled.not() + onChangeFunction = handleDisable + } } } @@ -55,6 +58,7 @@ public val RangeValueChooser: FunctionComponent = disabled = rangeDisabled value = innerValue?.toString() ?: "" onChangeFunction = handleChange + consumer.onTagEvent(this, "input", handleChange) val minValue = props.descriptor?.attributes?.get("min").string minValue?.let { min = it diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt index 2cfcc976..e29f0f8b 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt @@ -13,14 +13,13 @@ import org.w3c.dom.events.Event import react.* import react.dom.attrs import react.dom.option -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.boolean +import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.allowedValues -import space.kscience.dataforge.meta.get -import space.kscience.dataforge.meta.string -import space.kscience.dataforge.names.Name -import space.kscience.dataforge.values.* +import space.kscience.dataforge.values.ValueType +import space.kscience.dataforge.values.asValue +import space.kscience.dataforge.values.int +import space.kscience.dataforge.values.string import space.kscience.visionforge.Colors import space.kscience.visionforge.widgetType import styled.css @@ -28,23 +27,19 @@ import styled.styledInput import styled.styledSelect public external interface ValueChooserProps : RProps { - public var item: Meta? public var descriptor: MetaDescriptor? - - //public var nullable: Boolean? - public var valueChanged: ((Value?) -> Unit)? + public var meta: ObservableMutableMeta + public var actual: Meta } @JsExport public val StringValueChooser: FunctionComponent = functionalComponent("StringValueChooser") { props -> - var value by useState(props.item.string ?: "") + var value by useState(props.actual.string ?: "") val keyDown: (Event) -> Unit = { event -> if (event.type == "keydown" && event.asDynamic().key == "Enter") { value = (event.target as HTMLInputElement).value - if (value != props.item.string) { - props.valueChanged?.invoke(value.asValue()) - } + props.meta.value = value.asValue() } } val handleChange: (Event) -> Unit = { @@ -67,7 +62,7 @@ public val BooleanValueChooser: FunctionComponent = functionalComponent("BooleanValueChooser") { props -> val handleChange: (Event) -> Unit = { val newValue = (it.target as HTMLInputElement).checked - props.valueChanged?.invoke(newValue.asValue()) + props.meta.value = newValue.asValue() } styledInput(type = InputType.checkBox) { css { @@ -75,7 +70,7 @@ public val BooleanValueChooser: FunctionComponent = } attrs { //this.attributes["indeterminate"] = (props.item == null).toString() - defaultChecked = props.item.boolean ?: false + defaultChecked = props.actual.boolean ?: false onChangeFunction = handleChange } } @@ -84,7 +79,7 @@ public val BooleanValueChooser: FunctionComponent = @JsExport public val NumberValueChooser: FunctionComponent = functionalComponent("NumberValueChooser") { props -> - var innerValue by useState(props.item.string ?: "") + var innerValue by useState(props.actual.string ?: "") val keyDown: (Event) -> Unit = { event -> if (event.type == "keydown" && event.asDynamic().key == "Enter") { innerValue = (event.target as HTMLInputElement).value @@ -92,7 +87,7 @@ public val NumberValueChooser: FunctionComponent = if (number == null) { console.error("The input value $innerValue is not a number") } else { - props.valueChanged?.invoke(number.asValue()) + props.meta.value = number.asValue() } } } @@ -123,10 +118,10 @@ public val NumberValueChooser: FunctionComponent = @JsExport public val ComboValueChooser: FunctionComponent = functionalComponent("ComboValueChooser") { props -> - var selected by useState(props.item.string ?: "") + var selected by useState(props.actual.string ?: "") val handleChange: (Event) -> Unit = { selected = (it.target as HTMLSelectElement).value - props.valueChanged?.invoke(selected.asValue()) + props.meta.value = selected.asValue() } styledSelect { css { @@ -138,7 +133,7 @@ public val ComboValueChooser: FunctionComponent = } } attrs { - this.value = props.item?.string ?: "" + this.value = props.actual.string ?: "" multiple = false onChangeFunction = handleChange } @@ -149,14 +144,14 @@ public val ComboValueChooser: FunctionComponent = public val ColorValueChooser: FunctionComponent = functionalComponent("ColorValueChooser") { props -> var value by useState( - props.item?.value?.let { value -> + props.actual.value?.let { value -> if (value.type == ValueType.NUMBER) Colors.rgbToString(value.int) else value.string } ?: "#000000" ) val handleChange: (Event) -> Unit = { value = (it.target as HTMLInputElement).value - props.valueChanged?.invoke(value.asValue()) + props.meta.value = value.asValue() } styledInput(type = InputType.color) { css { @@ -189,19 +184,3 @@ public val ValueChooser: FunctionComponent = functionalCompon else -> child(StringValueChooser, props) } } - -internal fun RBuilder.valueChooser( - name: Name, - item: Meta?, - descriptor: MetaDescriptor? = null, - callback: (Value?) -> Unit, -) { - child(ValueChooser) { - attrs { - key = name.toString() - this.item = item - this.descriptor = descriptor - this.valueChanged = callback - } - } -} diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt index f8439a07..a14d23ca 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt @@ -15,7 +15,6 @@ import space.kscience.dataforge.names.isEmpty import space.kscience.dataforge.names.length import space.kscience.visionforge.VisionGroup import space.kscience.visionforge.computeProperties -import space.kscience.visionforge.propertyChanges import space.kscience.visionforge.react.ThreeCanvasComponent import space.kscience.visionforge.react.flexColumn import space.kscience.visionforge.react.flexRow @@ -137,7 +136,6 @@ public val ThreeCanvasWithControls: FunctionComponent = functional } } propertyEditor( - ownProperties = props.options, + ownProperties = props.options.meta, allProperties = props.options.meta.withDefault(Canvas3DOptions.descriptor.defaultNode), descriptor = Canvas3DOptions.descriptor, expanded = false diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt index e7bdd301..924dfdd1 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt @@ -12,10 +12,12 @@ import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.misc.Type import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName +import space.kscience.dataforge.names.startsWith import space.kscience.dataforge.values.Value import space.kscience.dataforge.values.asValue import space.kscience.dataforge.values.boolean import space.kscience.visionforge.Vision.Companion.TYPE +import kotlin.reflect.KProperty1 /** * A root type for display hierarchy @@ -129,3 +131,17 @@ public var Vision.visible: Boolean? get() = getPropertyValue(Vision.VISIBLE_KEY)?.boolean set(value) = meta.setValue(Vision.VISIBLE_KEY, value?.asValue()) + +public fun V.useProperty( + property: KProperty1, + owner: Any? = null, + callBack: V.(T) -> Unit, +) { + //Pass initial value. + callBack(property.get(this)) + meta.onChange(owner) { name -> + if (name.startsWith(property.name.asName())) { + callBack(property.get(this@useProperty)) + } + } +} \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt index c7d9413c..74f173ae 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt @@ -44,7 +44,7 @@ public open class VisionBase( } @Transient - private val listeners = HashSet() + private val listeners: MutableList = mutableListOf() private inner class VisionProperties(val pathName: Name) : ObservableMutableMeta { diff --git a/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt b/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt index 89a6836e..58708ab1 100644 --- a/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt +++ b/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt @@ -11,7 +11,6 @@ import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionBase -import space.kscience.visionforge.setProperty @Serializable @SerialName("vision.markup") @@ -20,15 +19,11 @@ public class VisionOfMarkup( ) : VisionBase() { //FIXME to be removed after https://github.com/Kotlin/kotlinx.serialization/issues/1602 fix - override var properties: MutableMeta? = null + protected override var properties: MutableMeta? = null //TODO add templates - public var content: String? - get() = meta.getMeta(CONTENT_PROPERTY_KEY).string - set(value) { - setProperty(CONTENT_PROPERTY_KEY, value) - } + public var content: String? by meta.string(CONTENT_PROPERTY_KEY) public companion object { public val CONTENT_PROPERTY_KEY: Name = "content".asName() diff --git a/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt b/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt index 30b8b848..d26488c5 100644 --- a/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt +++ b/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt @@ -1,16 +1,19 @@ package space.kscience.visionforge.markup import kotlinx.browser.document +import kotlinx.dom.clear +import kotlinx.html.dom.append import kotlinx.serialization.modules.SerializersModule +import org.intellij.markdown.flavours.commonmark.CommonMarkFlavourDescriptor +import org.intellij.markdown.flavours.gfm.GFMFlavourDescriptor import org.w3c.dom.Element import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.PluginFactory import space.kscience.dataforge.context.PluginTag import space.kscience.dataforge.meta.Meta -import space.kscience.visionforge.ElementVisionRenderer -import space.kscience.visionforge.Vision -import space.kscience.visionforge.VisionClient -import space.kscience.visionforge.VisionPlugin +import space.kscience.visionforge.* +import space.kscience.visionforge.markup.VisionOfMarkup.Companion.COMMONMARK_FORMAT +import space.kscience.visionforge.markup.VisionOfMarkup.Companion.GFM_FORMAT import kotlin.reflect.KClass public class MarkupPlugin : VisionPlugin(), ElementVisionRenderer { @@ -26,8 +29,20 @@ public class MarkupPlugin : VisionPlugin(), ElementVisionRenderer { override fun render(element: Element, vision: Vision, meta: Meta) { require(vision is VisionOfMarkup) { "The vision is not a markup vision" } val div = document.createElement("div") + val flavour = when (vision.format) { + COMMONMARK_FORMAT -> CommonMarkFlavourDescriptor() + GFM_FORMAT -> GFMFlavourDescriptor() + //TODO add new formats via plugins + else-> error("Format ${vision.format} not recognized") + } + vision.useProperty(VisionOfMarkup::content) { + div.clear() + div.append { + markdown(flavour) { vision.content ?: "" } + + } + } element.append(div) - TODO() } public companion object : PluginFactory { diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt index 01f6e74e..4a819ff7 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt @@ -5,7 +5,6 @@ import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.scheme import space.kscience.dataforge.meta.descriptors.value import space.kscience.dataforge.names.Name -import space.kscience.dataforge.values.ValueType import space.kscience.visionforge.hide import space.kscience.visionforge.widgetType @@ -21,20 +20,21 @@ public class Clipping : Scheme() { attributes["min"] = 0.0 attributes["max"] = 1.0 attributes["step"] = 0.01 + default(1.0) } value(Clipping::y) { widgetType = "range" attributes["min"] = 0.0 attributes["max"] = 1.0 attributes["step"] = 0.01 - + default(1.0) } value(Clipping::z) { widgetType = "range" attributes["min"] = 0.0 attributes["max"] = 1.0 attributes["step"] = 0.01 - + default(1.0) } } } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt index 2cfcadf5..0d223987 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt @@ -168,42 +168,40 @@ public class ThreeCanvas( } //Clipping planes - options.meta.onChange(this@ThreeCanvas) { name-> - if (name.startsWith(Canvas3DOptions::clipping.name.asName())) { - val clipping = options.clipping - if (!clipping.meta.isEmpty()) { - renderer.localClippingEnabled = true - boundingBox?.let { boundingBox -> - val xClippingPlane = clipping.x?.let { - val absoluteValue = boundingBox.min.x + (boundingBox.max.x - boundingBox.min.x) * it - Plane(Vector3(-1.0, 0.0, 0.0), absoluteValue) - - } - val yClippingPlane = clipping.y?.let { - val absoluteValue = boundingBox.min.y + (boundingBox.max.y - boundingBox.min.y) * it - Plane(Vector3(0.0, -1.0, 0.0), absoluteValue) - } - - val zClippingPlane = clipping.z?.let { - val absoluteValue = boundingBox.min.z + (boundingBox.max.z - boundingBox.min.z) * it - Plane(Vector3(0.0, 0.0, -1.0), absoluteValue) - } - renderer.clippingPlanes = - listOfNotNull(xClippingPlane, yClippingPlane, zClippingPlane).toTypedArray() + options.useProperty(Canvas3DOptions::clipping){clipping -> + if (!clipping.meta.isEmpty()) { + renderer.localClippingEnabled = true + boundingBox?.let { boundingBox -> + val xClippingPlane = clipping.x?.let { + val absoluteValue = boundingBox.min.x + (boundingBox.max.x - boundingBox.min.x) * it + Plane(Vector3(-1.0, 0.0, 0.0), absoluteValue) + } + val yClippingPlane = clipping.y?.let { + val absoluteValue = boundingBox.min.y + (boundingBox.max.y - boundingBox.min.y) * it + Plane(Vector3(0.0, -1.0, 0.0), absoluteValue) } - } else { - renderer.localClippingEnabled = false - } - } else if (name.startsWith(Canvas3DOptions::size.name.asName())) { - canvas.style.apply { - minWidth = "${options.size.minWith.toInt()}px" - maxWidth = "${options.size.maxWith.toInt()}px" - minHeight = "${options.size.minHeight.toInt()}px" - maxHeight = "${options.size.maxHeight.toInt()}px" - } - } + val zClippingPlane = clipping.z?.let { + val absoluteValue = boundingBox.min.z + (boundingBox.max.z - boundingBox.min.z) * it + Plane(Vector3(0.0, 0.0, -1.0), absoluteValue) + } + renderer.clippingPlanes = + listOfNotNull(xClippingPlane, yClippingPlane, zClippingPlane).toTypedArray() + } + } else { + renderer.localClippingEnabled = false + } } + + options.useProperty(Canvas3DOptions::size){ + canvas.style.apply { + minWidth = "${options.size.minWith.toInt()}px" + maxWidth = "${options.size.maxWith.toInt()}px" + minHeight = "${options.size.minHeight.toInt()}px" + maxHeight = "${options.size.maxHeight.toInt()}px" + } + } + } /** From 95459422d6b7c18e1901872ea232272a10e00182 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 15 Aug 2021 18:45:36 +0300 Subject: [PATCH 040/109] Fixes and bouncing ball demo. --- .../src/main/kotlin/JsPlaygroundApp.kt | 60 ++++++++++++------- .../src/main/kotlin/plotlyComponent.kt | 4 +- 2 files changed, 41 insertions(+), 23 deletions(-) diff --git a/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt b/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt index 74ff9fd9..a54e48c9 100644 --- a/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt +++ b/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt @@ -9,11 +9,11 @@ import react.dom.render import ringui.SmartTabs import ringui.Tab import space.kscience.dataforge.context.Context -import space.kscience.gdml.GdmlShowCase +import space.kscience.plotly.models.Trace +import space.kscience.plotly.models.appendXY import space.kscience.plotly.scatter import space.kscience.visionforge.Application import space.kscience.visionforge.VisionClient -import space.kscience.visionforge.gdml.toVision import space.kscience.visionforge.plotly.PlotlyPlugin import space.kscience.visionforge.ring.ThreeCanvasWithControls import space.kscience.visionforge.ring.ThreeWithControlsPlugin @@ -36,6 +36,8 @@ private class JsPlaygroundApp : Application { val element = document.getElementById("playground") ?: error("Element with id 'playground' not found on page") + val bouncingSphereTrace = Trace() + val bouncingSphere = SolidGroup { sphere(5.0, "ball") { detail = 16 @@ -52,20 +54,19 @@ private class JsPlaygroundApp : Application { time += dt velocity -= g * dt y = y.toDouble() + velocity * dt - if (y.toDouble() <= 2.5){ - velocity = sqrt(2*g*h) + bouncingSphereTrace.appendXY(time, y) + if (y.toDouble() <= 2.5) { + //conservation of energy + velocity = sqrt(2 * g * h) } } } } - box(200, 5, 200, name = "floor"){ + box(200, 5, 200, name = "floor") { y = -2.5 } } - - val visionOfD0 = GdmlShowCase.babyIaxo().toVision() - val random = Random(112233) val visionOfSpheres = SolidGroup { @@ -92,22 +93,41 @@ private class JsPlaygroundApp : Application { } SmartTabs("gravity") { Tab("gravity") { - child(ThreeCanvasWithControls) { - attrs { - context = playgroundContext - solid = bouncingSphere + styledDiv { + css{ + height = 50.vh + } + child(ThreeCanvasWithControls) { + attrs { + context = playgroundContext + solid = bouncingSphere + } + } + } + styledDiv { + css{ + height = 40.vh + } + + Plotly { + attrs { + context = playgroundContext + plot = space.kscience.plotly.Plotly.plot { + traces(bouncingSphereTrace) + } + } } } } - Tab("D0") { - child(ThreeCanvasWithControls) { - attrs { - context = playgroundContext - solid = visionOfD0 - } - } - } +// Tab("D0") { +// child(ThreeCanvasWithControls) { +// attrs { +// context = playgroundContext +// solid = GdmlShowCase.babyIaxo().toVision() +// } +// } +// } Tab("spheres") { child(ThreeCanvasWithControls) { attrs { diff --git a/demo/js-playground/src/main/kotlin/plotlyComponent.kt b/demo/js-playground/src/main/kotlin/plotlyComponent.kt index 7e456a69..9480c68b 100644 --- a/demo/js-playground/src/main/kotlin/plotlyComponent.kt +++ b/demo/js-playground/src/main/kotlin/plotlyComponent.kt @@ -1,4 +1,4 @@ -import kotlinx.css.* +import kotlinx.css.flex import org.w3c.dom.Element import org.w3c.dom.HTMLElement import react.RProps @@ -27,8 +27,6 @@ val Plotly = functionalComponent("Plotly"){props -> styledDiv { css { - maxWidth = 100.vw - maxHeight = 100.vh flex(1.0) } ref = elementRef From 8a8bac48db286049661e1ddc49c5d99841ae3285 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 15 Aug 2021 20:04:21 +0300 Subject: [PATCH 041/109] Update examples --- .../visionforge/gdml/demo/GDMLAppComponent.kt | 54 +++++---- .../src/main/kotlin/JsPlaygroundApp.kt | 107 +++++++++--------- ui/ring/src/main/kotlin/ringui/Loader.kt | 19 ++++ .../src/main/kotlin/ringui/LoaderScreen.kt | 16 +++ .../ThreeViewWithControls.kt | 55 ++++++--- .../ThreeWithControlsPlugin.kt | 3 +- .../space/kscience/visionforge/Application.kt | 8 +- 7 files changed, 169 insertions(+), 93 deletions(-) create mode 100644 ui/ring/src/main/kotlin/ringui/Loader.kt create mode 100644 ui/ring/src/main/kotlin/ringui/LoaderScreen.kt diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt index 4f6560b6..0c52257d 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt @@ -1,6 +1,9 @@ package space.kscience.visionforge.gdml.demo import kotlinx.browser.window +import kotlinx.coroutines.CompletableDeferred +import kotlinx.coroutines.Deferred +import org.w3c.files.File import org.w3c.files.FileReader import org.w3c.files.get import react.* @@ -27,32 +30,43 @@ external interface GDMLAppProps : RProps { @JsExport val GDMLApp = functionalComponent("GDMLApp") { props -> val visionManager = useMemo(props.context) { props.context.fetch(Solids).visionManager } - var vision: Solid? by useState { props.vision?.apply { root(visionManager) } } + var deferredVision: Deferred by useState { + CompletableDeferred(props.vision) + } - fun loadData(name: String, data: String) { - val parsedVision = when { - name.endsWith(".gdml") || name.endsWith(".xml") -> { - val gdml = Gdml.decodeFromString(data) - gdml.toVision().apply { - root(visionManager) - console.info("Marking layers for file $name") - markLayers() + fun readFileAsync(file: File): Deferred { + val deferred = CompletableDeferred() + FileReader().apply { + onload = { + val data = result as String + val name = file.name + val parsedVision = when { + name.endsWith(".gdml") || name.endsWith(".xml") -> { + val gdml = Gdml.decodeFromString(data) + gdml.toVision().apply { + root(visionManager) + console.info("Marking layers for file $name") + markLayers() + } + } + name.endsWith(".json") -> visionManager.decodeFromString(data) + else -> { + window.alert("File extension is not recognized: $name") + error("File extension is not recognized: $name") + } } + deferred.complete(parsedVision as? Solid ?: error("Parsed vision is not a solid")) } - name.endsWith(".json") -> visionManager.decodeFromString(data) - else -> { - window.alert("File extension is not recognized: $name") - error("File extension is not recognized: $name") - } + readAsText(file) } - vision = parsedVision as? Solid ?: error("Parsed vision is not a solid") + return deferred } child(ThreeCanvasWithControls) { attrs { this.context = props.context - this.solid = vision + this.builderOfSolid = deferredVision this.selected = props.selected tab("Load") { h2 { @@ -61,13 +75,7 @@ val GDMLApp = functionalComponent("GDMLApp") { props -> fileDrop("(drag file here)") { files -> val file = files?.get(0) if (file != null) { - FileReader().apply { - onload = { - val string = result as String - loadData(file.name, string) - } - readAsText(file) - } + deferredVision = readFileAsync(file) } } } diff --git a/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt b/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt index a54e48c9..55407e4f 100644 --- a/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt +++ b/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt @@ -1,5 +1,4 @@ import kotlinx.browser.document -import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.delay import kotlinx.coroutines.isActive import kotlinx.coroutines.launch @@ -17,6 +16,7 @@ import space.kscience.visionforge.VisionClient import space.kscience.visionforge.plotly.PlotlyPlugin import space.kscience.visionforge.ring.ThreeCanvasWithControls import space.kscience.visionforge.ring.ThreeWithControlsPlugin +import space.kscience.visionforge.ring.solid import space.kscience.visionforge.solid.* import space.kscience.visionforge.startApplication import styled.css @@ -38,51 +38,6 @@ private class JsPlaygroundApp : Application { val bouncingSphereTrace = Trace() - val bouncingSphere = SolidGroup { - sphere(5.0, "ball") { - detail = 16 - color("red") - val h = 100.0 - y = h - GlobalScope.launch { - val g = 10.0 - val dt = 0.1 - var time = 0.0 - var velocity = 0.0 - while (isActive) { - delay(20) - time += dt - velocity -= g * dt - y = y.toDouble() + velocity * dt - bouncingSphereTrace.appendXY(time, y) - if (y.toDouble() <= 2.5) { - //conservation of energy - velocity = sqrt(2 * g * h) - } - } - } - } - - box(200, 5, 200, name = "floor") { - y = -2.5 - } - } - val random = Random(112233) - - val visionOfSpheres = SolidGroup { - repeat(100) { - sphere(5, name = "sphere[$it]") { - x = random.nextDouble(-300.0, 300.0) - y = random.nextDouble(-300.0, 300.0) - z = random.nextDouble(-300.0, 300.0) - material { - color(random.nextInt()) - } - detail = 16 - } - } - } - render(element) { styledDiv { css { @@ -94,18 +49,46 @@ private class JsPlaygroundApp : Application { SmartTabs("gravity") { Tab("gravity") { styledDiv { - css{ + css { height = 50.vh } child(ThreeCanvasWithControls) { attrs { context = playgroundContext - solid = bouncingSphere + solid { + sphere(5.0, "ball") { + detail = 16 + color("red") + val h = 100.0 + y = h + launch { + val g = 10.0 + val dt = 0.1 + var time = 0.0 + var velocity = 0.0 + while (isActive) { + delay(20) + time += dt + velocity -= g * dt + y = y.toDouble() + velocity * dt + bouncingSphereTrace.appendXY(time, y) + if (y.toDouble() <= 2.5) { + //conservation of energy + velocity = sqrt(2 * g * h) + } + } + } + } + + box(200, 5, 200, name = "floor") { + y = -2.5 + } + } } } } styledDiv { - css{ + css { height = 40.vh } @@ -129,10 +112,28 @@ private class JsPlaygroundApp : Application { // } // } Tab("spheres") { - child(ThreeCanvasWithControls) { - attrs { - context = playgroundContext - solid = visionOfSpheres + styledDiv { + css { + height = 90.vh + } + child(ThreeCanvasWithControls) { + val random = Random(112233) + attrs { + context = playgroundContext + solid { + repeat(100) { + sphere(5, name = "sphere[$it]") { + x = random.nextDouble(-300.0, 300.0) + y = random.nextDouble(-300.0, 300.0) + z = random.nextDouble(-300.0, 300.0) + material { + color(random.nextInt()) + } + detail = 16 + } + } + } + } } } } diff --git a/ui/ring/src/main/kotlin/ringui/Loader.kt b/ui/ring/src/main/kotlin/ringui/Loader.kt new file mode 100644 index 00000000..c58d51c1 --- /dev/null +++ b/ui/ring/src/main/kotlin/ringui/Loader.kt @@ -0,0 +1,19 @@ +@file:JsModule("@jetbrains/ring-ui/components/loader/loader") +@file:JsNonModule + +package ringui + +import react.ComponentClass +import react.dom.WithClassName + +// https://github.com/JetBrains/ring-ui/blob/master/components/loader/loader.js +public external interface LoaderProps : WithClassName { + public var size: Number + public var colors: Array + public var message: String + public var stop: Boolean + public var deterministic: Boolean +} + +@JsName("default") +public external val Loader: ComponentClass \ No newline at end of file diff --git a/ui/ring/src/main/kotlin/ringui/LoaderScreen.kt b/ui/ring/src/main/kotlin/ringui/LoaderScreen.kt new file mode 100644 index 00000000..8d0bf578 --- /dev/null +++ b/ui/ring/src/main/kotlin/ringui/LoaderScreen.kt @@ -0,0 +1,16 @@ +@file:JsModule("@jetbrains/ring-ui/components/loader-screen/loader-screen") +@file:JsNonModule + +package ringui + +import react.ComponentClass +import react.dom.WithClassName + +// https://github.com/JetBrains/ring-ui/blob/master/components/loader-screen/loader-screen.js +public external interface LoaderScreenProps : WithClassName { + public var containerClassName: String + public var message: String +} + +@JsName("default") +public external val LoaderScreen: ComponentClass \ No newline at end of file diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt index a14d23ca..06cffdd0 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt @@ -1,18 +1,19 @@ package space.kscience.visionforge.ring +import kotlinx.coroutines.Deferred +import kotlinx.coroutines.async +import kotlinx.coroutines.launch import kotlinx.css.* import react.* import react.dom.div import react.dom.span -import ringui.Island -import ringui.IslandContent -import ringui.IslandHeader -import ringui.Link +import ringui.* import space.kscience.dataforge.context.Context import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.NameToken import space.kscience.dataforge.names.isEmpty import space.kscience.dataforge.names.length +import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionGroup import space.kscience.visionforge.computeProperties import space.kscience.visionforge.react.ThreeCanvasComponent @@ -20,17 +21,24 @@ import space.kscience.visionforge.react.flexColumn import space.kscience.visionforge.react.flexRow import space.kscience.visionforge.react.propertyEditor import space.kscience.visionforge.solid.Solid +import space.kscience.visionforge.solid.SolidGroup import space.kscience.visionforge.solid.specifications.Canvas3DOptions import styled.css import styled.styledDiv public external interface ThreeCanvasWithControlsProps : RProps { public var context: Context - public var solid: Solid? + public var builderOfSolid: Deferred public var selected: Name? public var additionalTabs: Map Unit>? } +public fun ThreeCanvasWithControlsProps.solid(block: SolidGroup.() -> Unit) { + builderOfSolid = context.async { + SolidGroup(block) + } +} + public fun ThreeCanvasWithControlsProps.tab(title: String, block: RBuilder.() -> Unit) { additionalTabs = (additionalTabs ?: emptyMap()) + (title to block) } @@ -72,6 +80,13 @@ public fun RBuilder.nameCrumbs(name: Name?, link: (Name) -> Unit): ReactElement public val ThreeCanvasWithControls: FunctionComponent = functionalComponent("ThreeViewWithControls") { props -> var selected by useState { props.selected } + var solid: Solid? by useState(null) + + useEffect { + props.context.launch { + solid = props.builderOfSolid.await() + } + } val onSelect: (Name?) -> Unit = { selected = it @@ -83,15 +98,16 @@ public val ThreeCanvasWithControls: FunctionComponent props.solid - else -> (props.solid as? VisionGroup)?.get(it) + it.isEmpty() -> solid + else -> (solid as? VisionGroup)?.get(it) } } } + flexRow { css { height = 100.pct @@ -108,12 +124,20 @@ public val ThreeCanvasWithControls: FunctionComponent Date: Mon, 16 Aug 2021 13:21:00 +0300 Subject: [PATCH 042/109] Duplicated in scheme hierarchy --- docs/uml/Vision.puml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/uml/Vision.puml b/docs/uml/Vision.puml index bf8caa88..eccbb81f 100644 --- a/docs/uml/Vision.puml +++ b/docs/uml/Vision.puml @@ -3,13 +3,13 @@ interface Vision interface Solid -Vision <-- Solid +Vision <- Solid class VisionGroup Vision <-- VisionGroup class VisionBase -Vision <-- VisionBase +Vision <- VisionBase class SolidLabel From 7b99ec54d2165cf23b8381642783a53b6fe3f130 Mon Sep 17 00:00:00 2001 From: kiruma524 Date: Mon, 16 Aug 2021 22:11:00 +0300 Subject: [PATCH 043/109] images, inheritance doc --- docs/images/inheritance-1.png | Bin 0 -> 62203 bytes docs/images/inheritance-2-1-1.png | Bin 0 -> 30473 bytes docs/images/inheritance-2-1-2.png | Bin 0 -> 26080 bytes docs/images/inheritance-2-2-1.png | Bin 0 -> 77444 bytes docs/images/inheritance-2-2-2.png | Bin 0 -> 77517 bytes docs/images/inheritance-2-2-3.png | Bin 0 -> 102370 bytes docs/images/inheritance-2-2-4.png | Bin 0 -> 102097 bytes docs/images/inheritance-2-2-5.png | Bin 0 -> 79566 bytes docs/images/inheritance-tree.png | Bin 0 -> 34239 bytes docs/inheritance | 19 ++++++++++++++++++- 10 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 docs/images/inheritance-1.png create mode 100644 docs/images/inheritance-2-1-1.png create mode 100644 docs/images/inheritance-2-1-2.png create mode 100644 docs/images/inheritance-2-2-1.png create mode 100644 docs/images/inheritance-2-2-2.png create mode 100644 docs/images/inheritance-2-2-3.png create mode 100644 docs/images/inheritance-2-2-4.png create mode 100644 docs/images/inheritance-2-2-5.png create mode 100644 docs/images/inheritance-tree.png diff --git a/docs/images/inheritance-1.png b/docs/images/inheritance-1.png new file mode 100644 index 0000000000000000000000000000000000000000..3a1a9d73adfb09f2f5ec4e56a7ca95a0625020e1 GIT binary patch literal 62203 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 XxV6CZWKg9D0{(V6x;hYc9Q)<}a?tnI literal 0 HcmV?d00001 diff --git a/docs/images/inheritance-2-1-1.png b/docs/images/inheritance-2-1-1.png new file mode 100644 index 0000000000000000000000000000000000000000..442e7314e1703cb76bcc1ffa64c3da3f9f9314da GIT binary patch literal 30473 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 Q6C*`IR{2T6BV*tH1v$Sk#sB~S literal 0 HcmV?d00001 diff --git a/docs/images/inheritance-2-2-4.png b/docs/images/inheritance-2-2-4.png new file mode 100644 index 0000000000000000000000000000000000000000..771b9310d3f3ef0f9b36b9e759f9f36a69b64f4d GIT binary patch literal 102097 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

@ntIkS{V- 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 literal 0 HcmV?d00001 diff --git a/docs/images/inheritance-tree.png b/docs/images/inheritance-tree.png new file mode 100644 index 0000000000000000000000000000000000000000..058df0f683aec5b42122b7c76b784f1dc32ca219 GIT binary patch literal 34239 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 X8eYr_$~ybz4EWJh(^D-|whsPZ0e7K@ literal 0 HcmV?d00001 diff --git a/docs/inheritance b/docs/inheritance index 37a4557c..94507fc0 100644 --- a/docs/inheritance +++ b/docs/inheritance @@ -1,16 +1,33 @@ ## Inheritance -Inheritance is a very useful ability of `children` elements to get the same property in default as his parent does have (to 'inherit' it). +Inheritance is an ability of an element to transfer a pack of propereties to its `children` elements 'wrapped inside'. +Properties have to be set in specific order: ### Main properties' inheritance: * styles * parents * parent's styles * defaults +As for `prototypes`, this property has to be set after styles, but before parents. So the order will be this: ### Reference properties' inheritance: * styles * prototypes * parents * parent's styles * defaults + +------------------------ + +Let's take a closer look using a [Muon Monitor Visualization](demo/muon-monitor/README.md). +Running the demo, we will see this: +![](../docs/images/inheritance-1.png) + +![](../docs/images/inheritance-tree.png) +![](../docs/images/inheritance-2-1-1.png) +![](../docs/images/inheritance-2-1-2.png) +![](../docs/images/inheritance-2-2-1.png) +![](../docs/images/inheritance-2-2-2.png) +![](../docs/images/inheritance-2-2-3.png) +![](../docs/images/inheritance-2-2-4.png) +![](../docs/images/inheritance-2-2-5.png) \ No newline at end of file From d361d42c29acdca91f79cfc0cab0b14dc008d5aa Mon Sep 17 00:00:00 2001 From: kiruma524 Date: Mon, 16 Aug 2021 23:33:32 +0300 Subject: [PATCH 044/109] Added one more image, supplemented inheritance doc --- docs/images/inheritance-properties.png | Bin 0 -> 53348 bytes docs/inheritance | 37 +++++++++++++++++++++---- 2 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 docs/images/inheritance-properties.png diff --git a/docs/images/inheritance-properties.png b/docs/images/inheritance-properties.png new file mode 100644 index 0000000000000000000000000000000000000000..0a719ea2861e2b26cdefdd87d1a6e3a0a491dfeb GIT binary patch literal 53348 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 literal 0 HcmV?d00001 diff --git a/docs/inheritance b/docs/inheritance index 94507fc0..6517a947 100644 --- a/docs/inheritance +++ b/docs/inheritance @@ -1,8 +1,8 @@ ## Inheritance -Inheritance is an ability of an element to transfer a pack of propereties to its `children` elements 'wrapped inside'. +Inheritance is an ability of an element to transfer a pack of properties to its `children` elements 'wrapped inside'. -Properties have to be set in specific order: +Properties have to be set in a specific order: ### Main properties' inheritance: * styles * parents @@ -16,18 +16,45 @@ As for `prototypes`, this property has to be set after styles, but before parent * parents * parent's styles * defaults - ------------------------ - Let's take a closer look using a [Muon Monitor Visualization](demo/muon-monitor/README.md). Running the demo, we will see this: + ![](../docs/images/inheritance-1.png) +You can see a tree of elements on the left; 'World' is a `root`, 'bottom', 'middle', and 'top' are 'World's `children` and so on. + ![](../docs/images/inheritance-tree.png) + +On the right, there is a list with changeable properties. + +![](../docs/images/inheritance-properties.png) + +Properties, which can or cannot be inherited, are these: +* `visible` - toggles the visibility of an element. To be exact, the invisibility of an element is inheritable. + If a `parent` element is invisible, other elements are invisible as well, and they cannot be changed to visible mode. ![](../docs/images/inheritance-2-1-1.png) ![](../docs/images/inheritance-2-1-2.png) + +* `material` - a group of properties, which can be inherited and which can be changed in `children` elements. + * `color` - color of an element. + +Let's see how elements of the `material` group inherits changing `color` property; other properties of the same group inherits in the same way. + +Let's change color of 'World' element. ![](../docs/images/inheritance-2-2-1.png) +It is a `parent`, so 'bottom', 'middle', and 'top' elements inherit this color. + +Now, let's change 'top's color. ![](../docs/images/inheritance-2-2-2.png) +It changes only, 'bottom' and 'middle' stays the same. + +'top' is a `parent` element as well: it has `children` - 'SC72', 'SC73', ... ,'SC80'. Let's change the color of 'SC76'. ![](../docs/images/inheritance-2-2-3.png) + ![](../docs/images/inheritance-2-2-4.png) -![](../docs/images/inheritance-2-2-5.png) \ No newline at end of file +![](../docs/images/inheritance-2-2-5.png) + * `opacity` - a number from 0 to 1 which represents percents of opacity (0 for 0%, 1 for 100%). + * `wireframe` - toggles the wireframe mode. +* `rotation` - rotation of an element. Here, it is set by `x` value. It is inheritable and unable to be changed in `children` elements. +* `position` - position of an element, cannot be inherited. From c70d4d2da6e125dea981cec51e536cc326a17df4 Mon Sep 17 00:00:00 2001 From: kiruma524 Date: Mon, 16 Aug 2021 23:48:22 +0300 Subject: [PATCH 045/109] Supplemented inheritance doc --- docs/inheritance | 46 +++++++++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/docs/inheritance b/docs/inheritance index 6517a947..6063d63c 100644 --- a/docs/inheritance +++ b/docs/inheritance @@ -33,28 +33,36 @@ On the right, there is a list with changeable properties. Properties, which can or cannot be inherited, are these: * `visible` - toggles the visibility of an element. To be exact, the invisibility of an element is inheritable. If a `parent` element is invisible, other elements are invisible as well, and they cannot be changed to visible mode. -![](../docs/images/inheritance-2-1-1.png) -![](../docs/images/inheritance-2-1-2.png) + ![](../docs/images/inheritance-2-1-1.png) + ![](../docs/images/inheritance-2-1-2.png) * `material` - a group of properties, which can be inherited and which can be changed in `children` elements. * `color` - color of an element. - -Let's see how elements of the `material` group inherits changing `color` property; other properties of the same group inherits in the same way. - -Let's change color of 'World' element. -![](../docs/images/inheritance-2-2-1.png) -It is a `parent`, so 'bottom', 'middle', and 'top' elements inherit this color. - -Now, let's change 'top's color. -![](../docs/images/inheritance-2-2-2.png) -It changes only, 'bottom' and 'middle' stays the same. - -'top' is a `parent` element as well: it has `children` - 'SC72', 'SC73', ... ,'SC80'. Let's change the color of 'SC76'. -![](../docs/images/inheritance-2-2-3.png) - -![](../docs/images/inheritance-2-2-4.png) -![](../docs/images/inheritance-2-2-5.png) * `opacity` - a number from 0 to 1 which represents percents of opacity (0 for 0%, 1 for 100%). * `wireframe` - toggles the wireframe mode. + + Let's see how elements of the `material` group inherit changing `color` property; ***other properties of this group inherit in the same way.*** + + Let's change color of 'World' element: + ![](../docs/images/inheritance-2-2-1.png) + It is a `parent`, so 'bottom', 'middle', and 'top' elements inherit this color. + + Now, let's change 'top's color: + ![](../docs/images/inheritance-2-2-2.png) + It changes only, 'bottom' and 'middle' stays the same. + + 'top' is a `parent` element as well: it has `children` - 'SC72', 'SC73', ... ,'SC80'. + Let's change the color of 'SC76': + ![](../docs/images/inheritance-2-2-3.png) + Again, only 'SC76' has changed among other 'siblings'. + + However, 'SC76' is a `parent` too. Let's change one of its `children` color (here we change 'SC76_5's color'): + ![](../docs/images/inheritance-2-2-4.png) + + As we can see, `color` is inheritable property, which can be changed in a custom way. + + If after all those changes we set at the 'World' element grey color, changes won't disappear: + ![](../docs/images/inheritance-2-2-5.png) + * `rotation` - rotation of an element. Here, it is set by `x` value. It is inheritable and unable to be changed in `children` elements. -* `position` - position of an element, cannot be inherited. +* `position` - position of an element, cannot be inherited. \ No newline at end of file From 0c711018587edc3071158365702484cf1c0ce7ab Mon Sep 17 00:00:00 2001 From: kiruma524 Date: Mon, 16 Aug 2021 23:50:11 +0300 Subject: [PATCH 046/109] hierarchy comments --- docs/hierarchy.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/hierarchy.md b/docs/hierarchy.md index dbb2c6c1..a4097221 100644 --- a/docs/hierarchy.md +++ b/docs/hierarchy.md @@ -1,6 +1,7 @@ # Hierarchy -![](../docs/images/hierarchy.png) +![](../docs/images/hierarchy.png) +**the image will be changed** ### Vision From 238a9e0dd19125f4b3c8bf63ded0813214ca5b60 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 17 Aug 2021 10:53:36 +0300 Subject: [PATCH 047/109] Fix color chooser order of update --- .../src/main/kotlin/JsPlaygroundApp.kt | 11 +++++++++-- .../kscience/visionforge/react/valueChooser.kt | 14 +++++--------- .../visionforge/solid/three/ThreeFactory.kt | 2 ++ 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt b/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt index 55407e4f..afd4e695 100644 --- a/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt +++ b/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt @@ -9,7 +9,6 @@ import ringui.SmartTabs import ringui.Tab import space.kscience.dataforge.context.Context import space.kscience.plotly.models.Trace -import space.kscience.plotly.models.appendXY import space.kscience.plotly.scatter import space.kscience.visionforge.Application import space.kscience.visionforge.VisionClient @@ -24,6 +23,14 @@ import styled.styledDiv import kotlin.math.sqrt import kotlin.random.Random +fun Trace.appendXYLatest(x: Number, y: Number, history: Int = 400, xErr: Number? = null, yErr: Number? = null) { + this.x.numbers = (this.x.numbers + x).takeLast(history) + this.y.numbers = (this.y.numbers + y).takeLast(history) + xErr?.let { error_x.array = (error_x.array + xErr).takeLast(history) } + yErr?.let { error_y.array = (error_y.array + yErr).takeLast(history) } +} + + private class JsPlaygroundApp : Application { override fun start(state: Map) { @@ -71,7 +78,7 @@ private class JsPlaygroundApp : Application { time += dt velocity -= g * dt y = y.toDouble() + velocity * dt - bouncingSphereTrace.appendXY(time, y) + bouncingSphereTrace.appendXYLatest(time, y) if (y.toDouble() <= 2.5) { //conservation of energy velocity = sqrt(2 * g * h) diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt index e29f0f8b..4727cde0 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt @@ -143,15 +143,8 @@ public val ComboValueChooser: FunctionComponent = @JsExport public val ColorValueChooser: FunctionComponent = functionalComponent("ColorValueChooser") { props -> - var value by useState( - props.actual.value?.let { value -> - if (value.type == ValueType.NUMBER) Colors.rgbToString(value.int) - else value.string - } ?: "#000000" - ) val handleChange: (Event) -> Unit = { - value = (it.target as HTMLInputElement).value - props.meta.value = value.asValue() + props.meta.value = (it.target as HTMLInputElement).value.asValue() } styledInput(type = InputType.color) { css { @@ -159,7 +152,10 @@ public val ColorValueChooser: FunctionComponent = margin(0.px) } attrs { - this.value = value + this.value = props.actual.value?.let { value -> + if (value.type == ValueType.NUMBER) Colors.rgbToString(value.int) + else value.string + } ?: "#000000" onChangeFunction = handleChange } } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt index c62abd77..81749fd3 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt @@ -7,6 +7,7 @@ import space.kscience.dataforge.misc.Type import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.startsWith import space.kscience.visionforge.Vision +import space.kscience.visionforge.computeProperty import space.kscience.visionforge.solid.* import space.kscience.visionforge.solid.SolidMaterial.Companion.MATERIAL_KEY import space.kscience.visionforge.solid.three.ThreeFactory.Companion.TYPE @@ -45,6 +46,7 @@ public fun Object3D.updatePosition(obj: Vision) { * Update non-position non-geometry property */ public fun Object3D.updateProperty(source: Vision, propertyName: Name) { + console.log("$source updated $propertyName with ${source.computeProperty(propertyName)}") if (this is Mesh && propertyName.startsWith(MATERIAL_KEY)) { updateMaterialProperty(source, propertyName) } else if ( From cbc67cb16b4ea112fb1dd0845e54664ef54e6a22 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 17 Aug 2021 15:26:31 +0300 Subject: [PATCH 048/109] fix styles and remove bootstrap dependencies --- .../visionforge/gdml/demo/GDMLAppComponent.kt | 38 +- demo/muon-monitor/build.gradle.kts | 10 +- .../mipt/npm/muon/monitor/MMAppComponent.kt | 342 ++++++++++-------- .../ru/mipt/npm/muon/monitor/MMDemoApp.kt | 2 - demo/muon-monitor/webpack.config.d/01.ring.js | 3 + .../visionforge/react/valueChooser.kt | 2 +- .../ThreeViewWithControls.kt | 7 +- 7 files changed, 242 insertions(+), 162 deletions(-) create mode 100644 demo/muon-monitor/webpack.config.d/01.ring.js diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt index 0c52257d..2bad5e8d 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt @@ -3,6 +3,9 @@ package space.kscience.visionforge.gdml.demo import kotlinx.browser.window import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.Deferred +import kotlinx.css.height +import kotlinx.css.pt +import kotlinx.css.vh import org.w3c.files.File import org.w3c.files.FileReader import org.w3c.files.get @@ -20,6 +23,8 @@ import space.kscience.visionforge.ring.tab import space.kscience.visionforge.root import space.kscience.visionforge.solid.Solid import space.kscience.visionforge.solid.Solids +import styled.css +import styled.styledDiv external interface GDMLAppProps : RProps { var context: Context @@ -63,24 +68,29 @@ val GDMLApp = functionalComponent("GDMLApp") { props -> return deferred } - child(ThreeCanvasWithControls) { - attrs { - this.context = props.context - this.builderOfSolid = deferredVision - this.selected = props.selected - tab("Load") { - h2 { - +"Drag and drop .gdml or .json VisionForge files here" - } - fileDrop("(drag file here)") { files -> - val file = files?.get(0) - if (file != null) { - deferredVision = readFileAsync(file) + styledDiv { + css { + height = 100.vh - 12.pt + } + child(ThreeCanvasWithControls) { + attrs { + this.context = props.context + this.builderOfSolid = deferredVision + this.selected = props.selected + tab("Load") { + h2 { + +"Drag and drop .gdml or .json VisionForge files here" + } + fileDrop("(drag file here)") { files -> + val file = files?.get(0) + if (file != null) { + deferredVision = readFileAsync(file) + } } } } - } + } } } diff --git a/demo/muon-monitor/build.gradle.kts b/demo/muon-monitor/build.gradle.kts index 3a8035ab..3818cada 100644 --- a/demo/muon-monitor/build.gradle.kts +++ b/demo/muon-monitor/build.gradle.kts @@ -17,6 +17,14 @@ kotlin { jvm { withJava() } + js { + useCommonJs() + browser { + commonWebpackConfig { + cssSupport.enabled = false + } + } + } afterEvaluate { val jsBrowserDistribution by tasks.getting @@ -43,7 +51,7 @@ kotlin { } jsMain { dependencies { - implementation(project(":ui:bootstrap")) + implementation(project(":ui:ring")) implementation("io.ktor:ktor-client-js:$ktorVersion") implementation("io.ktor:ktor-client-serialization:$ktorVersion") implementation(project(":visionforge-threejs")) diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt index 8450cb4a..1a7fe071 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt @@ -2,31 +2,27 @@ package ru.mipt.npm.muon.monitor import io.ktor.client.HttpClient import io.ktor.client.request.get +import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.DelicateCoroutinesApi -import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import kotlinx.css.* import kotlinx.html.js.onClickFunction import react.* -import react.dom.* +import react.dom.attrs +import react.dom.button +import react.dom.p import space.kscience.dataforge.context.Context import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.NameToken -import space.kscience.dataforge.names.isEmpty -import space.kscience.dataforge.names.length -import space.kscience.visionforge.Vision -import space.kscience.visionforge.bootstrap.canvasControls -import space.kscience.visionforge.bootstrap.card -import space.kscience.visionforge.bootstrap.gridRow -import space.kscience.visionforge.bootstrap.visionPropertyEditor -import space.kscience.visionforge.react.ThreeCanvasComponent import space.kscience.visionforge.react.flexColumn -import space.kscience.visionforge.react.visionTree +import space.kscience.visionforge.react.flexRow +import space.kscience.visionforge.ring.ThreeCanvasWithControls +import space.kscience.visionforge.ring.tab import space.kscience.visionforge.solid.specifications.Camera import space.kscience.visionforge.solid.specifications.Canvas3DOptions import space.kscience.visionforge.solid.three.edges import styled.css import styled.styledDiv +import styled.styledSpan import kotlin.math.PI external interface MMAppProps : RProps { @@ -39,11 +35,6 @@ external interface MMAppProps : RProps { @OptIn(DelicateCoroutinesApi::class) @JsExport val MMApp = functionalComponent("Muon monitor") { props -> - var selected by useState { props.selected } - - val onSelect: (Name?) -> Unit = { - selected = it - } val mmOptions = useMemo { Canvas3DOptions { @@ -52,7 +43,6 @@ val MMApp = functionalComponent("Muon monitor") { props -> latitude = PI / 6 azimuth = PI + PI / 6 } - this.onSelect = onSelect } } @@ -62,142 +52,210 @@ val MMApp = functionalComponent("Muon monitor") { props -> } } - gridRow { - flexColumn { - css { - +"col-lg-3" - +"order-lg-1" - +"order-2" - padding(0.px) - overflowY = Overflow.auto - height = 100.vh - } - //tree - card("Object tree") { - css { - flex(1.0, 1.0, FlexBasis.auto) - } - visionTree(root, selected, onSelect) - } - } - flexColumn { - css { - +"col-lg-6" - +"order-lg-2" - +"order-1" - height = 100.vh - } - h1("mx-auto page-header") { - +"Muon monitor demo" - } - //canvas + var events: Set by useState(emptySet()) - child(ThreeCanvasComponent) { - attrs { - this.context = props.context - this.solid = root - this.selected = selected - this.options = mmOptions - } - } + styledDiv { + css { + height = 100.vh - 12.pt } - flexColumn { - css { - +"col-lg-3" - +"order-3" - padding(0.px) - height = 100.vh - } - styledDiv { - css { - flex(0.0, 1.0, FlexBasis.zero) - } - //settings - card("Canvas configuration") { - canvasControls(mmOptions, root) - } - - card("Events") { - button { - +"Next" - attrs { - onClickFunction = { - GlobalScope.launch { - val event = props.connection.get("http://localhost:8080/event") - props.model.displayEvent(event) - } - } - } - } - button { - +"Clear" - attrs { - onClickFunction = { - props.model.reset() - } - } - } - } - } - styledDiv { - css { - padding(0.px) - } - nav { - attrs { - attributes["aria-label"] = "breadcrumb" - } - ol("breadcrumb") { - li("breadcrumb-item") { - button(classes = "btn btn-link p-0") { - +"World" + child(ThreeCanvasWithControls) { + attrs { + this.context = props.context + this.builderOfSolid = CompletableDeferred(root) + this.selected = props.selected + this.options = mmOptions + tab("Events") { + flexColumn { + flexRow { + button { + +"Next" attrs { onClickFunction = { - selected = Name.EMPTY - } - } - } - } - if (selected != null) { - val tokens = ArrayList(selected?.length ?: 1) - selected?.tokens?.forEach { token -> - tokens.add(token) - val fullName = Name(tokens.toList()) - li("breadcrumb-item") { - button(classes = "btn btn-link p-0") { - +token.toString() - attrs { - onClickFunction = { - console.log("Selected = $fullName") - selected = fullName - } + context.launch { + val event = props.connection.get( + "http://localhost:8080/event" + ) + events = events + event + props.model.displayEvent(event) } } } } + button { + +"Clear" + attrs { + onClickFunction = { + events = emptySet() + props.model.reset() + } + } + } + } + } + events.forEach { event -> + p { + styledSpan { + +event.id.toString() + } + +" : " + styledSpan { + css{ + color = Color.blue + } + +event.hits.toString() + } } } } } - styledDiv { - css { - overflowY = Overflow.auto - } - //properties - card("Properties") { - selected.let { selected -> - val selectedObject: Vision? = when { - selected == null -> null - selected.isEmpty() -> root - else -> root[selected] - } - if (selectedObject != null) { - visionPropertyEditor(selectedObject, key = selected) - } - } - } - } - } + } } + +// var selected by useState { props.selected } +// +// val onSelect: (Name?) -> Unit = { +// selected = it +// } +// + +// +// gridRow { +// flexColumn { +// css { +// +"col-lg-3" +// +"order-lg-1" +// +"order-2" +// padding(0.px) +// overflowY = Overflow.auto +// height = 100.vh +// } +// //tree +// card("Object tree") { +// css { +// flex(1.0, 1.0, FlexBasis.auto) +// } +// visionTree(root, selected, onSelect) +// } +// } +// flexColumn { +// css { +// +"col-lg-6" +// +"order-lg-2" +// +"order-1" +// height = 100.vh +// } +// h1("mx-auto page-header") { +// +"Muon monitor demo" +// } +// //canvas +// +// child(ThreeCanvasComponent) { +// attrs { +// this.context = props.context +// this.solid = root +// this.selected = selected +// this.options = mmOptions +// } +// } +// } +// flexColumn { +// css { +// +"col-lg-3" +// +"order-3" +// padding(0.px) +// height = 100.vh +// } +// styledDiv { +// css { +// flex(0.0, 1.0, FlexBasis.zero) +// } +// //settings +// card("Canvas configuration") { +// canvasControls(mmOptions, root) +// } +// +// card("Events") { +// button { +// +"Next" +// attrs { +// onClickFunction = { +// GlobalScope.launch { +// val event = props.connection.get("http://localhost:8080/event") +// props.model.displayEvent(event) +// } +// } +// } +// } +// button { +// +"Clear" +// attrs { +// onClickFunction = { +// props.model.reset() +// } +// } +// } +// } +// } +// styledDiv { +// css { +// padding(0.px) +// } +// nav { +// attrs { +// attributes["aria-label"] = "breadcrumb" +// } +// ol("breadcrumb") { +// li("breadcrumb-item") { +// button(classes = "btn btn-link p-0") { +// +"World" +// attrs { +// onClickFunction = { +// selected = Name.EMPTY +// } +// } +// } +// } +// if (selected != null) { +// val tokens = ArrayList(selected?.length ?: 1) +// selected?.tokens?.forEach { token -> +// tokens.add(token) +// val fullName = Name(tokens.toList()) +// li("breadcrumb-item") { +// button(classes = "btn btn-link p-0") { +// +token.toString() +// attrs { +// onClickFunction = { +// console.log("Selected = $fullName") +// selected = fullName +// } +// } +// } +// } +// } +// } +// } +// } +// } +// styledDiv { +// css { +// overflowY = Overflow.auto +// } +// //properties +// card("Properties") { +// selected.let { selected -> +// val selectedObject: Vision? = when { +// selected == null -> null +// selected.isEmpty() -> root +// else -> root[selected] +// } +// if (selectedObject != null) { +// visionPropertyEditor(selectedObject, key = selected) +// } +// } +// } +// } +// } +// +// } } \ No newline at end of file diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt index 9daa6213..f777d383 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt @@ -10,7 +10,6 @@ import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.fetch import space.kscience.visionforge.Application import space.kscience.visionforge.VisionManager -import space.kscience.visionforge.bootstrap.useBootstrap import space.kscience.visionforge.solid.three.ThreePlugin import space.kscience.visionforge.startApplication @@ -23,7 +22,6 @@ private class MMDemoApp : Application { } override fun start(state: Map) { - useBootstrap() val context = Context("MM-demo"){ plugin(ThreePlugin) diff --git a/demo/muon-monitor/webpack.config.d/01.ring.js b/demo/muon-monitor/webpack.config.d/01.ring.js new file mode 100644 index 00000000..41da041c --- /dev/null +++ b/demo/muon-monitor/webpack.config.d/01.ring.js @@ -0,0 +1,3 @@ +const ringConfig = require('@jetbrains/ring-ui/webpack.config').config; + +config.module.rules.push(...ringConfig.module.rules) \ No newline at end of file diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt index 4727cde0..711710f6 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt @@ -70,7 +70,7 @@ public val BooleanValueChooser: FunctionComponent = } attrs { //this.attributes["indeterminate"] = (props.item == null).toString() - defaultChecked = props.actual.boolean ?: false + checked = props.actual.boolean ?: false onChangeFunction = handleChange } } diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt index 06cffdd0..2cf552a2 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt @@ -30,6 +30,7 @@ public external interface ThreeCanvasWithControlsProps : RProps { public var context: Context public var builderOfSolid: Deferred public var selected: Name? + public var options: Canvas3DOptions? public var additionalTabs: Map Unit>? } @@ -92,8 +93,8 @@ public val ThreeCanvasWithControls: FunctionComponent Date: Tue, 17 Aug 2021 21:57:09 +0300 Subject: [PATCH 049/109] Adjust demo --- demo/js-playground/build.gradle.kts | 1 + .../src/main/kotlin/JsPlaygroundApp.kt | 98 +++++++++++-------- .../src/main/kotlin/markupComponent.kt | 56 +++++++++++ .../src/main/kotlin/plotlyComponent.kt | 30 ++++-- gradle/wrapper/gradle-wrapper.properties | 2 +- settings.gradle.kts | 1 + .../visionforge/react/ThreeCanvasComponent.kt | 3 +- .../ThreeViewWithControls.kt | 3 +- .../visionforge/markup/VisionOfMarkup.kt | 5 + .../visionforge/markup/MarkupPlugin.kt | 1 - .../visionforge/solid/three/ThreeCanvas.kt | 3 +- 11 files changed, 146 insertions(+), 57 deletions(-) create mode 100644 demo/js-playground/src/main/kotlin/markupComponent.kt diff --git a/demo/js-playground/build.gradle.kts b/demo/js-playground/build.gradle.kts index 4a908719..65539554 100644 --- a/demo/js-playground/build.gradle.kts +++ b/demo/js-playground/build.gradle.kts @@ -22,6 +22,7 @@ kotlin{ dependencies{ implementation(project(":visionforge-gdml")) implementation(project(":visionforge-plotly")) + implementation(projects.visionforge.visionforgeMarkdown) implementation(project(":visionforge-threejs")) implementation(project(":ui:ring")) } \ No newline at end of file diff --git a/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt b/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt index afd4e695..db9be953 100644 --- a/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt +++ b/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt @@ -12,7 +12,9 @@ import space.kscience.plotly.models.Trace import space.kscience.plotly.scatter import space.kscience.visionforge.Application import space.kscience.visionforge.VisionClient +import space.kscience.visionforge.markup.VisionOfMarkup import space.kscience.visionforge.plotly.PlotlyPlugin +import space.kscience.visionforge.react.flexRow import space.kscience.visionforge.ring.ThreeCanvasWithControls import space.kscience.visionforge.ring.ThreeWithControlsPlugin import space.kscience.visionforge.ring.solid @@ -30,7 +32,6 @@ fun Trace.appendXYLatest(x: Number, y: Number, history: Int = 400, xErr: Number? yErr?.let { error_y.array = (error_y.array + yErr).takeLast(history) } } - private class JsPlaygroundApp : Application { override fun start(state: Map) { @@ -44,6 +45,7 @@ private class JsPlaygroundApp : Application { val element = document.getElementById("playground") ?: error("Element with id 'playground' not found on page") val bouncingSphereTrace = Trace() + val bouncingSphereMarkup = VisionOfMarkup() render(element) { styledDiv { @@ -57,53 +59,68 @@ private class JsPlaygroundApp : Application { Tab("gravity") { styledDiv { css { - height = 50.vh + height = 100.vh - 50.pt } - child(ThreeCanvasWithControls) { - attrs { - context = playgroundContext - solid { - sphere(5.0, "ball") { - detail = 16 - color("red") - val h = 100.0 - y = h - launch { - val g = 10.0 - val dt = 0.1 - var time = 0.0 - var velocity = 0.0 - while (isActive) { - delay(20) - time += dt - velocity -= g * dt - y = y.toDouble() + velocity * dt - bouncingSphereTrace.appendXYLatest(time, y) - if (y.toDouble() <= 2.5) { - //conservation of energy - velocity = sqrt(2 * g * h) + styledDiv { + css { + height = 50.vh + } + child(ThreeCanvasWithControls) { + attrs { + context = playgroundContext + solid { + sphere(5.0, "ball") { + detail = 16 + color("red") + val h = 100.0 + y = h + launch { + val g = 10.0 + val dt = 0.1 + var time = 0.0 + var velocity = 0.0 + while (isActive) { + delay(20) + time += dt + velocity -= g * dt + val energy = g * y.toDouble() + velocity * velocity / 2 + y = y.toDouble() + velocity * dt + bouncingSphereTrace.appendXYLatest(time, y) + if (y.toDouble() <= 2.5) { + //conservation of energy + velocity = sqrt(2 * g * h) + } + + bouncingSphereMarkup.content = """ + ## Bouncing sphere parameters + + **velocity** = $velocity + + **energy** = $energy + """.trimIndent() } } } - } - box(200, 5, 200, name = "floor") { - y = -2.5 + box(200, 5, 200, name = "floor") { + y = -2.5 + } } } } } - } - styledDiv { - css { - height = 40.vh - } - - Plotly { - attrs { - context = playgroundContext - plot = space.kscience.plotly.Plotly.plot { - traces(bouncingSphereTrace) + flexRow { + css{ + alignContent = Align.stretch + alignItems = Align.stretch + height = 50.vh - 50.pt + } + plotly { + traces(bouncingSphereTrace) + } + Markup { + attrs { + markup = bouncingSphereMarkup } } } @@ -121,7 +138,7 @@ private class JsPlaygroundApp : Application { Tab("spheres") { styledDiv { css { - height = 90.vh + height = 100.vh - 50.pt } child(ThreeCanvasWithControls) { val random = Random(112233) @@ -147,7 +164,6 @@ private class JsPlaygroundApp : Application { Tab("plotly") { Plotly { attrs { - context = playgroundContext plot = space.kscience.plotly.Plotly.plot { scatter { x(1, 2, 3) diff --git a/demo/js-playground/src/main/kotlin/markupComponent.kt b/demo/js-playground/src/main/kotlin/markupComponent.kt new file mode 100644 index 00000000..73c7da29 --- /dev/null +++ b/demo/js-playground/src/main/kotlin/markupComponent.kt @@ -0,0 +1,56 @@ +import kotlinx.css.* +import kotlinx.css.properties.border +import kotlinx.dom.clear +import kotlinx.html.dom.append +import org.intellij.markdown.flavours.commonmark.CommonMarkFlavourDescriptor +import org.intellij.markdown.flavours.gfm.GFMFlavourDescriptor +import org.w3c.dom.Element +import org.w3c.dom.HTMLElement +import react.RProps +import react.functionalComponent +import react.useEffect +import react.useRef +import space.kscience.visionforge.markup.VisionOfMarkup +import space.kscience.visionforge.markup.markdown +import space.kscience.visionforge.useProperty +import styled.css +import styled.styledDiv + +external interface MarkupProps : RProps { + var markup: VisionOfMarkup? +} + +val Markup = functionalComponent("Markup") { props -> + val elementRef = useRef(null) + + useEffect(props.markup, elementRef) { + val element = elementRef.current as? HTMLElement ?: error("Markup element not found") + props.markup?.let { vision -> + val flavour = when (vision.format) { + VisionOfMarkup.COMMONMARK_FORMAT -> CommonMarkFlavourDescriptor() + VisionOfMarkup.GFM_FORMAT -> GFMFlavourDescriptor() + //TODO add new formats via plugins + else -> error("Format ${vision.format} not recognized") + } + vision.useProperty(VisionOfMarkup::content) { content -> + element.clear() + element.append { + markdown(flavour) { content ?: "" } + } + } + } + } + + styledDiv { + css { + width = 100.pct + height = 100.pct + border(2.pt, BorderStyle.solid, Color.blue) + padding(8.pt) + backgroundColor = Color.white + flex(1.0) + zIndex = 10000 + } + ref = elementRef + } +} \ No newline at end of file diff --git a/demo/js-playground/src/main/kotlin/plotlyComponent.kt b/demo/js-playground/src/main/kotlin/plotlyComponent.kt index 9480c68b..22f63ac8 100644 --- a/demo/js-playground/src/main/kotlin/plotlyComponent.kt +++ b/demo/js-playground/src/main/kotlin/plotlyComponent.kt @@ -1,34 +1,44 @@ -import kotlinx.css.flex +import kotlinx.css.* +import kotlinx.css.properties.border import org.w3c.dom.Element import org.w3c.dom.HTMLElement -import react.RProps -import react.functionalComponent -import react.useEffect -import react.useRef -import space.kscience.dataforge.context.Context +import react.* import space.kscience.plotly.Plot +import space.kscience.plotly.PlotlyConfig import space.kscience.plotly.plot import styled.css import styled.styledDiv -external interface PlotlyProps: RProps{ - var context: Context +external interface PlotlyProps : RProps { var plot: Plot? } -val Plotly = functionalComponent("Plotly"){props -> +val Plotly = functionalComponent("Plotly") { props -> val elementRef = useRef(null) useEffect(props.plot, elementRef) { val element = elementRef.current as? HTMLElement ?: error("Plotly element not found") - props.plot?.let { element.plot(it)} + props.plot?.let { + element.plot(it, PlotlyConfig { + responsive = true + }) + } } styledDiv { css { + width = 100.pct + height = 100.pct + border(2.pt, BorderStyle.solid, Color.blue) flex(1.0) } ref = elementRef } +} + +fun RBuilder.plotly(plotbuilder: Plot.() -> Unit) = Plotly { + attrs { + this.plot = Plot().apply(plotbuilder) + } } \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 05679dc3..ffed3a25 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/settings.gradle.kts b/settings.gradle.kts index d88c9b81..d4616ea7 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -18,6 +18,7 @@ pluginManagement { rootProject.name = "visionforge" +enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") include( // ":ui", diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt index 41034773..6be75689 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt @@ -50,7 +50,8 @@ public val ThreeCanvasComponent: FunctionComponent = functiona css { maxWidth = 100.vw maxHeight = 100.vh - flex(1.0) + width = 100.pct + height = 100.pct } ref = elementRef } diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt index 2cf552a2..e69b04c9 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt @@ -112,7 +112,7 @@ public val ThreeCanvasWithControls: FunctionComponent String) { + content = text() +} + internal val markupSerializersModule = SerializersModule { polymorphic(Vision::class) { subclass(VisionOfMarkup.serializer()) diff --git a/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt b/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt index d26488c5..4d7a1060 100644 --- a/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt +++ b/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt @@ -39,7 +39,6 @@ public class MarkupPlugin : VisionPlugin(), ElementVisionRenderer { div.clear() div.append { markdown(flavour) { vision.content ?: "" } - } } element.append(div) diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt index 0d223987..3b5ae6ae 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt @@ -2,7 +2,6 @@ package space.kscience.visionforge.solid.three import info.laht.threekt.WebGLRenderer import info.laht.threekt.cameras.PerspectiveCamera -import info.laht.threekt.core.BufferGeometry import info.laht.threekt.core.Object3D import info.laht.threekt.core.Raycaster import info.laht.threekt.external.controls.OrbitControls @@ -276,7 +275,7 @@ public class ThreeCanvas( if (this is Mesh) { if (highlight) { val edges = LineSegments( - EdgesGeometry(geometry as BufferGeometry), + EdgesGeometry(geometry), material ).apply { name = edgesName From 9afe5da45b363c6d7efb8d89dcd925ded74b1fed Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 18 Aug 2021 11:39:37 +0300 Subject: [PATCH 050/109] Fix webpack server bug and adjust demo styles. --- build.gradle.kts | 6 + demo/js-playground/build.gradle.kts | 8 +- .../src/main/kotlin/JsPlaygroundApp.kt | 78 +------------ .../src/main/kotlin/gravityDemo.kt | 103 ++++++++++++++++++ .../src/main/kotlin/markupComponent.kt | 2 +- demo/playground/build.gradle.kts | 14 +-- .../src/jsMain/kotlin/playgroundMain.kt | 4 +- ui/ring/build.gradle.kts | 5 - visionforge-fx/build.gradle.kts | 4 - 9 files changed, 127 insertions(+), 97 deletions(-) create mode 100644 demo/js-playground/src/main/kotlin/gravityDemo.kt diff --git a/build.gradle.kts b/build.gradle.kts index 2dc7926a..5b093e09 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,7 @@ plugins { id("ru.mipt.npm.gradle.project") // kotlin("multiplatform") version "1.5.30-RC" apply false +// kotlin("js") version "1.5.30-RC" apply false } val dataforgeVersion by extra("0.5.1") @@ -33,4 +34,9 @@ ksciencePublish { apiValidation { validationDisabled = true ignoredPackages.add("info.laht.threekt") +} + +//workaround for https://youtrack.jetbrains.com/issue/KT-48273 +rootProject.plugins.withType(org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin::class.java) { + rootProject.the().versions.webpackDevServer.version = "4.0.0-rc.0" } \ No newline at end of file diff --git a/demo/js-playground/build.gradle.kts b/demo/js-playground/build.gradle.kts index 65539554..ccec7015 100644 --- a/demo/js-playground/build.gradle.kts +++ b/demo/js-playground/build.gradle.kts @@ -20,9 +20,9 @@ kotlin{ dependencies{ - implementation(project(":visionforge-gdml")) - implementation(project(":visionforge-plotly")) + implementation(projects.visionforge.visionforgeGdml) + implementation(projects.visionforge.visionforgePlotly) implementation(projects.visionforge.visionforgeMarkdown) - implementation(project(":visionforge-threejs")) - implementation(project(":ui:ring")) + implementation(projects.visionforge.visionforgeThreejs) + implementation(projects.ui.ring) } \ No newline at end of file diff --git a/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt b/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt index db9be953..a1ffa4ff 100644 --- a/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt +++ b/demo/js-playground/src/main/kotlin/JsPlaygroundApp.kt @@ -1,7 +1,4 @@ import kotlinx.browser.document -import kotlinx.coroutines.delay -import kotlinx.coroutines.isActive -import kotlinx.coroutines.launch import kotlinx.css.* import react.child import react.dom.render @@ -12,9 +9,7 @@ import space.kscience.plotly.models.Trace import space.kscience.plotly.scatter import space.kscience.visionforge.Application import space.kscience.visionforge.VisionClient -import space.kscience.visionforge.markup.VisionOfMarkup import space.kscience.visionforge.plotly.PlotlyPlugin -import space.kscience.visionforge.react.flexRow import space.kscience.visionforge.ring.ThreeCanvasWithControls import space.kscience.visionforge.ring.ThreeWithControlsPlugin import space.kscience.visionforge.ring.solid @@ -22,7 +17,6 @@ import space.kscience.visionforge.solid.* import space.kscience.visionforge.startApplication import styled.css import styled.styledDiv -import kotlin.math.sqrt import kotlin.random.Random fun Trace.appendXYLatest(x: Number, y: Number, history: Int = 400, xErr: Number? = null, yErr: Number? = null) { @@ -44,9 +38,6 @@ private class JsPlaygroundApp : Application { val element = document.getElementById("playground") ?: error("Element with id 'playground' not found on page") - val bouncingSphereTrace = Trace() - val bouncingSphereMarkup = VisionOfMarkup() - render(element) { styledDiv { css { @@ -57,72 +48,9 @@ private class JsPlaygroundApp : Application { } SmartTabs("gravity") { Tab("gravity") { - styledDiv { - css { - height = 100.vh - 50.pt - } - styledDiv { - css { - height = 50.vh - } - child(ThreeCanvasWithControls) { - attrs { - context = playgroundContext - solid { - sphere(5.0, "ball") { - detail = 16 - color("red") - val h = 100.0 - y = h - launch { - val g = 10.0 - val dt = 0.1 - var time = 0.0 - var velocity = 0.0 - while (isActive) { - delay(20) - time += dt - velocity -= g * dt - val energy = g * y.toDouble() + velocity * velocity / 2 - y = y.toDouble() + velocity * dt - bouncingSphereTrace.appendXYLatest(time, y) - if (y.toDouble() <= 2.5) { - //conservation of energy - velocity = sqrt(2 * g * h) - } - - bouncingSphereMarkup.content = """ - ## Bouncing sphere parameters - - **velocity** = $velocity - - **energy** = $energy - """.trimIndent() - } - } - } - - box(200, 5, 200, name = "floor") { - y = -2.5 - } - } - } - } - } - flexRow { - css{ - alignContent = Align.stretch - alignItems = Align.stretch - height = 50.vh - 50.pt - } - plotly { - traces(bouncingSphereTrace) - } - Markup { - attrs { - markup = bouncingSphereMarkup - } - } + GravityDemo{ + attrs { + this.context = playgroundContext } } } diff --git a/demo/js-playground/src/main/kotlin/gravityDemo.kt b/demo/js-playground/src/main/kotlin/gravityDemo.kt new file mode 100644 index 00000000..e8ea5856 --- /dev/null +++ b/demo/js-playground/src/main/kotlin/gravityDemo.kt @@ -0,0 +1,103 @@ +import kotlinx.coroutines.delay +import kotlinx.coroutines.isActive +import kotlinx.coroutines.launch +import kotlinx.css.* +import react.RProps +import react.child +import react.functionalComponent +import space.kscience.dataforge.context.Context +import space.kscience.plotly.models.Trace +import space.kscience.visionforge.markup.VisionOfMarkup +import space.kscience.visionforge.react.flexRow +import space.kscience.visionforge.ring.ThreeCanvasWithControls +import space.kscience.visionforge.ring.solid +import space.kscience.visionforge.solid.* +import styled.css +import styled.styledDiv +import kotlin.math.sqrt + +external interface DemoProps : RProps { + var context: Context +} + +val GravityDemo = functionalComponent { props -> + val velocityTrace = Trace{ + name = "velocity" + } + val energyTrace = Trace{ + name = "energy" + } + val markup = VisionOfMarkup() + + styledDiv { + css { + height = 100.vh - 50.pt + } + styledDiv { + css { + height = 50.vh + } + child(ThreeCanvasWithControls) { + attrs { + context = props.context + solid { + sphere(5.0, "ball") { + detail = 16 + color("red") + val h = 100.0 + y = h + context.launch { + val g = 10.0 + val dt = 0.1 + var time = 0.0 + var velocity = 0.0 + while (isActive) { + delay(20) + time += dt + velocity -= g * dt + val energy = g * y.toDouble() + velocity * velocity / 2 + y = y.toDouble() + velocity * dt + + velocityTrace.appendXYLatest(time, y) + energyTrace.appendXYLatest(time, energy) + + if (y.toDouble() <= 2.5) { + //conservation of energy + velocity = sqrt(2 * g * h) + } + + markup.content = """ + ## Bouncing sphere parameters + + **velocity** = $velocity + + **energy** = $energy + """.trimIndent() + } + } + } + + box(200, 5, 200, name = "floor") { + y = -2.5 + } + } + } + } + } + flexRow { + css { + alignContent = Align.stretch + alignItems = Align.stretch + height = 50.vh - 50.pt + } + plotly { + traces(velocityTrace) + } + Markup { + attrs { + this.markup = markup + } + } + } + } +} \ No newline at end of file diff --git a/demo/js-playground/src/main/kotlin/markupComponent.kt b/demo/js-playground/src/main/kotlin/markupComponent.kt index 73c7da29..5a5f6df2 100644 --- a/demo/js-playground/src/main/kotlin/markupComponent.kt +++ b/demo/js-playground/src/main/kotlin/markupComponent.kt @@ -46,7 +46,7 @@ val Markup = functionalComponent("Markup") { props -> width = 100.pct height = 100.pct border(2.pt, BorderStyle.solid, Color.blue) - padding(8.pt) + padding(left = 8.pt) backgroundColor = Color.white flex(1.0) zIndex = 10000 diff --git a/demo/playground/build.gradle.kts b/demo/playground/build.gradle.kts index 68ea5f9a..a89fe123 100644 --- a/demo/playground/build.gradle.kts +++ b/demo/playground/build.gradle.kts @@ -51,24 +51,24 @@ kotlin { sourceSets { val commonMain by getting { dependencies { - api(project(":visionforge-solid")) - api(project(":visionforge-gdml")) - api(project(":visionforge-plotly")) + implementation(project(":visionforge-solid")) + implementation(project(":visionforge-gdml")) + implementation(project(":visionforge-plotly")) + implementation(projects.visionforge.visionforgeMarkdown) } } val jsMain by getting{ dependencies { implementation(project(":ui:ring")) - api(project(":visionforge-threejs")) + implementation(project(":visionforge-threejs")) } } val jvmMain by getting{ dependencies { - api(project(":visionforge-server")) - api(project(":visionforge-markdown")) - api("ch.qos.logback:logback-classic:1.2.3") + implementation(project(":visionforge-server")) + implementation("ch.qos.logback:logback-classic:1.2.3") implementation("com.github.Ricky12Awesome:json-schema-serialization:0.6.6") } } diff --git a/demo/playground/src/jsMain/kotlin/playgroundMain.kt b/demo/playground/src/jsMain/kotlin/playgroundMain.kt index 71431841..0ea9abe5 100644 --- a/demo/playground/src/jsMain/kotlin/playgroundMain.kt +++ b/demo/playground/src/jsMain/kotlin/playgroundMain.kt @@ -1,10 +1,12 @@ import space.kscience.dataforge.misc.DFExperimental +import space.kscience.visionforge.markup.MarkupPlugin import space.kscience.visionforge.plotly.PlotlyPlugin import space.kscience.visionforge.ring.ThreeWithControlsPlugin import space.kscience.visionforge.runVisionClient @DFExperimental fun main() = runVisionClient { - plugin(PlotlyPlugin) plugin(ThreeWithControlsPlugin) + plugin(PlotlyPlugin) + plugin(MarkupPlugin) } \ No newline at end of file diff --git a/ui/ring/build.gradle.kts b/ui/ring/build.gradle.kts index 84b4112f..53dee008 100644 --- a/ui/ring/build.gradle.kts +++ b/ui/ring/build.gradle.kts @@ -17,13 +17,8 @@ kotlin{ dependencies{ api(project(":ui:react")) - //api("ru.mipt.npm:ring-ui:0.1.0") api("org.jetbrains.kotlin-wrappers:kotlin-ring-ui") - implementation(npm("@jetbrains/icons", "3.14.1")) - implementation(npm("@jetbrains/ring-ui", "4.0.7")) implementation(npm("core-js","3.12.1")) implementation(npm("file-saver", "2.0.2")) -// compileOnly(npm("url-loader","4.1.1")) -// compileOnly(npm("postcss-loader","5.2.0")) } \ No newline at end of file diff --git a/visionforge-fx/build.gradle.kts b/visionforge-fx/build.gradle.kts index 961d181d..7b522fc4 100644 --- a/visionforge-fx/build.gradle.kts +++ b/visionforge-fx/build.gradle.kts @@ -11,15 +11,11 @@ kscience{ dependencies { api(project(":visionforge-solid")) - api("no.tornado:tornadofx:1.7.20") - api("org.fxyz3d:fxyz3d:0.5.4") { exclude(module = "slf4j-simple") } - api("org.jetbrains.kotlinx:kotlinx-coroutines-javafx:${ru.mipt.npm.gradle.KScienceVersions.coroutinesVersion}") - implementation("eu.mihosoft.vrl.jcsg:jcsg:0.5.7") { exclude(module = "slf4j-simple") } From a15afb3d52cb9c1e9e46c2b4d831f1eb1e8cf380 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 18 Aug 2021 15:29:02 +0300 Subject: [PATCH 051/109] Fix width in GDML demo --- .../space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt index 2bad5e8d..4c4fc43c 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt @@ -3,9 +3,7 @@ package space.kscience.visionforge.gdml.demo import kotlinx.browser.window import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.Deferred -import kotlinx.css.height -import kotlinx.css.pt -import kotlinx.css.vh +import kotlinx.css.* import org.w3c.files.File import org.w3c.files.FileReader import org.w3c.files.get @@ -71,6 +69,7 @@ val GDMLApp = functionalComponent("GDMLApp") { props -> styledDiv { css { height = 100.vh - 12.pt + width = 100.vw } child(ThreeCanvasWithControls) { attrs { From f00408166b4a6f06b9e54eb89dd85805ae5e4c44 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 18 Aug 2021 15:58:38 +0300 Subject: [PATCH 052/109] Rename inheritance to inheritance.md --- docs/{inheritance => inheritance.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename docs/{inheritance => inheritance.md} (97%) diff --git a/docs/inheritance b/docs/inheritance.md similarity index 97% rename from docs/inheritance rename to docs/inheritance.md index 6063d63c..c156bbda 100644 --- a/docs/inheritance +++ b/docs/inheritance.md @@ -65,4 +65,4 @@ Properties, which can or cannot be inherited, are these: ![](../docs/images/inheritance-2-2-5.png) * `rotation` - rotation of an element. Here, it is set by `x` value. It is inheritable and unable to be changed in `children` elements. -* `position` - position of an element, cannot be inherited. \ No newline at end of file +* `position` - position of an element, cannot be inherited. From b79265e8c2fd0eb59c3ad50973f19fdd883c6ff9 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 18 Aug 2021 23:02:17 +0300 Subject: [PATCH 053/109] WIP Root object model --- build.gradle.kts | 8 +- cern-root-loader/build.gradle.kts | 19 +++ .../kotlin/ru/mipt/npm/root/RootModel.kt | 25 ++++ .../kotlin/ru/mipt/npm/root/TGeoHMatrix.kt | 33 ++++++ .../kotlin/ru/mipt/npm/root/TGeoManager.kt | 30 +++++ .../kotlin/ru/mipt/npm/root/TGeoMaterial.kt | 9 ++ .../kotlin/ru/mipt/npm/root/TGeoMedium.kt | 10 ++ .../kotlin/ru/mipt/npm/root/TGeoNode.kt | 17 +++ .../kotlin/ru/mipt/npm/root/TGeoShape.kt | 80 +++++++++++++ .../kotlin/ru/mipt/npm/root/TGeoVolume.kt | 22 ++++ .../kotlin/ru/mipt/npm/root/TObject.kt | 22 ++++ .../src/main/kotlin/gravityDemo.kt | 6 +- .../src/main/kotlin/markupComponent.kt | 2 +- settings.gradle.kts | 1 + .../ThreeViewWithControls.kt | 8 +- visionforge-gdml/build.gradle.kts | 1 - .../visionforge/gdml/GdmlLoaderOptions.kt | 95 +++++++++++++++ .../{GdmlTransformer.kt => gdmlLoader.kt} | 110 ++---------------- .../kscience/visionforge/gdml/gdmlJVM.kt | 2 +- 19 files changed, 390 insertions(+), 110 deletions(-) create mode 100644 cern-root-loader/build.gradle.kts create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/RootModel.kt create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoHMatrix.kt create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMaterial.kt create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMedium.kt create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt create mode 100644 visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlLoaderOptions.kt rename visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/{GdmlTransformer.kt => gdmlLoader.kt} (80%) diff --git a/build.gradle.kts b/build.gradle.kts index 5b093e09..505c349c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -36,7 +36,9 @@ apiValidation { ignoredPackages.add("info.laht.threekt") } -//workaround for https://youtrack.jetbrains.com/issue/KT-48273 -rootProject.plugins.withType(org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin::class.java) { - rootProject.the().versions.webpackDevServer.version = "4.0.0-rc.0" + +afterEvaluate { + extensions.configure { + versions.webpackDevServer.version = "4.0.0" + } } \ No newline at end of file diff --git a/cern-root-loader/build.gradle.kts b/cern-root-loader/build.gradle.kts new file mode 100644 index 00000000..fa26fab5 --- /dev/null +++ b/cern-root-loader/build.gradle.kts @@ -0,0 +1,19 @@ +plugins { + id("ru.mipt.npm.gradle.mpp") +} + +kscience{ + useSerialization { + json() + } +} + +kotlin { + sourceSets { + val commonMain by getting { + dependencies { + api(project(":visionforge-solid")) + } + } + } +} \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/RootModel.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/RootModel.kt new file mode 100644 index 00000000..8f53d71f --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/RootModel.kt @@ -0,0 +1,25 @@ +package ru.mipt.npm.root + +import kotlin.properties.PropertyDelegateProvider +import kotlin.reflect.KType +import kotlin.reflect.typeOf + +public interface RootValueProvider { + /** + * Provide a member cast or reinterpreted to given type. + * Returns null if member with given name/type could not be resolved. + */ + public fun provideOrNull(name: String, type: KType): T? +} + +public interface RootModel { + public val provider: RootValueProvider +} + +public inline fun RootValueProvider.provide(name: String): T = + provideOrNull(name, typeOf()) ?: error("A member with type ${T::class} and name $name could not be resolved") + +public inline fun RootModel.member(name: String? = null): PropertyDelegateProvider> = + PropertyDelegateProvider { _, property -> + lazy { provider.provide(name ?: property.name) } + } diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoHMatrix.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoHMatrix.kt new file mode 100644 index 00000000..f70e9a24 --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoHMatrix.kt @@ -0,0 +1,33 @@ +package ru.mipt.npm.root + +import kotlinx.serialization.Serializable + + +@Serializable +public sealed class TGeoMatrix : TNamed() + +@Serializable +public class TGeoIdentity : TGeoMatrix() + +@Serializable +public class TGeoHMatrix( + public val fTranslation: DoubleArray, + public val fRotationMatrix: DoubleArray, + public val fScale: DoubleArray +) : TGeoMatrix() + +@Serializable +public class TGeoTranslation( + public val fTranslation: DoubleArray +) : TGeoMatrix() + +@Serializable +public class TGeoRotation( + public val fRotationMatrix: DoubleArray +): TGeoMatrix() + +@Serializable +public class TGeoCombiTrans( + public val fTranslation: DoubleArray, + public val fRotation: TGeoRotation? = null, +): TGeoMatrix() \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt new file mode 100644 index 00000000..2dcf5598 --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt @@ -0,0 +1,30 @@ +package ru.mipt.npm.root + +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonObject + +@Serializable +public class TGeoManager : TNamed() { + + public val fMatrices: TObjArray = TObjArray.empty + public val fShapes: TObjArray = TObjArray.empty + public val fVolumes: TObjArray = TObjArray.empty + + + companion object { + public val rootJson: Json = Json { + encodeDefaults = true + ignoreUnknownKeys = true + classDiscriminator = "_typename" + } + + + /** + * Load Json encoded TGeoManager + */ + public fun decodeFromJson(jsonObject: JsonObject): TGeoManager = TODO() + } +} + + diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMaterial.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMaterial.kt new file mode 100644 index 00000000..9094d721 --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMaterial.kt @@ -0,0 +1,9 @@ +package ru.mipt.npm.root + +import kotlinx.serialization.Serializable + +@Serializable +public open class TGeoMaterial: TNamed() + +@Serializable +public class TGeoMixture: TGeoMaterial() \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMedium.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMedium.kt new file mode 100644 index 00000000..196c209c --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMedium.kt @@ -0,0 +1,10 @@ +package ru.mipt.npm.root + +import kotlinx.serialization.Serializable + +@Serializable +public class TGeoMedium( + public val fId : Int, + public val fMaterial: TGeoMaterial, + public val fParams: DoubleArray +): TNamed() \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt new file mode 100644 index 00000000..2793773f --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt @@ -0,0 +1,17 @@ +package ru.mipt.npm.root + +import kotlinx.serialization.Serializable + +@Serializable +public class TGeoNode : TNamed() { + //val fGeoAtt: UInt + public val fVolume: TGeoVolume? = null + public val fMother: TGeoVolume? = null + public val fNumber: Int = 0 + public val fNovlp: Int = 0 + public val fOverlaps: IntArray = intArrayOf() +} + +public class TGeoNodeMatrix : TGeoMatrix() { + public val fMatrix: TGeoMatrix? = null +} \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt new file mode 100644 index 00000000..344f5e6f --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt @@ -0,0 +1,80 @@ +package ru.mipt.npm.root + +import kotlinx.serialization.Serializable + +@Serializable +public abstract class TGeoShape : TNamed() { + public val fShapeBits: UInt = 0u + public val fShapeId: Int = 0 +} + +@Serializable +public open class TGeoBBox : TGeoShape() { + public val fDX: Double = 0.0 + public val fDY: Double = 0.0 + public val fDZ: Double = 0.0 + public val fOrigin: DoubleArray = doubleArrayOf(0.0, 0.0, 0.0) +} + +@Serializable +public sealed class TGeoBoolNode : TObject() { + public abstract val fLeft: TGeoShape + public abstract val fLeftMat: TGeoMatrix + public abstract val fRight: TGeoShape + public abstract val fRightMat: TGeoMatrix +} + +@Serializable +public class TGeoUnion( + override val fLeft: TGeoShape, + override val fLeftMat: TGeoMatrix, + override val fRight: TGeoShape, + override val fRightMat: TGeoMatrix +) : TGeoBoolNode() + +@Serializable +public class TGeoSubtraction( + override val fLeft: TGeoShape, + override val fLeftMat: TGeoMatrix, + override val fRight: TGeoShape, + override val fRightMat: TGeoMatrix +) : TGeoBoolNode() + +@Serializable +public class TGeoIntersection( + override val fLeft: TGeoShape, + override val fLeftMat: TGeoMatrix, + override val fRight: TGeoShape, + override val fRightMat: TGeoMatrix +) : TGeoBoolNode() + + +@Serializable +public class TGeoCompositeShape(public val fNode: TGeoBoolNode) : TGeoBBox() + +@Serializable +public class TGeoXtru( + public val fNvert: Int, + public val fNz: Int, + public val fZcurrent: Double, + public val fX: DoubleArray, + public val fY: DoubleArray, + public val fZ: DoubleArray, + public val fScale: DoubleArray, + public val fX0: DoubleArray, + public val fY0: DoubleArray +) : TGeoBBox() + + +@Serializable +public class TGeoTube( + public val fRmin: Double, + public val fRmax: Double, + public val fDz: Double, +) : TGeoBBox() + +@Serializable +public class TGeoShapeAssembly( + public val fVolume: TGeoVolumeAssembly, + public val fBBoxOK: Boolean = true +): TGeoBBox() \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt new file mode 100644 index 00000000..1bd12cbf --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt @@ -0,0 +1,22 @@ +package ru.mipt.npm.root + +import kotlinx.serialization.Serializable + +@Serializable +public open class TGeoVolume : TNamed(){ + // "fGeoAtt" : 3084, +// "fLineColor" : 3, +// "fLineStyle" : 1, +// "fLineWidth" : 1, +// "fFillColor" : 19, +// "fFillStyle" : 1001, + public lateinit var fNodes: TObjArray + public lateinit var fShape: TGeoShape + public lateinit var fMedium: TGeoMedium + public val fNumber: Int = 1 + public val fNtotal: Int = 1 + public val fRefCount: Int = 1 +} + +@Serializable +public class TGeoVolumeAssembly : TGeoVolume() \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt new file mode 100644 index 00000000..fb17d8ac --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt @@ -0,0 +1,22 @@ +package ru.mipt.npm.root + +import kotlinx.serialization.Serializable + +@Serializable +public abstract class TObject { + public val fUniqueID: UInt = 0u + public val fBits: UInt = 0u +} + +@Serializable +public abstract class TNamed : TObject() { + public val fName: String = "" + public val fTitle: String = "" +} + +@Serializable +public class TObjArray(public val arr: List){ + public companion object{ + public val empty = TObjArray(emptyList()) + } +} \ No newline at end of file diff --git a/demo/js-playground/src/main/kotlin/gravityDemo.kt b/demo/js-playground/src/main/kotlin/gravityDemo.kt index e8ea5856..eec16afe 100644 --- a/demo/js-playground/src/main/kotlin/gravityDemo.kt +++ b/demo/js-playground/src/main/kotlin/gravityDemo.kt @@ -6,6 +6,7 @@ import react.RProps import react.child import react.functionalComponent import space.kscience.dataforge.context.Context +import space.kscience.plotly.layout import space.kscience.plotly.models.Trace import space.kscience.visionforge.markup.VisionOfMarkup import space.kscience.visionforge.react.flexRow @@ -91,7 +92,10 @@ val GravityDemo = functionalComponent { props -> height = 50.vh - 50.pt } plotly { - traces(velocityTrace) + traces(velocityTrace,energyTrace) + layout { + xaxis.title = "time" + } } Markup { attrs { diff --git a/demo/js-playground/src/main/kotlin/markupComponent.kt b/demo/js-playground/src/main/kotlin/markupComponent.kt index 5a5f6df2..879ab3df 100644 --- a/demo/js-playground/src/main/kotlin/markupComponent.kt +++ b/demo/js-playground/src/main/kotlin/markupComponent.kt @@ -32,7 +32,7 @@ val Markup = functionalComponent("Markup") { props -> //TODO add new formats via plugins else -> error("Format ${vision.format} not recognized") } - vision.useProperty(VisionOfMarkup::content) { content -> + vision.useProperty(VisionOfMarkup::content) { content: String? -> element.clear() element.append { markdown(flavour) { content ?: "" } diff --git a/settings.gradle.kts b/settings.gradle.kts index d4616ea7..7303d884 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -32,6 +32,7 @@ include( ":visionforge-threejs", ":visionforge-threejs:visionforge-threejs-server", ":visionforge-gdml", + ":cern-root-loader", ":visionforge-server", ":visionforge-plotly", ":visionforge-markdown", diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt index e69b04c9..94f02fdd 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt @@ -13,9 +13,7 @@ import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.NameToken import space.kscience.dataforge.names.isEmpty import space.kscience.dataforge.names.length -import space.kscience.visionforge.Vision -import space.kscience.visionforge.VisionGroup -import space.kscience.visionforge.computeProperties +import space.kscience.visionforge.* import space.kscience.visionforge.react.ThreeCanvasComponent import space.kscience.visionforge.react.flexColumn import space.kscience.visionforge.react.flexRow @@ -85,7 +83,9 @@ public val ThreeCanvasWithControls: FunctionComponent Action = { Action.PROTOTYPE } + public var volumeAction: (GdmlGroup) -> Action = { Action.PROTOTYPE } + + internal val styleCache = HashMap() + + public fun Solid.registerAndUseStyle(name: String, builder: MutableMeta.() -> Unit) { + styleCache.getOrPut(Name.parse(name)) { + Meta(builder) + } + useStyle(name) + } + + public fun Solid.transparent() { + registerAndUseStyle("transparent") { + SolidMaterial.MATERIAL_OPACITY_KEY put 0.3 + "edges.enabled" put true + } + } + + /** + * Configure paint for given solid with given [GdmlMaterial] + */ + public var configurePaint: SolidMaterial.(material: GdmlMaterial, solid: GdmlSolid) -> Unit = + { material, _ -> color(randomColor(material)) } + private set + + public fun paint(block: SolidMaterial.(material: GdmlMaterial, solid: GdmlSolid) -> Unit) { + configurePaint = block + } + + /** + * Configure given solid + */ + public var configureSolid: Solid.(parent: GdmlVolume, solid: GdmlSolid, material: GdmlMaterial) -> Unit = + { parent, solid, material -> + val styleName = "materials.${material.name}" + + if (parent.physVolumes.isNotEmpty()) transparent() + + registerAndUseStyle(styleName) { + val vfMaterial = SolidMaterial().apply { + configurePaint(material, solid) + } + SolidMaterial.MATERIAL_KEY put vfMaterial.toMeta() + "Gdml.material" put material.name + } + } + private set + + public fun configure(block: Solid.(parent: GdmlVolume, solid: GdmlSolid, material: GdmlMaterial) -> Unit) { + val oldConfigure = configureSolid + configureSolid = { parent: GdmlVolume, solid: GdmlSolid, material: GdmlMaterial -> + oldConfigure(parent, solid, material) + block(parent, solid, material) + } + } + + + public companion object { + private val random: Random = Random(222) + + private val colorCache = HashMap() + + /** + * Use random color and cache it based on the material. Meaning that colors are random, but always the same for the + * same material. + */ + public fun randomColor(material: GdmlMaterial): Int { + return colorCache.getOrPut(material) { random.nextInt(16777216) } + } + } +} \ No newline at end of file diff --git a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlTransformer.kt b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt similarity index 80% rename from visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlTransformer.kt rename to visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt index 284d80cf..8eca342c 100644 --- a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlTransformer.kt +++ b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt @@ -1,7 +1,5 @@ package space.kscience.visionforge.gdml -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName @@ -11,10 +9,8 @@ import space.kscience.gdml.* import space.kscience.visionforge.* import space.kscience.visionforge.html.VisionOutput import space.kscience.visionforge.solid.* -import space.kscience.visionforge.solid.SolidMaterial.Companion.MATERIAL_KEY import kotlin.math.cos import kotlin.math.sin -import kotlin.random.Random private val solidsName = "solids".asName() private val volumesName = "volumes".asName() @@ -25,91 +21,7 @@ private inline operator fun Number.times(d: Double) = toDouble() * d @Suppress("NOTHING_TO_INLINE") private inline operator fun Number.times(f: Float) = toFloat() * f -public class GdmlTransformer { - - public enum class Action { - ADD, - REJECT, - PROTOTYPE - } - - public var lUnit: LUnit = LUnit.MM - public var aUnit: AUnit = AUnit.RADIAN - - public var solidAction: (GdmlSolid) -> Action = { Action.PROTOTYPE } - public var volumeAction: (GdmlGroup) -> Action = { Action.PROTOTYPE } - - internal val styleCache = HashMap() - - public fun Solid.registerAndUseStyle(name: String, builder: MutableMeta.() -> Unit) { - styleCache.getOrPut(Name.parse(name)) { - Meta(builder) - } - useStyle(name) - } - - public fun Solid.transparent() { - registerAndUseStyle("transparent") { - SolidMaterial.MATERIAL_OPACITY_KEY put 0.3 - "edges.enabled" put true - } - } - - /** - * Configure paint for given solid with given [GdmlMaterial] - */ - public var configurePaint: SolidMaterial.(material: GdmlMaterial, solid: GdmlSolid) -> Unit = - { material, _ -> color(randomColor(material)) } - private set - - public fun paint(block: SolidMaterial.(material: GdmlMaterial, solid: GdmlSolid) -> Unit) { - configurePaint = block - } - - /** - * Configure given solid - */ - public var configureSolid: Solid.(parent: GdmlVolume, solid: GdmlSolid, material: GdmlMaterial) -> Unit = - { parent, solid, material -> - val styleName = "materials.${material.name}" - - if (parent.physVolumes.isNotEmpty()) transparent() - - registerAndUseStyle(styleName) { - val vfMaterial = SolidMaterial().apply { - configurePaint(material, solid) - } - MATERIAL_KEY put vfMaterial.toMeta() - "Gdml.material" put material.name - } - } - private set - - public fun configure(block: Solid.(parent: GdmlVolume, solid: GdmlSolid, material: GdmlMaterial) -> Unit) { - val oldConfigure = configureSolid - configureSolid = { parent: GdmlVolume, solid: GdmlSolid, material: GdmlMaterial -> - oldConfigure(parent, solid, material) - block(parent, solid, material) - } - } - - - public companion object { - private val random: Random = Random(222) - - private val colorCache = HashMap() - - /** - * Use random color and cache it based on the material. Meaning that colors are random, but always the same for the - * same material. - */ - public fun randomColor(material: GdmlMaterial): Int { - return colorCache.getOrPut(material) { random.nextInt(16777216) } - } - } -} - -private class GdmlTransformerEnv(val settings: GdmlTransformer) { +private class GdmlLoader(val settings: GdmlLoaderOptions) { //private val materialCache = HashMap() /** @@ -356,13 +268,13 @@ private class GdmlTransformerEnv(val settings: GdmlTransformer) { ): Solid? { require(name != "") { "Can't use empty solid name. Use null instead." } return when (settings.solidAction(solid)) { - GdmlTransformer.Action.ADD -> { + GdmlLoaderOptions.Action.ADD -> { addSolid(root, solid, name) } - GdmlTransformer.Action.PROTOTYPE -> { + GdmlLoaderOptions.Action.PROTOTYPE -> { proxySolid(root, this, solid, name ?: solid.name) } - GdmlTransformer.Action.REJECT -> { + GdmlLoaderOptions.Action.REJECT -> { //ignore null } @@ -388,14 +300,14 @@ private class GdmlTransformerEnv(val settings: GdmlTransformer) { } when (settings.volumeAction(volume)) { - GdmlTransformer.Action.ADD -> { + GdmlLoaderOptions.Action.ADD -> { val group: SolidGroup = volume(root, volume) this[physVolume.name] = group.withPosition(root, physVolume) } - GdmlTransformer.Action.PROTOTYPE -> { + GdmlLoaderOptions.Action.PROTOTYPE -> { proxyVolume(root, this, physVolume, volume) } - GdmlTransformer.Action.REJECT -> { + GdmlLoaderOptions.Action.REJECT -> { //ignore } } @@ -460,16 +372,16 @@ private class GdmlTransformerEnv(val settings: GdmlTransformer) { } -public fun Gdml.toVision(block: GdmlTransformer.() -> Unit = {}): SolidGroup { - val settings = GdmlTransformer().apply(block) - val context = GdmlTransformerEnv(settings) +public fun Gdml.toVision(block: GdmlLoaderOptions.() -> Unit = {}): SolidGroup { + val settings = GdmlLoaderOptions().apply(block) + val context = GdmlLoader(settings) return context.transform(this) } /** * Append Gdml node to the group */ -public fun SolidGroup.gdml(gdml: Gdml, key: String? = null, transformer: GdmlTransformer.() -> Unit = {}) { +public fun SolidGroup.gdml(gdml: Gdml, key: String? = null, transformer: GdmlLoaderOptions.() -> Unit = {}) { val visual = gdml.toVision(transformer) //println(Visual3DPlugin.json.stringify(VisualGroup3D.serializer(), visual)) set(key, visual) diff --git a/visionforge-gdml/src/jvmMain/kotlin/space/kscience/visionforge/gdml/gdmlJVM.kt b/visionforge-gdml/src/jvmMain/kotlin/space/kscience/visionforge/gdml/gdmlJVM.kt index b67e231e..ed854100 100644 --- a/visionforge-gdml/src/jvmMain/kotlin/space/kscience/visionforge/gdml/gdmlJVM.kt +++ b/visionforge-gdml/src/jvmMain/kotlin/space/kscience/visionforge/gdml/gdmlJVM.kt @@ -9,7 +9,7 @@ public fun SolidGroup.gdml( file: Path, key: String = "", usePreprocessor: Boolean = false, - transformer: GdmlTransformer.() -> Unit = {}, + transformer: GdmlLoaderOptions.() -> Unit = {}, ) { val gdml = Gdml.decodeFromFile(file, usePreprocessor) gdml(gdml, key, transformer) From 6ff3a0427822d8aab113e07caf6e563de35c64b8 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Thu, 19 Aug 2021 09:56:20 +0300 Subject: [PATCH 054/109] WIP Root object model --- .../kotlin/ru/mipt/npm/root/TGeoManager.kt | 49 +- .../src/commonTest/resources/BM@N.root.json | 26920 ++++++++++++++++ 2 files changed, 26961 insertions(+), 8 deletions(-) create mode 100644 cern-root-loader/src/commonTest/resources/BM@N.root.json diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt index 2dcf5598..26517477 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt @@ -1,8 +1,9 @@ package ru.mipt.npm.root -import kotlinx.serialization.Serializable +import kotlinx.serialization.* import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonObject +import kotlinx.serialization.modules.SerializersModule @Serializable public class TGeoManager : TNamed() { @@ -10,14 +11,9 @@ public class TGeoManager : TNamed() { public val fMatrices: TObjArray = TObjArray.empty public val fShapes: TObjArray = TObjArray.empty public val fVolumes: TObjArray = TObjArray.empty - - companion object { - public val rootJson: Json = Json { - encodeDefaults = true - ignoreUnknownKeys = true - classDiscriminator = "_typename" - } + + public companion object { /** @@ -27,4 +23,41 @@ public class TGeoManager : TNamed() { } } +@OptIn(ExperimentalSerializationApi::class) +private class RootJsonSerialFormat : StringFormat { + override val serializersModule: SerializersModule get() = json.serializersModule + + private val refCache: HashMap = HashMap() + + override fun decodeFromString(deserializer: DeserializationStrategy, string: String): T { + val match = refRegex.matchEntire(string) + return if (match != null) { + //Do unref + val ref = match.value.toUIntOrNull() ?: error("Ref value is not a number") + val refValue = refCache[ref] ?: error("Reference $ref unresolved") + refValue as T //TODO research means to make it safe + } else { + val res = json.decodeFromString(deserializer, string) + val uid = (res as? TObject)?.fUniqueID + if (uid != null && refCache[uid] == null) { + refCache[uid] = res + } + res + } + } + + override fun encodeToString(serializer: SerializationStrategy, value: T): String = + json.encodeToString(serializer, value) + + companion object { + val refRegex = """\{\s*"${"\\$"}ref"\s*:\s*(\d*)}""".toRegex() + + val json: Json = Json { + encodeDefaults = true + ignoreUnknownKeys = true + classDiscriminator = "_typename" + } + } + +} diff --git a/cern-root-loader/src/commonTest/resources/BM@N.root.json b/cern-root-loader/src/commonTest/resources/BM@N.root.json new file mode 100644 index 00000000..9058d156 --- /dev/null +++ b/cern-root-loader/src/commonTest/resources/BM@N.root.json @@ -0,0 +1,26920 @@ +{ + "_typename" : "TGeoManager", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "FAIRGeom", + "fTitle" : "FAIR geometry", + "fNNodes" : 413815, + "fVisDensity" : 0, + "fExplodedView" : 0, + "fVisOption" : 1, + "fVisLevel" : 3, + "fNsegments" : 20, + "fNtracks" : 0, + "fMaxVisNodes" : 10000, + "fNpdg" : 257, + "fPdgId" : [1, -1, 2, -2, 3, -3, 4, -4, 5, -5, 6, -6, 7, -7, 8, -8, 11, -11, 12, -12, 13, -13, 14, -14, 15, -15, 16, -16, 17, -17, 18, -18, 21, 22, 23, 24, -24, 25, 28, 29, 32, 33, 34, -34, 35, 36, 37, -37, 38, 39, -39, 40, -40, 51, 52, -52, 53, 54, 55, -55, 56, 61, -61, 62, -62, 63, -63, 64, -64, 65, -65, 66, -66, 81, 82, -82, 83, 84, -84, 85, -85, 91, 92, 93, 94, 95, 96, 97, 98, 99, 110, 111, 113, 115, 130, 210, -210, 211, -211, 213, -213, 215, -215, 220, 221, 223, 225, 310, 311, -311, 313, -313, 315, -315, 321, -321, 323, -323, 325, -325, 330, 331, 333, 335, 411, -411, 413, -413, 415, -415, 421, -421, 423, -423, 425, -425, 431, -431, 433, -433, 435, -435, 440, 441, 443, 445, 511, -511, 513, -513, 515, -515, 521, -521, 523, -523, 525, -525, 531, -531, 533, -533, 535, -535, 541, -541, 543, -543, 545, -545, 551, 553, 555, 1103, -1103, 1114, -1114, 2101, -2101, 2103, -2103, 2110, -2110, 2112, -2112, 2114, -2114, 2203, -2203, 2210, -2210, 2212, -2212, 2214, -2214, 2224, -2224, 3101, -3101, 3103, -3103, 3112, -3112, 3114, -3114, 3122, -3122, 3201, -3201, 3203, -3203, 3212, -3212, 3214, -3214, 3222, -3222, 3224, -3224, 3303, -3303, 3312, -3312, 3314, -3314, 3322, -3322, 3324, -3324, 3334, -3334, 4101, -4101, 4103, -4103, 4112, -4112, 4114, -4114, 4122, -4122, 4132, -4132, 4201, -4201, 4203, -4203, 4212, -4212, 4214, -4214, 4222, -4222, 4224, -4224, 4232, -4232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fStreamVoxels" : false, + "fPhiCut" : false, + "fTimeCut" : false, + "fMatrices" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoIdentity", + "fUniqueID" : 1, + "fBits" : 52428800, + "fName" : "Identity", + "fTitle" : "" + }, { + "_typename" : "TGeoHMatrix", + "fUniqueID" : 2, + "fBits" : 52428800, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 0], + "fRotationMatrix" : [1, 0, 0, 0, 1, 0, 0, 0, 1], + "fScale" : [1, 1, 1] + }, { + "_typename" : "TGeoIdentity", + "fUniqueID" : 3, + "fBits" : 52428800, + "fName" : "Identity", + "fTitle" : "" + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 4, + "fBits" : 52559872, + "fName" : "t5", + "fTitle" : "", + "fTranslation" : [0, -7.13984375, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 5, + "fBits" : 52559872, + "fName" : "t9", + "fTitle" : "", + "fTranslation" : [0, -4.7421875, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 6, + "fBits" : 52559872, + "fName" : "GlassLayer1PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [0, 0, -0.475] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 7, + "fBits" : 52559872, + "fName" : "GlassLayer2PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [0, 0, 0.219] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 8, + "fBits" : 52559872, + "fName" : "G10LayerPosTOF2_trans", + "fTitle" : "", + "fTranslation" : [0, 0, 0.642] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 9, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [45, 0, 1052.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 10, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [7.2, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 11, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [3.65, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 12, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -50.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 13, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 50.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 14, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -50.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 15, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 50.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 16, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -49.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 17, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [7.2, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 18, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -48.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 19, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [7.2, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 20, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -49.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 21, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [3.55, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 22, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -48.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 23, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -47.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 24, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -47] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 25, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -47.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 26, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -47] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 27, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -46.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 28, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -45.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 29, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -46.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 30, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -45.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 31, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -44.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 32, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -44] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 33, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -44.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 34, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -44] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 35, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -43.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 36, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -42.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 37, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -43.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 38, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -42.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 39, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -41.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 40, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -41] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 41, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -41.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 42, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -41] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 43, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -40.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 44, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -39.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 45, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -40.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 46, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -39.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 47, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -38.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 48, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -38] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 49, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -38.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 50, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -38] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 51, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -37.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 52, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -36.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 53, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -37.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 54, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -36.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 55, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -35.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 56, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -35] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 57, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -35.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 58, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -35] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 59, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -34.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 60, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -33.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 61, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -34.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 62, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -33.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 63, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -32.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 64, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -32] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 65, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -32.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 66, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -32] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 67, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -31.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 68, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -30.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 69, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -31.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 70, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -30.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 71, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -29.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 72, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -29] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 73, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -29.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 74, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -29] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 75, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -28.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 76, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -27.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 77, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -28.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 78, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -27.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 79, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -26.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 80, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -26] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 81, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -26.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 82, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -26] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 83, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -25.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 84, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -24.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 85, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -25.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 86, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -24.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 87, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -23.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 88, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -23] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 89, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -23.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 90, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -23] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 91, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -22.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 92, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -21.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 93, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -22.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 94, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -21.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 95, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -20.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 96, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -20] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 97, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -20.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 98, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -20] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 99, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -19.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 100, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -18.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 101, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -19.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 102, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -18.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 103, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -17.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 104, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -17] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 105, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -17.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 106, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -17] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 107, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -16.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 108, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -15.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 109, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -16.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 110, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -15.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 111, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -14.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 112, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -14] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 113, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -14.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 114, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -14] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 115, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -13.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 116, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -12.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 117, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -13.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 118, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -12.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 119, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -11.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 120, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -11] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 121, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -11.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 122, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -11] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 123, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -10.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 124, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -9.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 125, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -10.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 126, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -9.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 127, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -8.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 128, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -8] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 129, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -8.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 130, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -8] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 131, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -7.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 132, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -6.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 133, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -7.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 134, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -6.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 135, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -5.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 136, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 137, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -5.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 138, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 139, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -4.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 140, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -3.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 141, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -4.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 142, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -3.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 143, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -2.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 144, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -2] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 145, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -2.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 146, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -2] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 147, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -1.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 148, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -0.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 149, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -1.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 150, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -0.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 151, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 0.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 152, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 1] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 153, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 0.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 154, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 1] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 155, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 1.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 156, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 2.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 157, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 1.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 158, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 2.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 159, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 3.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 160, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 4] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 161, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 3.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 162, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 4] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 163, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 4.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 164, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 5.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 165, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 4.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 166, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 5.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 167, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 6.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 168, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 7] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 169, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 6.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 170, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 7] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 171, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 7.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 172, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 8.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 173, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 7.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 174, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 8.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 175, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 9.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 176, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 10] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 177, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 9.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 178, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 10] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 179, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 10.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 180, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 11.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 181, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 10.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 182, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 11.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 183, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 12.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 184, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 13] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 185, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 12.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 186, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 13] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 187, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 13.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 188, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 14.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 189, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 13.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 190, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 14.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 191, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 15.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 192, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 16] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 193, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 15.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 194, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 16] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 195, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 16.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 196, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 17.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 197, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 16.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 198, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 17.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 199, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 18.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 200, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 19] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 201, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 18.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 202, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 19] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 203, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 19.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 204, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 20.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 205, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 19.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 206, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 20.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 207, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 21.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 208, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 22] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 209, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 21.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 210, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 22] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 211, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 22.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 212, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 23.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 213, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 22.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 214, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 23.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 215, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 24.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 216, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 217, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 24.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 218, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 219, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 25.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 220, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 26.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 221, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 25.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 222, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 26.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 223, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 27.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 224, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 28] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 225, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 27.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 226, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 28] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 227, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 28.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 228, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 29.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 229, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 28.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 230, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 29.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 231, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 30.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 232, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 31] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 233, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 30.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 234, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 31] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 235, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 31.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 236, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 32.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 237, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 31.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 238, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 32.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 239, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 33.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 240, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 34] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 241, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 33.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 242, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 34] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 243, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 34.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 244, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 35.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 245, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 34.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 246, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 35.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 247, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 36.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 248, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 37] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 249, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 36.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 250, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 37] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 251, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 37.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 252, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 38.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 253, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 37.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 254, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 38.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 255, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 39.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 256, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 40] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 257, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 39.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 258, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 40] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 259, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 40.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 260, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 41.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 261, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 40.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 262, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 41.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 263, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 42.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 264, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 43] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 265, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 42.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 266, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 43] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 267, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 43.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 268, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 44.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 269, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 43.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 270, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 44.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 271, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 45.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 272, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 46] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 273, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 45.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 274, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 46] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 275, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 46.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 276, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 47.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 277, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 46.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 278, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 47.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 279, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 48.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 280, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 49] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 281, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 48.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 282, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 49] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 283, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-75, -45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 284, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-60, -45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 285, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-45, -45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 286, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-30, -45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 287, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-15, -45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 288, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, -45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 289, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [15, -45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 290, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [30, -45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 291, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [45, -45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 292, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [60, -45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 293, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [75, -45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 294, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-75, -30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 295, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-60, -30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 296, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-45, -30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 297, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-30, -30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 298, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-15, -30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 299, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, -30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 300, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [15, -30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 301, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [30, -30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 302, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [45, -30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 303, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [60, -30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 304, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [75, -30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 305, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-75, -15, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 306, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-60, -15, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 307, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-45, -15, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 308, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-30, -15, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 309, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-18.75, -18.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 310, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-11.25, -18.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 311, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-18.75, -11.25, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 312, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-11.25, -11.25, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 313, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-3.75, -18.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 314, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [3.75, -18.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 315, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-3.75, -11.25, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 316, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [3.75, -11.25, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 317, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [11.25, -18.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 318, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [18.75, -18.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 319, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [11.25, -11.25, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 320, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [18.75, -11.25, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 321, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [30, -15, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 322, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [45, -15, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 323, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [60, -15, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 324, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [75, -15, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 325, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-75, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 326, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-60, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 327, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-45, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 328, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-30, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 329, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-18.75, -3.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 330, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-11.25, -3.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 331, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-18.75, 3.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 332, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-11.25, 3.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 333, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-3.75, -3.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 334, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-3.75, 3.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 335, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [18.75, -3.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 336, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [18.75, 3.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 337, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [30, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 338, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [45, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 339, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [60, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 340, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [75, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 341, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-75, 15, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 342, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-60, 15, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 343, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-45, 15, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 344, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-30, 15, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 345, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-18.75, 11.25, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 346, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-11.25, 11.25, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 347, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-18.75, 18.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 348, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-11.25, 18.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 349, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-3.75, 11.25, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 350, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [3.75, 11.25, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 351, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-3.75, 18.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 352, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [3.75, 18.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 353, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [11.25, 11.25, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 354, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [18.75, 11.25, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 355, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [11.25, 18.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 356, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [18.75, 18.75, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 357, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [30, 15, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 358, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [45, 15, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 359, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [60, 15, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 360, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [75, 15, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 361, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-75, 30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 362, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-60, 30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 363, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-45, 30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 364, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-30, 30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 365, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-15, 30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 366, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 367, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [15, 30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 368, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [30, 30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 369, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [45, 30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 370, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [60, 30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 371, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [75, 30, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 372, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-75, 45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 373, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-60, 45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 374, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-45, 45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 375, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-30, 45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 376, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-15, 45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 377, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 378, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [15, 45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 379, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [30, 45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 380, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [45, 45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 381, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [60, 45, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 382, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [75, 45, 0] + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 383, + "fBits" : 52559872, + "fName" : "t383", + "fTitle" : "", + "fTranslation" : [35.5, 0, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 384, + "fBits" : 52559872, + "fName" : "t383", + "fTitle" : "", + "fTranslation" : [-35.5, 0, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 385, + "fBits" : 52559872, + "fName" : "t383", + "fTitle" : "", + "fTranslation" : [0, 22.375, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 386, + "fBits" : 52559872, + "fName" : "t383", + "fTitle" : "", + "fTranslation" : [0, -22.375, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 387, + "fBits" : 52559872, + "fName" : "t383", + "fTitle" : "", + "fTranslation" : [0, 0, 0.45], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 388, + "fBits" : 52559872, + "fName" : "t383", + "fTitle" : "", + "fTranslation" : [0, 0, 0.45], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 389, + "fBits" : 52559872, + "fName" : "t389", + "fTitle" : "", + "fTranslation" : [35.5, 0, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 390, + "fBits" : 52559872, + "fName" : "t389", + "fTitle" : "", + "fTranslation" : [-35.5, 0, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 391, + "fBits" : 52559872, + "fName" : "t389", + "fTitle" : "", + "fTranslation" : [0, 22.375, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 392, + "fBits" : 52559872, + "fName" : "t389", + "fTitle" : "", + "fTranslation" : [0, -22.375, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 393, + "fBits" : 52559872, + "fName" : "t389", + "fTitle" : "", + "fTranslation" : [0, 0, 0.45], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 394, + "fBits" : 52559872, + "fName" : "t389", + "fTitle" : "", + "fTranslation" : [0, 0, 0.45], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 395, + "fBits" : 52559872, + "fName" : "t395", + "fTitle" : "", + "fTranslation" : [35.5, 0, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 396, + "fBits" : 52559872, + "fName" : "t395", + "fTitle" : "", + "fTranslation" : [-35.5, 0, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 397, + "fBits" : 52559872, + "fName" : "t395", + "fTitle" : "", + "fTranslation" : [0, 22.375, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 398, + "fBits" : 52559872, + "fName" : "t395", + "fTitle" : "", + "fTranslation" : [0, -22.375, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 399, + "fBits" : 52559872, + "fName" : "t395", + "fTitle" : "", + "fTranslation" : [0, 0, 0.45], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 400, + "fBits" : 52559872, + "fName" : "t395", + "fTitle" : "", + "fTranslation" : [0, 0, 0.45], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 401, + "fBits" : 52559872, + "fName" : "t401", + "fTitle" : "", + "fTranslation" : [35.5, 0, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 402, + "fBits" : 52559872, + "fName" : "t401", + "fTitle" : "", + "fTranslation" : [-35.5, 0, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 403, + "fBits" : 52559872, + "fName" : "t401", + "fTitle" : "", + "fTranslation" : [0, 22.375, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 404, + "fBits" : 52559872, + "fName" : "t401", + "fTitle" : "", + "fTranslation" : [0, -22.375, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 405, + "fBits" : 52559872, + "fName" : "t405", + "fTitle" : "", + "fTranslation" : [35.5, 0, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 406, + "fBits" : 52559872, + "fName" : "t405", + "fTitle" : "", + "fTranslation" : [-35.5, 0, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 407, + "fBits" : 52559872, + "fName" : "t405", + "fTitle" : "", + "fTranslation" : [0, 22.375, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 408, + "fBits" : 52559872, + "fName" : "t405", + "fTitle" : "", + "fTranslation" : [0, -22.375, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 409, + "fBits" : 52559872, + "fName" : "t401", + "fTitle" : "", + "fTranslation" : [27.7, 0, 0.55], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 410, + "fBits" : 52559872, + "fName" : "t401", + "fTitle" : "", + "fTranslation" : [-34.7, 0.2, 2.95], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 411, + "fBits" : 52559872, + "fName" : "t401", + "fTitle" : "", + "fTranslation" : [27.7, 0, 0.55], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 412, + "fBits" : 52559872, + "fName" : "t405", + "fTitle" : "", + "fTranslation" : [-34.7, 0.2, 2.95], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 413, + "fBits" : 52559872, + "fName" : "t413", + "fTitle" : "", + "fTranslation" : [43.3, 0, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 414, + "fBits" : 52559872, + "fName" : "t413", + "fTitle" : "", + "fTranslation" : [0, 24.375, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 415, + "fBits" : 52559872, + "fName" : "t413", + "fTitle" : "", + "fTranslation" : [2.875, -24.375, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 416, + "fBits" : 52559872, + "fName" : "t416", + "fTitle" : "", + "fTranslation" : [43.3, 0, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 417, + "fBits" : 52559872, + "fName" : "t416", + "fTitle" : "", + "fTranslation" : [0, 24.375, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 418, + "fBits" : 52559872, + "fName" : "t416", + "fTitle" : "", + "fTranslation" : [2.875, -24.375, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 419, + "fBits" : 52559872, + "fName" : "t413", + "fTitle" : "", + "fTranslation" : [40.8, 0, 0.45], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 420, + "fBits" : 62259200, + "fName" : "c413", + "fTitle" : "", + "fTranslation" : [-40.8, 0, 0.45], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 53739520, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [-1, -0, -0, 0, 1, 0, 0, 0, 1] + } + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 421, + "fBits" : 52559872, + "fName" : "t413", + "fTitle" : "", + "fTranslation" : [40.8, 0, 0.45], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 422, + "fBits" : 62259200, + "fName" : "c416", + "fTitle" : "", + "fTranslation" : [-40.8, 0, 0.45], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 53739520, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [-1, -0, -0, 0, 1, 0, 0, 0, 1] + } + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 423, + "fBits" : 52559872, + "fName" : "t423", + "fTitle" : "", + "fTranslation" : [43.3, 0, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 424, + "fBits" : 52559872, + "fName" : "t423", + "fTitle" : "", + "fTranslation" : [0, 24.375, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 425, + "fBits" : 52559872, + "fName" : "t423", + "fTitle" : "", + "fTranslation" : [2.875, -24.375, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 426, + "fBits" : 52559872, + "fName" : "t426", + "fTitle" : "", + "fTranslation" : [43.3, 0, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 427, + "fBits" : 52559872, + "fName" : "t426", + "fTitle" : "", + "fTranslation" : [0, 24.375, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 428, + "fBits" : 52559872, + "fName" : "t426", + "fTitle" : "", + "fTranslation" : [2.875, -24.375, 0], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 429, + "fBits" : 52559872, + "fName" : "t423", + "fTitle" : "", + "fTranslation" : [40.8, 0, 0.45], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 430, + "fBits" : 62259200, + "fName" : "c423", + "fTitle" : "", + "fTranslation" : [-40.8, 0, 0.45], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 53739520, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [-1, -0, -0, 0, 1, 0, 0, 0, 1] + } + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 431, + "fBits" : 52559872, + "fName" : "t423", + "fTitle" : "", + "fTranslation" : [40.8, 0, 0.45], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 432, + "fBits" : 62259200, + "fName" : "c426", + "fTitle" : "", + "fTranslation" : [-40.8, 0, 0.45], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 53739520, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [-1, -0, -0, 0, 1, 0, 0, 0, 1] + } + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 433, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-29.375, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 434, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-28.125, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 435, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-26.875, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 436, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-25.625, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 437, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-24.375, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 438, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-23.125, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 439, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-21.875, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 440, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-20.625, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 441, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-19.375, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 442, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-18.125, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 443, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-16.875, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 444, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-15.625, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 445, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-14.375, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 446, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-13.125, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 447, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-11.875, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 448, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-10.625, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 449, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-9.375, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 450, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-8.125, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 451, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-6.875, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 452, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-5.625, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 453, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-4.375, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 454, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-3.125, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 455, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-1.875, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 456, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [-0.625, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 457, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [0.625, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 458, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [1.875, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 459, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [3.125, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 460, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [4.375, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 461, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [5.625, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 462, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [6.875, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 463, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [8.125, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 464, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [9.375, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 465, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [10.625, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 466, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [11.875, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 467, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [13.125, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 468, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [14.375, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 469, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [15.625, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 470, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [16.875, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 471, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [18.125, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 472, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [19.375, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 473, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [20.625, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 474, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [21.875, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 475, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [23.125, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 476, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [24.375, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 477, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [25.625, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 478, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [26.875, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 479, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [28.125, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 480, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [29.375, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 481, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [0, 0, -0.304499998688698] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 482, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [0, 0, 0.304499998688698] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 483, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [0, 0, -1.34000000357628] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 484, + "fBits" : 52559872, + "fName" : "t433", + "fTitle" : "", + "fTranslation" : [0, 0, 1.34000000357628] + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 485, + "fBits" : 52559872, + "fName" : "t485", + "fTitle" : "", + "fTranslation" : [0, 0, -11.59375], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 486, + "fBits" : 52559872, + "fName" : "t485", + "fTitle" : "", + "fTranslation" : [0, 0, -8.28125], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 487, + "fBits" : 52559872, + "fName" : "t485", + "fTitle" : "", + "fTranslation" : [0, 0, -4.96875], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 488, + "fBits" : 52559872, + "fName" : "t485", + "fTitle" : "", + "fTranslation" : [0, 0, -1.65625], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 489, + "fBits" : 52559872, + "fName" : "t485", + "fTitle" : "", + "fTranslation" : [0, 0, 1.65625], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 490, + "fBits" : 52559872, + "fName" : "t485", + "fTitle" : "", + "fTranslation" : [0, 0, 4.96875], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 491, + "fBits" : 52559872, + "fName" : "t485", + "fTitle" : "", + "fTranslation" : [0, 0, 8.28125], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 492, + "fBits" : 52559872, + "fName" : "t485", + "fTitle" : "", + "fTranslation" : [0, 0, 11.59375], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 493, + "fBits" : 52559872, + "fName" : "t493", + "fTitle" : "", + "fTranslation" : [0, 0, -2.50375], + "fRotation" : null + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 494, + "fBits" : 61210624, + "fName" : "c493", + "fTitle" : "", + "fTranslation" : [0, 0, -1.50225], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "r0", + "fTitle" : "", + "fRotationMatrix" : [0.5, -0.866025403784439, 0, 0.866025403784439, 0.5, -0, 0, 0, 1] + } + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 495, + "fBits" : 61210624, + "fName" : "c493", + "fTitle" : "", + "fTranslation" : [0, 0, -0.50075], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "r0", + "fTitle" : "", + "fRotationMatrix" : [-0.5, -0.866025403784439, 0, 0.866025403784439, -0.5, -0, 0, -0, 1] + } + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 496, + "fBits" : 61210624, + "fName" : "c493", + "fTitle" : "", + "fTranslation" : [0, 0, 0.50075], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "r0", + "fTitle" : "", + "fRotationMatrix" : [-1, -1.22464679914735e-16, 0, 1.22464679914735e-16, -1, -0, 0, -0, 1] + } + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 497, + "fBits" : 61210624, + "fName" : "c493", + "fTitle" : "", + "fTranslation" : [0, 0, 1.50225], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "r0", + "fTitle" : "", + "fRotationMatrix" : [-0.5, 0.866025403784438, 0, -0.866025403784438, -0.5, -0, -0, -0, 1] + } + }, { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 498, + "fBits" : 61210624, + "fName" : "c493", + "fTitle" : "", + "fTranslation" : [0, 0, 2.50375], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "r0", + "fTitle" : "", + "fRotationMatrix" : [0.5, 0.866025403784439, 0, -0.866025403784439, 0.5, -0, -0, 0, 1] + } + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 499, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-48, 0, 800] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 500, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [42, 54, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 501, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -19.9] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 502, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -19.71] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 503, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -0.075] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 504, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [4, 4, 0.015] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 505, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [4, 0, 0.015] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 506, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [4, -4, 0.015] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 507, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 4, 0.015] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 508, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 0.015] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 509, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, -4, 0.015] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 510, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-4, 4, 0.015] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 511, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-4, 0, 0.015] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 512, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-4, -4, 0.015] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 513, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -19.53] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 514, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -19.35] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 515, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -19.17] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 516, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -18.99] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 517, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -18.81] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 518, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -18.63] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 519, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -18.45] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 520, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -18.27] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 521, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -18.09] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 522, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -17.91] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 523, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -17.73] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 524, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -17.55] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 525, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -17.37] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 526, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -17.19] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 527, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -17.01] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 528, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -16.83] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 529, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -16.65] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 530, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -16.47] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 531, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -16.29] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 532, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -16.11] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 533, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -15.93] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 534, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -15.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 535, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -15.57] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 536, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -15.39] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 537, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -15.21] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 538, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -15.03] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 539, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -14.85] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 540, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -14.67] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 541, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -14.49] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 542, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -14.31] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 543, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -14.13] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 544, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -13.95] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 545, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -13.77] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 546, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -13.59] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 547, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -13.41] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 548, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -13.23] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 549, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -13.05] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 550, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -12.87] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 551, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -12.69] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 552, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -12.51] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 553, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -12.33] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 554, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -12.15] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 555, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -11.97] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 556, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -11.79] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 557, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -11.61] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 558, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -11.43] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 559, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -11.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 560, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -11.07] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 561, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -10.89] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 562, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -10.71] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 563, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -10.53] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 564, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -10.35] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 565, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -10.17] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 566, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -9.99] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 567, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -9.81] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 568, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -9.63] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 569, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -9.45] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 570, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -9.27] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 571, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -9.09] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 572, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -8.91] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 573, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -8.73] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 574, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -8.55] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 575, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -8.37] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 576, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -8.19] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 577, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -8.01] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 578, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -7.83] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 579, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -7.65] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 580, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -7.47] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 581, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -7.29] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 582, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -7.11] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 583, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -6.93] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 584, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -6.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 585, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -6.57] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 586, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -6.39] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 587, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -6.21] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 588, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -6.03] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 589, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -5.85] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 590, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -5.67] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 591, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -5.49] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 592, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -5.31] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 593, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -5.13] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 594, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -4.95] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 595, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -4.77] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 596, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -4.59] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 597, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -4.41] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 598, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -4.23] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 599, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -4.05] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 600, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -3.87] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 601, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -3.69] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 602, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -3.51] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 603, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -3.33] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 604, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -3.15] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 605, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -2.97] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 606, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -2.79] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 607, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -2.61] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 608, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -2.43] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 609, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -2.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 610, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -2.07] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 611, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -1.89] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 612, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -1.71] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 613, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -1.53] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 614, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -1.35] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 615, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -1.17] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 616, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -0.99] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 617, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -0.81] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 618, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -0.63] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 619, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -0.45] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 620, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -0.27] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 621, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, -0.09] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 622, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 0.09] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 623, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 0.27] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 624, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 0.45] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 625, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 0.63] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 626, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 0.81] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 627, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 0.99] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 628, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 1.17] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 629, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 1.35] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 630, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 1.53] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 631, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 1.71] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 632, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 1.89] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 633, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 2.07] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 634, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 2.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 635, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 2.43] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 636, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 2.61] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 637, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 2.79] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 638, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 2.97] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 639, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 3.15] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 640, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 3.33] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 641, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 3.51] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 642, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 3.69] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 643, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 3.87] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 644, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 4.05] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 645, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 4.23] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 646, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 4.41] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 647, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 4.59] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 648, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 4.77] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 649, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 4.95] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 650, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 5.13] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 651, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 5.31] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 652, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 5.49] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 653, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 5.67] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 654, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 5.85] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 655, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 6.03] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 656, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 6.21] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 657, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 6.39] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 658, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 6.57] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 659, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 6.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 660, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 6.93] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 661, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 7.11] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 662, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 7.29] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 663, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 7.47] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 664, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 7.65] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 665, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 7.83] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 666, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 8.01] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 667, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 8.19] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 668, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 8.37] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 669, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 8.55] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 670, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 8.73] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 671, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 8.91] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 672, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 9.09] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 673, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 9.27] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 674, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 9.45] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 675, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 9.63] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 676, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 9.81] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 677, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 9.99] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 678, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 10.17] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 679, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 10.35] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 680, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 10.53] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 681, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 10.71] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 682, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 10.89] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 683, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 11.07] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 684, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 11.25] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 685, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 11.43] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 686, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 11.61] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 687, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 11.79] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 688, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 11.97] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 689, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 12.15] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 690, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 12.33] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 691, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 12.51] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 692, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 12.69] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 693, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 12.87] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 694, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 13.05] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 695, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 13.23] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 696, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 13.41] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 697, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 13.59] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 698, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 13.77] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 699, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 13.95] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 700, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 14.13] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 701, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 14.31] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 702, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 14.49] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 703, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 14.67] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 704, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 14.85] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 705, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 15.03] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 706, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 15.21] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 707, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 15.39] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 708, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 15.57] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 709, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 15.75] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 710, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 15.93] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 711, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 16.11] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 712, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 16.29] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 713, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 16.47] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 714, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 16.65] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 715, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 16.83] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 716, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 17.01] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 717, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 17.19] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 718, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 17.37] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 719, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 17.55] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 720, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 17.73] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 721, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 17.91] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 722, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 18.09] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 723, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 18.27] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 724, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 18.45] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 725, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 18.63] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 726, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 18.81] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 727, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 18.99] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 728, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 19.17] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 729, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 19.35] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 730, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 19.53] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 731, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 19.71] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 732, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [42, 42, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 733, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [42, 30, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 734, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [42, 18, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 735, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [42, 6, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 736, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [42, -6, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 737, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [42, -18, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 738, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [42, -30, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 739, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [42, -42, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 740, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [42, -54, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 741, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [30, 54, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 742, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [30, 42, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 743, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [30, 30, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 744, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [30, 18, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 745, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [30, 6, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 746, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [30, -6, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 747, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [30, -18, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 748, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [30, -30, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 749, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [30, -42, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 750, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [30, -54, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 751, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [18, 54, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 752, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [18, 42, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 753, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [18, 30, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 754, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [18, 18, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 755, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [18, 6, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 756, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [18, -6, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 757, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [18, -18, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 758, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [18, -30, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 759, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [18, -42, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 760, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [18, -54, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 761, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [6, 54, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 762, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [6, 42, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 763, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [6, 30, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 764, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [6, 18, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 765, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [6, 6, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 766, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [6, -6, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 767, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [6, -18, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 768, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [6, -30, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 769, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [6, -42, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 770, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [6, -54, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 771, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-6, 54, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 772, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-6, 42, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 773, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-6, 30, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 774, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-6, 18, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 775, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-6, 6, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 776, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-6, -6, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 777, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-6, -18, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 778, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-6, -30, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 779, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-6, -42, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 780, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-6, -54, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 781, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-18, 54, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 782, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-18, 42, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 783, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-18, 30, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 784, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-18, 18, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 785, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-18, 6, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 786, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-18, -6, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 787, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-18, -18, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 788, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-18, -30, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 789, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-18, -42, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 790, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-18, -54, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 791, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-30, 54, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 792, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-30, 42, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 793, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-30, 30, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 794, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-30, 18, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 795, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-30, 6, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 796, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-30, -6, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 797, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-30, -18, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 798, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-30, -30, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 799, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-30, -42, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 800, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-30, -54, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 801, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-42, 54, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 802, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-42, 42, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 803, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-42, 30, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 804, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-42, 18, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 805, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-42, 6, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 806, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-42, -6, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 807, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-42, -18, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 808, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-42, -30, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 809, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-42, -42, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 810, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [-42, -54, -7.5] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 811, + "fBits" : 52559872, + "fName" : "", + "fTitle" : "", + "fTranslation" : [108, 0, 800] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t812", + "fTitle" : "", + "fTranslation" : [0, 3.15175, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t812", + "fTitle" : "", + "fTranslation" : [0, -3.15175, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t814", + "fTitle" : "", + "fTranslation" : [0, 3.15175, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t814", + "fTitle" : "", + "fTranslation" : [0, -3.15175, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t816", + "fTitle" : "", + "fTranslation" : [0, 3.15175, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t816", + "fTitle" : "", + "fTranslation" : [0, -3.15175, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t818", + "fTitle" : "", + "fTranslation" : [0, 3.15175, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t818", + "fTitle" : "", + "fTranslation" : [0, -3.15175, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t820", + "fTitle" : "", + "fTranslation" : [0, 3.15175, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t820", + "fTitle" : "", + "fTranslation" : [0, -3.15175, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t822", + "fTitle" : "", + "fTranslation" : [0, 3.15175, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t822", + "fTitle" : "", + "fTranslation" : [0, -3.15175, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t824", + "fTitle" : "", + "fTranslation" : [0, 3.15175, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t824", + "fTitle" : "", + "fTranslation" : [0, -3.15175, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t826", + "fTitle" : "", + "fTranslation" : [0, 3.15175, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t826", + "fTitle" : "", + "fTranslation" : [0, -3.15175, 0] + }, { + "_typename" : "TGeoIdentity", + "fUniqueID" : 0, + "fBits" : 52428800, + "fName" : "Identity", + "fTitle" : "" + }, { + "_typename" : "TGeoIdentity", + "fUniqueID" : 0, + "fBits" : 52428800, + "fName" : "Identity", + "fTitle" : "" + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52428800, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 0] + }, { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52428800, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 0] + }, { + "_typename" : "TGeoIdentity", + "fUniqueID" : 0, + "fBits" : 52428800, + "fName" : "Identity", + "fTitle" : "" + }, { + "_typename" : "TGeoIdentity", + "fUniqueID" : 0, + "fBits" : 52428800, + "fName" : "Identity", + "fTitle" : "" + }, { + "_typename" : "TGeoIdentity", + "fUniqueID" : 0, + "fBits" : 52428800, + "fName" : "Identity", + "fTitle" : "" + }, { + "_typename" : "TGeoHMatrix", + "fUniqueID" : 1, + "fBits" : 52428800, + "fName" : "Identity", + "fTitle" : "", + "fTranslation" : [0, 0, 0], + "fRotationMatrix" : [1, 0, 0, 0, 1, 0, 0, 0, 1], + "fScale" : [1, 1, 1] + }, { + "_typename" : "TGeoHMatrix", + "fUniqueID" : 0, + "fBits" : 52428800, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 0], + "fRotationMatrix" : [1, 0, 0, 0, 1, 0, 0, 0, 1], + "fScale" : [1, 1, 1] + }] + }, + "fShapes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoBBox", + "fUniqueID" : 1, + "fBits" : 50331648, + "fName" : "cave", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 2000, + "fDY" : 2000, + "fDZ" : 2000, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 2, + "fBits" : 50331648, + "fName" : "CoilTS", + "fTitle" : "CoilCornerS:combitran_CoilCorner1+CoilCornerS:combitran_CoilCorner2+CoilCornerS:combitran_CoilCorner3+CoilCornerS:combitran_CoilCorner4+CoilShortSideS:tran_CoilShortSide1+CoilShortSideS:tran_CoilShortSide2+CoilLongSideS:tran_CoilLongSide1+CoilLongSideS:tran_CoilLongSide2", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 214.6, + "fDY" : 25, + "fDZ" : 257.1, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoUnion", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 3, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "CoilCornerS:combitran_CoilCorner1+CoilCornerS:combitran_CoilCorner2+CoilCornerS:combitran_CoilCorner3+CoilCornerS:combitran_CoilCorner4+CoilShortSideS:tran_CoilShortSide1+CoilShortSideS:tran_CoilShortSide2+CoilLongSideS:tran_CoilLongSide1", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 214.6, + "fDY" : 25, + "fDZ" : 257.1, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoUnion", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 4, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "CoilCornerS:combitran_CoilCorner1+CoilCornerS:combitran_CoilCorner2+CoilCornerS:combitran_CoilCorner3+CoilCornerS:combitran_CoilCorner4+CoilShortSideS:tran_CoilShortSide1+CoilShortSideS:tran_CoilShortSide2", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 214.6, + "fDY" : 25, + "fDZ" : 257.1, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoUnion", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 5, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "CoilCornerS:combitran_CoilCorner1+CoilCornerS:combitran_CoilCorner2+CoilCornerS:combitran_CoilCorner3+CoilCornerS:combitran_CoilCorner4+CoilShortSideS:tran_CoilShortSide1", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 214.6, + "fDY" : 25, + "fDZ" : 257.1, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoUnion", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 6, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "CoilCornerS:combitran_CoilCorner1+CoilCornerS:combitran_CoilCorner2+CoilCornerS:combitran_CoilCorner3+CoilCornerS:combitran_CoilCorner4", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 214.6, + "fDY" : 25, + "fDZ" : 257.1, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoUnion", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 7, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "CoilCornerS:combitran_CoilCorner1+CoilCornerS:combitran_CoilCorner2+CoilCornerS:combitran_CoilCorner3", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 214.6, + "fDY" : 25, + "fDZ" : 257.1, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoUnion", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 8, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "CoilCornerS:combitran_CoilCorner1+CoilCornerS:combitran_CoilCorner2", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 214.6, + "fDY" : 25, + "fDZ" : 67.5, + "fOrigin" : [0, 0, -189.6], + "fNode" : { + "_typename" : "TGeoUnion", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoTubeSeg", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "CoilCornerS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 25600, + "fDX" : 67.5, + "fDY" : 67.5, + "fDZ" : 25, + "fOrigin" : [67.5, 67.5, 0], + "fRmin" : 25, + "fRmax" : 135, + "fDz" : 25, + "fPhi1" : 0, + "fPhi2" : 90, + "fS1" : 0, + "fC1" : 1, + "fS2" : 1, + "fC2" : 6.12323399573677e-17, + "fSm" : 0.707106781186547, + "fCm" : 0.707106781186548, + "fCdfi" : 0.707106781186548 + }, + "fRight" : {"$ref":863}, + "fLeftMat" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 61210624, + "fName" : "combitran_CoilCorner1", + "fTitle" : "", + "fTranslation" : [79.6, 0, -122.1], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [1, 0, 0, 0, 0, 1, 0, -1, 0] + } + }, + "fRightMat" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 61210624, + "fName" : "combitran_CoilCorner2", + "fTitle" : "", + "fTranslation" : [-79.6, 0, -122.1], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [-1, 0, 0, 0, 0, -1, 0, -1, 0] + } + } + } + }, + "fRight" : {"$ref":863}, + "fLeftMat" : {"$ref":4}, + "fRightMat" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 61210624, + "fName" : "combitran_CoilCorner3", + "fTitle" : "", + "fTranslation" : [-79.6, 0, 122.1], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [-1, 0, 0, 0, 0, 1, 0, 1, 0] + } + } + } + }, + "fRight" : {"$ref":863}, + "fLeftMat" : {"$ref":4}, + "fRightMat" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 61210624, + "fName" : "combitran_CoilCorner4", + "fTitle" : "", + "fTranslation" : [79.6, 0, 122.1], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [1, 0, 0, 0, 0, -1, 0, 1, 0] + } + } + } + }, + "fRight" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "CoilShortSideS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 79.6, + "fDY" : 25, + "fDZ" : 55, + "fOrigin" : [0, 0, 0] + }, + "fLeftMat" : {"$ref":4}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "tran_CoilShortSide1", + "fTitle" : "", + "fTranslation" : [0, 0, -202.1] + } + } + }, + "fRight" : {"$ref":872}, + "fLeftMat" : {"$ref":4}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "tran_CoilShortSide2", + "fTitle" : "", + "fTranslation" : [0, 0, 202.1] + } + } + }, + "fRight" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "CoilLongSideS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 55, + "fDY" : 25, + "fDZ" : 122.1, + "fOrigin" : [0, 0, 0] + }, + "fLeftMat" : {"$ref":4}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "tran_CoilLongSide1", + "fTitle" : "", + "fTranslation" : [-159.6, 0, 0] + } + } + }, + "fRight" : {"$ref":875}, + "fLeftMat" : {"$ref":4}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "tran_CoilLongSide2", + "fTitle" : "", + "fTranslation" : [159.6, 0, 0] + } + } + }, {"$ref":851}, {"$ref":853}, {"$ref":855}, {"$ref":857}, {"$ref":859}, {"$ref":861}, { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 9, + "fBits" : 50331648, + "fName" : "YokeS", + "fTitle" : "YokeContainerS-InnerSpaceInYokeS", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 350, + "fDY" : 224, + "fDZ" : 130, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoXtru", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "YokeContainerS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 134218752, + "fDX" : 350, + "fDY" : 224, + "fDZ" : 130, + "fOrigin" : [0, 0, 0], + "fNvert" : 8, + "fNz" : 2, + "fZcurrent" : 0, + "fX" : [-303.81197846483, -350, -350, -303.81197846483, 303.81197846483, 350, 350, 303.81197846483], + "fY" : [-224, -144, 144, 224, 224, 144, -144, -224], + "fZ" : [-130, 130], + "fScale" : [1, 1], + "fX0" : [0, 0], + "fY0" : [0, 0] + }, + "fRight" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "InnerSpaceInYokeS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 230, + "fDY" : 115, + "fDZ" : 130.005, + "fOrigin" : [0, 0, 0] + }, + "fLeftMat" : {"$ref":4}, + "fRightMat" : {"$ref":4} + } + }, { + "_typename" : "TGeoXtru", + "fUniqueID" : 10, + "fBits" : 50331648, + "fName" : "PoleS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 134218752, + "fDX" : 84, + "fDY" : 124.5, + "fDZ" : 30.75, + "fOrigin" : [0, 0, 0], + "fNvert" : 8, + "fNz" : 2, + "fZcurrent" : 0, + "fX" : [-54, -84, -84, -54, 54, 84, 84, 54], + "fY" : [-124.5, -94.5, 94.5, 124.5, 124.5, 94.5, -94.5, -124.5], + "fZ" : [-30.75, 30.75], + "fScale" : [1, 1], + "fX0" : [0, 0], + "fY0" : [0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 11, + "fBits" : 50331648, + "fName" : "TOF2GlassVolumeS0", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 8, + "fDY" : 17.575, + "fDZ" : 0.215, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 12, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 8, + "fDY" : 0.54921875, + "fDZ" : 0.132, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 13, + "fBits" : 50331648, + "fName" : "TOF2ActiveGasVolumeS0", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 8, + "fDY" : 17.575, + "fDZ" : 0.132, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 14, + "fBits" : 50331648, + "fName" : "TOF2G10VolumeS0", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 8, + "fDY" : 17.575, + "fDZ" : 0.208, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 15, + "fBits" : 50331648, + "fName" : "TOF2ChamberS0", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 9.501, + "fDY" : 19.076, + "fDZ" : 0.841, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 16, + "fBits" : 50331648, + "fName" : "TOF2GlassVolumeS1", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 28, + "fDY" : 15.175, + "fDZ" : 0.215, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 17, + "fBits" : 50331648, + "fName" : "TOF2ActiveGasVolumeS1", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 28, + "fDY" : 15.175, + "fDZ" : 0.132, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 18, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 28, + "fDY" : 0.9484375, + "fDZ" : 0.132, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 19, + "fBits" : 50331648, + "fName" : "TOF2G10VolumeS1", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 28, + "fDY" : 15.175, + "fDZ" : 0.208, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 20, + "fBits" : 50331648, + "fName" : "TOF2ChamberS1", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 29.501, + "fDY" : 16.676, + "fDZ" : 0.841, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 21, + "fBits" : 50331648, + "fName" : "VETO", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 83.5, + "fDY" : 53.5, + "fDZ" : 52.5, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 22, + "fBits" : 50331648, + "fName" : "VMDL", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 7.5, + "fDY" : 7.5, + "fDZ" : 52, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 23, + "fBits" : 50331648, + "fName" : "VFEL", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 7.3, + "fDY" : 7.3, + "fDZ" : 1, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 24, + "fBits" : 50331648, + "fName" : "VPBL", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 7.3, + "fDY" : 7.3, + "fDZ" : 0.5, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 25, + "fBits" : 50331648, + "fName" : "VSCL", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 7.3, + "fDY" : 7.3, + "fDZ" : 0.25, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 26, + "fBits" : 50331648, + "fName" : "VRFL", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 0.2, + "fDY" : 7.3, + "fDZ" : 1, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 27, + "fBits" : 50331648, + "fName" : "VRPL", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 0.2, + "fDY" : 7.3, + "fDZ" : 0.5, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 28, + "fBits" : 50331648, + "fName" : "VRSL", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 0.2, + "fDY" : 7.3, + "fDZ" : 0.25, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 29, + "fBits" : 50331648, + "fName" : "UMDL", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.75, + "fDY" : 3.75, + "fDZ" : 52, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 30, + "fBits" : 50331648, + "fName" : "USCL", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.65, + "fDY" : 3.65, + "fDZ" : 0.25, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 31, + "fBits" : 50331648, + "fName" : "URSL", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 0.1, + "fDY" : 3.65, + "fDZ" : 0.25, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 32, + "fBits" : 50331648, + "fName" : "UPBL", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.65, + "fDY" : 3.65, + "fDZ" : 0.5, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 33, + "fBits" : 50331648, + "fName" : "UFEL", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.65, + "fDY" : 3.65, + "fDZ" : 1, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 34, + "fBits" : 50331648, + "fName" : "URFL", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 0.1, + "fDY" : 3.65, + "fDZ" : 1, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 35, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "module_partS - holeS:hole_module_trans_6051", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 40.8, + "fDY" : 22.5, + "fDZ" : 0.45, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "module_partS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 40.8, + "fDY" : 22.5, + "fDZ" : 0.45, + "fOrigin" : [0, 0, 0] + }, + "fRight" : { + "_typename" : "TGeoTube", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "holeS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 9216, + "fDX" : 5.75, + "fDY" : 5.75, + "fDZ" : 0.46, + "fOrigin" : [0, 0, 0], + "fRmin" : 0, + "fRmax" : 5.75, + "fDz" : 0.46 + }, + "fLeftMat" : {"$ref":838}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "hole_module_trans_6051", + "fTitle" : "", + "fTranslation" : [-40.8, -22.5, 0] + } + } + }, { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 36, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "module_partS - holeS:hole_module_trans_9663", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 40.8, + "fDY" : 22.5, + "fDZ" : 0.45, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : {"$ref":909}, + "fRight" : {"$ref":910}, + "fLeftMat" : {"$ref":838}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "hole_module_trans_9663", + "fTitle" : "", + "fTranslation" : [-40.8, -22.5, 0] + } + } + }, { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 37, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "module_partS - holeS:hole_module_trans_3220", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 40.8, + "fDY" : 22.5, + "fDZ" : 0.45, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : {"$ref":909}, + "fRight" : {"$ref":910}, + "fLeftMat" : {"$ref":838}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "hole_module_trans_3220", + "fTitle" : "", + "fTranslation" : [-40.8, -22.5, 0] + } + } + }, { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 38, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "module_partS - holeS:hole_module_trans_9357", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 40.8, + "fDY" : 22.5, + "fDZ" : 0.45, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : {"$ref":909}, + "fRight" : {"$ref":910}, + "fLeftMat" : {"$ref":838}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "hole_module_trans_9357", + "fTitle" : "", + "fTranslation" : [-40.8, -22.5, 0] + } + } + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 39, + "fBits" : 50331648, + "fName" : "moduleS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 33, + "fDY" : 20.5, + "fDZ" : 0.45, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 40, + "fBits" : 50331648, + "fName" : "vertical_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 2.5, + "fDY" : 24.25, + "fDZ" : 1.15, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 41, + "fBits" : 50331648, + "fName" : "horizontal_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 33, + "fDY" : 1.875, + "fDZ" : 1.15, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 42, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 38, + "fDY" : 24.25, + "fDZ" : 1.15, + "fOrigin" : [0, 0, 0], + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "frame0_station0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station0_vertical_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "frame0_station0_vertical_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":922}, + "fMedium" : { + "_typename" : "TGeoMedium", + "fUniqueID" : 12, + "fBits" : 50331648, + "fName" : "HE_GAS", + "fTitle" : "", + "fId" : 12, + "fParams" : [0, 1, 0.19, 0.25, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : { + "_typename" : "TGeoMaterial", + "fUniqueID" : 14, + "fBits" : 50331648, + "fName" : "HE_GAS", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 13, + "fA" : 4, + "fZ" : 2, + "fDensity" : 1.78e-4, + "fRadLen" : 479968.980732484, + "fIntLen" : 312331.95325677, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null + } + }, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 32, + "fNtotal" : 1, + "fRefCount" : 2 + }, + "fMother" : {"$ref":925}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":384} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station0_vertical_frameV_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":928}, + "fMother" : {"$ref":925}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":385} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station0_horizontal_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "frame0_station0_horizontal_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":923}, + "fMedium" : { + "_typename" : "TGeoMedium", + "fUniqueID" : 18, + "fBits" : 50331648, + "fName" : "carbon", + "fTitle" : "", + "fId" : 18, + "fParams" : [0, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : { + "_typename" : "TGeoMaterial", + "fUniqueID" : 18, + "fBits" : 50331648, + "fName" : "carbon", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 17, + "fA" : 12.011, + "fZ" : 6, + "fDensity" : 2.265, + "fRadLen" : 18.7627684755763, + "fIntLen" : 35.4089682265511, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null + } + }, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 33, + "fNtotal" : 1, + "fRefCount" : 2 + }, + "fMother" : {"$ref":925}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":386} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station0_horizontal_frameV_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":933}, + "fMother" : {"$ref":925}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":387} + }] + }, + "fShape" : {"$ref":924}, + "fMedium" : { + "_typename" : "TGeoMedium", + "fUniqueID" : 1, + "fBits" : 50331648, + "fName" : "air", + "fTitle" : "", + "fId" : 1, + "fParams" : [0, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : { + "_typename" : "TGeoMixture", + "fUniqueID" : 1, + "fBits" : 50462720, + "fName" : "air", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 0, + "fA" : 14.6873, + "fZ" : 7.32, + "fDensity" : 0.001205, + "fRadLen" : 30422.5122009781, + "fIntLen" : 70886.8082068035, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null, + "fNelements" : 3, + "fZmixture" : [7, 8, 18], + "fAmixture" : [14.01, 16, 39.95], + "fWeights" : [0.78, 0.21, 0.01], + "fNatoms" : [], + "fVecNbOfAtomsPerVolume" : [], + "fElements" : null + } + }, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 34, + "fNtotal" : 5, + "fRefCount" : 5 + }, + "fBBoxOK" : true + }, { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 43, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 38, + "fDY" : 24.25, + "fDZ" : 1.15, + "fOrigin" : [0, 0, 0.45], + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "station0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_module0_station0_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_module0_station0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 7, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":921}, + "fMedium" : { + "_typename" : "TGeoMedium", + "fUniqueID" : 11, + "fBits" : 50331648, + "fName" : "IRON", + "fTitle" : "", + "fId" : 11, + "fParams" : [0, 1, 0.19, 1, -1, -1, 0.1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : { + "_typename" : "TGeoMaterial", + "fUniqueID" : 9, + "fBits" : 50462720, + "fName" : "IRON", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 8, + "fA" : 55.85, + "fZ" : 26, + "fDensity" : 7.87, + "fRadLen" : 1.75771664360148, + "fIntLen" : 16.9675125483994, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null + } + }, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 31, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":940}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":388} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station0_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":925}, + "fMother" : {"$ref":940}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":389} + }] + }, + "fShape" : {"$ref":939}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 35, + "fNtotal" : 7, + "fRefCount" : 3 + }, + "fBBoxOK" : true + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 44, + "fBits" : 50331648, + "fName" : "moduleS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 33, + "fDY" : 20.5, + "fDZ" : 0.45, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 45, + "fBits" : 50331648, + "fName" : "vertical_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 2.5, + "fDY" : 24.25, + "fDZ" : 1.15, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 46, + "fBits" : 50331648, + "fName" : "horizontal_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 33, + "fDY" : 1.875, + "fDZ" : 1.15, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 47, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 38, + "fDY" : 24.25, + "fDZ" : 1.15, + "fOrigin" : [0, 0, 0], + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "frame0_station1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station1_vertical_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "frame0_station1_vertical_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":948}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 37, + "fNtotal" : 1, + "fRefCount" : 2 + }, + "fMother" : {"$ref":951}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":390} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station1_vertical_frameV_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":954}, + "fMother" : {"$ref":951}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":391} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station1_horizontal_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "frame0_station1_horizontal_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":949}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 38, + "fNtotal" : 1, + "fRefCount" : 2 + }, + "fMother" : {"$ref":951}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":392} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station1_horizontal_frameV_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":957}, + "fMother" : {"$ref":951}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":393} + }] + }, + "fShape" : {"$ref":950}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 39, + "fNtotal" : 5, + "fRefCount" : 5 + }, + "fBBoxOK" : true + }, { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 48, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 38, + "fDY" : 24.25, + "fDZ" : 1.15, + "fOrigin" : [0, 0, 0.45], + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "station1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_module0_station1_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_module0_station1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 7, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":947}, + "fMedium" : { + "_typename" : "TGeoMedium", + "fUniqueID" : 17, + "fBits" : 50331648, + "fName" : "arco27030", + "fTitle" : "", + "fId" : 17, + "fParams" : [1, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : { + "_typename" : "TGeoMixture", + "fUniqueID" : 17, + "fBits" : 50331648, + "fName" : "arco27030", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 16, + "fA" : 36.5434594614837, + "fZ" : 16.5659958077497, + "fDensity" : 0.0019, + "fRadLen" : 10960.19206385, + "fIntLen" : 59730.4440787846, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null, + "fNelements" : 3, + "fZmixture" : [18, 6, 8], + "fAmixture" : [39.948, 12.01, 15.9994], + "fWeights" : [0.864021297422359, 0.0371085832369314, 0.0988701193407093], + "fNatoms" : [], + "fVecNbOfAtomsPerVolume" : [], + "fElements" : null + } + }, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 36, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":960}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":394} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station1_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":951}, + "fMother" : {"$ref":960}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":395} + }] + }, + "fShape" : {"$ref":959}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 40, + "fNtotal" : 7, + "fRefCount" : 3 + }, + "fBBoxOK" : true + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 49, + "fBits" : 50331648, + "fName" : "moduleS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 33, + "fDY" : 20.5, + "fDZ" : 0.45, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 50, + "fBits" : 50331648, + "fName" : "vertical_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 2.5, + "fDY" : 24.25, + "fDZ" : 1.15, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 51, + "fBits" : 50331648, + "fName" : "horizontal_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 33, + "fDY" : 1.875, + "fDZ" : 1.15, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 52, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 38, + "fDY" : 24.25, + "fDZ" : 1.15, + "fOrigin" : [0, 0, 0], + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "frame0_station2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station2_vertical_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "frame0_station2_vertical_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":968}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 42, + "fNtotal" : 1, + "fRefCount" : 2 + }, + "fMother" : {"$ref":971}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":396} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station2_vertical_frameV_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":974}, + "fMother" : {"$ref":971}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":397} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station2_horizontal_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "frame0_station2_horizontal_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":969}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 43, + "fNtotal" : 1, + "fRefCount" : 2 + }, + "fMother" : {"$ref":971}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":398} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station2_horizontal_frameV_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":977}, + "fMother" : {"$ref":971}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":399} + }] + }, + "fShape" : {"$ref":970}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 44, + "fNtotal" : 5, + "fRefCount" : 5 + }, + "fBBoxOK" : true + }, { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 53, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 38, + "fDY" : 24.25, + "fDZ" : 1.15, + "fOrigin" : [0, 0, 0.45], + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "station2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_module0_station2_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_module0_station2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 7, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":967}, + "fMedium" : {"$ref":964}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 41, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":980}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":400} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station2_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":971}, + "fMother" : {"$ref":980}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":401} + }] + }, + "fShape" : {"$ref":979}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 45, + "fNtotal" : 7, + "fRefCount" : 3 + }, + "fBBoxOK" : true + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 54, + "fBits" : 50331648, + "fName" : "moduleS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 33, + "fDY" : 20.5, + "fDZ" : 0.55, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 55, + "fBits" : 50331648, + "fName" : "moduleS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 33, + "fDY" : 20.5, + "fDZ" : 0.45, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 56, + "fBits" : 50331648, + "fName" : "vertical_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 2.5, + "fDY" : 24.25, + "fDZ" : 1.25, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 57, + "fBits" : 50331648, + "fName" : "horizontal_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 33, + "fDY" : 1.875, + "fDZ" : 1.25, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 58, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 38, + "fDY" : 24.25, + "fDZ" : 1.25, + "fOrigin" : [0, 0, 0], + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "frame0_station3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station3_vertical_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "frame0_station3_vertical_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":987}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 48, + "fNtotal" : 1, + "fRefCount" : 2 + }, + "fMother" : {"$ref":990}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":402} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station3_vertical_frameV_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":993}, + "fMother" : {"$ref":990}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":403} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station3_horizontal_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "frame0_station3_horizontal_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":988}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 49, + "fNtotal" : 1, + "fRefCount" : 2 + }, + "fMother" : {"$ref":990}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":404} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station3_horizontal_frameV_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":996}, + "fMother" : {"$ref":990}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":405} + }] + }, + "fShape" : {"$ref":989}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 50, + "fNtotal" : 5, + "fRefCount" : 5 + }, + "fBBoxOK" : true + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 59, + "fBits" : 50331648, + "fName" : "vertical_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 2.5, + "fDY" : 24.25, + "fDZ" : 1.15, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 60, + "fBits" : 50331648, + "fName" : "horizontal_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 33, + "fDY" : 1.875, + "fDZ" : 1.15, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 61, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 38, + "fDY" : 24.25, + "fDZ" : 1.15, + "fOrigin" : [0, 0, 0], + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "frame1_station3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame1_station3_vertical_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "frame1_station3_vertical_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":998}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 51, + "fNtotal" : 1, + "fRefCount" : 2 + }, + "fMother" : {"$ref":1001}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":406} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame1_station3_vertical_frameV_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1004}, + "fMother" : {"$ref":1001}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":407} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame1_station3_horizontal_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "frame1_station3_horizontal_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":999}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 52, + "fNtotal" : 1, + "fRefCount" : 2 + }, + "fMother" : {"$ref":1001}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":408} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame1_station3_horizontal_frameV_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1007}, + "fMother" : {"$ref":1001}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":409} + }] + }, + "fShape" : {"$ref":1000}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 53, + "fNtotal" : 5, + "fRefCount" : 5 + }, + "fBBoxOK" : true + }, { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 62, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 69.2, + "fDY" : 24.35, + "fDZ" : 2.4, + "fOrigin" : [-3.5, 0.0999999999999996, 1.7], + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "station3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_module0_station3_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_module0_station3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 7, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":985}, + "fMedium" : {"$ref":964}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 46, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1010}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":410} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_module1_station3_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_module1_station3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 7, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":986}, + "fMedium" : {"$ref":964}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 47, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1010}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":411} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station3_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":990}, + "fMother" : {"$ref":1010}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":412} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame1_station3_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1001}, + "fMother" : {"$ref":1010}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":413} + }] + }, + "fShape" : {"$ref":1009}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 54, + "fNtotal" : 13, + "fRefCount" : 5 + }, + "fBBoxOK" : true + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 63, + "fBits" : 50331648, + "fName" : "vertical_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 2.5, + "fDY" : 26.25, + "fDZ" : 1.95, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 64, + "fBits" : 50331648, + "fName" : "horizontal_upper_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 40.8, + "fDY" : 1.875, + "fDZ" : 1.95, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 65, + "fBits" : 50331648, + "fName" : "horizontal_upper_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 37.925, + "fDY" : 1.875, + "fDZ" : 1.95, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 66, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 43.3, + "fDY" : 26.25, + "fDZ" : 1.95, + "fOrigin" : [2.5, 0, 0], + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "frame0_station4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station4_vertical_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frame0_station4_vertical_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1018}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 57, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1022}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":414} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station4_horizontal_upper_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frame0_station4_horizontal_upper_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1019}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 58, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1022}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":415} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station4_horizontal_bottom_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frame0_station4_horizontal_bottom_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1020}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 59, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1022}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":416} + }] + }, + "fShape" : {"$ref":1021}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 60, + "fNtotal" : 4, + "fRefCount" : 4 + }, + "fBBoxOK" : true + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 67, + "fBits" : 50331648, + "fName" : "vertical_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 2.5, + "fDY" : 26.25, + "fDZ" : 1.95, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 68, + "fBits" : 50331648, + "fName" : "horizontal_upper_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 40.8, + "fDY" : 1.875, + "fDZ" : 1.95, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 69, + "fBits" : 50331648, + "fName" : "horizontal_upper_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 37.925, + "fDY" : 1.875, + "fDZ" : 1.95, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 70, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 43.3, + "fDY" : 26.25, + "fDZ" : 1.95, + "fOrigin" : [2.5, 0, 0], + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "frame1_station4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame1_station4_vertical_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frame1_station4_vertical_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1030}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 61, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1034}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":417} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame1_station4_horizontal_upper_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frame1_station4_horizontal_upper_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1031}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 62, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1034}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":418} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame1_station4_horizontal_bottom_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frame1_station4_horizontal_bottom_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1032}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 63, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1034}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":419} + }] + }, + "fShape" : {"$ref":1033}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 64, + "fNtotal" : 4, + "fRefCount" : 4 + }, + "fBBoxOK" : true + }, { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 71, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 86.6, + "fDY" : 26.25, + "fDZ" : 1.95, + "fOrigin" : [0, 0, 0.45], + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "station4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_module0_station4_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_module0_station4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 7, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":907}, + "fMedium" : {"$ref":964}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 55, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1043}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":420} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_module1_station4_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_module1_station4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 7, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":912}, + "fMedium" : {"$ref":964}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 56, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1043}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":421} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station4_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1022}, + "fMother" : {"$ref":1043}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":423} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame1_station4_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1034}, + "fMother" : {"$ref":1043}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":424} + }] + }, + "fShape" : {"$ref":1042}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 65, + "fNtotal" : 11, + "fRefCount" : 5 + }, + "fBBoxOK" : true + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 72, + "fBits" : 50331648, + "fName" : "vertical_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 2.5, + "fDY" : 26.25, + "fDZ" : 1.95, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 73, + "fBits" : 50331648, + "fName" : "horizontal_upper_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 40.8, + "fDY" : 1.875, + "fDZ" : 1.95, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 74, + "fBits" : 50331648, + "fName" : "horizontal_upper_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 37.925, + "fDY" : 1.875, + "fDZ" : 1.95, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 75, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 43.3, + "fDY" : 26.25, + "fDZ" : 1.95, + "fOrigin" : [2.5, 0, 0], + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "frame0_station5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station5_vertical_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frame0_station5_vertical_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1051}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 68, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1055}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":426} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station5_horizontal_upper_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frame0_station5_horizontal_upper_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1052}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 69, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1055}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":427} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station5_horizontal_bottom_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frame0_station5_horizontal_bottom_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1053}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 70, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1055}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":428} + }] + }, + "fShape" : {"$ref":1054}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 71, + "fNtotal" : 4, + "fRefCount" : 4 + }, + "fBBoxOK" : true + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 76, + "fBits" : 50331648, + "fName" : "vertical_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 2.5, + "fDY" : 26.25, + "fDZ" : 1.95, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 77, + "fBits" : 50331648, + "fName" : "horizontal_upper_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 40.8, + "fDY" : 1.875, + "fDZ" : 1.95, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 78, + "fBits" : 50331648, + "fName" : "horizontal_upper_frameS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 37.925, + "fDY" : 1.875, + "fDZ" : 1.95, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 79, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 43.3, + "fDY" : 26.25, + "fDZ" : 1.95, + "fOrigin" : [2.5, 0, 0], + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "frame1_station5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame1_station5_vertical_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frame1_station5_vertical_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1063}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 72, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1067}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":429} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame1_station5_horizontal_upper_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frame1_station5_horizontal_upper_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1064}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 73, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1067}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":430} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame1_station5_horizontal_bottom_frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frame1_station5_horizontal_bottom_frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1065}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 74, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1067}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":431} + }] + }, + "fShape" : {"$ref":1066}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 75, + "fNtotal" : 4, + "fRefCount" : 4 + }, + "fBBoxOK" : true + }, { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 80, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 86.6, + "fDY" : 26.25, + "fDZ" : 1.95, + "fOrigin" : [0, 0, 0.45], + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "station5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_module0_station5_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_module0_station5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 7, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":915}, + "fMedium" : {"$ref":964}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 66, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1076}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":432} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_module1_station5_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_module1_station5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 7, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":918}, + "fMedium" : {"$ref":964}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 67, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1076}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":433} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame0_station5_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1055}, + "fMother" : {"$ref":1076}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":435} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frame1_station5_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1067}, + "fMother" : {"$ref":1076}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":436} + }] + }, + "fShape" : {"$ref":1075}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 76, + "fNtotal" : 11, + "fRefCount" : 5 + }, + "fBBoxOK" : true + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 81, + "fBits" : 50331648, + "fName" : "StripGas", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 0.5, + "fDY" : 15, + "fDZ" : 0.150000005960464, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 82, + "fBits" : 50331648, + "fName" : "DetectorGlass", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 30, + "fDY" : 15, + "fDZ" : 0.154499992728233, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 83, + "fBits" : 50331648, + "fName" : "DetectorPlate", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 30, + "fDY" : 15, + "fDZ" : 0.159999996423721, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 84, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 30, + "fDY" : 15, + "fDZ" : 1.5, + "fOrigin" : [0, 0, 0], + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "tof1Detector", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "tof1StripActiveGasV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1084}, + "fMedium" : { + "_typename" : "TGeoMedium", + "fUniqueID" : 6, + "fBits" : 50331648, + "fName" : "RPCgas", + "fTitle" : "", + "fId" : 6, + "fParams" : [1, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : { + "_typename" : "TGeoMixture", + "fUniqueID" : 6, + "fBits" : 50331648, + "fName" : "RPCgas", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 5, + "fA" : 13.134094, + "fZ" : 6.433, + "fDensity" : 0.00375, + "fRadLen" : 10290.7323640963, + "fIntLen" : 17251.1264038771, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null, + "fNelements" : 4, + "fZmixture" : [6, 1, 9, 16], + "fAmixture" : [12.01, 1.008, 19, 32.06], + "fWeights" : [0.227, 0.248, 0.511, 0.014], + "fNatoms" : [], + "fVecNbOfAtomsPerVolume" : [], + "fElements" : null + } + }, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 78, + "fNtotal" : 1, + "fRefCount" : 48 + }, + "fMother" : {"$ref":1088}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":438} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":439} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 3, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":440} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 4, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":441} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 5, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":442} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_6", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 6, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":443} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_7", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 7, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":444} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_8", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 8, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":445} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_9", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 9, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":446} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_10", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 10, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":447} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_11", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 11, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":448} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_12", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 12, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":449} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_13", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 13, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":450} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_14", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 14, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":451} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_15", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 15, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":452} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_16", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 16, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":453} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_17", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 17, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":454} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_18", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 18, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":455} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_19", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 19, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":456} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_20", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 20, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":457} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_21", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 21, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":458} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_22", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 22, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":459} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_23", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 23, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":460} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_24", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 24, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":461} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_25", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 25, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":462} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_26", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 26, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":463} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_27", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 27, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":464} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_28", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 28, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":465} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_29", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 29, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":466} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_30", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 30, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":467} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_31", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 31, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":468} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_32", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 32, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":469} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_33", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 33, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":470} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_34", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 34, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":471} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_35", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 35, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":472} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_36", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 36, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":473} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_37", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 37, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":474} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_38", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 38, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":475} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_39", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 39, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":476} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_40", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 40, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":477} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_41", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 41, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":478} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_42", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 42, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":479} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_43", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 43, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":480} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_44", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 44, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":481} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_45", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 45, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":482} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_46", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 46, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":483} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_47", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 47, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":484} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1StripActiveGasV_48", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1091}, + "fMother" : {"$ref":1088}, + "fNumber" : 48, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":485} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1DetGlassV_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "tof1DetGlassV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 7, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1085}, + "fMedium" : { + "_typename" : "TGeoMedium", + "fUniqueID" : 5, + "fBits" : 50331648, + "fName" : "RPCglass", + "fTitle" : "", + "fId" : 5, + "fParams" : [0, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : { + "_typename" : "TGeoMixture", + "fUniqueID" : 5, + "fBits" : 50331648, + "fName" : "RPCglass", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 4, + "fA" : 21.6516575137294, + "fZ" : 10.8047928107838, + "fDensity" : 2.55, + "fRadLen" : 10.5807291507198, + "fIntLen" : 37.6225717576057, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null, + "fNelements" : 2, + "fZmixture" : [14, 8], + "fAmixture" : [28.09, 16], + "fWeights" : [0.467465468463971, 0.532534531536029], + "fNatoms" : [], + "fVecNbOfAtomsPerVolume" : [], + "fElements" : null + } + }, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 79, + "fNtotal" : 1, + "fRefCount" : 2 + }, + "fMother" : {"$ref":1088}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":486} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1DetGlassV_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1142}, + "fMother" : {"$ref":1088}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":487} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1DetPlateV_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "tof1DetPlateV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 3, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1086}, + "fMedium" : { + "_typename" : "TGeoMedium", + "fUniqueID" : 7, + "fBits" : 50331648, + "fName" : "G10", + "fTitle" : "", + "fId" : 7, + "fParams" : [0, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : { + "_typename" : "TGeoMixture", + "fUniqueID" : 7, + "fBits" : 50331648, + "fName" : "G10", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 6, + "fA" : 13.127344, + "fZ" : 6.696, + "fDensity" : 1.7, + "fRadLen" : 21.1963817958332, + "fIntLen" : 36.4724641224032, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null, + "fNelements" : 4, + "fZmixture" : [6, 1, 8, 14], + "fAmixture" : [12.01, 1.008, 16, 28.09], + "fWeights" : [0.259, 0.288, 0.248, 0.205], + "fNatoms" : [], + "fVecNbOfAtomsPerVolume" : [], + "fElements" : null + } + }, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 80, + "fNtotal" : 1, + "fRefCount" : 2 + }, + "fMother" : {"$ref":1088}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":488} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1DetPlateV_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1147}, + "fMother" : {"$ref":1088}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":489} + }] + }, + "fShape" : {"$ref":1087}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 81, + "fNtotal" : 53, + "fRefCount" : 62 + }, + "fBBoxOK" : true + }, { + "_typename" : "TGeoPgon", + "fUniqueID" : 85, + "fBits" : 50331648, + "fName" : "OctagonActivePlaneS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 67503104, + "fDX" : 156.77368629035, + "fDY" : 156.77368629035, + "fDZ" : 0.05, + "fOrigin" : [0, 0, 0], + "fNz" : 2, + "fPhi1" : 0, + "fDphi" : 360, + "fRmin" : [12, 12], + "fRmax" : [144.84, 144.84], + "fZ" : [-0.05, 0.05], + "fNedges" : 8 + }, { + "_typename" : "TGeoPgon", + "fUniqueID" : 86, + "fBits" : 50331648, + "fName" : "OctagonS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 67503104, + "fDX" : 156.77368629035, + "fDY" : 156.77368629035, + "fDZ" : 13.25, + "fOrigin" : [0, 0, 0], + "fNz" : 2, + "fPhi1" : 0, + "fDphi" : 360, + "fRmin" : [12, 12], + "fRmax" : [144.84, 144.84], + "fZ" : [-13.25, 13.25], + "fNedges" : 8 + }, { + "_typename" : "TGeoPgon", + "fUniqueID" : 87, + "fBits" : 50331648, + "fName" : "MWPCContainerS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 67503104, + "fDX" : 26.15396719429, + "fDY" : 26.15396719429, + "fDZ" : 3.5045, + "fOrigin" : [0, 0, 0], + "fNz" : 2, + "fPhi1" : 0, + "fDphi" : 360, + "fRmin" : [0, 0], + "fRmax" : [22.65, 22.65], + "fZ" : [-3.5045, 3.5045], + "fNedges" : 6 + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 88, + "fBits" : 50331648, + "fName" : "MWPCActivePlaneS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 12, + "fDY" : 21.65, + "fDZ" : 0.1, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 89, + "fBits" : 50331648, + "fName" : "ecal01", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 48, + "fDY" : 60, + "fDZ" : 27.5, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 90, + "fBits" : 50331648, + "fName" : "ecal01mod", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 6, + "fDY" : 6, + "fDZ" : 20, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 91, + "fBits" : 50331648, + "fName" : "ecal01front", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 6, + "fDY" : 6, + "fDZ" : 0.1, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 92, + "fBits" : 50331648, + "fName" : "ecal01lay", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 6, + "fDY" : 6, + "fDZ" : 0.09, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 93, + "fBits" : 50331648, + "fName" : "ecal01lead", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 6, + "fDY" : 6, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 94, + "fBits" : 50331648, + "fName" : "ecal01scint", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 2, + "fDY" : 2, + "fDZ" : 0.075, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 95, + "fBits" : 50331648, + "fName" : "frame_with_windowsS", + "fTitle" : "(frameS0-upper_window_frameS0:upper_window_frame_pos0)-lower_window_rect_frameS0:lower_window_rect_frame_pos0", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 0, + "fDY" : 0, + "fDZ" : 0, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 96, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "frameS0-upper_window_frameS0:upper_window_frame_pos0", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.09, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frameS0", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.09, + "fOrigin" : [0, 0, 0] + }, + "fRight" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "upper_window_frameS0", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.0905, + "fOrigin" : [0, 0, 0] + }, + "fLeftMat" : {"$ref":839}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "upper_window_frame_pos0", + "fTitle" : "", + "fTranslation" : [0, 3.15175, 0] + } + } + }, + "fRight" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "lower_window_rect_frameS0", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.0905, + "fOrigin" : [0, 0, 0] + }, + "fLeftMat" : {"$ref":839}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "lower_window_rect_frame_pos0", + "fTitle" : "", + "fTranslation" : [0, -3.15175, 0] + } + } + }, {"$ref":1163}, { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 97, + "fBits" : 50331648, + "fName" : "frame_with_windowsS", + "fTitle" : "(frameS1-upper_window_frameS1:upper_window_frame_pos1)-lower_window_bevel_frameS1:lower_window_bevel_frame_pos1", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 0, + "fDY" : 0, + "fDZ" : 0, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 98, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "frameS1-upper_window_frameS1:upper_window_frame_pos1", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.09, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoXtru", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frameS1", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 134218752, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.09, + "fOrigin" : [0, 0, 0], + "fNvert" : 5, + "fNz" : 2, + "fZcurrent" : 0, + "fX" : [3.15, -3.15, -3.15, -0.67, 3.15], + "fY" : [6.30175, 6.30175, -6.30175, -6.30175, -2.48175], + "fZ" : [-0.09, 0.09], + "fScale" : [1, 1], + "fX0" : [0, 0], + "fY0" : [0, 0] + }, + "fRight" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "upper_window_frameS1", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.0905, + "fOrigin" : [0, 0, 0] + }, + "fLeftMat" : {"$ref":839}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "upper_window_frame_pos1", + "fTitle" : "", + "fTranslation" : [0, 3.15175, 0] + } + } + }, + "fRight" : { + "_typename" : "TGeoXtru", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "lower_window_bevel_frameS1", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 134218752, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.0905, + "fOrigin" : [0, 0, 0], + "fNvert" : 5, + "fNz" : 2, + "fZcurrent" : 0, + "fX" : [3.05, -3.05, -3.05, -0.711421356237309, 3.05], + "fY" : [3.05, 3.05, -3.05, -3.05, 0.71142135623731], + "fZ" : [-0.0905, 0.0905], + "fScale" : [1, 1], + "fX0" : [0, 0], + "fY0" : [0, 0] + }, + "fLeftMat" : {"$ref":839}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "lower_window_bevel_frame_pos1", + "fTitle" : "", + "fTranslation" : [0, -3.15175, 0] + } + } + }, {"$ref":1172}, { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 99, + "fBits" : 50331648, + "fName" : "frame_with_windowsS", + "fTitle" : "(frameS2-upper_window_frameS2:upper_window_frame_pos2)-lower_window_bevel_frameS2:lower_window_bevel_frame_pos2", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 0, + "fDY" : 0, + "fDZ" : 0, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 100, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "frameS2-upper_window_frameS2:upper_window_frame_pos2", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.09, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoXtru", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frameS2", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 134218752, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.09, + "fOrigin" : [0, 0, 0], + "fNvert" : 5, + "fNz" : 2, + "fZcurrent" : 0, + "fX" : [3.15, -3.15, -3.15, -0.67, 3.15], + "fY" : [6.30175, 6.30175, -6.30175, -6.30175, -2.48175], + "fZ" : [-0.09, 0.09], + "fScale" : [1, 1], + "fX0" : [0, 0], + "fY0" : [0, 0] + }, + "fRight" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "upper_window_frameS2", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.0905, + "fOrigin" : [0, 0, 0] + }, + "fLeftMat" : {"$ref":839}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "upper_window_frame_pos2", + "fTitle" : "", + "fTranslation" : [0, 3.15175, 0] + } + } + }, + "fRight" : { + "_typename" : "TGeoXtru", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "lower_window_bevel_frameS2", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 134218752, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.0905, + "fOrigin" : [0, 0, 0], + "fNvert" : 5, + "fNz" : 2, + "fZcurrent" : 0, + "fX" : [3.05, -3.05, -3.05, -0.711421356237309, 3.05], + "fY" : [3.05, 3.05, -3.05, -3.05, 0.71142135623731], + "fZ" : [-0.0905, 0.0905], + "fScale" : [1, 1], + "fX0" : [0, 0], + "fY0" : [0, 0] + }, + "fLeftMat" : {"$ref":839}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "lower_window_bevel_frame_pos2", + "fTitle" : "", + "fTranslation" : [0, -3.15175, 0] + } + } + }, {"$ref":1181}, { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 101, + "fBits" : 50331648, + "fName" : "frame_with_windowsS", + "fTitle" : "(frameS3-upper_window_frameS3:upper_window_frame_pos3)-lower_window_rect_frameS3:lower_window_rect_frame_pos3", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 0, + "fDY" : 0, + "fDZ" : 0, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 102, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "frameS3-upper_window_frameS3:upper_window_frame_pos3", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.09, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frameS3", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.09, + "fOrigin" : [0, 0, 0] + }, + "fRight" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "upper_window_frameS3", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.0905, + "fOrigin" : [0, 0, 0] + }, + "fLeftMat" : {"$ref":839}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "upper_window_frame_pos3", + "fTitle" : "", + "fTranslation" : [0, 3.15175, 0] + } + } + }, + "fRight" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "lower_window_rect_frameS3", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.0905, + "fOrigin" : [0, 0, 0] + }, + "fLeftMat" : {"$ref":839}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "lower_window_rect_frame_pos3", + "fTitle" : "", + "fTranslation" : [0, -3.15175, 0] + } + } + }, {"$ref":1190}, { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 103, + "fBits" : 50331648, + "fName" : "frame_with_windowsS", + "fTitle" : "(frameS4-upper_window_frameS4:upper_window_frame_pos4)-lower_window_rect_frameS4:lower_window_rect_frame_pos4", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 0, + "fDY" : 0, + "fDZ" : 0, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 104, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "frameS4-upper_window_frameS4:upper_window_frame_pos4", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.09, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frameS4", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.09, + "fOrigin" : [0, 0, 0] + }, + "fRight" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "upper_window_frameS4", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.0905, + "fOrigin" : [0, 0, 0] + }, + "fLeftMat" : {"$ref":839}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "upper_window_frame_pos4", + "fTitle" : "", + "fTranslation" : [0, 3.15175, 0] + } + } + }, + "fRight" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "lower_window_rect_frameS4", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.0905, + "fOrigin" : [0, 0, 0] + }, + "fLeftMat" : {"$ref":839}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "lower_window_rect_frame_pos4", + "fTitle" : "", + "fTranslation" : [0, -3.15175, 0] + } + } + }, {"$ref":1199}, { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 105, + "fBits" : 50331648, + "fName" : "frame_with_windowsS", + "fTitle" : "(frameS5-upper_window_frameS5:upper_window_frame_pos5)-lower_window_bevel_frameS5:lower_window_bevel_frame_pos5", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 0, + "fDY" : 0, + "fDZ" : 0, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 106, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "frameS5-upper_window_frameS5:upper_window_frame_pos5", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.09, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoXtru", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frameS5", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 134218752, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.09, + "fOrigin" : [0, 0, 0], + "fNvert" : 5, + "fNz" : 2, + "fZcurrent" : 0, + "fX" : [3.15, -3.15, -3.15, -0.67, 3.15], + "fY" : [6.30175, 6.30175, -6.30175, -6.30175, -2.48175], + "fZ" : [-0.09, 0.09], + "fScale" : [1, 1], + "fX0" : [0, 0], + "fY0" : [0, 0] + }, + "fRight" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "upper_window_frameS5", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.0905, + "fOrigin" : [0, 0, 0] + }, + "fLeftMat" : {"$ref":839}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "upper_window_frame_pos5", + "fTitle" : "", + "fTranslation" : [0, 3.15175, 0] + } + } + }, + "fRight" : { + "_typename" : "TGeoXtru", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "lower_window_bevel_frameS5", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 134218752, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.0905, + "fOrigin" : [0, 0, 0], + "fNvert" : 5, + "fNz" : 2, + "fZcurrent" : 0, + "fX" : [3.05, -3.05, -3.05, -0.711421356237309, 3.05], + "fY" : [3.05, 3.05, -3.05, -3.05, 0.71142135623731], + "fZ" : [-0.0905, 0.0905], + "fScale" : [1, 1], + "fX0" : [0, 0], + "fY0" : [0, 0] + }, + "fLeftMat" : {"$ref":839}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "lower_window_bevel_frame_pos5", + "fTitle" : "", + "fTranslation" : [0, -3.15175, 0] + } + } + }, {"$ref":1208}, { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 107, + "fBits" : 50331648, + "fName" : "frame_with_windowsS", + "fTitle" : "(frameS6-upper_window_frameS6:upper_window_frame_pos6)-lower_window_bevel_frameS6:lower_window_bevel_frame_pos6", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 0, + "fDY" : 0, + "fDZ" : 0, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 108, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "frameS6-upper_window_frameS6:upper_window_frame_pos6", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.09, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoXtru", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frameS6", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 134218752, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.09, + "fOrigin" : [0, 0, 0], + "fNvert" : 5, + "fNz" : 2, + "fZcurrent" : 0, + "fX" : [3.15, -3.15, -3.15, -0.67, 3.15], + "fY" : [6.30175, 6.30175, -6.30175, -6.30175, -2.48175], + "fZ" : [-0.09, 0.09], + "fScale" : [1, 1], + "fX0" : [0, 0], + "fY0" : [0, 0] + }, + "fRight" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "upper_window_frameS6", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.0905, + "fOrigin" : [0, 0, 0] + }, + "fLeftMat" : {"$ref":839}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "upper_window_frame_pos6", + "fTitle" : "", + "fTranslation" : [0, 3.15175, 0] + } + } + }, + "fRight" : { + "_typename" : "TGeoXtru", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "lower_window_bevel_frameS6", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 134218752, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.0905, + "fOrigin" : [0, 0, 0], + "fNvert" : 5, + "fNz" : 2, + "fZcurrent" : 0, + "fX" : [3.05, -3.05, -3.05, -0.711421356237309, 3.05], + "fY" : [3.05, 3.05, -3.05, -3.05, 0.71142135623731], + "fZ" : [-0.0905, 0.0905], + "fScale" : [1, 1], + "fX0" : [0, 0], + "fY0" : [0, 0] + }, + "fLeftMat" : {"$ref":839}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "lower_window_bevel_frame_pos6", + "fTitle" : "", + "fTranslation" : [0, -3.15175, 0] + } + } + }, {"$ref":1217}, { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 109, + "fBits" : 50331648, + "fName" : "frame_with_windowsS", + "fTitle" : "(frameS7-upper_window_frameS7:upper_window_frame_pos7)-lower_window_rect_frameS7:lower_window_rect_frame_pos7", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 0, + "fDY" : 0, + "fDZ" : 0, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoCompositeShape", + "fUniqueID" : 110, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "frameS7-upper_window_frameS7:upper_window_frame_pos7", + "fShapeId" : 256, + "fShapeBits" : 33555456, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.09, + "fOrigin" : [0, 0, 0], + "fNode" : { + "_typename" : "TGeoSubtraction", + "fUniqueID" : 0, + "fBits" : 50331648, + "fLeft" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frameS7", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.09, + "fOrigin" : [0, 0, 0] + }, + "fRight" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "upper_window_frameS7", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.0905, + "fOrigin" : [0, 0, 0] + }, + "fLeftMat" : {"$ref":839}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "upper_window_frame_pos7", + "fTitle" : "", + "fTranslation" : [0, 3.15175, 0] + } + } + }, + "fRight" : { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "lower_window_rect_frameS7", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.0905, + "fOrigin" : [0, 0, 0] + }, + "fLeftMat" : {"$ref":839}, + "fRightMat" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "lower_window_rect_frame_pos7", + "fTitle" : "", + "fTranslation" : [0, -3.15175, 0] + } + } + }, {"$ref":1226}, { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sensor_zone_upper_partS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sensor_zone_lower_part_rectS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "moduleS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoXtru", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sensor_zone_lower_part_bevelS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 134218752, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0], + "fNvert" : 5, + "fNz" : 2, + "fZcurrent" : 0, + "fX" : [3.05, -3.05, -3.05, -0.711421356237309, 3.05], + "fY" : [3.05, 3.05, -3.05, -3.05, 0.71142135623731], + "fZ" : [-0.015, 0.015], + "fScale" : [1, 1], + "fX0" : [0, 0], + "fY0" : [0, 0] + }, { + "_typename" : "TGeoXtru", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "moduleS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 134218752, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0], + "fNvert" : 5, + "fNz" : 2, + "fZcurrent" : 0, + "fX" : [3.15, -3.15, -3.15, -0.67, 3.15], + "fY" : [6.30175, 6.30175, -6.30175, -6.30175, -2.48175], + "fZ" : [-0.015, 0.015], + "fScale" : [1, 1], + "fX0" : [0, 0], + "fY0" : [0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sensor_zone_upper_partS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoXtru", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "moduleS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 134218752, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0], + "fNvert" : 5, + "fNz" : 2, + "fZcurrent" : 0, + "fX" : [3.15, -3.15, -3.15, -0.67, 3.15], + "fY" : [6.30175, 6.30175, -6.30175, -6.30175, -2.48175], + "fZ" : [-0.015, 0.015], + "fScale" : [1, 1], + "fX0" : [0, 0], + "fY0" : [0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sensor_zone_upper_partS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoXtru", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sensor_zone_lower_part_bevelS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 134218752, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0], + "fNvert" : 5, + "fNz" : 2, + "fZcurrent" : 0, + "fX" : [3.05, -3.05, -3.05, -0.711421356237309, 3.05], + "fY" : [3.05, 3.05, -3.05, -3.05, 0.71142135623731], + "fZ" : [-0.015, 0.015], + "fScale" : [1, 1], + "fX0" : [0, 0], + "fY0" : [0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "moduleS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sensor_zone_upper_partS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sensor_zone_lower_part_rectS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "moduleS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sensor_zone_upper_partS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sensor_zone_lower_part_rectS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoXtru", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "moduleS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 134218752, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0], + "fNvert" : 5, + "fNz" : 2, + "fZcurrent" : 0, + "fX" : [3.15, -3.15, -3.15, -0.67, 3.15], + "fY" : [6.30175, 6.30175, -6.30175, -6.30175, -2.48175], + "fZ" : [-0.015, 0.015], + "fScale" : [1, 1], + "fX0" : [0, 0], + "fY0" : [0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sensor_zone_upper_partS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoXtru", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sensor_zone_lower_part_bevelS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 134218752, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0], + "fNvert" : 5, + "fNz" : 2, + "fZcurrent" : 0, + "fX" : [3.05, -3.05, -3.05, -0.711421356237309, 3.05], + "fY" : [3.05, 3.05, -3.05, -3.05, 0.71142135623731], + "fZ" : [-0.015, 0.015], + "fScale" : [1, 1], + "fX0" : [0, 0], + "fY0" : [0, 0] + }, { + "_typename" : "TGeoXtru", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "moduleS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 134218752, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0], + "fNvert" : 5, + "fNz" : 2, + "fZcurrent" : 0, + "fX" : [3.15, -3.15, -3.15, -0.67, 3.15], + "fY" : [6.30175, 6.30175, -6.30175, -6.30175, -2.48175], + "fZ" : [-0.015, 0.015], + "fScale" : [1, 1], + "fX0" : [0, 0], + "fY0" : [0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sensor_zone_upper_partS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoXtru", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sensor_zone_lower_part_bevelS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 134218752, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0], + "fNvert" : 5, + "fNz" : 2, + "fZcurrent" : 0, + "fX" : [3.05, -3.05, -3.05, -0.711421356237309, 3.05], + "fY" : [3.05, 3.05, -3.05, -3.05, 0.71142135623731], + "fZ" : [-0.015, 0.015], + "fScale" : [1, 1], + "fX0" : [0, 0], + "fY0" : [0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "moduleS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.15, + "fDY" : 6.30175, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sensor_zone_upper_partS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0] + }, { + "_typename" : "TGeoBBox", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sensor_zone_lower_part_rectS", + "fTitle" : "", + "fShapeId" : 256, + "fShapeBits" : 1024, + "fDX" : 3.05, + "fDY" : 3.05, + "fDZ" : 0.015, + "fOrigin" : [0, 0, 0] + }] + }, + "fVolumes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "cave", + "fTitle" : "Top volume", + "fGeoAtt" : 3084, + "fLineColor" : 3, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Magnet_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "Magnet", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Coil_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "Coil", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 4, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":849}, + "fMedium" : { + "_typename" : "TGeoMedium", + "fUniqueID" : 2, + "fBits" : 50331648, + "fName" : "copper", + "fTitle" : "", + "fId" : 2, + "fParams" : [0, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : { + "_typename" : "TGeoMaterial", + "fUniqueID" : 2, + "fBits" : 50331648, + "fName" : "copper", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 1, + "fA" : 63.54, + "fZ" : 29, + "fDensity" : 8.96, + "fRadLen" : 1.43502863740006, + "fIntLen" : 15.5141335257514, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null + } + }, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 3, + "fNtotal" : 1, + "fRefCount" : 2 + }, + "fMother" : {"$ref":1261}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t3", + "fTitle" : "", + "fTranslation" : [0, -85, 0] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Coil_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1264}, + "fMother" : {"$ref":1261}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t3", + "fTitle" : "", + "fTranslation" : [0, 85, 0] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Pole_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "Pole", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":882}, + "fMedium" : { + "_typename" : "TGeoMedium", + "fUniqueID" : 3, + "fBits" : 50331648, + "fName" : "iron", + "fTitle" : "", + "fId" : 3, + "fParams" : [1, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : { + "_typename" : "TGeoMaterial", + "fUniqueID" : 3, + "fBits" : 50331648, + "fName" : "iron", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 2, + "fA" : 55.847, + "fZ" : 26, + "fDensity" : 7.87, + "fRadLen" : 1.75762222730907, + "fIntLen" : 16.9675125483994, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null + } + }, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 4, + "fNtotal" : 1, + "fRefCount" : 2 + }, + "fMother" : {"$ref":1261}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 52822016, + "fName" : "c3", + "fTitle" : "", + "fTranslation" : [0, -84.25, 0], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [1, 0, 0, 0, 0, 1, 0, -1, 0] + } + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Pole_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1271}, + "fMother" : {"$ref":1261}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 52822016, + "fName" : "c3", + "fTitle" : "", + "fTranslation" : [0, 84.25, 0], + "fRotation" : {"$ref":1275} + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Yoke_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Yoke", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 6, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":878}, + "fMedium" : { + "_typename" : "TGeoMedium", + "fUniqueID" : 4, + "fBits" : 50331648, + "fName" : "steel", + "fTitle" : "", + "fId" : 4, + "fParams" : [0, 1, 30, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : { + "_typename" : "TGeoMixture", + "fUniqueID" : 4, + "fBits" : 50462720, + "fName" : "steel", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 3, + "fA" : 55.3021846147983, + "fZ" : 25.7733568999496, + "fDensity" : 8.02, + "fRadLen" : 1.73601610180003, + "fIntLen" : 16.5874229502559, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null, + "fNelements" : 5, + "fZmixture" : [25, 14, 24, 28, 26], + "fAmixture" : [54.938, 28.09, 51.996, 58.693, 55.85], + "fWeights" : [0.0199389542374542, 0.00509743005324265, 0.179276379064425, 0.106508886477384, 0.689178350167495], + "fNatoms" : [], + "fVecNbOfAtomsPerVolume" : [], + "fElements" : null + } + }, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 5, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1261}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":4} + }] + }, + "fShape" : { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 350, + "fDY" : 224, + "fDZ" : 257.1, + "fOrigin" : [0, 0, 0], + "fVolume" : {"$ref":1261}, + "fBBoxOK" : true + }, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 2, + "fNtotal" : 6, + "fRefCount" : 7 + }, + "fMother" : {"$ref":1258}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t3", + "fTitle" : "", + "fTranslation" : [0, 0, 124.5] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof700_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "tof700", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "TOF2ChamberV0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 4, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2GlassVolumeV0_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "TOF2GlassVolumeV0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 7, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":883}, + "fMedium" : {"$ref":1143}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 7, + "fNtotal" : 1, + "fRefCount" : 2 + }, + "fMother" : {"$ref":1288}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":7} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ActiveGasVolumeV0_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "TOF2ActiveGasVolumeV0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 1, + "fBits" : 58736640, + "fName" : "ActiveGasStrip", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":884}, + "fMedium" : {"$ref":1092}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 8, + "fNtotal" : 1, + "fRefCount" : 32 + }, + "fMother" : {"$ref":1293}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -17.02578125, + "fIndex" : 0, + "fFinder" : { + "_typename" : "TGeoPatternY", + "fUniqueID" : 0, + "fBits" : 50331648, + "fStep" : 1.0984375, + "fStart" : -17.575, + "fEnd" : 17.575, + "fNdivisions" : 32, + "fDivIndex" : 0, + "fVolume" : {"$ref":1293} + } + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -15.92734375, + "fIndex" : 1, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 3, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -14.82890625, + "fIndex" : 2, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 4, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -13.73046875, + "fIndex" : 3, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 5, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -12.63203125, + "fIndex" : 4, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_6", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 6, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -11.53359375, + "fIndex" : 5, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_7", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 7, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -10.43515625, + "fIndex" : 6, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_8", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 8, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -9.33671875, + "fIndex" : 7, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_9", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 9, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -8.23828125, + "fIndex" : 8, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_10", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 10, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -7.13984375, + "fIndex" : 9, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_11", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 11, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -6.04140625, + "fIndex" : 10, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_12", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 12, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -4.94296875, + "fIndex" : 11, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_13", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 13, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -3.84453125, + "fIndex" : 12, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_14", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 14, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -2.74609375, + "fIndex" : 13, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_15", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 15, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -1.64765625, + "fIndex" : 14, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_16", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 16, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -0.549218749999998, + "fIndex" : 15, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_17", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 17, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 0.549218750000001, + "fIndex" : 16, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_18", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 18, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 1.64765625, + "fIndex" : 17, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_19", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 19, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 2.74609375, + "fIndex" : 18, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_20", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 20, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 3.84453125, + "fIndex" : 19, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_21", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 21, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 4.94296875, + "fIndex" : 20, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_22", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 22, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 6.04140625, + "fIndex" : 21, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_23", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 23, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 7.13984375, + "fIndex" : 22, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_24", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 24, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 8.23828125, + "fIndex" : 23, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_25", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 25, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 9.33671875, + "fIndex" : 24, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_26", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 26, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 10.43515625, + "fIndex" : 25, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_27", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 27, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 11.53359375, + "fIndex" : 26, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_28", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 28, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 12.63203125, + "fIndex" : 27, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_29", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 29, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 13.73046875, + "fIndex" : 28, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_30", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 30, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 14.82890625, + "fIndex" : 29, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_31", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 31, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 15.92734375, + "fIndex" : 30, + "fFinder" : {"$ref":1297} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_32", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1296}, + "fMother" : {"$ref":1293}, + "fNumber" : 32, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 17.02578125, + "fIndex" : 31, + "fFinder" : {"$ref":1297} + }] + }, + "fShape" : {"$ref":885}, + "fMedium" : {"$ref":1092}, + "fFinder" : {"$ref":1297}, + "fVoxels" : null, + "fNumber" : 9, + "fNtotal" : 33, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1288}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "GasLayerPosTOF2_trans", + "fTitle" : "", + "fTranslation" : [0, 0, -0.128] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2GlassVolumeV0_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1291}, + "fMother" : {"$ref":1288}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":8} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2G10VolumeV0_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "TOF2G10VolumeV0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 3, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":886}, + "fMedium" : {"$ref":1148}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 10, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1288}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":9} + }] + }, + "fShape" : {"$ref":887}, + "fMedium" : { + "_typename" : "TGeoMedium", + "fUniqueID" : 8, + "fBits" : 50331648, + "fName" : "aluminium", + "fTitle" : "", + "fId" : 8, + "fParams" : [0, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : { + "_typename" : "TGeoMaterial", + "fUniqueID" : 8, + "fBits" : 50331648, + "fName" : "aluminium", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 7, + "fA" : 26.98, + "fZ" : 13, + "fDensity" : 2.7, + "fRadLen" : 8.87510465963777, + "fIntLen" : 38.8622319406182, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null + } + }, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 11, + "fNtotal" : 37, + "fRefCount" : 25 + }, + "fMother" : {"$ref":1285}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_1_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [86.1, 29.65, 605.9] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_2_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [71.9, 29.65, 597.1] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 3, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_3_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [55.8, 29.65, 605.9] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 4, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_4_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [42.1, 29.65, 597.1] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 5, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_5_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [25.7, 29.65, 605.9] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_6", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 6, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_6_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [12.3, 29.65, 597.1] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_7", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 7, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_7_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [-4.5, 27.15, 605.9] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_8", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 8, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_8_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [88.2, -3.55, 635.9] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_9", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 9, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_9_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [72.1, -4.35, 627.1] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_10", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 10, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_10_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [58, -3.55, 635.9] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_11", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 11, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_11_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [42.3, -4.35, 627.1] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_12", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 12, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_12_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [27.8, -3.55, 635.9] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_13", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 13, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_13_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [27.8, -3.55, 647] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_14", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 14, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_14_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [12.5, -4.35, 627.1] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_15", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 15, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_15_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [86, -36.45, 605.9] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_16", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 16, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_16_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [71.9, -36.45, 597.1] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_17", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 17, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_17_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [55.8, -36.45, 605.9] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_18", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 18, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_18_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [42.1, -36.45, 597.1] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_19", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 19, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_19_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [25.7, -36.45, 605.9] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_20", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 20, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_20_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [12.3, -36.45, 597.1] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV0_21", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1288}, + "fMother" : {"$ref":1285}, + "fNumber" : 21, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_21_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [-4.5, -34.15, 605.9] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV1_22", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "TOF2ChamberV1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 4, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2GlassVolumeV1_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "TOF2GlassVolumeV1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 7, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":888}, + "fMedium" : {"$ref":1143}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 12, + "fNtotal" : 1, + "fRefCount" : 2 + }, + "fMother" : {"$ref":1377}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":7} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ActiveGasVolumeV1_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "TOF2ActiveGasVolumeV1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 1, + "fBits" : 58736640, + "fName" : "ActiveGasStrip", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":890}, + "fMedium" : {"$ref":1092}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 8, + "fNtotal" : 1, + "fRefCount" : 16 + }, + "fMother" : {"$ref":1382}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -14.2265625, + "fIndex" : 0, + "fFinder" : { + "_typename" : "TGeoPatternY", + "fUniqueID" : 0, + "fBits" : 50331648, + "fStep" : 1.896875, + "fStart" : -15.175, + "fEnd" : 15.175, + "fNdivisions" : 16, + "fDivIndex" : 0, + "fVolume" : {"$ref":1382} + } + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1385}, + "fMother" : {"$ref":1382}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -12.3296875, + "fIndex" : 1, + "fFinder" : {"$ref":1386} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1385}, + "fMother" : {"$ref":1382}, + "fNumber" : 3, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -10.4328125, + "fIndex" : 2, + "fFinder" : {"$ref":1386} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1385}, + "fMother" : {"$ref":1382}, + "fNumber" : 4, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -8.5359375, + "fIndex" : 3, + "fFinder" : {"$ref":1386} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1385}, + "fMother" : {"$ref":1382}, + "fNumber" : 5, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -6.6390625, + "fIndex" : 4, + "fFinder" : {"$ref":1386} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_6", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1385}, + "fMother" : {"$ref":1382}, + "fNumber" : 6, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -4.7421875, + "fIndex" : 5, + "fFinder" : {"$ref":1386} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_7", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1385}, + "fMother" : {"$ref":1382}, + "fNumber" : 7, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -2.8453125, + "fIndex" : 6, + "fFinder" : {"$ref":1386} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_8", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1385}, + "fMother" : {"$ref":1382}, + "fNumber" : 8, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : -0.948437499999999, + "fIndex" : 7, + "fFinder" : {"$ref":1386} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_9", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1385}, + "fMother" : {"$ref":1382}, + "fNumber" : 9, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 0.948437500000001, + "fIndex" : 8, + "fFinder" : {"$ref":1386} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_10", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1385}, + "fMother" : {"$ref":1382}, + "fNumber" : 10, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 2.8453125, + "fIndex" : 9, + "fFinder" : {"$ref":1386} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_11", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1385}, + "fMother" : {"$ref":1382}, + "fNumber" : 11, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 4.7421875, + "fIndex" : 10, + "fFinder" : {"$ref":1386} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_12", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1385}, + "fMother" : {"$ref":1382}, + "fNumber" : 12, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 6.6390625, + "fIndex" : 11, + "fFinder" : {"$ref":1386} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_13", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1385}, + "fMother" : {"$ref":1382}, + "fNumber" : 13, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 8.5359375, + "fIndex" : 12, + "fFinder" : {"$ref":1386} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_14", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1385}, + "fMother" : {"$ref":1382}, + "fNumber" : 14, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 10.4328125, + "fIndex" : 13, + "fFinder" : {"$ref":1386} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_15", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1385}, + "fMother" : {"$ref":1382}, + "fNumber" : 15, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 12.3296875, + "fIndex" : 14, + "fFinder" : {"$ref":1386} + }, { + "_typename" : "TGeoNodeOffset", + "fUniqueID" : 0, + "fBits" : 50364416, + "fName" : "ActiveGasStrip_16", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1385}, + "fMother" : {"$ref":1382}, + "fNumber" : 16, + "fNovlp" : 0, + "fOverlaps" : [], + "fOffset" : 14.2265625, + "fIndex" : 15, + "fFinder" : {"$ref":1386} + }] + }, + "fShape" : {"$ref":889}, + "fMedium" : {"$ref":1092}, + "fFinder" : {"$ref":1386}, + "fVoxels" : null, + "fNumber" : 13, + "fNtotal" : 17, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1377}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":1329} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2GlassVolumeV1_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1380}, + "fMother" : {"$ref":1377}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":8} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2G10VolumeV1_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "TOF2G10VolumeV1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 3, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":891}, + "fMedium" : {"$ref":1148}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 14, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1377}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":9} + }] + }, + "fShape" : {"$ref":892}, + "fMedium" : {"$ref":1333}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 15, + "fNtotal" : 21, + "fRefCount" : 7 + }, + "fMother" : {"$ref":1285}, + "fNumber" : 22, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_22_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [120.3, 25.15, 597.1] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV1_23", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1377}, + "fMother" : {"$ref":1285}, + "fNumber" : 23, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_23_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [120.5, -4.25, 627.1] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF2ChamberV1_24", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1377}, + "fMother" : {"$ref":1285}, + "fNumber" : 24, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "Module_24_PosTOF2_trans", + "fTitle" : "", + "fTranslation" : [120.3, -31.95, 597.1] + } + }] + }, + "fShape" : { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 82.001, + "fDY" : 52.126, + "fDZ" : 25.791, + "fOrigin" : [68, -3.4, 622.05], + "fVolume" : {"$ref":1285}, + "fBBoxOK" : true + }, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 6, + "fNtotal" : 841, + "fRefCount" : 26 + }, + "fMother" : {"$ref":1258}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":842} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VETO_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "VETO", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "VMDL", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 7, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VFEL_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "VFEL", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 7, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VRFL_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "VRFL", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":898}, + "fMedium" : { + "_typename" : "TGeoMedium", + "fUniqueID" : 15, + "fBits" : 50331648, + "fName" : "PLASTIC", + "fTitle" : "", + "fId" : 15, + "fParams" : [0, 1, 0.19, 1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : { + "_typename" : "TGeoMixture", + "fUniqueID" : 15, + "fBits" : 50462720, + "fName" : "PLASTIC", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 14, + "fA" : 11.158100787, + "fZ" : 5.61284345, + "fDensity" : 1.032, + "fRadLen" : 42.0401716084694, + "fIntLen" : 70.7393809758668, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null, + "fNelements" : 2, + "fZmixture" : [6, 1], + "fAmixture" : [12.01, 1.008], + "fWeights" : [0.9225687, 0.07743125], + "fNatoms" : [], + "fVecNbOfAtomsPerVolume" : [], + "fElements" : null + } + }, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 21, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1418}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":11} + }] + }, + "fShape" : {"$ref":895}, + "fMedium" : {"$ref":944}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 18, + "fNtotal" : 2, + "fRefCount" : 3 + }, + "fMother" : {"$ref":1415}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":13} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VFEL_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1418}, + "fMother" : {"$ref":1415}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":14} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "VSCL", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 3, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VRSL_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "VRSL", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":900}, + "fMedium" : {"$ref":1422}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 23, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1426}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":18} + }] + }, + "fShape" : {"$ref":897}, + "fMedium" : { + "_typename" : "TGeoMedium", + "fUniqueID" : 13, + "fBits" : 50331648, + "fName" : "PLASTIC", + "fTitle" : "", + "fId" : 13, + "fParams" : [1, 0, 0, 1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : {"$ref":1423} + }, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 20, + "fNtotal" : 2, + "fRefCount" : 67 + }, + "fMother" : {"$ref":1415}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":17} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "VPBL", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 4, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VRPL_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "VRPL", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":899}, + "fMedium" : {"$ref":1422}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 22, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1432}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":20} + }] + }, + "fShape" : {"$ref":896}, + "fMedium" : { + "_typename" : "TGeoMedium", + "fUniqueID" : 14, + "fBits" : 50331648, + "fName" : "LEAD", + "fTitle" : "", + "fId" : 14, + "fParams" : [0, 0, 0, 1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : { + "_typename" : "TGeoMaterial", + "fUniqueID" : 10, + "fBits" : 50462720, + "fName" : "LEAD", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 9, + "fA" : 207.19, + "fZ" : 82, + "fDensity" : 11.35, + "fRadLen" : 0.561704911574565, + "fIntLen" : 18.2591661751475, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null + } + }, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 19, + "fNtotal" : 2, + "fRefCount" : 67 + }, + "fMother" : {"$ref":1415}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":19} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":24} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":25} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 3, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":28} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 3, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":29} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 4, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":32} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 4, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":33} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 5, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":36} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 5, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":37} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_6", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 6, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":40} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_6", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 6, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":41} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_7", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 7, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":44} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_7", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 7, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":45} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_8", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 8, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":48} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_8", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 8, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":49} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_9", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 9, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":52} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_9", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 9, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":53} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_10", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 10, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":56} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_10", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 10, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":57} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_11", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 11, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":60} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_11", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 11, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":61} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_12", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 12, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":64} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_12", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 12, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":65} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_13", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 13, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":68} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_13", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 13, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":69} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_14", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 14, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":72} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_14", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 14, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":73} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_15", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 15, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":76} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_15", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 15, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":77} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_16", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 16, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":80} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_16", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 16, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":81} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_17", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 17, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":84} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_17", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 17, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":85} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_18", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 18, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":88} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_18", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 18, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":89} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_19", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 19, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":92} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_19", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 19, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":93} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_20", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 20, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":96} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_20", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 20, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":97} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_21", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 21, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":100} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_21", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 21, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":101} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_22", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 22, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":104} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_22", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 22, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":105} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_23", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 23, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":108} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_23", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 23, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":109} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_24", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 24, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":112} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_24", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 24, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":113} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_25", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 25, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":116} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_25", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 25, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":117} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_26", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 26, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":120} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_26", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 26, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":121} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_27", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 27, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":124} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_27", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 27, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":125} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_28", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 28, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":128} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_28", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 28, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":129} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_29", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 29, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":132} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_29", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 29, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":133} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_30", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 30, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":136} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_30", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 30, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":137} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_31", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 31, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":140} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_31", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 31, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":141} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_32", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 32, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":144} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_32", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 32, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":145} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_33", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 33, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":148} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_33", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 33, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":149} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_34", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 34, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":152} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_34", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 34, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":153} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_35", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 35, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":156} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_35", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 35, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":157} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_36", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 36, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":160} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_36", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 36, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":161} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_37", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 37, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":164} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_37", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 37, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":165} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_38", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 38, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":168} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_38", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 38, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":169} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_39", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 39, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":172} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_39", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 39, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":173} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_40", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 40, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":176} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_40", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 40, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":177} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_41", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 41, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":180} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_41", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 41, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":181} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_42", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 42, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":184} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_42", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 42, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":185} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_43", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 43, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":188} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_43", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 43, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":189} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_44", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 44, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":192} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_44", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 44, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":193} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_45", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 45, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":196} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_45", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 45, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":197} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_46", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 46, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":200} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_46", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 46, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":201} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_47", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 47, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":204} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_47", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 47, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":205} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_48", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 48, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":208} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_48", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 48, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":209} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_49", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 49, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":212} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_49", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 49, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":213} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_50", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 50, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":216} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_50", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 50, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":217} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_51", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 51, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":220} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_51", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 51, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":221} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_52", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 52, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":224} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_52", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 52, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":225} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_53", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 53, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":228} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_53", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 53, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":229} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_54", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 54, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":232} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_54", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 54, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":233} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_55", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 55, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":236} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_55", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 55, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":237} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_56", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 56, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":240} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_56", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 56, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":241} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_57", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 57, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":244} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_57", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 57, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":245} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_58", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 58, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":248} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_58", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 58, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":249} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_59", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 59, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":252} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_59", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 59, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":253} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_60", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 60, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":256} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_60", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 60, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":257} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_61", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 61, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":260} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_61", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 61, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":261} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_62", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 62, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":264} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_62", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 62, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":265} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_63", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 63, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":268} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_63", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 63, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":269} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_64", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 64, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":272} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_64", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 64, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":273} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_65", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 65, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":276} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_65", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 65, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":277} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VSCL_66", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1426}, + "fMother" : {"$ref":1415}, + "fNumber" : 66, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":280} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VPBL_66", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1432}, + "fMother" : {"$ref":1415}, + "fNumber" : 66, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":281} + }] + }, + "fShape" : {"$ref":894}, + "fMedium" : {"$ref":944}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 17, + "fNtotal" : 269, + "fRefCount" : 202 + }, + "fMother" : {"$ref":1412}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":284} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":285} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 3, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":286} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 4, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":287} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 5, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":288} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_6", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 6, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":289} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_7", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 7, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":290} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_8", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 8, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":291} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_9", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 9, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":292} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_10", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 10, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":293} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_11", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 11, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":294} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_12", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 12, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":295} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_13", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 13, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":296} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_14", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 14, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":297} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_15", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 15, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":298} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_16", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 16, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":299} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_17", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 17, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":300} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_18", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 18, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":301} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_19", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 19, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":302} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_20", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 20, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":303} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_21", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 21, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":304} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_22", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 22, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":305} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_23", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 23, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":306} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_24", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 24, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":307} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_25", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 25, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":308} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_26", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 26, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":309} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "UMDL", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 7, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UFEL_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "UFEL", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 7, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "URFL_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "URFL", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":906}, + "fMedium" : {"$ref":1422}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 29, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1597}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":12} + }] + }, + "fShape" : {"$ref":905}, + "fMedium" : {"$ref":944}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 28, + "fNtotal" : 2, + "fRefCount" : 3 + }, + "fMother" : {"$ref":1594}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":15} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UFEL_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1597}, + "fMother" : {"$ref":1594}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":16} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "USCL", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 3, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "URSL_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "URSL", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":903}, + "fMedium" : {"$ref":1422}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 26, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1603}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":22} + }] + }, + "fShape" : {"$ref":902}, + "fMedium" : {"$ref":1430}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 25, + "fNtotal" : 2, + "fRefCount" : 67 + }, + "fMother" : {"$ref":1594}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":21} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "UPBL", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 4, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":904}, + "fMedium" : {"$ref":1436}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 27, + "fNtotal" : 1, + "fRefCount" : 66 + }, + "fMother" : {"$ref":1594}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":23} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":26} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":27} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 3, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":30} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 3, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":31} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 4, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":34} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 4, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":35} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 5, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":38} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 5, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":39} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_6", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 6, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":42} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_6", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 6, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":43} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_7", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 7, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":46} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_7", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 7, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":47} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_8", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 8, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":50} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_8", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 8, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":51} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_9", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 9, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":54} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_9", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 9, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":55} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_10", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 10, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":58} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_10", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 10, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":59} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_11", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 11, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":62} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_11", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 11, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":63} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_12", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 12, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":66} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_12", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 12, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":67} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_13", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 13, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":70} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_13", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 13, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":71} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_14", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 14, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":74} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_14", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 14, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":75} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_15", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 15, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":78} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_15", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 15, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":79} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_16", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 16, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":82} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_16", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 16, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":83} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_17", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 17, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":86} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_17", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 17, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":87} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_18", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 18, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":90} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_18", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 18, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":91} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_19", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 19, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":94} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_19", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 19, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":95} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_20", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 20, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":98} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_20", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 20, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":99} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_21", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 21, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":102} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_21", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 21, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":103} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_22", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 22, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":106} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_22", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 22, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":107} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_23", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 23, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":110} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_23", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 23, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":111} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_24", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 24, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":114} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_24", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 24, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":115} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_25", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 25, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":118} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_25", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 25, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":119} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_26", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 26, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":122} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_26", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 26, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":123} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_27", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 27, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":126} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_27", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 27, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":127} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_28", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 28, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":130} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_28", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 28, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":131} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_29", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 29, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":134} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_29", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 29, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":135} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_30", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 30, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":138} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_30", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 30, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":139} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_31", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 31, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":142} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_31", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 31, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":143} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_32", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 32, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":146} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_32", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 32, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":147} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_33", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 33, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":150} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_33", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 33, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":151} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_34", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 34, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":154} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_34", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 34, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":155} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_35", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 35, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":158} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_35", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 35, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":159} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_36", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 36, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":162} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_36", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 36, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":163} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_37", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 37, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":166} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_37", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 37, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":167} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_38", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 38, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":170} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_38", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 38, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":171} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_39", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 39, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":174} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_39", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 39, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":175} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_40", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 40, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":178} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_40", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 40, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":179} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_41", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 41, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":182} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_41", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 41, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":183} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_42", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 42, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":186} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_42", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 42, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":187} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_43", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 43, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":190} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_43", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 43, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":191} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_44", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 44, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":194} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_44", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 44, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":195} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_45", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 45, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":198} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_45", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 45, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":199} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_46", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 46, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":202} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_46", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 46, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":203} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_47", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 47, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":206} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_47", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 47, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":207} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_48", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 48, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":210} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_48", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 48, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":211} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_49", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 49, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":214} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_49", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 49, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":215} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_50", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 50, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":218} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_50", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 50, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":219} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_51", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 51, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":222} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_51", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 51, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":223} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_52", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 52, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":226} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_52", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 52, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":227} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_53", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 53, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":230} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_53", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 53, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":231} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_54", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 54, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":234} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_54", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 54, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":235} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_55", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 55, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":238} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_55", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 55, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":239} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_56", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 56, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":242} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_56", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 56, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":243} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_57", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 57, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":246} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_57", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 57, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":247} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_58", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 58, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":250} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_58", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 58, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":251} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_59", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 59, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":254} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_59", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 59, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":255} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_60", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 60, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":258} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_60", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 60, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":259} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_61", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 61, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":262} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_61", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 61, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":263} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_62", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 62, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":266} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_62", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 62, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":267} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_63", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 63, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":270} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_63", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 63, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":271} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_64", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 64, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":274} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_64", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 64, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":275} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_65", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 65, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":278} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_65", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 65, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":279} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "USCL_66", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1603}, + "fMother" : {"$ref":1594}, + "fNumber" : 66, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":282} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UPBL_66", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1608}, + "fMother" : {"$ref":1594}, + "fNumber" : 66, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":283} + }] + }, + "fShape" : {"$ref":901}, + "fMedium" : {"$ref":944}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 24, + "fNtotal" : 203, + "fRefCount" : 166 + }, + "fMother" : {"$ref":1412}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":310} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":311} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 3, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":312} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 4, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":313} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 5, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":314} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_6", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 6, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":315} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_7", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 7, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":316} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_8", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 8, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":317} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_9", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 9, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":318} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_10", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 10, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":319} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_11", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 11, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":320} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_12", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 12, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":321} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_27", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 27, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":322} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_28", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 28, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":323} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_29", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 29, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":324} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_30", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 30, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":325} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_31", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 31, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":326} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_32", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 32, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":327} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_33", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 33, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":328} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_34", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 34, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":329} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_13", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 13, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":330} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_14", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 14, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":331} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_15", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 15, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":332} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_16", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 16, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":333} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_17", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 17, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":334} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_19", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 19, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":335} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_22", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 22, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":336} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_24", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 24, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":337} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_35", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 35, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":338} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_36", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 36, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":339} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_37", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 37, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":340} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_38", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 38, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":341} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_39", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 39, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":342} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_40", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 40, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":343} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_41", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 41, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":344} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_42", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 42, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":345} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_25", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 25, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":346} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_26", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 26, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":347} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_27", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 27, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":348} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_28", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 28, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":349} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_29", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 29, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":350} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_30", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 30, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":351} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_31", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 31, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":352} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_32", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 32, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":353} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_33", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 33, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":354} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_34", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 34, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":355} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_35", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 35, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":356} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "UMDL_36", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1594}, + "fMother" : {"$ref":1412}, + "fNumber" : 36, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":357} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_43", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 43, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":358} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_44", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 44, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":359} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_45", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 45, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":360} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_46", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 46, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":361} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_47", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 47, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":362} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_48", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 48, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":363} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_49", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 49, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":364} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_50", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 50, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":365} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_51", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 51, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":366} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_52", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 52, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":367} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_53", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 53, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":368} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_54", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 54, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":369} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_55", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 55, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":370} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_56", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 56, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":371} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_57", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 57, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":372} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_58", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 58, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":373} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_59", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 59, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":374} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_60", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 60, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":375} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_61", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 61, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":376} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_62", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 62, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":377} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_63", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 63, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":378} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_64", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 64, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":379} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_65", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 65, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":380} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_66", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 66, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":381} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_67", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 67, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":382} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "VMDL_68", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1415}, + "fMother" : {"$ref":1412}, + "fNumber" : 68, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":383} + }] + }, + "fShape" : {"$ref":893}, + "fMedium" : { + "_typename" : "TGeoMedium", + "fUniqueID" : 9, + "fBits" : 50331648, + "fName" : "AIR", + "fTitle" : "", + "fId" : 9, + "fParams" : [0, 1, 0.19, 0.25, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : { + "_typename" : "TGeoMaterial", + "fUniqueID" : 11, + "fBits" : 50462720, + "fName" : "AIR", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 10, + "fA" : 14.61, + "fZ" : 7.3, + "fDensity" : 0.001205, + "fRadLen" : 30412.608512906, + "fIntLen" : 70037.7174700344, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null + } + }, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 16, + "fNtotal" : 24789, + "fRefCount" : 101 + }, + "fMother" : {"$ref":1258}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":10} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "GEMS_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "GEMS", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "station0_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":940}, + "fMother" : {"$ref":1815}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t383", + "fTitle" : "", + "fTranslation" : [-1.5, -4.5, 32.7], + "fRotation" : null + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "station1_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":960}, + "fMother" : {"$ref":1815}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t389", + "fTitle" : "", + "fTranslation" : [-1.5, -4.5, 64.5], + "fRotation" : null + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "station2_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":980}, + "fMother" : {"$ref":1815}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t395", + "fTitle" : "", + "fTranslation" : [-1.5, -4.5, 96.5], + "fRotation" : null + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "station3_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1010}, + "fMother" : {"$ref":1815}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t401", + "fTitle" : "", + "fTranslation" : [0, -4.5, 128.5], + "fRotation" : null + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "station4_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1043}, + "fMother" : {"$ref":1815}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t413", + "fTitle" : "", + "fTranslation" : [0, -6.9, 161.1], + "fRotation" : null + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "station5_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1076}, + "fMother" : {"$ref":1815}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t423", + "fTitle" : "", + "fTranslation" : [0, -6.9, 193.1], + "fRotation" : null + } + }] + }, + "fShape" : { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 86.6, + "fDY" : 26.55, + "fDZ" : 81.75, + "fOrigin" : [0, -6.6, 113.75], + "fVolume" : {"$ref":1815}, + "fBBoxOK" : true + }, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 30, + "fNtotal" : 57, + "fRefCount" : 8 + }, + "fMother" : {"$ref":1258}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":838} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "TOF400_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "TOF400", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1Detector_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1088}, + "fMother" : {"$ref":1831}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t1", + "fTitle" : "", + "fTranslation" : [54.4, 54, 458.66] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1Detector_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1088}, + "fMother" : {"$ref":1831}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t1", + "fTitle" : "", + "fTranslation" : [54.4, 27, 454.8] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1Detector_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1088}, + "fMother" : {"$ref":1831}, + "fNumber" : 3, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t1", + "fTitle" : "", + "fTranslation" : [54.4, 0, 458.66] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1Detector_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1088}, + "fMother" : {"$ref":1831}, + "fNumber" : 4, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t1", + "fTitle" : "", + "fTranslation" : [54.4, -27, 454.8] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1Detector_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1088}, + "fMother" : {"$ref":1831}, + "fNumber" : 5, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t1", + "fTitle" : "", + "fTranslation" : [54.4, -54, 458.66] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1Detector_6", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1088}, + "fMother" : {"$ref":1831}, + "fNumber" : 6, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t1", + "fTitle" : "", + "fTranslation" : [54.4, 54, 446.46] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1Detector_7", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1088}, + "fMother" : {"$ref":1831}, + "fNumber" : 7, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t1", + "fTitle" : "", + "fTranslation" : [54.4, 27, 442.6] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1Detector_8", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1088}, + "fMother" : {"$ref":1831}, + "fNumber" : 8, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t1", + "fTitle" : "", + "fTranslation" : [54.4, 0, 446.46] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1Detector_9", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1088}, + "fMother" : {"$ref":1831}, + "fNumber" : 9, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t1", + "fTitle" : "", + "fTranslation" : [54.4, -27, 442.6] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tof1Detector_10", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1088}, + "fMother" : {"$ref":1831}, + "fNumber" : 10, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t1", + "fTitle" : "", + "fTranslation" : [54.4, -54, 446.46] + } + }] + }, + "fShape" : { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 30, + "fDY" : 69, + "fDZ" : 9.53, + "fOrigin" : [54.4, 0, 450.63], + "fVolume" : {"$ref":1831}, + "fBBoxOK" : true + }, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 77, + "fNtotal" : 531, + "fRefCount" : 12 + }, + "fMother" : {"$ref":1258}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52428800, + "fName" : "tw", + "fTitle" : "", + "fTranslation" : [0, 0, 0] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "DCH_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "DCH", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "DCHDetV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "DCHDetV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 3, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "DCHActivePlaneV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "DCHActivePlaneV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 7, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1151}, + "fMedium" : {"$ref":964}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 83, + "fNtotal" : 1, + "fRefCount" : 8 + }, + "fMother" : {"$ref":1859}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":490} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "DCHActivePlaneV_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1862}, + "fMother" : {"$ref":1859}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":491} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "DCHActivePlaneV_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1862}, + "fMother" : {"$ref":1859}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":492} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "DCHActivePlaneV_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1862}, + "fMother" : {"$ref":1859}, + "fNumber" : 3, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":493} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "DCHActivePlaneV_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1862}, + "fMother" : {"$ref":1859}, + "fNumber" : 4, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":494} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "DCHActivePlaneV_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1862}, + "fMother" : {"$ref":1859}, + "fNumber" : 5, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":495} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "DCHActivePlaneV_6", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1862}, + "fMother" : {"$ref":1859}, + "fNumber" : 6, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":496} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "DCHActivePlaneV_7", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1862}, + "fMother" : {"$ref":1859}, + "fNumber" : 7, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":497} + }] + }, + "fShape" : {"$ref":1152}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 84, + "fNtotal" : 9, + "fRefCount" : 10 + }, + "fMother" : {"$ref":1856}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 52822016, + "fName" : "c485", + "fTitle" : "", + "fTranslation" : [0, 0, 514], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "rot", + "fTitle" : "", + "fRotationMatrix" : [0.923879532511287, -0.38268343236509, 0, 0.38268343236509, 0.923879532511287, -0, 0, 0, 1] + } + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "DCHDetV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1859}, + "fMother" : {"$ref":1856}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 52822016, + "fName" : "c493", + "fTitle" : "", + "fTranslation" : [0, 0, 713], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "rot", + "fTitle" : "", + "fRotationMatrix" : [0.923879532511287, -0.38268343236509, 0, 0.38268343236509, 0.923879532511287, -0, 0, 0, 1] + } + } + }] + }, + "fShape" : { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 204.834692374119, + "fDY" : 204.834692374119, + "fDZ" : 112.75, + "fOrigin" : [0, 0, 613.5], + "fVolume" : {"$ref":1856}, + "fBBoxOK" : true + }, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 82, + "fNtotal" : 19, + "fRefCount" : 4 + }, + "fMother" : {"$ref":1258}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":843} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "MWPC_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "MWPC", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "MWPCContainerV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "MWPCContainerV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 3, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "MWPCActivePlaneV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "MWPCActivePlaneV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 7, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1154}, + "fMedium" : {"$ref":964}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 86, + "fNtotal" : 1, + "fRefCount" : 6 + }, + "fMother" : {"$ref":1880}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":498} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "MWPCActivePlaneV_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1883}, + "fMother" : {"$ref":1880}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":499} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "MWPCActivePlaneV_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1883}, + "fMother" : {"$ref":1880}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":501} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "MWPCActivePlaneV_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1883}, + "fMother" : {"$ref":1880}, + "fNumber" : 3, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":503} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "MWPCActivePlaneV_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1883}, + "fMother" : {"$ref":1880}, + "fNumber" : 4, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":505} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "MWPCActivePlaneV_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1883}, + "fMother" : {"$ref":1880}, + "fNumber" : 5, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":507} + }] + }, + "fShape" : {"$ref":1153}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 87, + "fNtotal" : 7, + "fRefCount" : 8 + }, + "fMother" : {"$ref":1877}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "DetPos0_trans", + "fTitle" : "", + "fTranslation" : [0, 0, -362.41265] + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "MWPCContainerV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1880}, + "fMother" : {"$ref":1877}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "DetPos1_trans", + "fTitle" : "", + "fTranslation" : [0, 0, -212.63755] + } + }] + }, + "fShape" : { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 26.15396719429, + "fDY" : 26.15396719429, + "fDZ" : 78.39205, + "fOrigin" : [0, 0, -287.5251], + "fVolume" : {"$ref":1877}, + "fBBoxOK" : true + }, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 85, + "fNtotal" : 15, + "fRefCount" : 4 + }, + "fMother" : {"$ref":1258}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":844} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "ecal01", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 3, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "ecal01mod", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 3, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01front_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "ecal01front", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 6, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1157}, + "fMedium" : {"$ref":1280}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 90, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1897}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":511} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "ecal01lay", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 3, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lead_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "ecal01lead", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 3, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1159}, + "fMedium" : {"$ref":1430}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 92, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":1902}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":513} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01scint_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58736640, + "fName" : "ecal01scint", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 4, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1160}, + "fMedium" : { + "_typename" : "TGeoMedium", + "fUniqueID" : 20, + "fBits" : 50331648, + "fName" : "FscScint", + "fTitle" : "", + "fId" : 20, + "fParams" : [1, 1, 20, -1, -1, -1, 1e-4, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : { + "_typename" : "TGeoMixture", + "fUniqueID" : 20, + "fBits" : 50462720, + "fName" : "FscScint", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 19, + "fA" : 11.0715201827875, + "fZ" : 5.57349581111957, + "fDensity" : 1.032, + "fRadLen" : 42.1299811568047, + "fIntLen" : 70.0999370078305, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null, + "fNelements" : 2, + "fZmixture" : [6, 1], + "fAmixture" : [12.01, 1.008], + "fWeights" : [0.914699162223915, 0.0853008377760853], + "fNatoms" : [], + "fVecNbOfAtomsPerVolume" : [], + "fElements" : null + } + }, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 93, + "fNtotal" : 1, + "fRefCount" : 9 + }, + "fMother" : {"$ref":1902}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":514} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01scint_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1907}, + "fMother" : {"$ref":1902}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":515} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01scint_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1907}, + "fMother" : {"$ref":1902}, + "fNumber" : 3, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":516} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01scint_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1907}, + "fMother" : {"$ref":1902}, + "fNumber" : 4, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":517} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01scint_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1907}, + "fMother" : {"$ref":1902}, + "fNumber" : 5, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":518} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01scint_6", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1907}, + "fMother" : {"$ref":1902}, + "fNumber" : 6, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":519} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01scint_7", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1907}, + "fMother" : {"$ref":1902}, + "fNumber" : 7, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":520} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01scint_8", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1907}, + "fMother" : {"$ref":1902}, + "fNumber" : 8, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":521} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01scint_9", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1907}, + "fMother" : {"$ref":1902}, + "fNumber" : 9, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":522} + }] + }, + "fShape" : {"$ref":1158}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 91, + "fNtotal" : 11, + "fRefCount" : 230 + }, + "fMother" : {"$ref":1897}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":512} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":523} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 3, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":524} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 4, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":525} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 5, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":526} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_6", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 6, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":527} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_7", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 7, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":528} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_8", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 8, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":529} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_9", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 9, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":530} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_10", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 10, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":531} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_11", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 11, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":532} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_12", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 12, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":533} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_13", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 13, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":534} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_14", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 14, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":535} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_15", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 15, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":536} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_16", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 16, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":537} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_17", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 17, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":538} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_18", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 18, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":539} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_19", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 19, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":540} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_20", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 20, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":541} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_21", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 21, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":542} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_22", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 22, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":543} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_23", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 23, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":544} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_24", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 24, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":545} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_25", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 25, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":546} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_26", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 26, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":547} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_27", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 27, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":548} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_28", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 28, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":549} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_29", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 29, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":550} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_30", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 30, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":551} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_31", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 31, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":552} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_32", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 32, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":553} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_33", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 33, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":554} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_34", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 34, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":555} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_35", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 35, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":556} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_36", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 36, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":557} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_37", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 37, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":558} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_38", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 38, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":559} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_39", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 39, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":560} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_40", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 40, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":561} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_41", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 41, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":562} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_42", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 42, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":563} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_43", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 43, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":564} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_44", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 44, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":565} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_45", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 45, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":566} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_46", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 46, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":567} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_47", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 47, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":568} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_48", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 48, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":569} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_49", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 49, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":570} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_50", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 50, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":571} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_51", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 51, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":572} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_52", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 52, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":573} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_53", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 53, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":574} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_54", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 54, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":575} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_55", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 55, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":576} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_56", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 56, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":577} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_57", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 57, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":578} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_58", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 58, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":579} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_59", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 59, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":580} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_60", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 60, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":581} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_61", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 61, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":582} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_62", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 62, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":583} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_63", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 63, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":584} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_64", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 64, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":585} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_65", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 65, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":586} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_66", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 66, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":587} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_67", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 67, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":588} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_68", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 68, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":589} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_69", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 69, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":590} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_70", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 70, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":591} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_71", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 71, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":592} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_72", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 72, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":593} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_73", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 73, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":594} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_74", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 74, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":595} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_75", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 75, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":596} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_76", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 76, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":597} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_77", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 77, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":598} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_78", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 78, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":599} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_79", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 79, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":600} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_80", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 80, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":601} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_81", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 81, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":602} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_82", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 82, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":603} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_83", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 83, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":604} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_84", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 84, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":605} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_85", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 85, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":606} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_86", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 86, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":607} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_87", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 87, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":608} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_88", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 88, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":609} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_89", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 89, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":610} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_90", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 90, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":611} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_91", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 91, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":612} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_92", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 92, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":613} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_93", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 93, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":614} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_94", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 94, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":615} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_95", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 95, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":616} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_96", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 96, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":617} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_97", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 97, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":618} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_98", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 98, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":619} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_99", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 99, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":620} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_100", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 100, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":621} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_101", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 101, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":622} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_102", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 102, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":623} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_103", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 103, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":624} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_104", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 104, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":625} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_105", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 105, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":626} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_106", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 106, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":627} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_107", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 107, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":628} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_108", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 108, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":629} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_109", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 109, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":630} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_110", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 110, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":631} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_111", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 111, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":632} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_112", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 112, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":633} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_113", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 113, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":634} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_114", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 114, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":635} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_115", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 115, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":636} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_116", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 116, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":637} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_117", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 117, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":638} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_118", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 118, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":639} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_119", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 119, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":640} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_120", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 120, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":641} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_121", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 121, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":642} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_122", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 122, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":643} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_123", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 123, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":644} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_124", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 124, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":645} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_125", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 125, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":646} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_126", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 126, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":647} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_127", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 127, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":648} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_128", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 128, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":649} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_129", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 129, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":650} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_130", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 130, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":651} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_131", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 131, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":652} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_132", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 132, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":653} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_133", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 133, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":654} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_134", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 134, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":655} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_135", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 135, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":656} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_136", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 136, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":657} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_137", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 137, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":658} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_138", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 138, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":659} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_139", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 139, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":660} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_140", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 140, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":661} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_141", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 141, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":662} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_142", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 142, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":663} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_143", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 143, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":664} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_144", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 144, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":665} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_145", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 145, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":666} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_146", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 146, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":667} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_147", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 147, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":668} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_148", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 148, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":669} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_149", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 149, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":670} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_150", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 150, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":671} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_151", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 151, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":672} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_152", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 152, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":673} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_153", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 153, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":674} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_154", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 154, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":675} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_155", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 155, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":676} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_156", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 156, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":677} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_157", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 157, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":678} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_158", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 158, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":679} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_159", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 159, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":680} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_160", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 160, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":681} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_161", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 161, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":682} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_162", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 162, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":683} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_163", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 163, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":684} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_164", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 164, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":685} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_165", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 165, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":686} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_166", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 166, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":687} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_167", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 167, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":688} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_168", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 168, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":689} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_169", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 169, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":690} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_170", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 170, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":691} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_171", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 171, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":692} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_172", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 172, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":693} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_173", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 173, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":694} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_174", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 174, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":695} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_175", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 175, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":696} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_176", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 176, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":697} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_177", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 177, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":698} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_178", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 178, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":699} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_179", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 179, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":700} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_180", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 180, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":701} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_181", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 181, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":702} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_182", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 182, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":703} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_183", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 183, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":704} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_184", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 184, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":705} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_185", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 185, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":706} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_186", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 186, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":707} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_187", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 187, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":708} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_188", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 188, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":709} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_189", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 189, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":710} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_190", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 190, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":711} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_191", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 191, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":712} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_192", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 192, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":713} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_193", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 193, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":714} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_194", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 194, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":715} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_195", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 195, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":716} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_196", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 196, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":717} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_197", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 197, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":718} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_198", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 198, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":719} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_199", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 199, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":720} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_200", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 200, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":721} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_201", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 201, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":722} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_202", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 202, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":723} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_203", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 203, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":724} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_204", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 204, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":725} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_205", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 205, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":726} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_206", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 206, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":727} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_207", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 207, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":728} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_208", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 208, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":729} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_209", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 209, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":730} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_210", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 210, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":731} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_211", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 211, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":732} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_212", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 212, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":733} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_213", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 213, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":734} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_214", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 214, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":735} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_215", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 215, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":736} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_216", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 216, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":737} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_217", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 217, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":738} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_218", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 218, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":739} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_219", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 219, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":740} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01lay_220", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1902}, + "fMother" : {"$ref":1897}, + "fNumber" : 220, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":741} + }] + }, + "fShape" : {"$ref":1156}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 89, + "fNtotal" : 2422, + "fRefCount" : 301 + }, + "fMother" : {"$ref":1894}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":510} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":742} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 3, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":743} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 4, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":744} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 5, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":745} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_6", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 6, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":746} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_7", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 7, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":747} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_8", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 8, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":748} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_9", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 9, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":749} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_10", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 10, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":750} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_11", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 11, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":751} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_12", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 12, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":752} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_13", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 13, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":753} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_14", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 14, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":754} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_15", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 15, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":755} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_16", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 16, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":756} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_17", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 17, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":757} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_18", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 18, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":758} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_19", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 19, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":759} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_20", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 20, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":760} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_21", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 21, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":761} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_22", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 22, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":762} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_23", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 23, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":763} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_24", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 24, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":764} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_25", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 25, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":765} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_26", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 26, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":766} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_27", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 27, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":767} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_28", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 28, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":768} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_29", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 29, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":769} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_30", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 30, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":770} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_31", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 31, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":771} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_32", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 32, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":772} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_33", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 33, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":773} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_34", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 34, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":774} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_35", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 35, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":775} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_36", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 36, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":776} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_37", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 37, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":777} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_38", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 38, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":778} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_39", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 39, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":779} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_40", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 40, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":780} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_41", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 41, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":781} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_42", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 42, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":782} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_43", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 43, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":783} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_44", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 44, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":784} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_45", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 45, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":785} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_46", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 46, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":786} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_47", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 47, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":787} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_48", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 48, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":788} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_49", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 49, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":789} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_50", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 50, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":790} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_51", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 51, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":791} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_52", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 52, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":792} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_53", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 53, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":793} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_54", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 54, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":794} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_55", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 55, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":795} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_56", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 56, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":796} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_57", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 57, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":797} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_58", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 58, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":798} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_59", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 59, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":799} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_60", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 60, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":800} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_61", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 61, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":801} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_62", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 62, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":802} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_63", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 63, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":803} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_64", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 64, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":804} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_65", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 65, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":805} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_66", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 66, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":806} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_67", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 67, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":807} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_68", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 68, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":808} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_69", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 69, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":809} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_70", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 70, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":810} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_71", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 71, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":811} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_72", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 72, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":812} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_73", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 73, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":813} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_74", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 74, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":814} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_75", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 75, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":815} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_76", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 76, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":816} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_77", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 77, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":817} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_78", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 78, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":818} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_79", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 79, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":819} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01mod_80", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1897}, + "fMother" : {"$ref":1894}, + "fNumber" : 80, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":820} + }] + }, + "fShape" : {"$ref":1155}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 88, + "fNtotal" : 193761, + "fRefCount" : 82 + }, + "fMother" : {"$ref":1258}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":509} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ecal01_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1894}, + "fMother" : {"$ref":1258}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":821} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Silicon_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59785216, + "fName" : "Silicon", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "station0_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolumeAssembly", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "station0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 1, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "moduleV_0_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "moduleV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_zone_upper_partV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_zone_upper_partV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1233}, + "fMedium" : { + "_typename" : "TGeoMedium", + "fUniqueID" : 21, + "fBits" : 50331648, + "fName" : "silicon", + "fTitle" : "", + "fId" : 21, + "fParams" : [1, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : { + "_typename" : "TGeoMaterial", + "fUniqueID" : 21, + "fBits" : 50331648, + "fName" : "silicon", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 20, + "fA" : 28.0855, + "fZ" : 14, + "fDensity" : 2.33, + "fRadLen" : 9.34960746942193, + "fIntLen" : 45.753205754866, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null + } + }, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 95, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2224}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":822} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_zone_lower_part_rectV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_zone_lower_part_rectV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1234}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 96, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2224}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":823} + }] + }, + "fShape" : {"$ref":1235}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 97, + "fNtotal" : 3, + "fRefCount" : 3 + }, + "fMother" : {"$ref":2221}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 61210624, + "fName" : "c812", + "fTitle" : "", + "fTranslation" : [9, 6.15175, 3.325], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [-1, 0, 1.22464679914735e-16, 0, 1, 0, -1.22464679914735e-16, -0, -1] + } + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frameV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 2, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1161}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 98, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2221}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 61210624, + "fName" : "c814", + "fTitle" : "", + "fTranslation" : [9, 6.15175, 3.22], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [-1, 0, 1.22464679914735e-16, 0, 1, 0, -1.22464679914735e-16, -0, -1] + } + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "moduleV_1_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "moduleV_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_zone_upper_partV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_zone_upper_partV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1238}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 95, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2239}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":824} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_zone_lower_part_bevelV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_zone_lower_part_bevelV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1236}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 99, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2239}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":825} + }] + }, + "fShape" : {"$ref":1237}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 100, + "fNtotal" : 3, + "fRefCount" : 3 + }, + "fMother" : {"$ref":2221}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 61210624, + "fName" : "c814", + "fTitle" : "", + "fTranslation" : [3, 6.15175, 1.795], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [-1, 0, 1.22464679914735e-16, 0, 1, 0, -1.22464679914735e-16, -0, -1] + } + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frameV_1", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 17, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1170}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 8, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2221}, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 61210624, + "fName" : "c816", + "fTitle" : "", + "fTranslation" : [3, 6.15175, 1.69], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [-1, 0, 1.22464679914735e-16, 0, 1, 0, -1.22464679914735e-16, -0, -1] + } + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "moduleV_2_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "moduleV_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_zone_upper_partV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_zone_upper_partV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1240}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 95, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2252}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":826} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_zone_lower_part_bevelV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_zone_lower_part_bevelV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1241}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 99, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2252}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":827} + }] + }, + "fShape" : {"$ref":1239}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 101, + "fNtotal" : 3, + "fRefCount" : 3 + }, + "fMother" : {"$ref":2221}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t816", + "fTitle" : "", + "fTranslation" : [-3, 6.15175, 3.105], + "fRotation" : null + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frameV_2", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 17, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1179}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 8, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2221}, + "fNumber" : 2, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t818", + "fTitle" : "", + "fTranslation" : [-3, 6.15175, 3.21], + "fRotation" : null + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "moduleV_3_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "moduleV_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_zone_upper_partV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_zone_upper_partV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1243}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 95, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2263}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":828} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_zone_lower_part_rectV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_zone_lower_part_rectV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1244}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 96, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2263}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":829} + }] + }, + "fShape" : {"$ref":1242}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 102, + "fNtotal" : 3, + "fRefCount" : 3 + }, + "fMother" : {"$ref":2221}, + "fNumber" : 3, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t818", + "fTitle" : "", + "fTranslation" : [-9, 6.15175, 1.575], + "fRotation" : null + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frameV_3", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 17, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1188}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 8, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2221}, + "fNumber" : 3, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t820", + "fTitle" : "", + "fTranslation" : [-9, 6.15175, 1.68], + "fRotation" : null + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "moduleV_4_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "moduleV_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_zone_upper_partV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_zone_upper_partV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1246}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 95, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2274}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":830} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_zone_lower_part_rectV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_zone_lower_part_rectV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1247}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 96, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2274}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":831} + }] + }, + "fShape" : {"$ref":1245}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 103, + "fNtotal" : 3, + "fRefCount" : 3 + }, + "fMother" : {"$ref":2221}, + "fNumber" : 4, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 61210624, + "fName" : "c820", + "fTitle" : "", + "fTranslation" : [9, -6.15175, 2.065], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [-1, 0, 1.22464679914735e-16, 1.49975978266186e-32, -1, 1.22464679914735e-16, 1.22464679914735e-16, 1.22464679914735e-16, 1] + } + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frameV_4", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 17, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1197}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 8, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2221}, + "fNumber" : 4, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 61210624, + "fName" : "c822", + "fTitle" : "", + "fTranslation" : [9, -6.15175, 2.17], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [-1, 0, 1.22464679914735e-16, 1.49975978266186e-32, -1, 1.22464679914735e-16, 1.22464679914735e-16, 1.22464679914735e-16, 1] + } + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "moduleV_5_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "moduleV_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_zone_upper_partV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_zone_upper_partV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1249}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 95, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2287}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":832} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_zone_lower_part_bevelV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_zone_lower_part_bevelV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1250}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 99, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2287}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":833} + }] + }, + "fShape" : {"$ref":1248}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 104, + "fNtotal" : 3, + "fRefCount" : 3 + }, + "fMother" : {"$ref":2221}, + "fNumber" : 5, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 61210624, + "fName" : "c822", + "fTitle" : "", + "fTranslation" : [3, -6.15175, 3.595], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [-1, 0, 1.22464679914735e-16, 1.49975978266186e-32, -1, 1.22464679914735e-16, 1.22464679914735e-16, 1.22464679914735e-16, 1] + } + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frameV_5", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 17, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1206}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 8, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2221}, + "fNumber" : 5, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 61210624, + "fName" : "c824", + "fTitle" : "", + "fTranslation" : [3, -6.15175, 3.7], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [-1, 0, 1.22464679914735e-16, 1.49975978266186e-32, -1, 1.22464679914735e-16, 1.22464679914735e-16, 1.22464679914735e-16, 1] + } + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "moduleV_6_6", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "moduleV_6", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_zone_upper_partV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_zone_upper_partV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1252}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 95, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2300}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":834} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_zone_lower_part_bevelV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_zone_lower_part_bevelV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1253}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 99, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2300}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":835} + }] + }, + "fShape" : {"$ref":1251}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 105, + "fNtotal" : 3, + "fRefCount" : 3 + }, + "fMother" : {"$ref":2221}, + "fNumber" : 6, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 61210624, + "fName" : "c824", + "fTitle" : "", + "fTranslation" : [-3, -6.15175, 2.285], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [1, 0, 0, -0, -1, -1.22464679914735e-16, 0, 1.22464679914735e-16, -1] + } + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frameV_6", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 17, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1215}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 8, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2221}, + "fNumber" : 6, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 61210624, + "fName" : "c826", + "fTitle" : "", + "fTranslation" : [-3, -6.15175, 2.18], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [1, 0, 0, -0, -1, -1.22464679914735e-16, 0, 1.22464679914735e-16, -1] + } + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "moduleV_7_7", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 59768832, + "fName" : "moduleV_7", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_zone_upper_partV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_zone_upper_partV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1255}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 95, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2313}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":836} + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sensor_zone_lower_part_rectV_0", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "Sensor_zone_lower_part_rectV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 5, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1256}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 96, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2313}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":837} + }] + }, + "fShape" : {"$ref":1254}, + "fMedium" : {"$ref":2228}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 106, + "fNtotal" : 3, + "fRefCount" : 3 + }, + "fMother" : {"$ref":2221}, + "fNumber" : 7, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 61210624, + "fName" : "c826", + "fTitle" : "", + "fTranslation" : [-9, -6.15175, 3.815], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [1, 0, 0, -0, -1, -1.22464679914735e-16, 0, 1.22464679914735e-16, -1] + } + } + }, { + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "frameV_7", + "fTitle" : "", + "fGeoAtt" : 3084, + "fVolume" : { + "_typename" : "TGeoVolume", + "fUniqueID" : 0, + "fBits" : 58720256, + "fName" : "frameV", + "fTitle" : "", + "fGeoAtt" : 3084, + "fLineColor" : 17, + "fLineStyle" : 1, + "fLineWidth" : 1, + "fFillColor" : 19, + "fFillStyle" : 1001, + "fNodes" : null, + "fShape" : {"$ref":1224}, + "fMedium" : {"$ref":934}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 8, + "fNtotal" : 1, + "fRefCount" : 1 + }, + "fMother" : {"$ref":2221}, + "fNumber" : 7, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoCombiTrans", + "fUniqueID" : 0, + "fBits" : 61210624, + "fName" : "c828", + "fTitle" : "", + "fTranslation" : [-9, -6.15175, 3.71], + "fRotation" : { + "_typename" : "TGeoRotation", + "fUniqueID" : 0, + "fBits" : 52690944, + "fName" : "", + "fTitle" : "", + "fRotationMatrix" : [1, 0, 0, -0, -1, -1.22464679914735e-16, 0, 1.22464679914735e-16, -1] + } + } + }] + }, + "fShape" : { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 12.15, + "fDY" : 12.4535, + "fDZ" : 1.135, + "fOrigin" : [0, 0, 2.695], + "fVolume" : {"$ref":2221}, + "fBBoxOK" : true + }, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 3, + "fNtotal" : 33, + "fRefCount" : 17 + }, + "fMother" : {"$ref":2218}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : { + "_typename" : "TGeoTranslation", + "fUniqueID" : 0, + "fBits" : 52559872, + "fName" : "t812", + "fTitle" : "", + "fTranslation" : [0, -4.5, 0] + } + }] + }, + "fShape" : { + "_typename" : "TGeoShapeAssembly", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fShapeId" : 0, + "fShapeBits" : 1024, + "fDX" : 12.15, + "fDY" : 12.4535, + "fDZ" : 1.135, + "fOrigin" : [0, -4.5, 2.695], + "fVolume" : {"$ref":2218}, + "fBBoxOK" : true + }, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 94, + "fNtotal" : 34, + "fRefCount" : 3 + }, + "fMother" : {"$ref":1258}, + "fNumber" : 0, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":839} + }] + }, + "fShape" : {"$ref":848}, + "fMedium" : {"$ref":937}, + "fFinder" : null, + "fVoxels" : null, + "fNumber" : 1, + "fNtotal" : 413815, + "fRefCount" : 10 + }, {"$ref":1261}, {"$ref":1264}, {"$ref":1271}, {"$ref":1279}, {"$ref":1285}, {"$ref":1291}, {"$ref":1296}, {"$ref":1293}, {"$ref":1332}, {"$ref":1288}, {"$ref":1380}, {"$ref":1382}, {"$ref":1385}, {"$ref":1404}, {"$ref":1377}, {"$ref":1412}, {"$ref":1415}, {"$ref":1418}, {"$ref":1432}, {"$ref":1426}, {"$ref":1421}, {"$ref":1435}, {"$ref":1429}, {"$ref":1594}, {"$ref":1603}, {"$ref":1606}, {"$ref":1608}, {"$ref":1597}, {"$ref":1600}, {"$ref":1815}, {"$ref":943}, {"$ref":928}, {"$ref":933}, {"$ref":925}, {"$ref":940}, {"$ref":963}, {"$ref":954}, {"$ref":957}, {"$ref":951}, {"$ref":960}, {"$ref":983}, {"$ref":974}, {"$ref":977}, {"$ref":971}, {"$ref":980}, {"$ref":1013}, {"$ref":1015}, {"$ref":993}, {"$ref":996}, {"$ref":990}, {"$ref":1004}, {"$ref":1007}, {"$ref":1001}, {"$ref":1010}, {"$ref":1046}, {"$ref":1048}, {"$ref":1025}, {"$ref":1027}, {"$ref":1029}, {"$ref":1022}, {"$ref":1037}, {"$ref":1039}, {"$ref":1041}, {"$ref":1034}, {"$ref":1043}, {"$ref":1079}, {"$ref":1081}, {"$ref":1058}, {"$ref":1060}, {"$ref":1062}, {"$ref":1055}, {"$ref":1070}, {"$ref":1072}, {"$ref":1074}, {"$ref":1067}, {"$ref":1076}, {"$ref":1831}, {"$ref":1091}, {"$ref":1142}, {"$ref":1147}, {"$ref":1088}, {"$ref":1856}, {"$ref":1862}, {"$ref":1859}, {"$ref":1877}, {"$ref":1883}, {"$ref":1880}, {"$ref":1894}, {"$ref":1897}, {"$ref":1900}, {"$ref":1902}, {"$ref":1905}, {"$ref":1907}, {"$ref":2218}, {"$ref":2227}, {"$ref":2231}, {"$ref":2224}, {"$ref":2235}, {"$ref":2244}, {"$ref":2239}, {"$ref":2242}, {"$ref":2252}, {"$ref":2255}, {"$ref":2257}, {"$ref":2263}, {"$ref":2266}, {"$ref":2268}, {"$ref":2274}, {"$ref":2277}, {"$ref":2279}, {"$ref":2287}, {"$ref":2290}, {"$ref":2292}, {"$ref":2300}, {"$ref":2303}, {"$ref":2305}, {"$ref":2313}, {"$ref":2316}, {"$ref":2318}] + }, + "fPhysicalNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [] + }, + "fTracks" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [] + }, + "fPdgNames" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "d", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "d_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "u", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "u_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "s", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "s_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "c", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "c_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "b", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "b_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "t", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "t_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "b'", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "b'_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "t'", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "t'_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "e-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "e+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "nu_e", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "nu_e_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "mu-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "mu+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "nu_mu", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "nu_mu_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tau-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tau+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "nu_tau", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "nu_tau_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tau'-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "tau'+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "nu'_tau", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "nu'_tau_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "g", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "gamma", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Z0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "W+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "W-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "h0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "reggeon", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "pomeron", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Z'0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Z\"0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "W'+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "W'-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "H0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "A0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "H+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "H-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "eta_tech0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "LQ_ue", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "LQ_ue_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "R0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "R0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "pi_tech0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "pi_tech+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "pi_tech-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "pi'_tech0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "rho_tech0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "rho_tech+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "rho_tech-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "omega_tech", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "H_L++", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "H_L--", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "H_R++", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "H_R--", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "W_R+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "W_R-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "nu_Re", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "nu_Re_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "nu_Rmu", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "nu_Rmu_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "nu_Rtau", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "nu_Rtau_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "specflav", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "rndmflav", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "rndmflav_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "phasespa", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "c-hadron", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "c-hadron_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "b-hadron", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "b-hadron_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "cluster", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "string", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "indep.", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "CMshower", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "SPHEaxis", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "THRUaxis", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "CLUSjet", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "CELLjet", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "table", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "rho_diff0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "pi0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "rho0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "a_20", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "K_L0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "pi_diffr+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "pi_diffr-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "pi+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "pi-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "rho+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "rho-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "a_2+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "a_2-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "omega_di", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "eta", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "omega", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "f_2", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "K_S0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "K0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "K0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "K*0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "K*0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "K*_20", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "K*_20_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "K+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "K-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "K*+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "K*-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "K*_2+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "K*_2-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "phi_diff", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "eta'", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "phi", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "f'_2", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "D+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "D-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "D*+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "D*-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "D*_2+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "D*_2-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "D0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "D0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "D*0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "D*0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "D*_20", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "D*_20_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "D_s+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "D_s-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "D*_s+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "D*_s-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "D*_2s+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "D*_2s-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "J\/psi_di", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "eta_c", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "J\/psi", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "chi_2c", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B*0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B*0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B*_20", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B*_20_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B*+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B*-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B*_2+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B*_2-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B_s0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B_s0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B*_s0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B*_s0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B*_2s0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B*_2s0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B_c+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B_c-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B*_c+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B*_c-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B*_2c+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "B*_2c-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "eta_b", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Upsilon", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "chi_2b", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "dd_1", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "dd_1_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Delta-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Delta-_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ud_0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ud_0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ud_1", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ud_1_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "n_diffr0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "n_diffr0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "neutron", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "antineutron", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Delta0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Delta0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "uu_1", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "uu_1_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "p_diffr+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "p_diffr+_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "proton", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "antiproton", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Delta+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Delta+_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Delta++", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Delta--", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sd_0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sd_0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sd_1", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "sd_1_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma-_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma*-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma*-_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Lambda0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Lambda0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "su_0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "su_0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "su_1", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "su_1_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma*0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma*0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma+_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma*+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma*+_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ss_1", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "ss_1_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Xi-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Xi-_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Xi*-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Xi*+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Xi0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Xi0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Xi*0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Xi*0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Omega-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Omega+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "cd_0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "cd_0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "cd_1", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "cd_1_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma_c0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma_c0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma*_c0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma*_c0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Lambda_c+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Lambda_c-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Xi_c0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Xi_c0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "cu_0", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "cu_0_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "cu_1", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "cu_1_bar", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma_c+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma_c-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma*_c+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma*_c-", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma_c++", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma_c--", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma*_c++", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Sigma*_c--", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Xi_c+", + "fTitle" : "" + }, { + "_typename" : "TNamed", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "Xi_c-", + "fTitle" : "" + }] + }, + "fMaterials" : { + "_typename" : "TList", + "name" : "THashList", + "arr" : [{"$ref":938}, {"$ref":1266}, {"$ref":1273}, {"$ref":1281}, {"$ref":1144}, {"$ref":1093}, {"$ref":1149}, {"$ref":1334}, {"$ref":945}, {"$ref":1437}, {"$ref":1813}, { + "_typename" : "TGeoMaterial", + "fUniqueID" : 12, + "fBits" : 50331648, + "fName" : "VACUUM", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 11, + "fA" : 0, + "fZ" : 0, + "fDensity" : 0, + "fRadLen" : 1e30, + "fIntLen" : 1e30, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null + }, { + "_typename" : "TGeoMaterial", + "fUniqueID" : 13, + "fBits" : 50331648, + "fName" : "SILICON", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 12, + "fA" : 28.09, + "fZ" : 14, + "fDensity" : 2.33, + "fRadLen" : 9.35110551053256, + "fIntLen" : 45.753205754866, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null + }, {"$ref":930}, {"$ref":1423}, { + "_typename" : "TGeoMixture", + "fUniqueID" : 16, + "fBits" : 50331648, + "fName" : "TYVEC", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 15, + "fA" : 10.4296180316, + "fZ" : 5.281386, + "fDensity" : 0.93, + "fRadLen" : 47.5076063184073, + "fIntLen" : 72.8965033104632, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null, + "fNelements" : 2, + "fZmixture" : [6, 1], + "fAmixture" : [12.011, 1.008], + "fWeights" : [0.8562772, 0.1437228], + "fNatoms" : [], + "fVecNbOfAtomsPerVolume" : [], + "fElements" : null + }, {"$ref":965}, {"$ref":935}, { + "_typename" : "TGeoMaterial", + "fUniqueID" : 19, + "fBits" : 50331648, + "fName" : "lead", + "fTitle" : "", + "fFillColor" : 19, + "fFillStyle" : 1001, + "fIndex" : 18, + "fA" : 207.1, + "fZ" : 82, + "fDensity" : 11.34, + "fRadLen" : 0.561956031451292, + "fIntLen" : 18.2752677326212, + "fTemperature" : 273.15, + "fPressure" : 632420000, + "fState" : 0, + "fShader" : null, + "fCerenkov" : null, + "fElement" : null + }, {"$ref":1909}, {"$ref":2229}], + "opt" : ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""] + }, + "fMedia" : { + "_typename" : "TList", + "name" : "THashList", + "arr" : [{"$ref":937}, {"$ref":1265}, {"$ref":1272}, {"$ref":1280}, {"$ref":1143}, {"$ref":1092}, {"$ref":1148}, {"$ref":1333}, {"$ref":1812}, { + "_typename" : "TGeoMedium", + "fUniqueID" : 10, + "fBits" : 50331648, + "fName" : "VACUUM", + "fTitle" : "", + "fId" : 10, + "fParams" : [0, 1, 0.19, 0.25, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : {"$ref":2589} + }, {"$ref":944}, {"$ref":929}, {"$ref":1430}, {"$ref":1436}, {"$ref":1422}, { + "_typename" : "TGeoMedium", + "fUniqueID" : 16, + "fBits" : 50331648, + "fName" : "TYVEC", + "fTitle" : "", + "fId" : 16, + "fParams" : [0, 0, 0, 1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : {"$ref":2591} + }, {"$ref":964}, {"$ref":934}, { + "_typename" : "TGeoMedium", + "fUniqueID" : 19, + "fBits" : 50331648, + "fName" : "lead", + "fTitle" : "", + "fId" : 19, + "fParams" : [0, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "fMaterial" : {"$ref":2592} + }, {"$ref":1908}, {"$ref":2228}], + "opt" : ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""] + }, + "fNodes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{ + "_typename" : "TGeoNodeMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "cave_1", + "fTitle" : "Top logical node", + "fGeoAtt" : 3084, + "fVolume" : {"$ref":1258}, + "fMother" : null, + "fNumber" : 1, + "fNovlp" : 0, + "fOverlaps" : [], + "fMatrix" : {"$ref":2} + }] + }, + "fOverlaps" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [] + }, + "fRegions" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [] + }, + "fMasterVolume" : {"$ref":1258}, + "fGLMatrix" : { + "_typename" : "TGeoHMatrix", + "fUniqueID" : 0, + "fBits" : 50331648, + "fName" : "", + "fTitle" : "", + "fTranslation" : [0, 0, 0], + "fRotationMatrix" : [1, 0, 0, 0, 1, 0, 0, 0, 1], + "fScale" : [1, 1, 1] + }, + "fUniqueVolumes" : { + "_typename" : "TObjArray", + "name" : "TObjArray", + "arr" : [{"$ref":1258}, {"$ref":1258}, {"$ref":1261}, {"$ref":1264}, {"$ref":1271}, {"$ref":1279}, {"$ref":1285}, {"$ref":1291}, {"$ref":1296}, {"$ref":1293}, {"$ref":1332}, {"$ref":1288}, {"$ref":1380}, {"$ref":1382}, {"$ref":1404}, {"$ref":1377}, {"$ref":1412}, {"$ref":1415}, {"$ref":1418}, {"$ref":1432}, {"$ref":1426}, {"$ref":1421}, {"$ref":1435}, {"$ref":1429}, {"$ref":1594}, {"$ref":1603}, {"$ref":1606}, {"$ref":1608}, {"$ref":1597}, {"$ref":1600}, {"$ref":1815}, {"$ref":943}, {"$ref":928}, {"$ref":933}, {"$ref":925}, {"$ref":940}, {"$ref":963}, {"$ref":954}, {"$ref":957}, {"$ref":951}, {"$ref":960}, {"$ref":983}, {"$ref":974}, {"$ref":977}, {"$ref":971}, {"$ref":980}, {"$ref":1013}, {"$ref":1015}, {"$ref":993}, {"$ref":996}, {"$ref":990}, {"$ref":1004}, {"$ref":1007}, {"$ref":1001}, {"$ref":1010}, {"$ref":1046}, {"$ref":1048}, {"$ref":1025}, {"$ref":1027}, {"$ref":1029}, {"$ref":1022}, {"$ref":1037}, {"$ref":1039}, {"$ref":1041}, {"$ref":1034}, {"$ref":1043}, {"$ref":1079}, {"$ref":1081}, {"$ref":1058}, {"$ref":1060}, {"$ref":1062}, {"$ref":1055}, {"$ref":1070}, {"$ref":1072}, {"$ref":1074}, {"$ref":1067}, {"$ref":1076}, {"$ref":1831}, {"$ref":1091}, {"$ref":1142}, {"$ref":1147}, {"$ref":1088}, {"$ref":1856}, {"$ref":1862}, {"$ref":1859}, {"$ref":1877}, {"$ref":1883}, {"$ref":1880}, {"$ref":1894}, {"$ref":1897}, {"$ref":1900}, {"$ref":1902}, {"$ref":1905}, {"$ref":1907}, {"$ref":2218}, {"$ref":2227}, {"$ref":2231}, {"$ref":2224}, {"$ref":2235}, {"$ref":2244}, {"$ref":2239}, {"$ref":2252}, {"$ref":2263}, {"$ref":2274}, {"$ref":2287}, {"$ref":2300}, {"$ref":2313}] + }, + "fNLevel" : 100, + "fHashPNE" : { + "_typename" : "THashList", + "name" : "THashList", + "arr" : [], + "opt" : [] + }, + "fSizePNEId" : 0, + "fNPNEId" : 0, + "fKeyPNEId" : [], + "fValuePNEId" : [], + "fUsePWNav" : false, + "fParallelWorld" : null +} \ No newline at end of file From f2120aedf32629eaf67eaa4674f71299f1a4eb79 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Thu, 19 Aug 2021 10:02:26 +0300 Subject: [PATCH 055/109] WIP Root object model --- .../src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt index 26517477..557783ae 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt @@ -20,6 +20,9 @@ public class TGeoManager : TNamed() { * Load Json encoded TGeoManager */ public fun decodeFromJson(jsonObject: JsonObject): TGeoManager = TODO() + + public fun decodeFromString(string: String): TGeoManager = + RootJsonSerialFormat().decodeFromString(serializer(), string) } } From a748282d63fe547830260697d6c4017ecd399d79 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 20 Aug 2021 20:24:41 +0300 Subject: [PATCH 056/109] Fix Jupyter Kapt problem --- demo/jupyter-playground/build.gradle.kts | 4 ++-- .../VisionForgePlayGroundForJupyter.kt | 4 ++-- demo/playground/build.gradle.kts | 18 +++++++++--------- gradle.properties | 2 ++ 4 files changed, 15 insertions(+), 13 deletions(-) rename demo/jupyter-playground/src/main/kotlin/{hep/dataforge/playground => }/VisionForgePlayGroundForJupyter.kt (96%) diff --git a/demo/jupyter-playground/build.gradle.kts b/demo/jupyter-playground/build.gradle.kts index 903b991b..62f92348 100644 --- a/demo/jupyter-playground/build.gradle.kts +++ b/demo/jupyter-playground/build.gradle.kts @@ -5,6 +5,7 @@ plugins { } repositories { + jcenter() mavenCentral() maven("https://repo.kotlin.link") } @@ -15,7 +16,6 @@ dependencies { tasks.withType { kotlinOptions { - useIR = true jvmTarget = ru.mipt.npm.gradle.KScienceVersions.JVM_TARGET.toString() } } @@ -29,7 +29,7 @@ tasks.withType { } tasks.processJupyterApiResources { - libraryProducers = listOf("space.kscience.dataforge.playground.VisionForgePlayGroundForJupyter") + libraryProducers = listOf("playground.VisionForgePlayGroundForJupyter") } tasks.findByName("shadowJar")?.dependsOn("processJupyterApiResources") \ No newline at end of file diff --git a/demo/jupyter-playground/src/main/kotlin/hep/dataforge/playground/VisionForgePlayGroundForJupyter.kt b/demo/jupyter-playground/src/main/kotlin/VisionForgePlayGroundForJupyter.kt similarity index 96% rename from demo/jupyter-playground/src/main/kotlin/hep/dataforge/playground/VisionForgePlayGroundForJupyter.kt rename to demo/jupyter-playground/src/main/kotlin/VisionForgePlayGroundForJupyter.kt index 88e4effb..12426672 100644 --- a/demo/jupyter-playground/src/main/kotlin/hep/dataforge/playground/VisionForgePlayGroundForJupyter.kt +++ b/demo/jupyter-playground/src/main/kotlin/VisionForgePlayGroundForJupyter.kt @@ -1,4 +1,4 @@ -package space.kscience.dataforge.playground +package playground import kotlinx.html.div import kotlinx.html.id @@ -24,7 +24,7 @@ import space.kscience.visionforge.visionManager @JupyterLibrary @DFExperimental -internal class VisionForgePlayGroundForJupyter : JupyterIntegration() { +public class VisionForgePlayGroundForJupyter : JupyterIntegration() { private val context = Context("VisionForge") { plugin(Solids) diff --git a/demo/playground/build.gradle.kts b/demo/playground/build.gradle.kts index a89fe123..515cb165 100644 --- a/demo/playground/build.gradle.kts +++ b/demo/playground/build.gradle.kts @@ -51,25 +51,25 @@ kotlin { sourceSets { val commonMain by getting { dependencies { - implementation(project(":visionforge-solid")) - implementation(project(":visionforge-gdml")) - implementation(project(":visionforge-plotly")) - implementation(projects.visionforge.visionforgeMarkdown) + api(project(":visionforge-solid")) + api(project(":visionforge-gdml")) + api(project(":visionforge-plotly")) + api(projects.visionforge.visionforgeMarkdown) } } val jsMain by getting{ dependencies { - implementation(project(":ui:ring")) - implementation(project(":visionforge-threejs")) + api(project(":ui:ring")) + api(project(":visionforge-threejs")) } } val jvmMain by getting{ dependencies { - implementation(project(":visionforge-server")) - implementation("ch.qos.logback:logback-classic:1.2.3") - implementation("com.github.Ricky12Awesome:json-schema-serialization:0.6.6") + api(project(":visionforge-server")) + api("ch.qos.logback:logback-classic:1.2.3") + api("com.github.Ricky12Awesome:json-schema-serialization:0.6.6") } } } diff --git a/gradle.properties b/gradle.properties index 2ffacd8f..511d4130 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,5 +3,7 @@ kotlin.mpp.enableGranularSourceSetsMetadata=true kotlin.mpp.stability.nowarn=true kotlin.native.enableDependencyPropagation=false +kotlin.jupyter.add.scanner=false + org.gradle.jvmargs=-XX:MaxMetaspaceSize=1G org.gradle.parallel=true \ No newline at end of file From 5d2c853cbec6138bb53fc5580ada6eb76ca50e4b Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 20 Aug 2021 20:25:19 +0300 Subject: [PATCH 057/109] WIP ROOT json serialization --- build.gradle.kts | 7 +- .../kotlin/ru/mipt/npm/root/RootModel.kt | 25 ------ .../kotlin/ru/mipt/npm/root/TGeoHMatrix.kt | 7 ++ .../kotlin/ru/mipt/npm/root/TGeoManager.kt | 88 +++++++++++++++++-- .../kotlin/ru/mipt/npm/root/TGeoMaterial.kt | 3 + .../kotlin/ru/mipt/npm/root/TGeoMedium.kt | 2 + .../kotlin/ru/mipt/npm/root/TGeoNode.kt | 8 +- .../kotlin/ru/mipt/npm/root/TGeoShape.kt | 34 ++++++- .../kotlin/ru/mipt/npm/root/TGeoVolume.kt | 3 + .../kotlin/ru/mipt/npm/root/TObject.kt | 2 + .../kotlin/ru/mipt/npm/root/loadBM@N.kt | 7 ++ 11 files changed, 144 insertions(+), 42 deletions(-) delete mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/RootModel.kt create mode 100644 cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBM@N.kt diff --git a/build.gradle.kts b/build.gradle.kts index 505c349c..cd6ece5d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -37,8 +37,7 @@ apiValidation { } -afterEvaluate { - extensions.configure { - versions.webpackDevServer.version = "4.0.0" - } +//workaround for https://youtrack.jetbrains.com/issue/KT-48273 +rootProject.plugins.withType(org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin::class.java) { + rootProject.the().versions.webpackDevServer.version = "4.0.0" } \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/RootModel.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/RootModel.kt deleted file mode 100644 index 8f53d71f..00000000 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/RootModel.kt +++ /dev/null @@ -1,25 +0,0 @@ -package ru.mipt.npm.root - -import kotlin.properties.PropertyDelegateProvider -import kotlin.reflect.KType -import kotlin.reflect.typeOf - -public interface RootValueProvider { - /** - * Provide a member cast or reinterpreted to given type. - * Returns null if member with given name/type could not be resolved. - */ - public fun provideOrNull(name: String, type: KType): T? -} - -public interface RootModel { - public val provider: RootValueProvider -} - -public inline fun RootValueProvider.provide(name: String): T = - provideOrNull(name, typeOf()) ?: error("A member with type ${T::class} and name $name could not be resolved") - -public inline fun RootModel.member(name: String? = null): PropertyDelegateProvider> = - PropertyDelegateProvider { _, property -> - lazy { provider.provide(name ?: property.name) } - } diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoHMatrix.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoHMatrix.kt index f70e9a24..3e1362f8 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoHMatrix.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoHMatrix.kt @@ -1,15 +1,19 @@ package ru.mipt.npm.root +import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable +@SerialName("TGeoMatrix") public sealed class TGeoMatrix : TNamed() @Serializable +@SerialName("TGeoIdentity") public class TGeoIdentity : TGeoMatrix() @Serializable +@SerialName("TGeoHMatrix") public class TGeoHMatrix( public val fTranslation: DoubleArray, public val fRotationMatrix: DoubleArray, @@ -17,16 +21,19 @@ public class TGeoHMatrix( ) : TGeoMatrix() @Serializable +@SerialName("TGeoTranslation") public class TGeoTranslation( public val fTranslation: DoubleArray ) : TGeoMatrix() @Serializable +@SerialName("TGeoRotation") public class TGeoRotation( public val fRotationMatrix: DoubleArray ): TGeoMatrix() @Serializable +@SerialName("TGeoCombiTrans") public class TGeoCombiTrans( public val fTranslation: DoubleArray, public val fRotation: TGeoRotation? = null, diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt index 557783ae..acf4d712 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt @@ -1,11 +1,18 @@ package ru.mipt.npm.root import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonDecoder import kotlinx.serialization.json.JsonObject import kotlinx.serialization.modules.SerializersModule +import kotlinx.serialization.modules.polymorphic +import kotlinx.serialization.modules.subclass @Serializable +@SerialName("TGeoManager") public class TGeoManager : TNamed() { public val fMatrices: TObjArray = TObjArray.empty @@ -20,19 +27,31 @@ public class TGeoManager : TNamed() { * Load Json encoded TGeoManager */ public fun decodeFromJson(jsonObject: JsonObject): TGeoManager = TODO() - + public fun decodeFromString(string: String): TGeoManager = - RootJsonSerialFormat().decodeFromString(serializer(), string) + Root().decodeFromString(serializer(), string) } } @OptIn(ExperimentalSerializationApi::class) -private class RootJsonSerialFormat : StringFormat { - - override val serializersModule: SerializersModule get() = json.serializersModule +private class RootJsonSerializer(private val tSerializer: KSerializer) : KSerializer { private val refCache: HashMap = HashMap() + + override val descriptor: SerialDescriptor get() = tSerializer.descriptor + + + override fun deserialize(decoder: Decoder): T { + val input = decoder as JsonDecoder + val element = input.decodeJsonElement() + return input.json.decodeFromJsonElement(tSerializer, transformDeserialize(element)) + } + + override fun serialize(encoder: Encoder, value: T) { + tSerializer.serialize(encoder, value) + } + override fun decodeFromString(deserializer: DeserializationStrategy, string: String): T { val match = refRegex.matchEntire(string) return if (match != null) { @@ -41,7 +60,7 @@ private class RootJsonSerialFormat : StringFormat { val refValue = refCache[ref] ?: error("Reference $ref unresolved") refValue as T //TODO research means to make it safe } else { - val res = json.decodeFromString(deserializer, string) + val res = rootJson.decodeFromString(deserializer, string) val uid = (res as? TObject)?.fUniqueID if (uid != null && refCache[uid] == null) { refCache[uid] = res @@ -50,17 +69,70 @@ private class RootJsonSerialFormat : StringFormat { } } + override fun encodeToString(serializer: SerializationStrategy, value: T): String = - json.encodeToString(serializer, value) + rootJson.encodeToString(serializer, value) companion object { val refRegex = """\{\s*"${"\\$"}ref"\s*:\s*(\d*)}""".toRegex() - val json: Json = Json { + val rootSerializersModule = SerializersModule { + polymorphic(TGeoShape::class) { + subclass(TGeoBBox.serializer()) + subclass(TGeoCompositeShape.serializer()) + subclass(TGeoXtru.serializer()) + subclass(TGeoTube.serializer()) + subclass(TGeoTubeSeg.serializer()) + subclass(TGeoShapeAssembly.serializer()) + } + + polymorphic(TGeoMatrix::class) { + subclass(TGeoIdentity.serializer()) + subclass(TGeoHMatrix.serializer()) + subclass(TGeoTranslation.serializer()) + subclass(TGeoRotation.serializer()) + subclass(TGeoCombiTrans.serializer()) + } + + polymorphic(TObject::class) { + subclass(TGeoBBox.serializer()) + subclass(TGeoCompositeShape.serializer()) + subclass(TGeoXtru.serializer()) + subclass(TGeoTube.serializer()) + subclass(TGeoTubeSeg.serializer()) + subclass(TGeoShapeAssembly.serializer()) + + subclass(TGeoIdentity.serializer()) + subclass(TGeoHMatrix.serializer()) + subclass(TGeoTranslation.serializer()) + subclass(TGeoRotation.serializer()) + subclass(TGeoCombiTrans.serializer()) + + subclass(TGeoMaterial.serializer()) + subclass(TGeoMixture.serializer()) + + subclass(TGeoMedium.serializer()) + + subclass(TGeoNode.serializer()) + subclass(TGeoNodeMatrix.serializer()) + subclass(TGeoVolume.serializer()) + subclass(TGeoVolumeAssembly.serializer()) + } + polymorphic(TGeoNode::class, TGeoNode.serializer()) { + subclass(TGeoNodeMatrix.serializer()) + } + polymorphic(TGeoVolume::class, TGeoVolume.serializer()) { + subclass(TGeoVolumeAssembly.serializer()) + } + } + + val rootJson: Json = Json { encodeDefaults = true ignoreUnknownKeys = true classDiscriminator = "_typename" + serializersModule = rootSerializersModule } + } } diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMaterial.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMaterial.kt index 9094d721..f4883e0e 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMaterial.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMaterial.kt @@ -1,9 +1,12 @@ package ru.mipt.npm.root +import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable +@SerialName("TGeoMaterial") public open class TGeoMaterial: TNamed() @Serializable +@SerialName("TGeoMixture") public class TGeoMixture: TGeoMaterial() \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMedium.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMedium.kt index 196c209c..3e598753 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMedium.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMedium.kt @@ -1,8 +1,10 @@ package ru.mipt.npm.root +import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable +@SerialName("TGeoMedium") public class TGeoMedium( public val fId : Int, public val fMaterial: TGeoMaterial, diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt index 2793773f..5805f3ea 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt @@ -1,9 +1,11 @@ package ru.mipt.npm.root +import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable -public class TGeoNode : TNamed() { +@SerialName("TGeoNode") +public open class TGeoNode : TNamed() { //val fGeoAtt: UInt public val fVolume: TGeoVolume? = null public val fMother: TGeoVolume? = null @@ -12,6 +14,8 @@ public class TGeoNode : TNamed() { public val fOverlaps: IntArray = intArrayOf() } -public class TGeoNodeMatrix : TGeoMatrix() { +@Serializable +@SerialName("TGeoNodeMatrix") +public class TGeoNodeMatrix : TGeoNode() { public val fMatrix: TGeoMatrix? = null } \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt index 344f5e6f..f26261da 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt @@ -1,14 +1,17 @@ package ru.mipt.npm.root +import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable -public abstract class TGeoShape : TNamed() { +@SerialName("TGeoShape") +public sealed class TGeoShape : TNamed() { public val fShapeBits: UInt = 0u public val fShapeId: Int = 0 } @Serializable +@SerialName("TGeoBBox") public open class TGeoBBox : TGeoShape() { public val fDX: Double = 0.0 public val fDY: Double = 0.0 @@ -17,6 +20,7 @@ public open class TGeoBBox : TGeoShape() { } @Serializable +@SerialName("TGeoBoolNode") public sealed class TGeoBoolNode : TObject() { public abstract val fLeft: TGeoShape public abstract val fLeftMat: TGeoMatrix @@ -25,6 +29,7 @@ public sealed class TGeoBoolNode : TObject() { } @Serializable +@SerialName("TGeoUnion") public class TGeoUnion( override val fLeft: TGeoShape, override val fLeftMat: TGeoMatrix, @@ -33,6 +38,7 @@ public class TGeoUnion( ) : TGeoBoolNode() @Serializable +@SerialName("TGeoSubtraction") public class TGeoSubtraction( override val fLeft: TGeoShape, override val fLeftMat: TGeoMatrix, @@ -41,6 +47,7 @@ public class TGeoSubtraction( ) : TGeoBoolNode() @Serializable +@SerialName("TGeoIntersection") public class TGeoIntersection( override val fLeft: TGeoShape, override val fLeftMat: TGeoMatrix, @@ -50,9 +57,11 @@ public class TGeoIntersection( @Serializable +@SerialName("TGeoCompositeShape") public class TGeoCompositeShape(public val fNode: TGeoBoolNode) : TGeoBBox() @Serializable +@SerialName("TGeoXtru") public class TGeoXtru( public val fNvert: Int, public val fNz: Int, @@ -67,14 +76,33 @@ public class TGeoXtru( @Serializable -public class TGeoTube( +@SerialName("TGeoTube") +public open class TGeoTube( public val fRmin: Double, public val fRmax: Double, public val fDz: Double, ) : TGeoBBox() @Serializable +@SerialName("TGeoTubeSeg") +public class TGeoTubeSeg( + public val fRmin: Double, + public val fRmax: Double, + public val fDz: Double, + public val fPhi1: Double, + public val fPhi2: Double, + public val fS1: Double, + public val fC1: Double, + public val fS2: Double, + public val fC2: Double, + public val fSm: Double, + public val fCm: Double, + public val fCdfi: Double, +) : TGeoBBox() + +@Serializable +@SerialName("TGeoShapeAssembly") public class TGeoShapeAssembly( public val fVolume: TGeoVolumeAssembly, public val fBBoxOK: Boolean = true -): TGeoBBox() \ No newline at end of file +) : TGeoBBox() \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt index 1bd12cbf..dc986729 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt @@ -1,8 +1,10 @@ package ru.mipt.npm.root +import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable +@SerialName("TGeoVolume") public open class TGeoVolume : TNamed(){ // "fGeoAtt" : 3084, // "fLineColor" : 3, @@ -19,4 +21,5 @@ public open class TGeoVolume : TNamed(){ } @Serializable +@SerialName("TGeoVolumeAssembly") public class TGeoVolumeAssembly : TGeoVolume() \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt index fb17d8ac..bf528e6f 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt @@ -1,5 +1,6 @@ package ru.mipt.npm.root +import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable @@ -15,6 +16,7 @@ public abstract class TNamed : TObject() { } @Serializable +@SerialName("TObjArray") public class TObjArray(public val arr: List){ public companion object{ public val empty = TObjArray(emptyList()) diff --git a/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBM@N.kt b/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBM@N.kt new file mode 100644 index 00000000..5d3a03af --- /dev/null +++ b/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBM@N.kt @@ -0,0 +1,7 @@ +package ru.mipt.npm.root + +fun main() { + val string = TGeoManager::class.java.getResourceAsStream("/BM@N.root.json")!! + .readAllBytes().decodeToString() + val geo = TGeoManager.decodeFromString(string) +} \ No newline at end of file From 829d0dfde7f9b7d4f3b86d55b94dd109238a6638 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 20 Aug 2021 20:24:41 +0300 Subject: [PATCH 058/109] Fix Jupyter Kapt problem --- demo/jupyter-playground/build.gradle.kts | 4 ++-- .../VisionForgePlayGroundForJupyter.kt | 4 ++-- demo/playground/build.gradle.kts | 18 +++++++++--------- gradle.properties | 2 ++ 4 files changed, 15 insertions(+), 13 deletions(-) rename demo/jupyter-playground/src/main/kotlin/{hep/dataforge/playground => }/VisionForgePlayGroundForJupyter.kt (96%) diff --git a/demo/jupyter-playground/build.gradle.kts b/demo/jupyter-playground/build.gradle.kts index 903b991b..62f92348 100644 --- a/demo/jupyter-playground/build.gradle.kts +++ b/demo/jupyter-playground/build.gradle.kts @@ -5,6 +5,7 @@ plugins { } repositories { + jcenter() mavenCentral() maven("https://repo.kotlin.link") } @@ -15,7 +16,6 @@ dependencies { tasks.withType { kotlinOptions { - useIR = true jvmTarget = ru.mipt.npm.gradle.KScienceVersions.JVM_TARGET.toString() } } @@ -29,7 +29,7 @@ tasks.withType { } tasks.processJupyterApiResources { - libraryProducers = listOf("space.kscience.dataforge.playground.VisionForgePlayGroundForJupyter") + libraryProducers = listOf("playground.VisionForgePlayGroundForJupyter") } tasks.findByName("shadowJar")?.dependsOn("processJupyterApiResources") \ No newline at end of file diff --git a/demo/jupyter-playground/src/main/kotlin/hep/dataforge/playground/VisionForgePlayGroundForJupyter.kt b/demo/jupyter-playground/src/main/kotlin/VisionForgePlayGroundForJupyter.kt similarity index 96% rename from demo/jupyter-playground/src/main/kotlin/hep/dataforge/playground/VisionForgePlayGroundForJupyter.kt rename to demo/jupyter-playground/src/main/kotlin/VisionForgePlayGroundForJupyter.kt index 88e4effb..12426672 100644 --- a/demo/jupyter-playground/src/main/kotlin/hep/dataforge/playground/VisionForgePlayGroundForJupyter.kt +++ b/demo/jupyter-playground/src/main/kotlin/VisionForgePlayGroundForJupyter.kt @@ -1,4 +1,4 @@ -package space.kscience.dataforge.playground +package playground import kotlinx.html.div import kotlinx.html.id @@ -24,7 +24,7 @@ import space.kscience.visionforge.visionManager @JupyterLibrary @DFExperimental -internal class VisionForgePlayGroundForJupyter : JupyterIntegration() { +public class VisionForgePlayGroundForJupyter : JupyterIntegration() { private val context = Context("VisionForge") { plugin(Solids) diff --git a/demo/playground/build.gradle.kts b/demo/playground/build.gradle.kts index a89fe123..515cb165 100644 --- a/demo/playground/build.gradle.kts +++ b/demo/playground/build.gradle.kts @@ -51,25 +51,25 @@ kotlin { sourceSets { val commonMain by getting { dependencies { - implementation(project(":visionforge-solid")) - implementation(project(":visionforge-gdml")) - implementation(project(":visionforge-plotly")) - implementation(projects.visionforge.visionforgeMarkdown) + api(project(":visionforge-solid")) + api(project(":visionforge-gdml")) + api(project(":visionforge-plotly")) + api(projects.visionforge.visionforgeMarkdown) } } val jsMain by getting{ dependencies { - implementation(project(":ui:ring")) - implementation(project(":visionforge-threejs")) + api(project(":ui:ring")) + api(project(":visionforge-threejs")) } } val jvmMain by getting{ dependencies { - implementation(project(":visionforge-server")) - implementation("ch.qos.logback:logback-classic:1.2.3") - implementation("com.github.Ricky12Awesome:json-schema-serialization:0.6.6") + api(project(":visionforge-server")) + api("ch.qos.logback:logback-classic:1.2.3") + api("com.github.Ricky12Awesome:json-schema-serialization:0.6.6") } } } diff --git a/gradle.properties b/gradle.properties index 2ffacd8f..511d4130 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,5 +3,7 @@ kotlin.mpp.enableGranularSourceSetsMetadata=true kotlin.mpp.stability.nowarn=true kotlin.native.enableDependencyPropagation=false +kotlin.jupyter.add.scanner=false + org.gradle.jvmargs=-XX:MaxMetaspaceSize=1G org.gradle.parallel=true \ No newline at end of file From 7103f49ff96b8f89105a059dadbe29c90b0d7900 Mon Sep 17 00:00:00 2001 From: Kira Dmitrieva <71787194+kiruma524@users.noreply.github.com> Date: Fri, 20 Aug 2021 20:26:21 +0300 Subject: [PATCH 059/109] Raw version of everything --- docs/hierarchy.md | 44 +++++++++++++---- docs/inheritance.md | 6 +-- docs/uml/Vision.puml | 114 ++++++++++++++++++++++++------------------- gradle.properties | 2 + 4 files changed, 105 insertions(+), 61 deletions(-) diff --git a/docs/hierarchy.md b/docs/hierarchy.md index a4097221..2427cec7 100644 --- a/docs/hierarchy.md +++ b/docs/hierarchy.md @@ -1,17 +1,43 @@ # Hierarchy -![](../docs/images/hierarchy.png) -**the image will be changed** +![](../docs/images/hierarchy.png) ### Vision +* function `getPropertyValue(name: Name, inherit: Boolean = false, includeStyles: Boolean = true, includeDefaults: Boolean = true)` - get property value with given layer flags. -* function `getProperty(name: Name, inherit: Boolean, includeStyles: Boolean, includeDefaults: Boolean)`. +* function `setProperty(name: Name, item: Any?)` - a convenient method to set property node or value. If `item` is null, then node is removed, not a value + Sets the `item` property to the element with the `name` identification. -It gets properties of element with `name` identification. -`inherit` — toggles parent node property lookup. Null means inference from descriptor. Default is false. -`includeStyles` — toggles inclusion of. Null means inference from descriptor. Default is true. -`includeDefaults` — default is false. +### VisionBase -* function `setProperty(name: Name, item: MetaItem?, notify: Boolean = true)` +Basic vision implementation -Sets the `item` property to the element with the `name` identification. `notify` is a value which toggles the necessity of the change notification. Default is true. +### VisionGroup + +A group of Visions. + +### MutableVisionGroup + +Mutable version of VisionGroup. + +low structure changes of this group. Unconsumed changes are discarded. + +### Solid + +Interface for 3-dimensional Vision. + +### SolidGroup + +* function `getPrototype(name: Name)` - get a prototype redirecting the request to the parent if prototype is not found. If prototype is a ref, then it is unfolded automatically. + +* function `prototypes(builder: VisionContainerBuilder.() -> Unit)` - create or edit prototype node as a group. + +### SolidReferenceGroup + +A reference Solid to reuse a template object. + +### RootVisionGroup + +Non-serializable root group used to propagate manager to its children. + +* function Vision.root(manager: VisionManager) - designate this [VisionGroup] as a root group and assign a [VisionManager] as its parent. diff --git a/docs/inheritance.md b/docs/inheritance.md index c156bbda..079d1940 100644 --- a/docs/inheritance.md +++ b/docs/inheritance.md @@ -37,9 +37,9 @@ Properties, which can or cannot be inherited, are these: ![](../docs/images/inheritance-2-1-2.png) * `material` - a group of properties, which can be inherited and which can be changed in `children` elements. - * `color` - color of an element. - * `opacity` - a number from 0 to 1 which represents percents of opacity (0 for 0%, 1 for 100%). - * `wireframe` - toggles the wireframe mode. + * `color` - color of an element. + * `opacity` - a number from 0 to 1 which represents percents of opacity (0 for 0%, 1 for 100%). + * `wireframe` - toggles the wireframe mode. Let's see how elements of the `material` group inherit changing `color` property; ***other properties of this group inherit in the same way.*** diff --git a/docs/uml/Vision.puml b/docs/uml/Vision.puml index bb3143cc..2b4d9953 100644 --- a/docs/uml/Vision.puml +++ b/docs/uml/Vision.puml @@ -1,108 +1,124 @@ @startuml 'https://plantuml.com/class-diagram -interface Vision +interface Vision{ + val parent: VisionGroup? + fun getPropertyValue(name,inherit,includeStyles,includeDefaults): Value? +} -interface Solid -Vision <- Solid +interface Solid{ + The base for 3D geometry +} +Vision <-- Solid +class VisionGroup{ + A group of Visions -class VisionGroup + val children: Map + val defaultTarget: String + + fun content(target): Map + fun get(name: Name): Vision? +} Vision <-- VisionGroup -class VisionBase -Vision <- VisionBase +class VisionBase{ + basic vision implementation +} +Vision <-- VisionBase class SolidLabel Solid <--- SolidLabel -SolidBase <-- SolidLabel -class SolidGroup +class SolidGroup{ + var properties: MutableMeta? + val children: Map + var prototypes: MutableVisionGroup? + + fun getPrototype(name): Solid? + fun prototypes(builder) +} Solid <--- SolidGroup VisionGroupBase <-- SolidGroup -class SolidBase -Solid <--- SolidBase -VisionBase <-- SolidBase - - class SphereLayer -SolidBase <-- SphereLayer -GeometrySolid <-- SphereLayer +Solid <-- SphereLayer class Sphere -SolidBase <-- Sphere -GeometrySolid <-- Sphere +Solid <-- Sphere class Box -SolidBase <-- Box Hexagon <-- Box class GenericHexagon -SolidBase <-- GenericHexagon Hexagon <-- GenericHexagon class Extruded -SolidBase <-- Extruded -GeometrySolid <-- Extruded +Solid <-- Extruded class PolyLine Solid <--- PolyLine -SolidBase <-- PolyLine - -interface GeometrySolid -Solid <--- GeometrySolid interface Hexagon -GeometrySolid <-- Hexagon +Solid <-- Hexagon class ConeSegment -GeometrySolid <-- ConeSegment +Solid <-- ConeSegment class ConeSurface -GeometrySolid <-- ConeSurface +Solid <-- ConeSurface class Convex Solid <--- Convex -SolidBase <-- Convex class Composite Solid <--- Composite -SolidBase <-- Composite -interface SolidReference +interface SolidReference{ + val prototype: Solid + fun getPropertyValue(name,inherit,includeStyles,includeDefaults): Value? +} VisionGroup <---- SolidReference -interface MutableVisionGroup +class SolidReferenceGroup{ + val refName: Name + var properties: MutableMeta? + val prototype: Solid + val children: Map + fun getPropertyValue(name,inherit,includeStyles,includeDefaults): Value? +} +VisionBase <-- SolidReferenceGroup + +interface MutableVisionGroup{ + fun onStructureChanged(owner, block) + fun removeStructureListener(owner) +} VisionGroup <---- MutableVisionGroup -class SolidReferenceGroup -VisionGroup <-- SolidReferenceGroup -Solid <-- SolidReferenceGroup -VisionBase <-- SolidReferenceGroup -SolidReference <-- SolidReferenceGroup - -class ReferenceChild -VisionGroup <-- ReferenceChild -Solid <-- ReferenceChild -SolidReference <-- ReferenceChild - - -class VisionGroupBase +class VisionGroupBase{ + val children: Map + fun set(name: Name?, child: Vision?) +} VisionBase <-- VisionGroupBase MutableVisionGroup <-- VisionGroupBase - - class RootVisionGroup VisionGroupBase <-- RootVisionGroup - -class VisionOfPlotly +class VisionOfPlotly{ + var properties: MutableMeta? + val plot: Plot +} VisionBase <-- VisionOfPlotly + +class VisionOfMarkup{ + val format: String + var content: String? +} +VisionBase <-- VisionOfMarkup @enduml \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 2ffacd8f..0659c12d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,6 +2,8 @@ kotlin.code.style=official kotlin.mpp.enableGranularSourceSetsMetadata=true kotlin.mpp.stability.nowarn=true kotlin.native.enableDependencyPropagation=false +kapt.use.worker.api=false +kapt.incremental.apt=false org.gradle.jvmargs=-XX:MaxMetaspaceSize=1G org.gradle.parallel=true \ No newline at end of file From 02df77e97e6d78b466f13acf56aef135032cc161 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 20 Aug 2021 20:36:23 +0300 Subject: [PATCH 060/109] Fix Kapt problem --- gradle.properties | 2 -- 1 file changed, 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 511d4130..2ffacd8f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,5 @@ kotlin.mpp.enableGranularSourceSetsMetadata=true kotlin.mpp.stability.nowarn=true kotlin.native.enableDependencyPropagation=false -kotlin.jupyter.add.scanner=false - org.gradle.jvmargs=-XX:MaxMetaspaceSize=1G org.gradle.parallel=true \ No newline at end of file From 1b2d61008f4d8602d0ca4735fdfed89591702376 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sat, 21 Aug 2021 10:53:36 +0300 Subject: [PATCH 061/109] WIP root unref --- .../kotlin/ru/mipt/npm/root/TGeoManager.kt | 123 +----------------- .../kotlin/ru/mipt/npm/root/rootJson.kt | 107 +++++++++++++++ 2 files changed, 114 insertions(+), 116 deletions(-) create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootJson.kt diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt index acf4d712..3b3eecf5 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt @@ -1,15 +1,9 @@ package ru.mipt.npm.root -import kotlinx.serialization.* -import kotlinx.serialization.descriptors.SerialDescriptor -import kotlinx.serialization.encoding.Decoder -import kotlinx.serialization.encoding.Encoder -import kotlinx.serialization.json.Json -import kotlinx.serialization.json.JsonDecoder -import kotlinx.serialization.json.JsonObject -import kotlinx.serialization.modules.SerializersModule -import kotlinx.serialization.modules.polymorphic -import kotlinx.serialization.modules.subclass +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.decodeFromJsonElement @Serializable @SerialName("TGeoManager") @@ -26,113 +20,10 @@ public class TGeoManager : TNamed() { /** * Load Json encoded TGeoManager */ - public fun decodeFromJson(jsonObject: JsonObject): TGeoManager = TODO() + public fun decodeFromJson(jsonElement: JsonElement): TGeoManager = + rootJson().decodeFromJsonElement(jsonElement) public fun decodeFromString(string: String): TGeoManager = - Root().decodeFromString(serializer(), string) + rootJson().decodeFromString(serializer(), string) } } - -@OptIn(ExperimentalSerializationApi::class) -private class RootJsonSerializer(private val tSerializer: KSerializer) : KSerializer { - - private val refCache: HashMap = HashMap() - - - override val descriptor: SerialDescriptor get() = tSerializer.descriptor - - - override fun deserialize(decoder: Decoder): T { - val input = decoder as JsonDecoder - val element = input.decodeJsonElement() - return input.json.decodeFromJsonElement(tSerializer, transformDeserialize(element)) - } - - override fun serialize(encoder: Encoder, value: T) { - tSerializer.serialize(encoder, value) - } - - override fun decodeFromString(deserializer: DeserializationStrategy, string: String): T { - val match = refRegex.matchEntire(string) - return if (match != null) { - //Do unref - val ref = match.value.toUIntOrNull() ?: error("Ref value is not a number") - val refValue = refCache[ref] ?: error("Reference $ref unresolved") - refValue as T //TODO research means to make it safe - } else { - val res = rootJson.decodeFromString(deserializer, string) - val uid = (res as? TObject)?.fUniqueID - if (uid != null && refCache[uid] == null) { - refCache[uid] = res - } - res - } - } - - - override fun encodeToString(serializer: SerializationStrategy, value: T): String = - rootJson.encodeToString(serializer, value) - - companion object { - val refRegex = """\{\s*"${"\\$"}ref"\s*:\s*(\d*)}""".toRegex() - - val rootSerializersModule = SerializersModule { - polymorphic(TGeoShape::class) { - subclass(TGeoBBox.serializer()) - subclass(TGeoCompositeShape.serializer()) - subclass(TGeoXtru.serializer()) - subclass(TGeoTube.serializer()) - subclass(TGeoTubeSeg.serializer()) - subclass(TGeoShapeAssembly.serializer()) - } - - polymorphic(TGeoMatrix::class) { - subclass(TGeoIdentity.serializer()) - subclass(TGeoHMatrix.serializer()) - subclass(TGeoTranslation.serializer()) - subclass(TGeoRotation.serializer()) - subclass(TGeoCombiTrans.serializer()) - } - - polymorphic(TObject::class) { - subclass(TGeoBBox.serializer()) - subclass(TGeoCompositeShape.serializer()) - subclass(TGeoXtru.serializer()) - subclass(TGeoTube.serializer()) - subclass(TGeoTubeSeg.serializer()) - subclass(TGeoShapeAssembly.serializer()) - - subclass(TGeoIdentity.serializer()) - subclass(TGeoHMatrix.serializer()) - subclass(TGeoTranslation.serializer()) - subclass(TGeoRotation.serializer()) - subclass(TGeoCombiTrans.serializer()) - - subclass(TGeoMaterial.serializer()) - subclass(TGeoMixture.serializer()) - - subclass(TGeoMedium.serializer()) - - subclass(TGeoNode.serializer()) - subclass(TGeoNodeMatrix.serializer()) - subclass(TGeoVolume.serializer()) - subclass(TGeoVolumeAssembly.serializer()) - } - polymorphic(TGeoNode::class, TGeoNode.serializer()) { - subclass(TGeoNodeMatrix.serializer()) - } - polymorphic(TGeoVolume::class, TGeoVolume.serializer()) { - subclass(TGeoVolumeAssembly.serializer()) - } - } - - val rootJson: Json = Json { - encodeDefaults = true - ignoreUnknownKeys = true - classDiscriminator = "_typename" - serializersModule = rootSerializersModule - } - - } - -} diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootJson.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootJson.kt new file mode 100644 index 00000000..f0b25d18 --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootJson.kt @@ -0,0 +1,107 @@ +package ru.mipt.npm.root + +import kotlinx.serialization.KSerializer +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import kotlinx.serialization.json.* +import kotlinx.serialization.modules.PolymorphicModuleBuilder +import kotlinx.serialization.modules.SerializersModule +import kotlinx.serialization.modules.polymorphic +import kotlinx.serialization.modules.subclass + + +private typealias RefCache = MutableList + +private class RootJsonSerializer( + private val refCache: RefCache, + private val tSerializer: KSerializer +) : KSerializer { + + override val descriptor: SerialDescriptor get() = tSerializer.descriptor + + override fun deserialize(decoder: Decoder): T { + val input = decoder as JsonDecoder + val element = input.decodeJsonElement() + val refId = (element as? JsonObject)?.get("\$ref")?.jsonPrimitive?.int + return if (refId != null) { + //Do unref + val refValue = refCache[refId] + refValue as T //TODO research means to make it safe + } else { + val res = input.json.decodeFromJsonElement(tSerializer, element) + //val uid = res.fUniqueID + refCache.add(res) + res + } + } + + override fun serialize(encoder: Encoder, value: T) { + tSerializer.serialize(encoder, value) + } + +} + +private fun KSerializer.unref(refCache: RefCache): RootJsonSerializer = + RootJsonSerializer(refCache, this) + + +private fun PolymorphicModuleBuilder.shapes(refCache: RefCache) { + subclass(TGeoBBox.serializer().unref(refCache)) + subclass(TGeoCompositeShape.serializer().unref(refCache)) + subclass(TGeoXtru.serializer().unref(refCache)) + subclass(TGeoTube.serializer().unref(refCache)) + subclass(TGeoTubeSeg.serializer().unref(refCache)) + subclass(TGeoShapeAssembly.serializer().unref(refCache)) +} + +private fun PolymorphicModuleBuilder.matrices(refCache: RefCache) { + subclass(TGeoIdentity.serializer().unref(refCache)) + subclass(TGeoHMatrix.serializer().unref(refCache)) + subclass(TGeoTranslation.serializer().unref(refCache)) + subclass(TGeoRotation.serializer().unref(refCache)) + subclass(TGeoCombiTrans.serializer().unref(refCache)) +} + +/** + * Create an instance of Json with unfolding Root references. This instance could not be reused because of the cache. + */ +internal fun rootJson(): Json { + val refCache = ArrayList(4096) + return Json { + encodeDefaults = true + ignoreUnknownKeys = true + classDiscriminator = "_typename" + serializersModule = SerializersModule { + polymorphic(TGeoShape::class) { + default { TGeoBBox.serializer().unref(refCache) } + shapes(refCache) + } + + polymorphic(TGeoMatrix::class) { + matrices(refCache) + } + + polymorphic(TObject::class) { + shapes(refCache) + matrices(refCache) + + subclass(TGeoMaterial.serializer().unref(refCache)) + subclass(TGeoMixture.serializer().unref(refCache)) + + subclass(TGeoMedium.serializer().unref(refCache)) + + subclass(TGeoNode.serializer().unref(refCache)) + subclass(TGeoNodeMatrix.serializer().unref(refCache)) + subclass(TGeoVolume.serializer().unref(refCache)) + subclass(TGeoVolumeAssembly.serializer().unref(refCache)) + } + polymorphic(TGeoNode::class, TGeoNode.serializer().unref(refCache)) { + subclass(TGeoNodeMatrix.serializer().unref(refCache)) + } + polymorphic(TGeoVolume::class, TGeoVolume.serializer().unref(refCache)) { + subclass(TGeoVolumeAssembly.serializer().unref(refCache)) + } + } + } +} \ No newline at end of file From 9b6cdd0166c0b3713d30afbf4e824be931f6451c Mon Sep 17 00:00:00 2001 From: Kira Dmitrieva <71787194+kiruma524@users.noreply.github.com> Date: Sat, 21 Aug 2021 21:15:16 +0300 Subject: [PATCH 062/109] Changes in documentation --- README.md | 2 +- docs/hierarchy.md | 11 +++++++-- docs/images/hierarchy.png | Bin 27217 -> 156172 bytes docs/inheritance.md | 22 ++++++++++-------- docs/uml/Vision.puml | 2 ++ .../space/kscience/visionforge/VisionBase.kt | 2 +- 6 files changed, 25 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 621f474f..b89b0ea9 100644 --- a/README.md +++ b/README.md @@ -95,7 +95,7 @@ The `prototypes` property tree is defined in `SolidGroup` class via `PrototypeHo ##### Styles -`SolidGroup` has a `styleSheet` property that can optionally define styles at the Group's +`VisionGroup` has a `styleSheet` property that can optionally define styles at the Group's level. Styles are applied to child (descendant) objects using `Vision.styles: List` property. diff --git a/docs/hierarchy.md b/docs/hierarchy.md index 2427cec7..720af5d2 100644 --- a/docs/hierarchy.md +++ b/docs/hierarchy.md @@ -27,6 +27,7 @@ low structure changes of this group. Unconsumed changes are discarded. Interface for 3-dimensional Vision. ### SolidGroup +3D Visual Group with a container for templates visible inside this group. It has an interface `PrototypeHolder` which stands for being a container with prototype support. * function `getPrototype(name: Name)` - get a prototype redirecting the request to the parent if prototype is not found. If prototype is a ref, then it is unfolded automatically. @@ -34,10 +35,16 @@ Interface for 3-dimensional Vision. ### SolidReferenceGroup -A reference Solid to reuse a template object. +A class with `SolidReference` interface with reference `Solid`s for template objects reuse. + +### VisionGroupBase + +Abstract implementation of mutable group of `Vision`. ### RootVisionGroup Non-serializable root group used to propagate manager to its children. -* function Vision.root(manager: VisionManager) - designate this [VisionGroup] as a root group and assign a [VisionManager] as its parent. +### MutableVisionGroup + +Just a mutable version of `VisionGroup` \ No newline at end of file diff --git a/docs/images/hierarchy.png b/docs/images/hierarchy.png index e202c6afaa746ea54011d46fe48f1d0faae43c5a..9e9394ac820854b0a07c2dd5802f13d0c6635f45 100644 GIT binary patch literal 156172 zcma%jbzGF&8ZK@XEJ6_xkx--sR5}L)>5@iD=^Bvk0RaW1rPPsVefO!-sjxkz4HeO4C`C*zR&Z#u_j1aQHt=&ohx{Fc!V<25-NCjm-6xO&SNh9 z0e;dEFNY8QVRn3`gBXIo>%ijO&*bEjgv>M>`ePY1JGzg(x=`)wpZ|{O^pid%U=0d*K_kFm01v* z^#?oKS8@e!_3II6bLK4CR}YNRliwhvb>6j;K3r$_C*G;kycMcR6z46nZTU9Vjo;d} zcfLGy)J9nG=0j>8zZpTQVe08Yj~$3{{VJcJ@zHE4LA?|@<|f}KQUk^-c^YaD@6ET3 z4>6p7GS}nnz?$l-ocGF)x=0HSYn@zW+$;8SUK&w_caFmX zR-D*{na5^Tx?i~PSak9eTsKBUJLs>dqgwlN<^TIj%@c+8+IW2iqeA=`;q;VvOf{yv z!_NDiCQmZ+FoZURZtZpFh#*7Mu<&Ec!G&?frU$V>Kfe-wueu3moYixV7pzR5VZQ$P zQ#LF_bX0FV?hkvq0eP8MvuO@{0-1Oa;($2$C<>-+|0=~VUz59j#+}2Tjm$PL_U5wx zrFD2&?|y~s7uKK#mYwF_;4N}^jRXst@mn<>o)4akgqWJE{xa&amfFrqligw^>#B)O zMQZx26DzkI;a-DRtwpR{Ec!#mSJTg*(7tld($g#6Jmg%4)BeFui#YOSxc~LxSKmU; z?bC&W@rqu4QKsPfb(nBsz})MOy<<}!yO;ZXA>9VR&(B_ubR{>b{`v;*5pA*9zrJ}F z!gJ}bZ+=8{<72@A_qzQAN&Dx2@$keYDKCI;M8l0yN@Vv$%X>OLsM}dV0z2o$gpw5cavE?{H7|p^ii* zxf(2uj=skJwt=c7oe=zSL^Ad(UXql#-=%xcLi+ICY{tk)NJy?(v)kk2vd*R-2ODgy^(iLzV_J8Vtzp-tpp;>k zK33>PwMY3&KbElcv(|tj5iV;rUPsnYC|L1*I=cT}>!X&ID=w@2a{UJmal)E0gb@!7 zCFQ9p_@bT$-W0}}gY216Y+r&#)HNLW#bk9PB3}GrLL^ohQKYO2u+DFpw5DBh%j&|K z2-9DuS}gW1GMj}Gt|?i*d@^TtaY6ET_8sEdX_HLdh=`v7xHHC`G@cK2GT{?{^PkH) zN@_J4%2ATJAvZts*yIY*b=V*6@fG-bDm=YHg|j*OGs|=L=V`{X@9pg<9ln58^#*Td zTk{PG`OIZWPw8MTEHc(9S&?JIW2?{QeewV$Tc&T;gKeQMCI9x-unou3Cw zlk~wgthM;u__xjA*;($EEAj3?aZ5wX;VfgPYvu3GTa;JTvy=AWYn({$MN$z%@y|%W#d#0k{S6f9z z^QN%e&V-T}=k$!kEbSt9Ny&(zgh#KEf?9NtbJr}032DZfej0u%=Hx#p?_&wVsAp@` zfCnNE^1Z7+e!laqO8I|1RE>j>Wy-xB35qeC!0 zb>+*KF7W`E^nzHeevf|z*GpUi%b|;SD z=-hu=Fg{5f5oz#drPwNjddGcR&jn6}nJ>*4L)6`fW~xZO1V5YmQ(GCjTe_wV$y zbo>`D@~ps0SCjX~JhqndAu=-jlgm}P8o76x!q=_~HigqLQISyySFW94tYYG%TV-*m z82xW-JTG097?r5eeJc2|HB|ex}vAv2)lZ}z35-fFgIejKjAQOe(^E^^ARKL=$ zUeDPs_1fG2;rXKiVGhT#^!aXAB2%n#h+U{yH6rq5q?5(}>7$aXuG&ams@1}ytim;B z+6038@j67Lb1dW!QrB^mp#1e;#Bhz_)z z656Z*a^B=!(qSCXsi@*nlUKPIX^3N#|HKH_ifI$K@-4nW-d_ivm6Oc_bO{JWg!cF* zlGJWlbIr)X+i{I=_jR0Il?Dm(uYX$OI|>D@szikbU$j1ofsdEsVNC;$K^kCoY9dO~ z*Z*ly*Pp(>{SUYZBvEPj=dgg3aa=3<7a9Y`W!2$nq$*+Xk1%USx5IH}V*Hn}WD?&0 z*PoF8iGQ1?orK8B$76$^NuDO$(=4@4{ToZWqOjyk+O&jY2;2nly6B3<{x!~Dk4^?- z-+cU!jV8I58u-t{1+4#f1m64&jfjklv^U!@9r`}j8h`)tWhtFf>n|~6Ur{OD{v|dT zOZgBp*dR+S#!WJpCts_;moLp8Et`;VtM!eU9Du=&c!PYEG?ffRsN$D>aeh&03c|nH z$k$G&@;UOy4zsrb7Ox=2#%dKlJyGM|z4ko2JzG8d{@8mcYc@?tX!g57#U2y5>sTStk$~qrr3_#Og%l?TVpScA!pe&=S|hp$saG@V6{;3KyT?vdA#2hXcM`I{31|N z>$Iflv`3RD=^d7u)`&fjuZ-f851w%iN9)9-SyNilUL zkd+@WcX4e5c@}N~E-LPRKd)~&YDQP_a6-AF0DA?6cj(-(fD>~4RHz2Nw%MYKr8hZ4*Fh+Xp6 z$w(_E_-_X)R8eYKp;F*Y(x@`$RozUlIFj?1{$`6G%qSmh0-Dp+^9IBgx^0uMAMcHE zswmsD)y(5#(IH*X%cPZ&-OSc5I)o&sWNU=(yV49_DTEF`V=}TtvI+`rPlpG{#e}ai z>+6qb<|p)LsrRmoXqxX0=0S6+KLA7OjUTjWJ5l+vEj4Exbuou-*DAkine;vu+$ku; zkS>=W`}`eA4obuznBumr3WmawzF+c(luwn>%P` z^7bQ~BS$ko*7$d++Z24G|yI@-T^vWq>ugth&mrog5cw#|v;%^1_BkJ(CNO zkz=R|hqMB_opa~i8-BTCrkS5Vx4|4bWozWhf{p4-)NBcp9RV!d;Imm++|qmr9EO7X zA@gw1xpPMiCs)W$=wrB$n5m}<@?%***nv~ZH*kr`%|XTLi%VB!3+wS@>PiVb^Q@{p zHcZF7G)W{u3;5rb{2Mz*9wU=72tSguYt!O93dDu$l~|Z(2phyQf^yQo==opc{98jyTw*r-+tSa1w!iyk7ykbj zuK{bcEOA4(#yor&%j~_S({PP)KnMBAed;Z_zWH!rLH-&$+W2}(HLdoI8)5I|ez#uf zUhOvj`JxQQ&G1W=|6yLTy&0^aSeMtNRT+IUB@5GJsKp#S`>Y9rU8z-k#jpkE_d@<^ zn90pjXXQ0lwr!4ZX+%`G>3#Cn&G5N-68%$tmX{9Y^Y%R%>(B_Cm7v%y%Uj{V%c=Na zU0l^pPIa}Dtzg9Yf6&g~B+twszIu+9ST0Xz%VqVG*|Nay6QUQ$F7uz(P+rH?<4XI& zK<0@!6joAVcB+B*AC&N2e0X0@<%2=ChQb28L2!P|crY)Nq19 z1Vb0T<*(&cI$1d_?fxpUVsCA9((I~E@;*iMr^)SBC?)WB168W6eUF?2NlbNEJEt$7 zV10)g#hkE)pk8BucD4o~C48rc8qIy(Ky0BX*CTJYm8n+iAU8z=9&DwRCQEM@wFLrE9c6c& zuQY+H+ARGHcFYH%7LZCITl~V{feyK~*@IW?Iy`!#W5yYB%t0fiJQ<2Bwx~mOl(5R* zTq9Cwgmz`^trKtY$kYn&xaVgOE@24EdFZ4*=V(2iuJfA?zUB3R5J2sZ*2RG0V%6B# zCH!mi$-4Z4f{s9sR61I)u3R6Pax4(GR2xUP(QufU@+drHr6Ow^tM!&&j)aZJ&rKo8 ziph&@P^0SEBBYc$W$Y)LZ8AL_uj<{$%O}}+8hnwpt^NPt_5t><#}Ak|UU**Wp%IQU zHBS60qYiGzRf%^L4)K=}wx`3(C zctK5Pu(h3Jsn884?FxHSU~KeqA{}d_CPqayVt(#x)qAsL<1pCr5H+gTVe8NkU8Wer z5|ge#dCvw?T1uJ9c)KM}UdEfYQ0XPis4~iJ?3yuabDl~9jj4ox$+i+h=glLiPHSWE zZs?urnaNkl9@_udTr(@b4^cF6R|-?^11dy#pK7f}LEsEjSvqC0-QMc?`s$^H>r=rT zrO**w%ZrYhw-{x;ofN8a)wAC@ay{DSY6>jq>jqd?f#(VQolz?zX3-(&u> zK~hpu`5bE-`-_Tl*KCh&H}(&6+LgiN-)r^@TTj?O*rCnY;5K_@@>a!p1Lrj$ysZiN})RUojbnpgS>>!hDDz~=?b$X{qdXmgfuTr{&c}l zbM2y~Ag!K2lfG}?Wm7J|HF#)M*sXR=~E%}n6mOal`58%yOiHnUG0qkiGV#nb=Zw)a<)8UK&loxZrqzX+7-#V+NII{w;z2U@=~kR$~m|HC^cCFTWU2}DhGwHqLchAVDi3yLhZ z_^rXQW0sJ6Zm^G2u>+Z^loo=WH`ky?G=JyrV2M-}a?69+pT-8aqycMx(K?efOMoY7^xL@O#CB!=rjr3aYBT_`!PO}WKsz^3`9 zu=4Y`q`|*R1*u>%e`Q4UaGC{gTYA7R;4IzEzvRQs)6GnPJm zVQH~Cmv#Gi+&02s{*~SW6DX8 z*`FB(O5}I*$Czl|iSYBiez$KJRJM73U(imjG_Skqu<`WPQ;yy5mZt76$Fi!ukMGfN zn@KkRS1$JV@k`n936$eG`bdZfAA_TL20E&&o?? zb93{=#7i0)8Z$Gq5wp^1VmN*7&P<>vytgs)&SOD3yrIG`zm$rLr zE`$xm(nuy$g%7zT-WM@)&cC+1A@p!X(0-`RtG$zGO|c|%BVqa|(ZdFXDO0`nwtR`i zg?7qDV)WAkM#i=^LolOO(m#VJ7Jh#I$B!TL@bIv(uxuvkR=6^c_6&P>5a;PZigU-B zFsOy5Tb~k3ArBLKCkHS_OXMDR4N4VYc<#*GE`snYw%L{tcK-&Q0=C`efC%EX%W}B} z^LESGp@kUoKb|UnggRMr4kQn+8(rmzhd9gfD5nP@i0laNuSzz=%ScMTJ7xzh1W7_? zWi{n@!h9Ypg%xS15eFT-#eaHn~j#Jg$(}J*`U~x+*DKuvqa|Gp2LRE@I*Fw`+grSteeneN+I2 z_UToTjTnXxanL+_qhk9j4J8|~rcPo+UNf?Sv@bSmlF=-^+bUhom@h+ylf}5AY0P_TA4n)tYnNmUNy806-ETv$Y z8KU4h26uwBueqG>n4LABNfEu*g};z|bY1i3+$X_4nwb&r-B3SjehUiRC_|{) zil)?LTUHFw|C-m|Su~v*_;$p`8 z1AF{G9L|nEX()BP!ecr~s;iH?Lm>dcMR}bIgD}soU)b22aS*)@rcqlw)DR3=cCzB^ z06Q;7Nu1t9-@*vSP_8`7vEP&d$2VfbNLPcL>YhCBv~t4ui@my3FaCy`stCbNQe@JT z2OA9w6BJgB!u1>1uiEnOTNDUhS4hrp31WLmj<@jw|cKSx;hGLh!6-77mMN3aWeC7nvK-!W$@Js zOabSheuj$08fntUGZp13AN46_g522#O|+K4srHKj<~OVVqV`mO$OPDERX09G!chiY zeJz)ZtHpQQS`M4Lujkg30DIpQ#4RI97vVj-h*luL1pL;dfV=K}bap<--;fgLruekU zFKP?Q$1Dn_8X=4G1<3}(gH$A&3zdkBjyCM6uIJ!R)yJOk?=aV1j)S>y9L$~Hz5%N1 za={8!`}O*EYcpf8skBgn-sulB*i&^qE5VCaMC?qw3RyGJUKojltKe7UGd3U99MZu}S>;{3)hdIhM8mPdd+@}Qbqdu+hpuY}`H z^wEXzyrz?i-g_^nt{l0aM~x_4f){PX_7*HhtAPP_!2k{wciN%hK2fBx*;aeRUy7fs zO0OGKRBYY@yKzi~t2!xbm@v?f7jFQAinnU(2G*sdpiNdX$i1TB>q+$JVX;_5;L(rf zL@2RK{8W#1Lxs8^4Qk?T7Z_pl3|OP-0RY&IiJ8To*zdQ81G8v)$5vk0E^zSE>EQ0m za&tdg2gsD{zK}z}p`YhbXN_GK9iy-+7P*vH&(P1EgO`_i|7W9o1%)hHhAN04O~QC>#@ ziX11*2Zqs}z(@5K-mO^KFXQ9dA9Fek*y^@ym??1|?iAV}Jq z&uqeGOGjiD=!X@-iF3zO(H&4_-@}Q6UlW=$(-g8Va<~DqlBX+cB3>d`FWWtu`nl)*;9~qKE3c-= zm845xDmS<&K6MZ1!~Euk2Ptp!c+^*S$>C15@T~QU>BCI$b3l7{DQlEXtnJH}qI>0F zHPd9#QL*uaZjg+9xJHw*#tofrOT@7#sihpLHN^ERAk1cDDGQ%|l zxv3X>4As_uJAsFOa-nIS!;8j4(ng25jz6-4Kb_fcji9SG)gNE^ zf?-m?E+h#UFBk%^f?)2nst_GfyWkm95Tsd_Y4-c!RM>^NRI}DOJS+>ihJj5tj0Xy? zT0#%u-Brwex#>O*KHbmC%dQW(8BPvq*x%6P*?XDu|A zCmS{H?x!SwzNUZW5|f9yUs5MEs@%b*Uop;skc#z7I(RHYC*iwQTJv-;G@hSoTE zl{o+c3F9Dkw&G+5y7=*8iZ(Gd*w1KYVCCoS9j3!B1lx*Yd6^-ve4658c6YNGm*COI+R#Y%W!16>Csy#Dy~hdW+UA_PglzY;#BxL?DnHejZ$3IQ%LDVceF50#GvW@tV6E@{V0@9a_V>uSSgien z=QGLR#12#T>RW@F;z=K{k>LhczRiU=u(~|he+#7Aj04`at5A|wb_EURkm|L9$*U_% z+r$YKt2RHh55VI^TX4G}s=djyxSNQ$d;X;8XYvW{UMcC%S?enFd}90umc;W|CU}Y0 zvo=~?46EIjWU#lWKev&GgFY>smx+#>jLB74%#m&m6X)fJ+F6?4*`Lh%R-Kpmcw>_v z4}Bg=a;*jBQ&gAeX={*i3Z`MS?1feDSO}jI#i@L+=%@q=Fzt{}Z-H^M7)2S0*H#vy zyZpAiu?GSv7JDSbpSke-XcS0W^qE{cfDz!~y+5PFZE2O}#$d?m7S$su02VW-Pjeb8 z@#m8ZFFV8ZKG=k^@-aO0OY9YI3Qsr#$bl~LR-M` zaWsUtegTZ3pC{?i#JN7>kH%>=Z&H^BT39DtKdU{i-!&fdB7v@u2|2|7cPxO%)PMGaTeC@39O*7ohM{6YHtoxuUJ{lLXgIc^l_2&l^m8Q;FMm{cjrGIQ}_P#u;t$`F9SyRO&e3 zH&){Vw~(nL$KlAqnXzoh1y#8Lx&~+oc0pLclVqbm7RdD?nhh0EQL$8>`OR2`jhX?_ z$r8tF`<3v?ON+7_?4G9q0CA?^%O(zOf3bHhj(kNonx)Ihp-y~2w*i0s0w*H=Tsiwo zEPT8C!NFZ0Pid%fRlbvr4d1%ByDFq0wkpFgBKm0k&#hUR1}(5 z@V5VQfQ9$Tsw1!-te)aH;6G5oaeTDLnT-elU55JM03u+oKI7QdAqi}NtYi}=DRO1P zq6=kd5WJMV66TqYt43ki{zmyaG_eyOFBCy}Uq7_3UC3MBZ+DEcGTx4*e;YCO%$GkEP7m-isK<;JR{UA)uf5<*)!ND=Ps30S!%JU|`_Tkk&yv(K{wyDbgkP zr|vs7sx-N?#Q1;U`P7~nozHf8DkXuiZ+fnsjlgKyaA4BH_%j`<4(W-stT#8FGa!>3 zh& zz<{F3W0Nx2w{fwQufke>G$n3t_uGpR42H5u|?T+c_0e3B;_%<3CM@;SjMbI8rbp4pX z@oF@OMHy+zE+X;JyhL?6nVn7YVy7-SbS1`Z?+w_#%-#_mrXG{Toov5;#;Y4Sw5Tt| zs@xu@VR32pVk%dX37@`dpdl3IHi@ZpK8>3GZG(va-9E`*2X^QoZinjQFpt;<(5@gF z*xMytSt8=&hYf=q3W#*T^o2Ctk@yxr`)orV?w9y(2J^M$_TI*JE~{*Up(jn~AvYkm zU2BC=Kpz41Tct${5>q%?^5YSR-ATg}ManGaBK0|G0O0xXlY0-rZ`wZxdcbzxjPj;e zL+k9$WNUhpfQ0bI7V(`Li>N0Q4(?ZG?i-^rL}R|qA#PzAJ;@!A~Q zgLWwAa7ogEDz_9+dj!4i=qjFzH0>OqF9O>bQvn(}H@AzGiEe}9=lV5}T#MH~jsnuY zftYyEMbHf7Jb>o#c@m73a6giS_)h0y*aE@`F|q(c`=N_K=9Sac@h^Y?81GODGD17v zNj}o9pOfQ@bo4|qaTLlNRmlA$f2hfxt&k|9heCOG*DS4IbU;HDQ`39u5@gkj5*E+&G?r4Xa%+qnsJC3t617EexCU8;%MM39%f=t1xaW6tBxNKsnby zy16=eq`xd3%<`cNkyLCG(G za7nMobZ4^u=mGtKMfhhphjsVY0>19C6FUsuR|K2=d{;Q+WIxRr1`11{x~}uX7fD(& zVpxxK_sV_2?Y_5qgWN?zFo_Y^Lw8!!IKtXy0VH<@HH_HvM&Qn@Vptw+CBoX8&l6@r z`kmMm@1ZZDt58P1KAM}4>>7bQp#fAMMTCV`T?S4KvI84jHr)*%!)`q?cxvT! z|BJpyiuy>$$_%vYI%~kY^U-aVQIXgCQf1C(x>SHNc8VkiXcwMcjAkce)%gBhD>k0W z5)|Ilv(vH594=zCMpg2G-f_@a$Wik#Nm#(FqalD;3AEldEEK9nUk_+_Hj0=t_~Bbw zj|>eLxx9N!tOVdgr9j7yKPCTL^!Z2zW=O{h6Pi`{FH&SO{u8CD*48R0DMaP{Oof_bx=AmZP^?&D%smVZIpC&HcwDG-@|5G zEEp5O_4$#-QRc1R&6jRag5DOS3>2r-^sA&2Hbs{>EPmjGKF*I^WsPpMWrDF@mLvRz;qIo`&0 zLdEqobQ*+VT ztrY8NyUsj!RsRtv{o7F9B%Nkf;DH{VcHZwv1aj|Y!-4+=Sh+07I)Lo24I=S(zd2S* zVN+(n-sgjJ2#AgPq{JZxYXhcVz1ccEk=2S$3qv(|ZlKn8-HM!tpale6K?rlrMy0UnA2VCO{&Udk?VXizIuI&Wnxc_mfiL ze~27e=h#qkdF=Yn%uIvoF}KUAcQNa{42Zie3qR249kq`knz%q_yp#QOXR`k`&ScKo zp*o`&=r~Wz=YgTP?|n>v!n5Ih+SUdq8iP2fgV5-17g!j$rGm2Y&zUZ`QfSq?;Y9bg zY;1`g?uglAD)0rjC<+Uo0vLgRqR2rRZIAcR)4ntSy~!+U`*CV5&0!1=?s9XlsDs)x zxRCN5I{bVXtV8DE{oQ$XdU%V2*g}JVljX_blKsl}p`l_6vCupHl3`qKpuyJpqA=Es z3^v~`fy|17^?Hrcno|Cn9Z37dVF7;*mr|PG2Lb6p&%5&=Qz`;uPDpd~ZeI(-jMb36UA6#3 zSUYA-Zu7R5qu>K!&{&ZWH@f^qC+wt2id|)Jl?J598>Ta`Z2o6_%0wUj)#kLK?J-CZ zg5=xih$1dUnBuLmNe6&pQ&wptX>?ssKX!3eypM6k_^ooCok*HJ4El{vvm)sgpb;i5 zcikS4u@xTM57${Lz~;UYF|=60nHGp;w4@8Tn9bt>NaE`nP)_%Cajn;@Kljj6HJSpU zd{PrMLV8GuvuRI6O^T0MCsAnnHFDT$qHmp}Jz6fZ2OH^2{b!_KvtJ<{70HZ!06i|v zne-7`2y!Ece_XWgzGMW_=O8z%H*AT)rc?Rx_6339;TnE*B5uaF7yp%Lf6nYu#f4!H z;?M4XUO7+^NG9~HxelR4ec#@udeoGBk_5^$AlAjEwtYU}f*a+#_6|``+4YZK<=dVP zgQyWCPZD%WI5+k!6f{abZ{TevgSPe6sHaTFa-2=E>3I;S3XiDDa;L!2+UV>iQu(nA z*|sMDj_Q~@UUSD~wFoYnh2evG){z{}Gg$Gtfs0Sqm#OuGD|X=+;Ks{K+k39lkV%8j zO_d4Fu#XIh=Y5`bZShFAQgO(2vK#502qQhZ?THb3ic-1YQHX;VG$rHHW!qMJibg~( z6lOp2$<*F~dI^Snj`YUXN zJf%eIQ!vmh2tsc_toUo5%rql7PmfVSj5_D>l&f$t#Aa-E_o%Sb3AO@t1j_>+?`Asy z^y)YvUt8kibIM=<>BoQ}P1HbTCZ}zK)F?K~Y7YVy1R4;qiGX#G&jZGD!T<_x>Q@n@ zDRJMdcD9!Jm<=aON2t#YhwqPP;>q5H;%d8V&ib)M&LPZezVr)wLG=Aca5JR`zm7KTS3_{( zxUNnpm`fdqsD%=Lw~PA~l6kp)1QF#qumwLv8@5g}cSJfjp7}&^=!PG+%nq%;1s+mw z3v+aD>2#^`1(^nrAX?Xz8E>0%L(!_-4VrfHdpUn2>>1d$6cAnSH$N-8ivfumq__|l zla5;$F)3b>F1AR1`_jU_aWoq|`jj_TXiu6$Pq~$NtH*|3V#Pslr`s|^G9AQt1f9Ar zy}tyvR?i>Y#hWL@M&3aD@kd5|hGB@w6GamFK@l39F2P(LrV-3OYHstNT z84b(^9Y(k2`4t#2CEr}nA!hF>2XF(?wTN3{+^DhEn_ z^XjtOul_i@wEL2FpYXGYl>0|B1afqEc(|#F5wxKQ^~ixdfHzs8&+0(kCu& zbuxl>^Q$=WK7!khD1`jAQ_G4WjW$17)!>)1q|r%7D#fNuZ;qThvZ_D%Wbz?%q~hOlRV5B7fr! zI9%o1I45{MMSO529?%#2N>jE0{3Qeyy!8TN7F?7UVA!Zru(F@nP6Yks;dqD9G@9|w zYj9*o?KR^FmweaMxqn>>K4qDuUxLYkdLR(o*m|J#I_y8|fuh5jKlTdu#=Yn2i4_zS zJeY}NVAu;Z8t}Opf6Kk!U-*BGjp-icfwpng^lRz~(z2W&>)Uw+SdDvw(&lRXFJu`_ z=I0_UlL|ewld{(@ZIJ9KEh5iGhB~hBrB`8!Pk%GF)?dK;(TnYIx*d4Kt68(zys%!e z{e|hEx&O2#3%KNb&}fm|deT1$F5@*+*6aL!;`&{%ohylgAsoyHMNV?r%(G;F=Pbx$;_^!SB?$(ZI5QG>T*I zK8@ERhGN4kJNrAp9W2nRs{vw7(3$xa;hK;k=h(!qUrZxVT(*k>{gd_e#1?~^+3l#cFS^Vjo#j1n0GVFq`HskB=4E(2pmw5Nur{22@4_+S00H_1e%>Js*RJ}t5r>F(;P^N1D(Qp`~& z9uQ+vzX(Y@oT;x$jR+?99-R|>8P+<4Wt2{@BDy+=E~wa2p2ri98Q&}1S*ksriRv~q zI^2!~0+e1*z&^F*JsBsp5MK>w-$Xi_fmZGY>c4upX}CGz3=C;0NQaWGsnMgo@E{75 z3S(!l39C7$wbmLX?`Y#YEh+0IMU6}q3uN(i&~*#6@{1D7EL6U(?(*p@TuD{+yn2=b z2o9UKbXA&fZi3ZEU{^2O(76HwQl)AyS>T7_FkTDk%Zx?ggXRbe^vplj{(yQ@Sp5%( zPTt~^w*DuQ!dVzx z8WZ*|xHmSCr7kXzC9El!_;H@KT@7?-gRb6%LbBqGO=OKdTE5`btAgL{D`uz`=tyj! zlWE6YhuM(a*_Jj7>7$t7CH<}A4*Iw9=f*wH`NfT+ES}%svCW+Jpvj{9GSjF83wm9+ zBz(~Kg}xPt$5GXDq84Ws|G~9cbHBk|Ync1)WZ_X_B3UZsG)H;xL6#If;9X=%5jyBpM?+Fb)& z_$aeANXDL|3mUtckYhMUtcNtYa^&dn-8 zuU+$>LX{!vh5 zdzYrCFxKGGvpxF#bi}00J`#c^!dav;J?}>q2gZ`6^;!(!@*4`|2)dB;= z+(2$U1A{HM)j-#PvpBf>;&3{aDe)DF>AKTtYrmX`l~)7E8G*TP!Y z>xU0@L4iKfVGFlCPoDUKKrbo*CX0~zeC^T@1j@eQJ(|%d_P9S*TVqG`buwwpQxBMd)^~&)GErvSLu4WHY)C zK7vAdg*uc${`eY)FufXozCxYU)^Bf`;M?HNWr0o^?^E&9-MhVWw^uXqlDM$Nuxk<< zA~POYUydEqF#fq`_sNk>dM_02lza$vljjaUi_!Hei%}pfm2C|Ixiz!Sgh!sPH0Th} z|G0Fzl~@NpeF1jr)xW=SKITY{9c-h|Po`GfJ_7HpIxrPPCwqr<_nsO?&U^3A25;st zxn#5kCiYX!v8ii_K?Q2qPqj}kyMfq!Bh$^TR>S;%Bp_2x$2uYIH`g(H4#*O#?cAD9#X*^sz7j#{TKzBH99Ehxt<>` zN-18M_+9}WnFSwUusUAr;aD6{>`>=RTxPBPfM>S-NEErggX*u?S^|l{l49MxI)XJg zoI_1tqUCLX8_)!uyVceJ;hh%yqE8SmuKV}UKOmAvI!_IyC*d5eMP>-Wc8&zwFjcB! zg@FyvM;?XcTRGZ@*$-@OL>IGRP9p~=620I)kX@d`TtTbJvj(MEQikI-h=syuF5|t` z{t5w?wzH(~|0}Eco@Pg<*!-blaoOo+vXlA48>T!Sn+uJK6^}l90z@4;&g!~1#xll4ZfcBCK z<>w9EcQ=G5TgWZixt3pB_9+FKH78S&+#7<>BZZf5)9gvE^Ao` zm+)IR%dIT4zz1x+e~2ox-HGF%Zm3L(W}&Aa8_cJ9KqJNLzD>fgrD0dFw>3BSBbVfR zw;#da8>Mrx0s@-h)F^plSncc7rz96FWFOt}r@iDGc!_XnvtQtME8d)(UUiEv)IRzuI{ zp;sv_3NDM&LsyLaKUHI*!l(q-Mf#F2``b|a(n>?ke>qUdZu>JDq;mIuug`=vSy+41 z$%f1|IYWM4OPp-`IcYamC{!uo>(VQw$2H$q}_ou9^EOWEH z^6y(Xi( zhs0C@J}T8?KO?V*k)$%$nUna^Ub=suE2mA9k-NQG%>T!cfQNHjVd2A#QgBDj*m!=+ zEE{|b1?}YYmh)ntUBqjbQx9bEMg;IwE0qs~uOuH5h}l*=fBU~y#ysxfhb)C&<@EFu zwTupAKevbf=4*;Vx;(|zpq41_puk5Dp0xascdx7up@F(~X_nFlcRtMWG-nM28kmdKm&s4)0AyA=26CY8Ta8%I5du z@IO+txb_Y2?BN~`?ydGR_ zNMO(H+t7Fdfg&9uX?KU1u;Oqqb1=$L6EAOp0vU2xex#tDz-k)8-W}C&Rd5AysAkqVSL#$c@e zx<}$fqwh@@u0<$`auLrUCO#p+7%i~h*(LUkT<$Uck6#Ye#Ti`x7`WvU6!?LijNkDMOf1Xu$a8{%Koz*YgDBKykd^S+LecuUA z3*QM-%idfp-i7^67K!|y<;@S2H#IfrX}SY_h5OF^jk+UrNJ5pwg*Qm{LX6HTSv0n1 z;IJ8sR;3RpX1(IOp(si0!IRfrJZ%2l^m`D+bVPHWe7#@4zpO63ttR$=`TAe#UG1>B zT^2o3K40p{dibH2$xeLmgTjR&;$C!45&ie^KFlctiWHQ8KVE`BUiXs3QpktjQ6Tsd znfwz=jX5ja(AkVb@x}l0`IHT=7m7tCVKWJ_`?^1n-!HPX?3>;mw={fWZ5Ekz42}C8 z5UalSzPfg@^Y_2B{%HdqmFK@lWykHC*t~JQ;rAu3{F2yUhfi;&^^1SPPx>5`OA>?7 zPkN6(j7^dcrnLS??n!{$D=zZ1{p!~Ckk8Ol#<|an_SSIX{fzbMZhI#UIjMBvW!9Vj z_~R^72NW4UI-ZJavV{tysE=Gip{7?SRR1i0BAUi&PEycZao85yOZi`Zi^GlL5_yOD zCnH1ioIH7Vv3ZX$TF@u=phgS|U}Kh}nY;ryxl?MfR-}B%;KyPd8c%W zfB?@o>CC~0n;HwQdOS8X`UJKKk2{4d7naZeTl(++{;kmJ7>aGgzic_H{GAdTd><9> z-(=9j=wf1IA6pA}>pHT95Rxfs%rVUu_qLc854bz5I4~%QitZR-`#(m@4=}axWx&zyU~3MrCs6`_$safgA4QY`cF-_N@N7{u> zr=0vG!bN7fooJ^l;kP!L2?c6@UrJGt=Sn9WHMQo{grnTe1-gV!#2@5FSVnOr2lIa+ z)c?;A?z+LCOhQwEff?FQpZ< zV6Y(SOy?8Y?+K&cR_sMohO*@yHjmQwND#7Ox#iy*Yp|iz1_z!eW1@5VKr6mTLBD63 z!bo9yMk=V!8(U4n1fL{B3GVqBMHec*V8BVse=NI$e{h|Bd2|_?FYPM-Z%;TtKG?x;=!qbz0l(QvX?LQ z9&RsOFLo*Xaq6UGtJT%xurc@G?cCg!FknCP=yhcP=#0^UkcD_cKxl%BBK_{&?%opF z83)HC7zmMbqN7X!lzdG`_l8LjG%S^@^V5wMa0N_$bq{@CgXM|>XR_8Wy#)X^_;ow$ z&gA7s8Xe-3_-^78@YpJSy&6@2>GUx#t)o&HeCj;=l4<2Zp$Ht!9Pjsx%{# zen#7nrTc3FnhKRU0-}I3ld=q#aJWK3eo-@|HJPB7E@5FIRH$R|TO&a;|Cx;LklnkW zef?Sy)av6Ca<-Xy{v%P@?s$SWad7H}kd|y_HU?anv}ch5f4sjU<*P@1nJtN?%W4rD zdvklU19sSBMUi?KG_ow$`}~^u>hcvvLWt?*@QC;udAO!xyBil;-FPbzPZ~da-6yi~ zo}Dd(5zonPwz<0@XnLLpVM{kQP63!{XIuK3t{*-3>&PM4aHP=6Mlz+K46U`$K{Rr- zvv!uK9;`dt-A&H0=nc1^f}~NbHi_SjAcsOF`XJLIUsMFSzD|AYr+m$MaeZRs$ZNg+ znUtYhjuoFGoNr_^i_*nP-9f{|Z@mM0+{Me(8En_0gKBp|0!e zTr6z?U7VfGmIg;Hi*r^9T$qQjag?rgQ)*L7ztm5IwO#IzJ-kKCO>d``(i2Oc(3f?sdFeF4lFucWVzbZpKx$;Uj$q>?rF;UY>7ve~}ci#+EV z7$=+#YHGrTt9TuX{J!G})%Cl!rmi$GPRo>+U7HjCzhXeuzLGQRxOFY5f9IQgo?5n~ z?nlKlZhc;Kl}}>e{9R~A5R|#P0`tW{!ohUa>6WeCx^x^z#VU3-E@c%OL5eWvd6PU^ za%@yL$WG4HKfK>MwADHvcbHK)?ZB`CFw0J&YBPh<2j%4+jzNT z&c*rr#p@HwfI4eyOyI`INnKbgp#4IDEQA0Hw()&kyHLqLK`p-SqQ~d|)n}Q*MN37M zn0823&(RogZ!(3-=Va|Xp69ENx-^U#iMA~o|K?@Nu8WWTp(^oP+xAS+J#X)N7oYiG zt!_Wk1qEp`=oU+&5pE?j61*Di4`l73?BSK159iHMLK(k9v_#JC!-;@d1{?b^nTv@+ zM4>5cgP;VM~o&A!7t{ZZkt-|9WK?T~8%XCaOBH>M4E&L=#Lt|IgT=4q)dTe&n6 z{F_4V&7~+8j#KeLKUeR|r?HU2!_mMkC5JAcQ1KejyS__UWh?F}wbLrbvAvc*cY|W4 z4G1ZFUA9~@P+0JN5K9J)8J;g^qwzSPyD#=uP`-w!=9gWhW<-+x;FnJ1c%fTjDNxW* z#O30djuytjEo4InbCLmdU~0L(*~!VBDbpzv3G_zStThFf9n66`b$(tNPIzUP%Uu~$ z2kMvY4ujo=oUZOZKmucgAL|t#rz?iU#Xp6Uq(;R)#9ElxV%$_zZ1TI<8&sG_^SJVs zWl_XOe1_4|s1OM>g}6o2N?|v`I#Rc`(e4e4#Tmsq`qK~nK&dz=6pS;(?G)8C&dy#- zOFs~m3oa0)(qlZAFs>qnZ*g^UABgK7NlVS04##JU>8MxwbeLaQ_y^2(i8?A@9ru2w zd8IAe_@IAh`rl$9rt4ZXN5Nr*kAci3e z3+=n+fL!IU_s0Ox3rR`Ft_o)9f?7kV^z`K9oK~x}i*N_%t0f}M0HF;GC=hY()1ZaF zKZjjgWx&Fw2@ZBhVmDI#Mk^y^(oA84h2{Qq+U+yAGIs-dmF*!zX3neV6jK=^|1pB? zi#-|0q^xPo=Pcnu;v7|DsR#qPsrO~5Uzw5d0t)WWsoD2dQrg5EP|jdchS z5}s5@{MFz8w+X-qKPG2O-^rhPd&W=uX3l95!q9(5pEh7m(9%bAUMy!*t}(o$aEc?w z8E;Ct3p@Rnw1+c>j$8usX?O71&5e0p-mKf* zq>%v|q(_&*WbdE#F{)bW;T{#6vQfjvOnj4z@i_?g5DJ^ z`elt+$+y(Yrw2zeVVl;pR6oL38kI*FQ zf8ajpZa{=st>s{2)AaUgiGVwP2sLJOs9ts5UhE+pSQZ^!c;$iPO-9M~r+cHDi}2O5 z>XU=ZpW^<{oGzDGQkc2mjI})p_|+k1HuG^!&wodtL||i0?`}lV+Nuc&uJTMf-x+_t zMe93Ni=Zpl!~P7oHI0fyfG;yQ7nL;PXn5s7(859&S6mFwx+tB8<+ISyskPwZo5`Lb z%s85JOKun?g#OJ#B?o*67mK$e3l?KKzEmvZhGP;VHTj)ots+spm%8OH#@dL_J$GFjzZg!QwFwirMbm=() zlbh?oWLeU3okq#dLkEGnuUUR;YG|m-7OzcLjJ38NIVSt2lrwX_%E}6Hx!6@#-;_}; zETn5yIT?t*dS+nV_XK%PHhJIsyVB%;U1*Y#OS_km4Z$~3NPn7|fYgy$99A89Xt4a& z6kHeJSTZiTw)}URt^PL(8FALv-8s4iOjV#Zo&R(>gK=p{rG8LDek)st*Dxk*9$$3| z5#cj0Kk)mSG^|0n~#Zm)UfnvPW6J#)cAIPeNrM5M~g0ArlaFcBprM2%5^;dO!4M6 zGb$3if|g5t+iiy9ERXg3uG3*WoHX4JjRU~TYfngf)CQi#ML?fF0sb?h-sNh$!)MR& zuG8qo{FAt_Qmu~TJmCO(D4e-W_)mwIt&YdLwPO71*PUP<0%4POEqKL25774NrdGHb zO-WBF$2RR(eqAWn5y~1{wiKug;ZI+{{Ok=9D@*Z0QAY5FqVGx(6qB|FewI65p0h|w z!i>Z5{I5M>8v;?G6aP^9Kw;WTOg3E*b-9z&pmhGG9|e8Ej|xoSA8hPaF}+Nn{%5WH8JuVKkU6dJP_dD znw6i~Z4_HDIWQ`-`#K*_Y?Dwir{4~lca6Mgutp)Es69o`KUMZe<1X){DGp zr+?_6yz4uzag6y)R*g$dDXkO+Ks^qS~sd`wy+J=saL0@=tra{w@R zT=sjXQhs7PNv2LJbRSR&(cuN+GZpQkwo_d(axN#>Q)&yR=F|H8c{m44ciK1f}^XbxIA1KR(!rY ziSqKlLD)(UXc&VW?85z7fsKEK;<3rv(JsCJ9cgd$Z zG4vb`^6QU&B9re*RzPj!Q2LinkxQU9=!FfvAI}Tr;%eh^zlXOLg-m+MjGdp;Uw4kr zov6S$nHvn9sFTcd&&Al!o+!Gc9rI`R{5Q9&oI;2d+h>j3_BiX%i@jP)0(3Y=$uetg$5+Q0hSwKdkx7lZ z@t>fHTlX5JhV-tjeJ;nJ5wA`uhV`m0NT)Clu~hTGK1-C-B^$QeRtRondzCtjI_SuW z_0!+PXwJ?nA~#=pIdQR_yrQY;@91+^0Y}mKa~cfJ>Sbw2Jj(_*{{?kbN!bi(eXO#Z z=YgrGL=ugz1Lf5I^Y1KtP(epV9DqQYRm?D;)%7Ei60WJSm4Wesg}I)`Vv+q5o2aN9 zP@qgNJ#dykRfz1I?+~-F7%s>BIfsBTO^V8xdRXx%4e%gScD_4a30!Px(rF#krt+Z> zF#kkfPo}2yA>{y<c z7>GFiq`!r*o1*}9vIxq_QWXoXqCHwu1LTkG-vmP!97tr8z4p%KW?o;9c!R)7rMCZ- z8c)q$BL-PRQVJ4I`|G%DR2@VCKC;Jc%Vx^v&Mx(?@=J&0Q8ypU?VxRd$5-s!q2nc+ zaX|d7E&ej46QAqXYUa`jsK4RtpZ0CC{NpgcprfIzj{d;IwVtiSWU#2^E%hHsM~wS5 zvw&OUWAk{C^O;9CFRr3>K) zb9I!EY>))&2QL!nXz$-p|51`R7Xdnr1x8tO%aYI?Al+=XenpMwQIXa4{m6Mm_|1Ma z!yOiuE6^oy`vIfeNZR`oE|I+BfXO@f`JdoUOK*OQ%_)jzGBp%ef6SS%BLzWwtzyHs zmMl#J4F32{KB!B9Qx(H#!Bj)9gJswjd;otquf`z@%iwv`JonP>`XZP2_B|HPS+ze| zKmo`{Y9Utz(j^9OHmTk)VgRCqnX-bveO(bb6r~HOYaTt=Bd@e-^!B+399IWw=+e{RCWTw%SFkH~P1nI@gvO7(LFN$$qEtv?`ia`I*)315!JcouR~ z$+c3k(IGgx-JZ*C4ZmEcq2Llu?3|kLej&puH~h5I6ue3>v6JnUb!gHNsdvwq{q?4SK5C$U84y|He(Y~N_A!n0v;ZIunR9Uvb79TNI*Nn=t(NGe&9etAEt$@ zGrU{8Ox8w!9HD-%HPDR4lB1!d=S(rjvfZbBx5KLu#b%aoilRI&&uULMFuY}iER3#{ zvAD&0dr>osh4G$-p8jD++%__vcqb8s3Zf(wk7avjoXyua4F={gV%ZIkw}|?$^#Sn4 zW>&^Kl;kYRERD3x?kUpWy@iU+gF1Gv+L!J}qz9g#jf2ngvx)d414`f(zF^NAjJm~} zgVxQ0WB+%8*m()fll3*A^?=FV!`U!p2j^o{(#6IXy{JHwu28N|gu^rUwSj=M$!QA$ z-OJ0rT92fHjb9{bxrqIo^VpLboG}0~KqCuvZy!7fFL?d%w5FyRK5!*xHdmVi1b*NQ zOy|47y?w$VQ~;ngF=0M;%jVcy_27jA*HA||A(5utm|hp+b>_^#0rFedttu}!z)kC_ zfI(!10Ly;EBL2pIdF%7V0708zX>VKAYw30lb|ASdySyRfRe#G6f)ZFjy9Qt%h>f#T zOJwYWnutiTPFq^pC++poQrMoJBpPl^NZH?%pb=HfP?=5lFabND)d6GAGvyod2`|GXpaz z>=D!Fr-Kn$|EOxyzlwYa26?4Yq7b4PI573n7dK}Y0)r^1{-nokh9&y(_58&u z&JSO0_eA5hhYO1+B6<1G`V-oIch)F?GFo=nZP{@JjXeaJTx!7gXk!2jD4!a;++NL1 z{*@tHp<~_C)UgS2&bJXcr@Q7t~QC?u_PLd~ytP zKRErgT31yyy!$S(=)P4embze93rH&Wrc&!Cc<}B!=e}nYr}+=XVdOB-GYy=%?IVo? zZDk>zxQd|ZPeyjiPJ8$8FF44{g`hFRoDa@eVjk2Xy3|A3X9t(O>5RB$9!rB!DMq*B zBDk@l!jgv~NHeXvK(Bi;YrVM{v}WEf%^9gmcroRB?RCd_>xHw>E5y-s>^*U%k`fd7 zZ5yk&^nm#c?K)L6Oyi*CM&umI(A<*!M6A@i;JboCDBn~H>tTuMn-auQYsk)8c1r(Q zV6zcHUK)r8oL5(6dNj?`OY{t+z(LvkVBD*MqSvVStezGT5+WiDTvOODH8kYKl&%hy z%^qQ-5!fo@mSLT2XbD%{2I?a3UCqD4zM`X(x25BqOQg+p2pr=U2Nn`@bEdLS3xc{o z`vCcPGJ9qo&}u~CzX%bDo8}t%2YG1)i|Tt;n5t%Y0)H%?pezSreS!lqy!U)W`0uN8 zesvF3Xf#Bn;0<`U=0yAhWv}h7?XcRu_j>BR1$TTwVW>6F3KDJ&~>2d zG_N9GX*v0LJ^5Y{8aB2&_q&^h`lrThL9jgi)U3;8M|kBV=(gnno_U~Bt-?39#VZvT z#5I-d8vHyc9Ol_R^h~nxblgM~&5$?gqd~iyD=>ve-#fjQF7opwT6s%9glPKkuvS3qniFU(F`S)d6$B0(4OS*AaA~HyufIoXLkrUa`pX*Fk~TN50M8`c92=c{ z3|QxbeG*A={OAs}PcHxXdMSNQ%P}p#bvC z_ulhy^`E-xBqhqszIUY?zC?ODALKrch&!8q=xK?a(f&H8u!LWJWq9u9gFKZ{nF5)% z=}U-8GfuhwP$;Rs_U9+ujWbR3HS#fLi1Xmdj4S!%EYcWITYV(GUUG^XFXS~kISLo8 zc#>LI7Mk>(_@lDfSG_8F|9;7VUU({xSs)gm$OB9Q_k-B86u131RqbT^rvpS!@Wz<% z-tcf7+O5qF3fX{xud^T}U$oz$SlP;tjx%fn(h&bOgl3~{94G+g%$LV2P=Q%MBnl^< z`>48pvHhD4@JQeQiN<}0d8F^ZtYGbd_Jxq8BN6?sDDm&7Jjlr zp!;VwH&66by||)=YLx!|DnPPU=}ynFkQ_LN_fkmJ+c26=ZSs2|qfCAndn5SN=t`@L zvoMrRVzJ)jl}R~A!@e7q)>PzYwRDpw$OzqwH@|ZqQ2#5c65tx31T#pMfEt4AZhg;7 zzj)08#6@|z-x>b}(l9KJmIN0|wBo_rG=K;4w-0GXmzasuO<#GA;sbr5svey`T~xYDGr!GyBLLUAYVKfBV1vWlde=!ymtEsWV^fGT3_1* znx>GHARtcwUloq3{{yqjWejNKN&7p=)MMwU0nKB;Xi%*;%JEHOl~>uz;_mVM%Wmca zjt-^h-bfPihtHhfDn{ahuRq9vEcoYYgNFfnc%_@j7o8*+(v~g2UFxk%KiF5sWvdIn z{h*!fG9EtVU%BrpT{1Q}&(50;R6GGKrdiq9KCI|Eyw-WQnF_S8>8~n@&pOv=FBtGrC8HVk8DS&y**&O?vbGki;VC2&cO9oitBsW1h zw>y#)0~a7NK(*|bR_R*2+MYdj3sVBx(lT2;qdMG`=OES%{WnHUM`39^T4||J575)g zyN@^g7Gme)NJ1M2`c6>>EKwajPMH8`3~{!a`Yfx@tBzHB-2pAENlW4SX0F!kU7fi$ zuxbhdVH61Vwmv=TRSp?DzRzA(%AcKu0fqe%MIgPFJ)3?Qdt#dL7^}4}CNu9aj+pTv z<%1EQ9r~}a&&U>}DNS;t#JuwsNS##K3vY{-7-GZy%cnDm32h1B|4`Cd_5OQjB!+{j#G~zDj-8=g$@l5_*L$KF&c)g!}7=cYL~i z28$iw3}mqllSv^#JR6X({&rB*d`9shR^<(7iDy*8`h@E?bVS@Un!XRPim1^NCK{? zfPZl-6ioS5^js8czkq{9@D|MS{Gy}W5!If!{HtZ{%gq^y&s z;K?}TzwN;oDZl9LWv4YV|I;8KHGf!{Jojlp!J7rXmBnAPE4G28G(l8Fk1^cL`{49^ zdMi%914F@b%d?rl;;LpFZjj+f5yNpe{Drh~m0lX2)%%PnWn1kWoVzjPOW4WnyLS3- zKN(g)%w~VC0O8$V$KxQUOPf2aUg5XJ6bIh0B zS=te!Y1zK-LROj~ZtT|L9jE{3=dO{X6#MPmA!|j(`H>6TPA53+ol@69^7-H_(q+$A zd$-#^ia(K*840du@;*32@3)z;xbh$yFe5iI38JoL0$mgm&B&k;Mui@%7w81o;3H0Y zK6`Tsq*!e^37fy4SO^6yXprxglKAv;pyP`hnT)X|EA=lO*dVkeE8?Z!?lc4fcm^a` z%`iia&T|#0oMr3A%~#`@{xHXIf4kQ%s(D#CxAR^|@n^whCGrg;=PZ-&uOU(6{&dqO^lvhT>8oa3bRUbPL56 zZcYC=t>32o9;Jz%=k*~AaXozN8N&%a{xAgIM+*&OI!ZNpp;uRbZf0B>(D0Kgc+XeQ z7)Gv2R&>%pb|XJm<(yb$prEb1#B)l9e@LY%6mOn&in@E>yJ&MhvY3T4sfoM42phLD@MDTtVm;3gal+;eHyP+eIN9pnxb6Gg{0qO)qzBGgJ=sM1H1{;d z>tRC~dj=UpYE_nFKTV`0mGADUKKU0S_v43{SK%#S;~(fZ@Eqi^u5<2~e9TtQ+&ki8 zG|4Gqcq3PHfgs>K;(YH6bmHEiwe&QC$sMnHzzhvRKG!27Y}MGXLQm3hK?*3{%q}2jM>%%}FN`4kA7ws-6_<$xe%{Mg&8Yw4g`DJraC?%K54%c=% z4{7ZCM>x*mTR;!gnQqahXuL4wBFHzdqOnS%rvSjmhjZl5q+<6uLJ?^Ik&2I>A8a|> z+1crEpq8b#IW|4io2Tr#QoPML7&;3_!#vqR;}*YnJrl z9iC-Jhzq^H_DvJt5z@MTJ?zdCS@x2P5E6RxtzXJE81J@Dcfbe0i_=TDNa#@SmHI`^rgpaGNAkx3|-9l zOm5Faj`>0HVaSPpj}r?G0|Pei!5Y1naB&s{Iq%v5-~QYg%+ z`4$4}rz~Dw?3x5P;+vs)!9QLG{yP@ti`h6+sHt|6eKiveQ7KBqn6o#xik|aEf};T7{{RxF%yd3L9vt!tDy#Tk88=<^*uWm-Q6<+OPd}zh*rFsw zIPl6dcdZ9lBIOiz5B<^#rJs*|nPFj;zx}}XbP#Bw8m#$3QWAO|+A^p?rl0Om*G}Cs z<>D*g6nMNMRVhJZ-h_I_RRNILIzd&<0%C%nZ;u-KwJ%Es7yuJiii8UH!vti|E0`%_mHp+5Pf6vxQHE69L@oRyvJ=H}KB&&Fm>gf{KF({04715`5nb6^dVPsWOnk>*9RLsUMI5B*xL0rj zaUP*k zcGD$1W*1tkvZ{OT$tM=AR#3$&sZc$9;aSHKH?l}(KvLeJpN0*xKrC%Y9N@Klcnw@XOonRw99+0yts2TFC6OvNC8F z=*Uhld9OAIfQVS$G;E(%#RMD{uPC>&x@?QU`(>YmGfwt8-?RWyTDIof>tB_p-r)=2 zTtVwVv7(ACbDyCBK>|$m`l#Td`^3a$sjlvBaV}I{l2!>prt`+jl)dnp=umj%OwEaq z18*N-D>SfIXC`d>Q+~ylw=SF474o^3W3rT>k87Km7#aDMA!`#Y^XxCYfPRm1o9x+1 z$Ti)8j5_sG-g)-Jq>xYe`1fAMzv0EMVel_g(bA{x{>V5YNkWGWe0@SY+#A8WOd$m0 zZu3UzMSJL`F`p*{QELxi-~bcP*exhU(dPlS8;c-(f0O0ps^G;xGc-UWv=oId{w-&P zvd!*gGCG~0usC=DS!8j()mj_tMO36@16Ad=op!L=84-r;d{n=|(6mK#M95TN&mmNg zV41V*7#kO~Nztjcfo++E#`B1tVgd>X|5Qqli@~R;IJp`?n;Nk{?_dNlD<>r;15D}u zPy-r!+!u91+nB1v`rlvox&gCcgzA1#uajR?%`nHsaGTb8m3Ia<8gxP5POqf|$`sJA zZ5Gxj*7cp-;MJ!%2~}H&=DW9s@Sq`o*&u=5p*Q^{>?tj|yWcg1KNVw_1V)aM3voCw!QfGpfbua#Zv#K;WVv&v7w}CJPgcf*l$?{*1jp_j zOFmy#_`WWEb>nTK)5>UEm@vDz=1M#YqlXpz1xwn}D|ghq+bC5+5<1}nAZBN2ka_SV z?agt^siw!D`jO_oxg%P7cd{&$`v|u>ZPxwLu4~~Q)4obzOo|6$T_}2vnz9Oez|f!l z>59%yf12(0_k=F&y0e86S?djVJY8qM0i9Kp z>qqWvwGp@((O?nmYQRR89&&t3>8KZGGDd%1&uECrF}Qnj>MYor2PoW=Nr=(hVBNo$ zWwy^#C1quhU$UJ(hdf^+ZXYLPVd4M)pGXTEND4C=3#)`1Nw8}46dGY1q{8~;iSz8E zTM%O|{NXF^X2(vz*Z>lztrup(FbK)%*If0xSodV1RaL3ExgNvMH2S@Jq@3`; zsDP=jxoCo13ioTlC6uw_x5g98M>|jx#6S-OI}WZgbw=nz$y{cgu-MqxJkCl!@PI>; zfzAsC(zu_~m-0q?{zn+vC`W+1N8R665Rlv#ti%$c8w(Pj7Um7f>6)_sI4dq1dwLo| zB02-e)pC0=-TAx6(<;)n!}7~k!JGJt??C9vBybEX8383LQ> zYO@OS4TcrzFnwMFf=?lTv=Ijs<8PEeAuuoecDf8MB}{k?QsJ!f?P4 zg-zX79S(#=KF#UbrwnuT3FlW9K&NQ27OSOQ`7RjXU_4nSI*eMc|9blH6g(4=Th1dT zwqO7zU^#tiX48)Rm(5?d_3!+=pb%U_9JSK4UI<15C+efgxNa4Yg(1dW!7B+kIl{(wR zECc3lV!nD0u%?QP!r?>@48ipD13`gyM7-*=Q&+_6u8*eRN)3IWoy=6_3nhI@bpTc| zPMb|xm@j~8CKXIV2uT43x)~Y_#p^<)K%7FU+v1zpLaqGVJ zV_koagg*y(##cC~y2IviHok=s(hy_l!Uu*R_X4IoKK@RaCiBOru5&WhbMeqE;$Geo{mltxO_PQxY^cXHvM zPcanV<5$-Qr*ZRusQ^;}53%JqrIigRldW)n@e-Eh>jsBifMC%03Uf4F! zH;(k#>Y~nX6?8La5_CZ1-eZ&)QV-V>Pps zoR$=I(lVUH(m2;n{wg4=&C~@83|{4Bg3j>V?Fn^qm^{@no1dbfqGUg&ZXME$`JNO4 zzf4ev;G`N^Iy@Owa#Pcwpcqa^{F2L=?^{Od7bRfl>3GpY1uq%7>Fs1sa&Hla*N{@x zqfDM;066+!(e9qTd}2Y)M>aX^n9aA4{KKS zEQnKoNK3PNhtkLsVG|XP%(0Aa{}xRc)B?h$yZc+PBtRAPsjU^7n5@xZ7psm9IJ5#@ zyVgmu!yqE+wX65lHA7bQNo60*#fuPpN=-?_z`n76!5N>thv@RT1M-m7_WxRdBE&0@ zoK{tX>FbvxTlzCGvDTZva?ls)lNm5ibFR?wp39tQzTyl1E3lew4PNm`5#8z!gjEl) z_#rjl;&Q&+VHe@~N%*}#kf#>>O2)OQ|Kf`mRRWgSL$Hi~Djq6}CrcCo6BFd3!cWKl zafaw_)TNezq}>RoV)Fwcztc6LXlqwx$#nwrr`yknY(Z}D{wc4v&8h>i7lV;r7X&;r ze|;eYzCaHG^EpWQdmyRa-5DCv@chvE<5SuT>mv)=)Trt_yQ$}a-OaHLKY-B-&u(+YFC9QI~W6-YJ6MlgUSm6&(@!f9CnC@gTCt8%gU-=_o5 zXqLYWhS+(54tu}{@=#^Os2Hq#hLS%mO;{BPgw0@2@w7yq6SBwbQCvhsw!EU=F&~_) zMG8g3yz%Z}7gaTEe`I{2*=Ra>REVY#`ABzdy#K)n&Yvct zyv_sCjhahtrt_cY)wkdg2~N>Py#V2~7N{%>VEIjm5fk+#UM(Qu z#^Xy0u7=(LmGacjqeyySY~R)KSA!6$6HIeaF_F8*lGB88F<+s^(>-R{7c)-%ovZoW zDZHEyj_u5PG*ui!i}9L%)sWn3YRto+p6JiZ%$Nl>`rN^R<3Wr;+!c8NA$M( z4Q)WvR)6T>T;1)>nGIyp>cZQ^3=hP{&)H^=GD4njEL56}rmNEyFO;%jF)cEqN7c5O zZ3)3zmL@yEZUEBN5LLaMnNQX9n|MJ*Fd;%05aIy#bnQ>$Qaq)M@s-&C0nuRstFu^N zSJ_Z)JQ~@w6ZW{YLqY*RHv1P_T;wqD3QqR$fH##LTFLQwsRVdJfakI8 zOz9YSOn{Xk6E__^zplf#gw)Tvmbl>OO<3_2(turQab2reMDOsvL8fpBIJbM$no1*l~m)1fsTtZajr^Ta;g2#mKa#t>DJ%k142lOe`1Mtx87 zFyyjJ9_7~!?tJ%o8Z?=moO+r8-WbiGYSdH8RbUD8weh;zMC#a`1+xi|wozJ+n-|d% zMbULPlYc*N4*!>4|1!~a4eoo~vtM-L5;*>W*SKqe=HDJxa&~5gxQ0fY#RaMRwO751 z;eVNG!8_`u)i2+7^h8sKBBF7<3hEntqx}lp`!P1QKUMZV^UA&(F?T%Qp{pwaI1AGH z@+~4w5up#lNd>)&hv~DNO^cntDuPDw99Y;xE%;|a^~-?LM=DqNoPA8!*O)Q?aSAMP z!?1TZ*|7>gVc8xmwQb&B_^i*-zrV!z(f<32c^fQ8wzxR7xjHeO;Jig(T(j|sz>#~W zSqo+x=B6;Gt{#&aI}!FQVQ8x|#*n*VG`?>1(Yz6Cst*H z5B551i<++lI)P#fJW61l>-%v>0wbj54`l|v=0B-klpBpwjGuZn;nQ0pcQ96gu?WD< zml|Octhy9j+yp6Vi!e=X>Ck>9zz%ABSZA5mlzueCj{@nc#rHn__HoJD2TErX6bN8F ziI1{q_aqvtq9!FY}t<1>0a)?zotHv@~4goPSa*>;PB?M&|DoS*!X|3Q6p* z*<+}tuUEVIr%H**Kybmzndp1)0_l>%LWv_Ya5a#v;Xgk?rVMD+oZW@37h7F{W-$`* zkvyZz;I5|UxbnF<=h=Kk0E?RI`dZSwF@J=Bwe006R(G1zs31)4P$laUSRjm||7lg! zDL*zQC@SEF<^v885TcQWqQq;kKrqO2Dsve2e=PxZ$Ggn`>#;MLG^oWzPhWO{fpkX! zNsx`Wz(DGNR{q!Z`2_q&clEC@z<1kO*7hbKB%c7>HFN*h8B!PtP&`8!8dx)WmYRY2 zC@R57(CzCoc?q<3GHl`}PZ~hB!wp8B$8H6Kdm9`BlSVCZDcTSPGvuc(i>d!Z)mKJUwRUZ91nCl_ zL_$SUK)M^HBqgLpI+gAa1QdgAflW%QNQ)rd-5}j1wWZ^moM*g0zH$DZan4@rp7)$r z&4t!c`BUe*V4(2*hXlD*1hQJzRA(&`pFO47i3yS34{uW)rfip8Y{n;SS4-hqSN(ps zwjh%OW<8iPpj0YxJMKR741{D{YkoBBMtS^|lnqGAkZSl^_}~k~oJW^K$ig7t2TQ@{ zu%YjD<12EhKIoL`{&?T}bp|hnJZo49XBGPq=j7xCA6Jh{y;KG~e1rdYBrkO-WzUqc z_1Hd`so890s&IDp(Y_&3**zy2)!#y`o+@PVXG_XcvTy1dDfPKSlCrxKf>bl zf2id`Rm<}cL=wC1m2dYHjF9p_Y+i(D`b`KhK}-)KXDGhHbt%v3cr)ii5U36Y-C?a_ zqTP-_*hv6*7z5vXo3Nos*rk#9>}@0dWY}pa9}KlOZUpyN6F^{wpoH9vz)=s`_2d9} z&0}dFZv=d&tgWG~sDkw;OxmHWW&YdQiB-V$o9oK5$gv5abI)zq4=IgqX^xkII{gF>}go-zyVDsC|Le|&eG!`Nyw-&q>evT`v0@C^CS1s zCMq54qnW;}9lL5dKMMM9gRC$czK+1nRi)H>nFAmJn+W#L;jqS4rlZ!#pRmiU2g*MN zMqz|c4~x%`HiE^qeDK!E@3}HCJ>*86@xTW@z`FB%DSSEpoAwWL{*6HTqO0VLylv=D z@k#2=tF(tr4`g93TvK|>mHLSigf4CnxMtT13h}^a3chW}L691jY*Z9apBqIj&oaHi zi!YM}cOheYZL-~tZ|w_-%Msyi!TjJpwYXR;G2TrstXc&73vNAK0~@BFuxuq`Q}6y1 zCDdJ6;UqR04zmEqSHg}|Kwx%bIQ z0T5TsxR`n>_GgCFeg>a@Tr6^gv)J|4OGoJSWn@ah<}=(@6C^LsC@gdc>bCwW&u!hL zNT<(-B7@}4Xt3Oa)jTtWvh`<`Sl?=gIwh4D&UEBXXK z1BetTK9&E?(Mh{D4cH5V9ZU0SES;PDW7kjMlP1va;A8iUR99EGn2diQ~d>da; zrG;da@bP zD=fVCKor`>K_=Q_#q^JR?as_|_0ONze(vY1b1p$*hwZ&mUbB3`9RcPJLoM{$QWy^P z?+Wv4?nW-Ha&Oar5CUuH3X`+Zza@r?@}H0|zkh9T4OX`y<`)FIWiMwI`MrPArI}I~ z@9g9t$#HD=li{;%YK2{@FJG~2H^djO zwcoXV4#SZ8P91g+Y>9t;4RRN(SO!Z}|9%fQnPZ=jU*l}Rd(d-?edv!KLc-F5sfzLK znbaYG9h(~!Q#WPr|Ne$P!?o&skA^er5n_cNayqjZS26MVsHgoar9>;KNf$M3u%mk9 zRr*$+2Ld+mffx&h!Fx>>^N(9~{g*?VH98}Uy)o;0kxu{|jhp^XmZCChu2YcOgR-a#_Dp9}0#J-l%U>p!p` zgL!!<2N5p_r2t{4{`VP=2M5-n7N(z(-_O$6ir8k95ap0vK=`e#|E{-n;z*~+T?lKo&ZWq}T~ zyEJIlIQaTDR0Bz{dVdJ9+1z;Uv#@us7{BDRHV-uVR$)Ty5d3=Qpp0BsV%Y=$k^fVx zb(s}952k(4a(?1?39{LG=qd2NMdaAKaqB}qs^v0)p9ES9h-Kvvb%ueneb5OLpmKma z@U7^Ti+>|MquA3hUJ!dPX2=WGRtVFF?_Gh8}L!yj7nm=d!SgrF-Dqz{JY%OZe zX>HjCIZIOuxS@PeU!g}^}-CcH0t)MpdKGW}A zs}7&2s5{?!3EwFAduBT7>s88b>=5R6T)bpeP(*OC(^#)zEiLy>Iuf<<}qWKgWssL6ds zg$reO7qx7o&AKiPBJEWcl23)jKBrAYW) zyqo@f&c3I>pB;_vh_biWYD;@+S3h9AE$R|W$O;+=@JcT*+w364mx=zvrb=dCcj&Cy zLAHeI>(iZ7^E{c;?~6qv?uM8AwPufqh{(H2^!olPyWTFrXJ8pU}8>d>kQZq<<8ZeIY~2r@HpBT zf^W+F{EM6HdBb7SX;$Xff0`OufM`BBCIl>!>j$qHqnaC$>TXLq;{0B zR6qLHhl43wPY07H_deGsaCr(Mkf-$U3H(In2?p2xHKBv>dn?c9% zq#UU=b6HQ`cPTYX@y>mRu7THgi1%xs;N7@~WD%U{F73%|_Ebm@qFsb@A^X;#o_6D{ z7e*>X&FD>!r>_?TOyE=o-*7(s7NUoYvtQw>NOB76Zy(v8N?cXcqq#Y==8r%sadu&z zZ`Emri^LaPi1~VT?#u-lc`nhVIMZ4!?E2K6{^gNrbbt9r5IIp*Bl>)~YuniWd?uR7 zKQXO${j3Yt6vbVv>|1$Ed#OnGts35ZzdY`>-TpN?)4rBvljeQ+>DO+H|7{u~quLs* zU`_8AoUhM&XnMmhw#)6`i}-CWC?U6I>-knyJ?1*i%{_Y(_v`Mcb;cz!GD&QW4K_B? zo+m>6tD=m8gU|n{8|keJ*iTffYJK?Fn%SDa7yoPc`}c713lFOmlDl?rGbZlX-pC#k zeu%H^p)&1(pPTGw5u}+v<~V)tK_)rv8;3kSdRrTIw*%Ylw27BqZ6Atq?e7;Cx4K_L zL=c+=A?Sr2wG0#GUUd|+y`K5%c-cD?@KuN5Wd)~ahXcz<+k|MYk=9wk%Rl+ih3Vvl zhutr9Zp*ozj11WLNFW_ngLH+}!oUSa-y*pY$`f3vbBMNy=b-$x;aj zRgg~THpTy3w5u={qlkL^&srz)ipVP)+ zT|yGqm5ZwWF@LRTVaJ~!k@(D@tl4rV;lm8I=`u?O#oy@pUMBqV<1CH+Lc{4^A1=h) z>||_hKm0t+)-gJkTe;+OFYcdfw7nkqR?J&F*UjkL^Ok5P%SRbw(4V>zb`4jU&h|R{ z^YVIyQ>narxJ<=gIsasiY+_;%{X28XJ}eIDd?|@f5V8ptKG-}VF%&@glZ9m|MAxo< zj$K<&%F3!lN~CYt=JE6VXm4(=U6nF5^=Mu6$RG9nH|$?*WPd06es#4GCD#jix#Jqo zK|&fE|3mm>)W>NBtz*2I^}+|eQbCwU$3kwthX3ntYHQTN6P&r@V=XV6OeN7#LRbAQ z#IohPNUm3SzI}@KF`_&2{X~aoplRHsCn~uov4ra|AMe3U0z{q^{N13tHXSS+HN7A7 zT?f41WUoxNz$Jhi^o%+w>wqjklYv0l{BQlcWX_{cdx7|<9+ z?g;(t!=kBJzIhU}D~7F-wqNQwrh2u#ZPz`lRk43~ zh-Z?|XW!CRAu=c6qKF-xN8^qd!ijP>axj)&Zt_jI)a%u{-h}C6-c4Iqz44shPu2#N z(YPw8Fz!p1R4Ezi6;D8dd$0O&|G~+|rFM6VwlQ5k?yr57y1MgG|BHRSmCL`?Ym z2FvQLQIo-I`*rz1Go?p(1H<_tLh>$o<1~wt`Wt{TD@BxPSYC z6CWKF+hkZpBlWx|E~s;Hmo7ro6V`e@EA@P2se*Z9dTVem+I=iDT*RzpZF@Hv95hhu4lQtqK{cMq<&mhn(MC6&Z7~u{o3QLU%qWLLAu(xaWG-F#&Z+iZ)&XT`KA1O&15+hvgx^3=? zZ5aQZ8KKvAZl@+Ald$f%QYyRBYURCAB%nEtoS1m7m1|r#YHK5ya=3QH`L*ui<#)mI zjs09&)g)ANcXH@8^p`8k+}}ofBbnX*bi@qJnnLo*7|C52Ne3lETkjtV+`Z=NU_?mM>-pq

dBgGqQDci9iUeII^B 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 literal 27217 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 F{{WiZ#M1x( diff --git a/docs/inheritance.md b/docs/inheritance.md index 079d1940..d57bed71 100644 --- a/docs/inheritance.md +++ b/docs/inheritance.md @@ -2,6 +2,7 @@ Inheritance is an ability of an element to transfer a pack of properties to its `children` elements 'wrapped inside'. + Properties have to be set in a specific order: ### Main properties' inheritance: * styles @@ -16,8 +17,9 @@ As for `prototypes`, this property has to be set after styles, but before parent * parents * parent's styles * defaults ------------------------- -Let's take a closer look using a [Muon Monitor Visualization](demo/muon-monitor/README.md). + + +Let's take a closer look using a [Muon Monitor Visualization](../demo/muon-monitor/README.md). Running the demo, we will see this: ![](../docs/images/inheritance-1.png) @@ -31,15 +33,15 @@ On the right, there is a list with changeable properties. ![](../docs/images/inheritance-properties.png) Properties, which can or cannot be inherited, are these: -* `visible` - toggles the visibility of an element. To be exact, the invisibility of an element is inheritable. +* `visible` – toggles the visibility of an element. To be exact, the invisibility of an element is inheritable. If a `parent` element is invisible, other elements are invisible as well, and they cannot be changed to visible mode. ![](../docs/images/inheritance-2-1-1.png) ![](../docs/images/inheritance-2-1-2.png) -* `material` - a group of properties, which can be inherited and which can be changed in `children` elements. - * `color` - color of an element. - * `opacity` - a number from 0 to 1 which represents percents of opacity (0 for 0%, 1 for 100%). - * `wireframe` - toggles the wireframe mode. +* `material` – a group of properties, which can be inherited and which can be changed in `children` elements. + * `color` – color of an element. + * `opacity` – a number from 0 to 1 which represents percents of opacity (0 for 0%, 1 for 100%). + * `wireframe` – toggles the wireframe mode. Let's see how elements of the `material` group inherit changing `color` property; ***other properties of this group inherit in the same way.*** @@ -51,7 +53,7 @@ Properties, which can or cannot be inherited, are these: ![](../docs/images/inheritance-2-2-2.png) It changes only, 'bottom' and 'middle' stays the same. - 'top' is a `parent` element as well: it has `children` - 'SC72', 'SC73', ... ,'SC80'. + 'top' is a `parent` element as well: it has `children` – 'SC72', 'SC73', ... ,'SC80'. Let's change the color of 'SC76': ![](../docs/images/inheritance-2-2-3.png) Again, only 'SC76' has changed among other 'siblings'. @@ -64,5 +66,5 @@ Properties, which can or cannot be inherited, are these: If after all those changes we set at the 'World' element grey color, changes won't disappear: ![](../docs/images/inheritance-2-2-5.png) -* `rotation` - rotation of an element. Here, it is set by `x` value. It is inheritable and unable to be changed in `children` elements. -* `position` - position of an element, cannot be inherited. +* `rotation` – rotation of an element. Here, it is set by `x` value. It is inheritable and unable to be changed in `children` elements. +* `position` – position of an element, cannot be inherited. diff --git a/docs/uml/Vision.puml b/docs/uml/Vision.puml index 2b4d9953..04e873b9 100644 --- a/docs/uml/Vision.puml +++ b/docs/uml/Vision.puml @@ -84,6 +84,7 @@ interface SolidReference{ fun getPropertyValue(name,inherit,includeStyles,includeDefaults): Value? } VisionGroup <---- SolidReference +SolidReferenceGroup -- SolidReference class SolidReferenceGroup{ val refName: Name @@ -93,6 +94,7 @@ class SolidReferenceGroup{ fun getPropertyValue(name,inherit,includeStyles,includeDefaults): Value? } VisionBase <-- SolidReferenceGroup +VisionGroup <-- SolidReferenceGroup interface MutableVisionGroup{ fun onStructureChanged(owner, block) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt index 74f173ae..dce9bbd5 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt @@ -23,7 +23,7 @@ internal data class MetaListener( /** * A full base implementation for a [Vision] - * @param parent the parent object for this vision. Could ve set later. Not serialized. + * @param parent the parent object for this vision. Could've set later. Not serialized. */ @Serializable @SerialName("vision") From 0b4fea5ff117f9e04d6a15b37845815c1a8828b7 Mon Sep 17 00:00:00 2001 From: Kira Dmitrieva <71787194+kiruma524@users.noreply.github.com> Date: Sat, 21 Aug 2021 21:15:33 +0300 Subject: [PATCH 063/109] Changes in documentation --- ...patial-showcase-FX.png => solid-showcase-FX.png} | Bin .../{spatial-showcase.png => solid-showcase.png} | Bin 2 files changed, 0 insertions(+), 0 deletions(-) rename docs/images/{spatial-showcase-FX.png => solid-showcase-FX.png} (100%) rename docs/images/{spatial-showcase.png => solid-showcase.png} (100%) diff --git a/docs/images/spatial-showcase-FX.png b/docs/images/solid-showcase-FX.png similarity index 100% rename from docs/images/spatial-showcase-FX.png rename to docs/images/solid-showcase-FX.png diff --git a/docs/images/spatial-showcase.png b/docs/images/solid-showcase.png similarity index 100% rename from docs/images/spatial-showcase.png rename to docs/images/solid-showcase.png From 5f07bf1920a761af865d38672963d3d7a72fe139 Mon Sep 17 00:00:00 2001 From: Kira Dmitrieva <71787194+kiruma524@users.noreply.github.com> Date: Sun, 22 Aug 2021 13:25:57 +0300 Subject: [PATCH 064/109] pre-change of README.md --- README.md | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index b89b0ea9..032b7ee4 100644 --- a/README.md +++ b/README.md @@ -15,8 +15,13 @@ * [About DataForge](#about-dataforge) * [Modules contained in this repository](#modules-contained-in-this-repository) * [visionforge-core](#visionforge-core) - * [visionforge-solid](#visionforge-solid) + * [visionforge-fx](#visionforge-fx) * [visionforge-gdml](#visionforge-gdml) + * [visionforge-markdown](#visionforge-markdown) + * [visionforge-plotly](#visionforge-plotly) + * [visionforge-server](#visionforge-server) + * [visionforge-solid](#visionforge-solid) + * [visionforge-threejs](#visionforge-threejs) * [Visualization for External Systems](#visualization-for-external-systems) * [Demonstrations](#demonstrations) * [Simple Example - Solid Showcase](#simple-example---solid-showcase) @@ -75,6 +80,17 @@ The `visionforge-core` module also includes configuration editors for JS (in `js ![](docs/images/class-diag-core.png) +### visionforge-fx + +### visionforge-gdml + +GDML bindings for 3D visualization (to be moved to gdml project). + +### visionforge-markdown + +### visionforge-plotly + +### visionforge-server ### visionforge-solid @@ -96,13 +112,9 @@ The `prototypes` property tree is defined in `SolidGroup` class via `PrototypeHo ##### Styles `VisionGroup` has a `styleSheet` property that can optionally define styles at the Group's -level. Styles are applied to child (descendant) objects using `Vision.styles: List` property. - - -### visionforge-gdml - -GDML bindings for 3D visualization (to be moved to gdml project). +level. Styles are applied to child (descendant) objects using `Vision.styles: List` property. +### visionforge-threejs ## Visualization for External Systems From 51b8ae279a82281d8f3cc61a837474623fa8f752 Mon Sep 17 00:00:00 2001 From: Kira Dmitrieva <71787194+kiruma524@users.noreply.github.com> Date: Sun, 22 Aug 2021 14:56:31 +0300 Subject: [PATCH 065/109] pre-change of README.md --- docs/inheritance.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/inheritance.md b/docs/inheritance.md index d57bed71..88dc85b8 100644 --- a/docs/inheritance.md +++ b/docs/inheritance.md @@ -2,18 +2,20 @@ Inheritance is an ability of an element to transfer a pack of properties to its `children` elements 'wrapped inside'. - +`VisionBase` Properties have to be set in a specific order: ### Main properties' inheritance: -* styles +* styles - `StyleSheet` * parents * parent's styles * defaults + +`SolidReference` As for `prototypes`, this property has to be set after styles, but before parents. So the order will be this: ### Reference properties' inheritance: * styles -* prototypes +* prototypes - `PrototypeHolder` in `SolidGroup` * parents * parent's styles * defaults From 59bc5415403f1e0e1b4b3c5d04abbc720f6de28a Mon Sep 17 00:00:00 2001 From: Kira Dmitrieva <71787194+kiruma524@users.noreply.github.com> Date: Sun, 22 Aug 2021 18:10:05 +0300 Subject: [PATCH 066/109] pilot version of inheritance.md --- docs/inheritance.md | 21 +++++++------------ .../space/kscience/visionforge/Vision.kt | 4 ++-- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/docs/inheritance.md b/docs/inheritance.md index 88dc85b8..d99451f3 100644 --- a/docs/inheritance.md +++ b/docs/inheritance.md @@ -2,21 +2,16 @@ Inheritance is an ability of an element to transfer a pack of properties to its `children` elements 'wrapped inside'. -`VisionBase` -Properties have to be set in a specific order: -### Main properties' inheritance: -* styles - `StyleSheet` -* parents -* parent's styles -* defaults +Properties, which can be inherited by objects, are `styles`, `prototypes` (if the object is a reference), `inherit` (it stands for the presence of `parent` objects), and `defaults`. +All values of `styles` property are contained in class `StyleSheet`, where they all are defined at `Group`s level. The `prototypes` property tree is defined in `SolidGroup` class via `PrototypeHolder` interface, and +`SolidReference` class helps to reuse a template object. -`SolidReference` -As for `prototypes`, this property has to be set after styles, but before parents. So the order will be this: -### Reference properties' inheritance: -* styles -* prototypes - `PrototypeHolder` in `SolidGroup` -* parents +The order of inheritance of properties is set in function `getPropertyValue` in `VisionBase` class. +The order is this: +* own styles +* prototypes +* parent * parent's styles * defaults diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt index 924dfdd1..1c8e3a28 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt @@ -36,7 +36,7 @@ public interface Vision : Described, Configurable { public val manager: VisionManager? get() = parent?.manager /** - * This Vision own properties (ignoring inheritance, styles and defaults + * This Vision own properties (ignoring inheritance, styles and defaults) */ override val meta: ObservableMutableMeta @@ -92,7 +92,7 @@ public val Vision.propertyChanges: Flow } /** - * Subscribe on property updates. The subscription is bound to the given [scope] and canceled when the scope is canceled + * Subscribe on property updates. The subscription is bound to the given scope and canceled when the scope is canceled */ public fun Vision.onPropertyChange(callback: Meta.(Name) -> Unit) { meta.onChange(null, callback) From 64e084dc533e49be886385b06edd8366ce341565 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 22 Aug 2021 22:39:47 +0300 Subject: [PATCH 067/109] WIP root unref --- .../kotlin/ru/mipt/npm/root/TGeoManager.kt | 22 +- .../root/{TGeoHMatrix.kt => TGeoMatrix.kt} | 6 +- .../kotlin/ru/mipt/npm/root/TGeoMedium.kt | 6 +- .../kotlin/ru/mipt/npm/root/TGeoNode.kt | 5 + .../kotlin/ru/mipt/npm/root/TGeoShape.kt | 21 ++ .../kotlin/ru/mipt/npm/root/TGeoVolume.kt | 12 +- .../kotlin/ru/mipt/npm/root/TObject.kt | 16 +- .../kotlin/ru/mipt/npm/root/rootJson.kt | 280 +++++++++++++----- .../kotlin/ru/mipt/npm/root/loadBM@N.kt | 26 +- 9 files changed, 286 insertions(+), 108 deletions(-) rename cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/{TGeoHMatrix.kt => TGeoMatrix.kt} (90%) diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt index 3b3eecf5..96b02768 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt @@ -1,29 +1,19 @@ package ru.mipt.npm.root +import kotlinx.serialization.Contextual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import kotlinx.serialization.json.JsonElement -import kotlinx.serialization.json.decodeFromJsonElement @Serializable @SerialName("TGeoManager") public class TGeoManager : TNamed() { + @Contextual public val fMatrices: TObjArray = TObjArray.empty + + @Contextual public val fShapes: TObjArray = TObjArray.empty + + @Contextual public val fVolumes: TObjArray = TObjArray.empty - - - public companion object { - - - /** - * Load Json encoded TGeoManager - */ - public fun decodeFromJson(jsonElement: JsonElement): TGeoManager = - rootJson().decodeFromJsonElement(jsonElement) - - public fun decodeFromString(string: String): TGeoManager = - rootJson().decodeFromString(serializer(), string) - } } diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoHMatrix.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMatrix.kt similarity index 90% rename from cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoHMatrix.kt rename to cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMatrix.kt index 3e1362f8..0c6ec7ab 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoHMatrix.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMatrix.kt @@ -1,5 +1,6 @@ package ru.mipt.npm.root +import kotlinx.serialization.Contextual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -30,11 +31,12 @@ public class TGeoTranslation( @SerialName("TGeoRotation") public class TGeoRotation( public val fRotationMatrix: DoubleArray -): TGeoMatrix() +) : TGeoMatrix() @Serializable @SerialName("TGeoCombiTrans") public class TGeoCombiTrans( public val fTranslation: DoubleArray, + @Contextual public val fRotation: TGeoRotation? = null, -): TGeoMatrix() \ No newline at end of file +) : TGeoMatrix() \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMedium.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMedium.kt index 3e598753..72b72c4c 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMedium.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMedium.kt @@ -1,12 +1,14 @@ package ru.mipt.npm.root +import kotlinx.serialization.Contextual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable @SerialName("TGeoMedium") public class TGeoMedium( - public val fId : Int, + public val fId: Int, + @Contextual public val fMaterial: TGeoMaterial, public val fParams: DoubleArray -): TNamed() \ No newline at end of file +) : TNamed() \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt index 5805f3ea..f507aeb2 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt @@ -1,5 +1,6 @@ package ru.mipt.npm.root +import kotlinx.serialization.Contextual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -7,7 +8,10 @@ import kotlinx.serialization.Serializable @SerialName("TGeoNode") public open class TGeoNode : TNamed() { //val fGeoAtt: UInt + @Contextual public val fVolume: TGeoVolume? = null + + @Contextual public val fMother: TGeoVolume? = null public val fNumber: Int = 0 public val fNovlp: Int = 0 @@ -17,5 +21,6 @@ public open class TGeoNode : TNamed() { @Serializable @SerialName("TGeoNodeMatrix") public class TGeoNodeMatrix : TGeoNode() { + @Contextual public val fMatrix: TGeoMatrix? = null } \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt index f26261da..c986f899 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt @@ -1,5 +1,6 @@ package ru.mipt.npm.root +import kotlinx.serialization.Contextual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -22,36 +23,55 @@ public open class TGeoBBox : TGeoShape() { @Serializable @SerialName("TGeoBoolNode") public sealed class TGeoBoolNode : TObject() { + @Contextual public abstract val fLeft: TGeoShape + + @Contextual public abstract val fLeftMat: TGeoMatrix + + @Contextual public abstract val fRight: TGeoShape + + @Contextual public abstract val fRightMat: TGeoMatrix } @Serializable @SerialName("TGeoUnion") public class TGeoUnion( + @Contextual override val fLeft: TGeoShape, + @Contextual override val fLeftMat: TGeoMatrix, + @Contextual override val fRight: TGeoShape, + @Contextual override val fRightMat: TGeoMatrix ) : TGeoBoolNode() @Serializable @SerialName("TGeoSubtraction") public class TGeoSubtraction( + @Contextual override val fLeft: TGeoShape, + @Contextual override val fLeftMat: TGeoMatrix, + @Contextual override val fRight: TGeoShape, + @Contextual override val fRightMat: TGeoMatrix ) : TGeoBoolNode() @Serializable @SerialName("TGeoIntersection") public class TGeoIntersection( + @Contextual override val fLeft: TGeoShape, + @Contextual override val fLeftMat: TGeoMatrix, + @Contextual override val fRight: TGeoShape, + @Contextual override val fRightMat: TGeoMatrix ) : TGeoBoolNode() @@ -103,6 +123,7 @@ public class TGeoTubeSeg( @Serializable @SerialName("TGeoShapeAssembly") public class TGeoShapeAssembly( + @Contextual public val fVolume: TGeoVolumeAssembly, public val fBBoxOK: Boolean = true ) : TGeoBBox() \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt index dc986729..afa7c7d9 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt @@ -1,20 +1,30 @@ package ru.mipt.npm.root +import kotlinx.serialization.Contextual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable @SerialName("TGeoVolume") -public open class TGeoVolume : TNamed(){ +public open class TGeoVolume : TNamed() { // "fGeoAtt" : 3084, // "fLineColor" : 3, // "fLineStyle" : 1, // "fLineWidth" : 1, // "fFillColor" : 19, // "fFillStyle" : 1001, + @Contextual public lateinit var fNodes: TObjArray + internal set + + @Contextual public lateinit var fShape: TGeoShape + internal set + + @Contextual public lateinit var fMedium: TGeoMedium + internal set + public val fNumber: Int = 1 public val fNtotal: Int = 1 public val fRefCount: Int = 1 diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt index bf528e6f..f70cc589 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt @@ -10,15 +10,23 @@ public abstract class TObject { } @Serializable -public abstract class TNamed : TObject() { +public open class TNamed : TObject() { public val fName: String = "" public val fTitle: String = "" } @Serializable @SerialName("TObjArray") -public class TObjArray(public val arr: List){ +public class TObjArray(public val arr: List): TObject() { public companion object{ - public val empty = TObjArray(emptyList()) + public val empty: TObjArray = TObjArray(emptyList()) } -} \ No newline at end of file +} + +@Serializable +@SerialName("TList") +public class TList(public val arr: List): TObject() + +@Serializable +@SerialName("THashList") +public class THashList(public val arr: List): TObject() \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootJson.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootJson.kt index f0b25d18..33b8b6c2 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootJson.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootJson.kt @@ -1,107 +1,223 @@ package ru.mipt.npm.root +import kotlinx.serialization.DeserializationStrategy +import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.KSerializer -import kotlinx.serialization.descriptors.SerialDescriptor import kotlinx.serialization.encoding.Decoder -import kotlinx.serialization.encoding.Encoder import kotlinx.serialization.json.* -import kotlinx.serialization.modules.PolymorphicModuleBuilder -import kotlinx.serialization.modules.SerializersModule -import kotlinx.serialization.modules.polymorphic -import kotlinx.serialization.modules.subclass +import kotlinx.serialization.modules.* +import kotlin.reflect.KClass -private typealias RefCache = MutableList +/** + * Load Json encoded TObject + */ +public fun TObject.Companion.decodeFromJson(serializer: KSerializer, jsonElement: JsonElement): TObject = + RootDecoder.decode(serializer, jsonElement) -private class RootJsonSerializer( - private val refCache: RefCache, - private val tSerializer: KSerializer -) : KSerializer { +public fun TObject.Companion.decodeFromString(serializer: KSerializer, string: String): TObject { + val json = RootDecoder.json.parseToJsonElement(string) + return RootDecoder.decode(serializer, json) +} - override val descriptor: SerialDescriptor get() = tSerializer.descriptor +private object RootDecoder { - override fun deserialize(decoder: Decoder): T { - val input = decoder as JsonDecoder - val element = input.decodeJsonElement() - val refId = (element as? JsonObject)?.get("\$ref")?.jsonPrimitive?.int - return if (refId != null) { - //Do unref - val refValue = refCache[refId] - refValue as T //TODO research means to make it safe - } else { - val res = input.json.decodeFromJsonElement(tSerializer, element) - //val uid = res.fUniqueID - refCache.add(res) - res + private class RootUnrefSerializer( + private val tSerializer: KSerializer, + private val refCache: MutableList,// = ArrayList(4096) + private val counter: ReferenceCounter + ) : KSerializer by tSerializer { + + override fun deserialize(decoder: Decoder): T { + val input = decoder as JsonDecoder + val element = input.decodeJsonElement() + val refId = (element as? JsonObject)?.get("\$ref")?.jsonPrimitive?.int + val ref = if (refId != null) { + //Do unref + refCache[refId] + } else { + refCache[counter.value].also { + counter.increment() + } + } + return ref.value(tSerializer) as T //TODO research means to make it safe } } - override fun serialize(encoder: Encoder, value: T) { - tSerializer.serialize(encoder, value) + private fun KSerializer.unref(refCache: MutableList, counter: ReferenceCounter): KSerializer = + RootUnrefSerializer(this, refCache, counter) + + @OptIn(ExperimentalSerializationApi::class) + fun unrefSerializersModule( + refCache: MutableList, counter: ReferenceCounter + ): SerializersModule = SerializersModule { + val collector = this + val unrefCollector = object : SerializersModuleCollector { + + override fun contextual( + kClass: KClass, + provider: (typeArgumentsSerializers: List>) -> KSerializer<*> + ) { + collector.contextual(kClass) { provider(it).unref(refCache, counter) } + } + + override fun polymorphic( + baseClass: KClass, + actualClass: KClass, + actualSerializer: KSerializer + ) { + collector.polymorphic(baseClass, actualClass, actualSerializer.unref(refCache, counter)) + } + + override fun polymorphicDefault( + baseClass: KClass, + defaultSerializerProvider: (className: String?) -> DeserializationStrategy? + ) { + collector.polymorphicDefault(baseClass) { + (defaultSerializerProvider(it) as KSerializer).unref(refCache, counter) + } + } + } + serializersModule.dumpTo(unrefCollector) } -} - -private fun KSerializer.unref(refCache: RefCache): RootJsonSerializer = - RootJsonSerializer(refCache, this) - - -private fun PolymorphicModuleBuilder.shapes(refCache: RefCache) { - subclass(TGeoBBox.serializer().unref(refCache)) - subclass(TGeoCompositeShape.serializer().unref(refCache)) - subclass(TGeoXtru.serializer().unref(refCache)) - subclass(TGeoTube.serializer().unref(refCache)) - subclass(TGeoTubeSeg.serializer().unref(refCache)) - subclass(TGeoShapeAssembly.serializer().unref(refCache)) -} - -private fun PolymorphicModuleBuilder.matrices(refCache: RefCache) { - subclass(TGeoIdentity.serializer().unref(refCache)) - subclass(TGeoHMatrix.serializer().unref(refCache)) - subclass(TGeoTranslation.serializer().unref(refCache)) - subclass(TGeoRotation.serializer().unref(refCache)) - subclass(TGeoCombiTrans.serializer().unref(refCache)) -} - -/** - * Create an instance of Json with unfolding Root references. This instance could not be reused because of the cache. - */ -internal fun rootJson(): Json { - val refCache = ArrayList(4096) - return Json { + /** + * Create an instance of Json with unfolding Root references. This instance could not be reused because of the cache. + */ + private fun unrefJson(refCache: MutableList, counter: ReferenceCounter): Json = Json { encodeDefaults = true ignoreUnknownKeys = true classDiscriminator = "_typename" - serializersModule = SerializersModule { - polymorphic(TGeoShape::class) { - default { TGeoBBox.serializer().unref(refCache) } - shapes(refCache) - } + serializersModule = unrefSerializersModule(refCache, counter) + } - polymorphic(TGeoMatrix::class) { - matrices(refCache) - } - polymorphic(TObject::class) { - shapes(refCache) - matrices(refCache) + fun decode(sourceDeserializer: KSerializer, source: JsonElement): TObject { + val counter = ReferenceCounter() + val refCache = ArrayList() - subclass(TGeoMaterial.serializer().unref(refCache)) - subclass(TGeoMixture.serializer().unref(refCache)) - - subclass(TGeoMedium.serializer().unref(refCache)) - - subclass(TGeoNode.serializer().unref(refCache)) - subclass(TGeoNodeMatrix.serializer().unref(refCache)) - subclass(TGeoVolume.serializer().unref(refCache)) - subclass(TGeoVolumeAssembly.serializer().unref(refCache)) - } - polymorphic(TGeoNode::class, TGeoNode.serializer().unref(refCache)) { - subclass(TGeoNodeMatrix.serializer().unref(refCache)) - } - polymorphic(TGeoVolume::class, TGeoVolume.serializer().unref(refCache)) { - subclass(TGeoVolumeAssembly.serializer().unref(refCache)) + fun fillCache(element: JsonElement) { + when (element) { + is JsonObject -> { + if (element["_typename"] != null) { + refCache.add(RefEntry(element)) + } + element.values.forEach { + fillCache(it) + } + } + is JsonArray -> { + element.forEach { + fillCache(it) + } + } + else -> { + } } } + fillCache(source) + + return unrefJson(refCache, counter).decodeFromJsonElement(sourceDeserializer.unref(refCache, counter), source) } + + class ReferenceCounter(var value: Int = 0) { + fun increment() { + value += 1 + } + + override fun toString(): String = value.toString() + } + + class RefEntry(val obj: JsonObject) { + + private var cachedValue: Any? = null + + fun value(serializer: KSerializer<*>): Any { + if (cachedValue == null) { + cachedValue = json.decodeFromJsonElement(serializer, obj) + } + return cachedValue!! + } + + override fun toString(): String = obj.toString() + } + + private fun PolymorphicModuleBuilder.shapes() { + subclass(TGeoBBox.serializer()) + subclass(TGeoCompositeShape.serializer()) + subclass(TGeoXtru.serializer()) + subclass(TGeoTube.serializer()) + subclass(TGeoTubeSeg.serializer()) + subclass(TGeoShapeAssembly.serializer()) + } + + private fun PolymorphicModuleBuilder.matrices() { + subclass(TGeoIdentity.serializer()) + subclass(TGeoHMatrix.serializer()) + subclass(TGeoTranslation.serializer()) + subclass(TGeoRotation.serializer()) + subclass(TGeoCombiTrans.serializer()) + } + + private fun PolymorphicModuleBuilder.boolNodes() { + subclass(TGeoIntersection.serializer()) + subclass(TGeoUnion.serializer()) + subclass(TGeoSubtraction.serializer()) + } + + private val serializersModule = SerializersModule { + contextual(TGeoManager::class) { TGeoManager.serializer() } + contextual(TObjArray::class) { TObjArray.serializer() } + contextual(TGeoVolumeAssembly::class) { TGeoVolumeAssembly.serializer() } + contextual(TGeoShapeAssembly::class) { TGeoShapeAssembly.serializer() } + contextual(TGeoRotation::class) { TGeoRotation.serializer() } + contextual(TGeoMedium::class) { TGeoMedium.serializer() } + + polymorphic(TGeoShape::class) { + default { TGeoBBox.serializer() } + shapes() + } + + polymorphic(TGeoMatrix::class) { + matrices() + } + + polymorphic(TGeoBoolNode::class) { + boolNodes() + } + + polymorphic(TObject::class) { + subclass(TObjArray.serializer()) + + shapes() + matrices() + boolNodes() + + subclass(TGeoMaterial.serializer()) + subclass(TGeoMixture.serializer()) + + subclass(TGeoMedium.serializer()) + + subclass(TGeoNode.serializer()) + subclass(TGeoNodeMatrix.serializer()) + subclass(TGeoVolume.serializer()) + subclass(TGeoVolumeAssembly.serializer()) + } + + polymorphic(TGeoNode::class, TGeoNode.serializer()) { + subclass(TGeoNodeMatrix.serializer()) + } + + polymorphic(TGeoVolume::class, TGeoVolume.serializer()) { + subclass(TGeoVolumeAssembly.serializer()) + } + } + + val json = Json { + encodeDefaults = true + ignoreUnknownKeys = true + classDiscriminator = "_typename" + serializersModule = this@RootDecoder.serializersModule + } + } \ No newline at end of file diff --git a/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBM@N.kt b/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBM@N.kt index 5d3a03af..2c2aa86c 100644 --- a/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBM@N.kt +++ b/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBM@N.kt @@ -1,7 +1,31 @@ package ru.mipt.npm.root +import kotlinx.serialization.json.* + +private fun JsonElement.countTypes(): Sequence = sequence { + val json = this@countTypes + when (json){ + is JsonObject -> { + json["_typename"]?.let { yield(it.jsonPrimitive.content) } + json.values.forEach { yieldAll(it.countTypes()) } + } + is JsonArray -> { + json.forEach { + yieldAll(it.countTypes()) + } + } + else -> {} + } +} + fun main() { val string = TGeoManager::class.java.getResourceAsStream("/BM@N.root.json")!! .readAllBytes().decodeToString() - val geo = TGeoManager.decodeFromString(string) + val json = Json.parseToJsonElement(string) + val sizes = json.countTypes().groupBy { it }.mapValues { it.value.size } + sizes.forEach { + println(it) + } + + val geo = TObject.decodeFromString(TGeoManager.serializer(), string) } \ No newline at end of file From e39f79e4ab702226b0b125e1eb9fe4b4392fa25a Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 24 Aug 2021 16:04:21 +0300 Subject: [PATCH 068/109] Root parsing complete --- .../kotlin/ru/mipt/npm/root/JsonRootObject.kt | 26 +++ .../kotlin/ru/mipt/npm/root/TGeoNode.kt | 8 +- .../kotlin/ru/mipt/npm/root/TGeoShape.kt | 6 +- .../kotlin/ru/mipt/npm/root/TGeoVolume.kt | 34 ++-- .../kotlin/ru/mipt/npm/root/TObject.kt | 8 +- .../kotlin/ru/mipt/npm/root/rootJson.kt | 149 +++++++++--------- .../mipt/npm/root/{loadBM@N.kt => loadBMN.kt} | 8 +- 7 files changed, 143 insertions(+), 96 deletions(-) create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/JsonRootObject.kt rename cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/{loadBM@N.kt => loadBMN.kt} (78%) diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/JsonRootObject.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/JsonRootObject.kt new file mode 100644 index 00000000..bb5fd1cb --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/JsonRootObject.kt @@ -0,0 +1,26 @@ +package ru.mipt.npm.root + +import kotlinx.serialization.KSerializer +import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import kotlinx.serialization.json.JsonElement + +@Serializable(JsonRootSerializer::class) +public class JsonRootObject(public val element: JsonElement): TObject() + +public object JsonRootSerializer: KSerializer{ + private val jsonElementSerializer = JsonElement.serializer() + + override val descriptor: SerialDescriptor + get() = jsonElementSerializer.descriptor + + override fun deserialize(decoder: Decoder): JsonRootObject { + return JsonRootObject(decoder.decodeSerializableValue(jsonElementSerializer)) + } + + override fun serialize(encoder: Encoder, value: JsonRootObject) { + encoder.encodeSerializableValue(jsonElementSerializer, value.element) + } +} \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt index f507aeb2..9e6f47f1 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt @@ -7,12 +7,14 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("TGeoNode") public open class TGeoNode : TNamed() { - //val fGeoAtt: UInt + public val fGeoAtt: UInt = 0u + @Contextual public val fVolume: TGeoVolume? = null - @Contextual - public val fMother: TGeoVolume? = null +// @Contextual +// public val fMother: TGeoVolume? = null + public val fNumber: Int = 0 public val fNovlp: Int = 0 public val fOverlaps: IntArray = intArrayOf() diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt index c986f899..26cf0bab 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt @@ -126,4 +126,8 @@ public class TGeoShapeAssembly( @Contextual public val fVolume: TGeoVolumeAssembly, public val fBBoxOK: Boolean = true -) : TGeoBBox() \ No newline at end of file +) : TGeoBBox() + +public class TGeoShapeRef(provider: () -> TGeoShape) : TGeoShape() { + public val value: TGeoShape by lazy(provider) +} \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt index afa7c7d9..480c1ca7 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt @@ -7,29 +7,35 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("TGeoVolume") public open class TGeoVolume : TNamed() { - // "fGeoAtt" : 3084, -// "fLineColor" : 3, -// "fLineStyle" : 1, -// "fLineWidth" : 1, -// "fFillColor" : 19, -// "fFillStyle" : 1001, - @Contextual - public lateinit var fNodes: TObjArray - internal set + public val fGeoAtt: UInt = 0u + public val fLineColor: Int = 2 + public val fLineStyle: Int? = null + public val fLineWidth: UInt = 1u + public val fFillColor: Int? = null + public val fFillStyle: Int? = null @Contextual - public lateinit var fShape: TGeoShape - internal set + public val fNodes: TObjArray? = null @Contextual - public lateinit var fMedium: TGeoMedium - internal set + public val fShape: TGeoShape? = null + + @Contextual + public val fMedium: TGeoMedium? = null public val fNumber: Int = 1 public val fNtotal: Int = 1 public val fRefCount: Int = 1 } +public class TGeoVolumeRef(provider: () -> TGeoVolume) : TGeoVolume() { + public val value: TGeoVolume by lazy(provider) +} + @Serializable @SerialName("TGeoVolumeAssembly") -public class TGeoVolumeAssembly : TGeoVolume() \ No newline at end of file +public open class TGeoVolumeAssembly : TGeoVolume() + +public class TGeoVolumeAssemblyRef(provider: () -> TGeoVolumeAssembly) : TGeoVolumeAssembly() { + public val value: TGeoVolumeAssembly by lazy(provider) +} \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt index f70cc589..50738d11 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt @@ -1,5 +1,6 @@ package ru.mipt.npm.root +import kotlinx.serialization.Contextual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -15,9 +16,10 @@ public open class TNamed : TObject() { public val fTitle: String = "" } + @Serializable @SerialName("TObjArray") -public class TObjArray(public val arr: List): TObject() { +public class TObjArray(public val arr: List<@Contextual TObject>): TObject() { public companion object{ public val empty: TObjArray = TObjArray(emptyList()) } @@ -25,8 +27,8 @@ public class TObjArray(public val arr: List): TObject() { @Serializable @SerialName("TList") -public class TList(public val arr: List): TObject() +public class TList(public val arr: List<@Contextual TObject>): TObject() @Serializable @SerialName("THashList") -public class THashList(public val arr: List): TObject() \ No newline at end of file +public class THashList(public val arr: List<@Contextual TObject>): TObject() \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootJson.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootJson.kt index 33b8b6c2..8416368a 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootJson.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootJson.kt @@ -1,12 +1,10 @@ package ru.mipt.npm.root -import kotlinx.serialization.DeserializationStrategy import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.KSerializer import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.json.* import kotlinx.serialization.modules.* -import kotlin.reflect.KClass /** @@ -24,8 +22,8 @@ private object RootDecoder { private class RootUnrefSerializer( private val tSerializer: KSerializer, - private val refCache: MutableList,// = ArrayList(4096) - private val counter: ReferenceCounter + private val refCache: List,// = ArrayList(4096) + //private val counter: ReferenceCounter ) : KSerializer by tSerializer { override fun deserialize(decoder: Decoder): T { @@ -33,67 +31,74 @@ private object RootDecoder { val element = input.decodeJsonElement() val refId = (element as? JsonObject)?.get("\$ref")?.jsonPrimitive?.int val ref = if (refId != null) { - //Do unref - refCache[refId] - } else { - refCache[counter.value].also { - counter.increment() + //println("Substituting ref $refId") + //Forward ref for shapes + when (tSerializer.descriptor.serialName) { + "TGeoShape" -> return TGeoShapeRef{ + //Should be not null at the moment of actualization + refCache[refId].value as TGeoShape + } as T + "TGeoVolumeAssembly" -> return TGeoVolumeAssemblyRef{ + //Should be not null at the moment of actualization + refCache[refId].value as TGeoVolumeAssembly + } as T + //Do unref + else -> refCache[refId] } + } else { + refCache.find { it.element == element } ?: error("Element '$element' not found in the cache") + } + + return ref.getOrPutValue { +// val actualTypeName = it.jsonObject["_typename"]?.jsonPrimitive?.content + input.json.decodeFromJsonElement(tSerializer, it) } - return ref.value(tSerializer) as T //TODO research means to make it safe } } - private fun KSerializer.unref(refCache: MutableList, counter: ReferenceCounter): KSerializer = - RootUnrefSerializer(this, refCache, counter) + private fun KSerializer.unref(refCache: List): KSerializer = + RootUnrefSerializer(this, refCache) @OptIn(ExperimentalSerializationApi::class) fun unrefSerializersModule( - refCache: MutableList, counter: ReferenceCounter + refCache: List ): SerializersModule = SerializersModule { - val collector = this - val unrefCollector = object : SerializersModuleCollector { + include(serializersModule) - override fun contextual( - kClass: KClass, - provider: (typeArgumentsSerializers: List>) -> KSerializer<*> - ) { - collector.contextual(kClass) { provider(it).unref(refCache, counter) } - } + contextual(TGeoManager.serializer().unref(refCache)) + contextual(TObjArray.serializer().unref(refCache)) + contextual(TGeoVolumeAssembly.serializer().unref(refCache)) + contextual(TGeoShapeAssembly.serializer().unref(refCache)) + contextual(TGeoRotation.serializer().unref(refCache)) + contextual(TGeoMedium.serializer().unref(refCache)) + contextual(TGeoVolume.serializer().unref(refCache)) + contextual(TGeoMatrix.serializer().unref(refCache)) + contextual(TGeoNodeMatrix.serializer().unref(refCache)) + contextual(TGeoShape.serializer().unref(refCache)) + contextual(TObject.serializer().unref(refCache)) - override fun polymorphic( - baseClass: KClass, - actualClass: KClass, - actualSerializer: KSerializer - ) { - collector.polymorphic(baseClass, actualClass, actualSerializer.unref(refCache, counter)) - } - override fun polymorphicDefault( - baseClass: KClass, - defaultSerializerProvider: (className: String?) -> DeserializationStrategy? - ) { - collector.polymorphicDefault(baseClass) { - (defaultSerializerProvider(it) as KSerializer).unref(refCache, counter) - } - } + polymorphicDefault(TGeoShape::class) { + TGeoShape.serializer().unref(refCache) + } + + polymorphicDefault(TGeoMatrix::class) { + TGeoMatrix.serializer().unref(refCache) } - serializersModule.dumpTo(unrefCollector) } /** * Create an instance of Json with unfolding Root references. This instance could not be reused because of the cache. */ - private fun unrefJson(refCache: MutableList, counter: ReferenceCounter): Json = Json { + private fun unrefJson(refCache: MutableList): Json = Json { encodeDefaults = true ignoreUnknownKeys = true classDiscriminator = "_typename" - serializersModule = unrefSerializersModule(refCache, counter) + serializersModule = unrefSerializersModule(refCache) } fun decode(sourceDeserializer: KSerializer, source: JsonElement): TObject { - val counter = ReferenceCounter() val refCache = ArrayList() fun fillCache(element: JsonElement) { @@ -112,34 +117,35 @@ private object RootDecoder { } } else -> { + //ignore primitives } } } fillCache(source) - return unrefJson(refCache, counter).decodeFromJsonElement(sourceDeserializer.unref(refCache, counter), source) + return unrefJson(refCache).decodeFromJsonElement(sourceDeserializer.unref(refCache), source) } - class ReferenceCounter(var value: Int = 0) { - fun increment() { - value += 1 - } +// class ReferenceCounter(var value: Int = 0) { +// fun increment() { +// value += 1 +// } +// +// override fun toString(): String = value.toString() +// } - override fun toString(): String = value.toString() - } + class RefEntry(val element: JsonElement) { - class RefEntry(val obj: JsonObject) { + var value: Any? = null - private var cachedValue: Any? = null - - fun value(serializer: KSerializer<*>): Any { - if (cachedValue == null) { - cachedValue = json.decodeFromJsonElement(serializer, obj) + fun getOrPutValue(builder: (JsonElement) -> T): T { + if (value == null) { + value = builder(element) } - return cachedValue!! + return value as T } - override fun toString(): String = obj.toString() + override fun toString(): String = element.toString() } private fun PolymorphicModuleBuilder.shapes() { @@ -166,27 +172,9 @@ private object RootDecoder { } private val serializersModule = SerializersModule { - contextual(TGeoManager::class) { TGeoManager.serializer() } - contextual(TObjArray::class) { TObjArray.serializer() } - contextual(TGeoVolumeAssembly::class) { TGeoVolumeAssembly.serializer() } - contextual(TGeoShapeAssembly::class) { TGeoShapeAssembly.serializer() } - contextual(TGeoRotation::class) { TGeoRotation.serializer() } - contextual(TGeoMedium::class) { TGeoMedium.serializer() } - - polymorphic(TGeoShape::class) { - default { TGeoBBox.serializer() } - shapes() - } - - polymorphic(TGeoMatrix::class) { - matrices() - } - - polymorphic(TGeoBoolNode::class) { - boolNodes() - } polymorphic(TObject::class) { + default { JsonRootSerializer } subclass(TObjArray.serializer()) shapes() @@ -202,6 +190,19 @@ private object RootDecoder { subclass(TGeoNodeMatrix.serializer()) subclass(TGeoVolume.serializer()) subclass(TGeoVolumeAssembly.serializer()) + subclass(TGeoManager.serializer()) + } + + polymorphic(TGeoShape::class) { + shapes() + } + + polymorphic(TGeoMatrix::class) { + matrices() + } + + polymorphic(TGeoBoolNode::class) { + boolNodes() } polymorphic(TGeoNode::class, TGeoNode.serializer()) { diff --git a/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBM@N.kt b/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt similarity index 78% rename from cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBM@N.kt rename to cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt index 2c2aa86c..763b7e45 100644 --- a/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBM@N.kt +++ b/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt @@ -1,6 +1,8 @@ package ru.mipt.npm.root import kotlinx.serialization.json.* +import java.time.Duration +import kotlin.system.measureTimeMillis private fun JsonElement.countTypes(): Sequence = sequence { val json = this@countTypes @@ -27,5 +29,9 @@ fun main() { println(it) } - val geo = TObject.decodeFromString(TGeoManager.serializer(), string) + val time = measureTimeMillis { + val geo = TObject.decodeFromString(TGeoManager.serializer(), string) + } + + println(Duration.ofMillis(time)) } \ No newline at end of file From df30f8ecc3e1b2b1bc68d80cbacb027fda9ce64f Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 25 Aug 2021 18:04:15 +0300 Subject: [PATCH 069/109] Add polygon and polycone and add generics to TObjectArray --- build.gradle.kts | 4 +- .../kotlin/ru/mipt/npm/root/JsonRootObject.kt | 26 --- .../kotlin/ru/mipt/npm/root/TGeoManager.kt | 9 +- .../kotlin/ru/mipt/npm/root/TGeoNode.kt | 8 +- .../kotlin/ru/mipt/npm/root/TGeoShape.kt | 49 ++--- .../kotlin/ru/mipt/npm/root/TGeoVolume.kt | 2 +- .../kotlin/ru/mipt/npm/root/TObject.kt | 4 +- .../npm/root/{rootJson.kt => jsonToRoot.kt} | 106 +++++++---- .../kotlin/ru/mipt/npm/root/rootToSolid.kt | 176 ++++++++++++++++++ .../kotlin/ru/mipt/npm/root/loadBMN.kt | 1 + gradle.properties | 2 +- .../kscience/visionforge/solid/geometry.kt | 7 +- 12 files changed, 297 insertions(+), 97 deletions(-) delete mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/JsonRootObject.kt rename cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/{rootJson.kt => jsonToRoot.kt} (71%) create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootToSolid.kt diff --git a/build.gradle.kts b/build.gradle.kts index cd6ece5d..20d1a1bd 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,7 +1,7 @@ plugins { id("ru.mipt.npm.gradle.project") -// kotlin("multiplatform") version "1.5.30-RC" apply false -// kotlin("js") version "1.5.30-RC" apply false + kotlin("multiplatform") version "1.5.30" apply false + kotlin("js") version "1.5.30" apply false } val dataforgeVersion by extra("0.5.1") diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/JsonRootObject.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/JsonRootObject.kt deleted file mode 100644 index bb5fd1cb..00000000 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/JsonRootObject.kt +++ /dev/null @@ -1,26 +0,0 @@ -package ru.mipt.npm.root - -import kotlinx.serialization.KSerializer -import kotlinx.serialization.Serializable -import kotlinx.serialization.descriptors.SerialDescriptor -import kotlinx.serialization.encoding.Decoder -import kotlinx.serialization.encoding.Encoder -import kotlinx.serialization.json.JsonElement - -@Serializable(JsonRootSerializer::class) -public class JsonRootObject(public val element: JsonElement): TObject() - -public object JsonRootSerializer: KSerializer{ - private val jsonElementSerializer = JsonElement.serializer() - - override val descriptor: SerialDescriptor - get() = jsonElementSerializer.descriptor - - override fun deserialize(decoder: Decoder): JsonRootObject { - return JsonRootObject(decoder.decodeSerializableValue(jsonElementSerializer)) - } - - override fun serialize(encoder: Encoder, value: JsonRootObject) { - encoder.encodeSerializableValue(jsonElementSerializer, value.element) - } -} \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt index 96b02768..41607fbd 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt @@ -9,11 +9,14 @@ import kotlinx.serialization.Serializable public class TGeoManager : TNamed() { @Contextual - public val fMatrices: TObjArray = TObjArray.empty + public val fMatrices: TObjArray = TObjArray.getEmpty() @Contextual - public val fShapes: TObjArray = TObjArray.empty + public val fShapes: TObjArray = TObjArray.getEmpty() @Contextual - public val fVolumes: TObjArray = TObjArray.empty + public val fVolumes: TObjArray = TObjArray.getEmpty() + + @Contextual + public val fNodes: TObjArray = TObjArray.getEmpty() } diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt index 9e6f47f1..75a8ac05 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt @@ -6,7 +6,7 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("TGeoNode") -public open class TGeoNode : TNamed() { +public sealed class TGeoNode : TNamed() { public val fGeoAtt: UInt = 0u @Contextual @@ -25,4 +25,10 @@ public open class TGeoNode : TNamed() { public class TGeoNodeMatrix : TGeoNode() { @Contextual public val fMatrix: TGeoMatrix? = null +} + +@Serializable +@SerialName("TGeoNodeOffset") +public class TGeoNodeOffset : TGeoNode() { + public val fOffset: Double = 0.0 } \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt index 26cf0bab..7cf6876a 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt @@ -3,6 +3,7 @@ package ru.mipt.npm.root import kotlinx.serialization.Contextual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import kotlin.math.PI @Serializable @SerialName("TGeoShape") @@ -27,13 +28,13 @@ public sealed class TGeoBoolNode : TObject() { public abstract val fLeft: TGeoShape @Contextual - public abstract val fLeftMat: TGeoMatrix + public val fLeftMat: TGeoMatrix? = null @Contextual public abstract val fRight: TGeoShape @Contextual - public abstract val fRightMat: TGeoMatrix + public val fRightMat: TGeoMatrix? = null } @Serializable @@ -42,11 +43,7 @@ public class TGeoUnion( @Contextual override val fLeft: TGeoShape, @Contextual - override val fLeftMat: TGeoMatrix, - @Contextual override val fRight: TGeoShape, - @Contextual - override val fRightMat: TGeoMatrix ) : TGeoBoolNode() @Serializable @@ -55,11 +52,7 @@ public class TGeoSubtraction( @Contextual override val fLeft: TGeoShape, @Contextual - override val fLeftMat: TGeoMatrix, - @Contextual override val fRight: TGeoShape, - @Contextual - override val fRightMat: TGeoMatrix ) : TGeoBoolNode() @Serializable @@ -68,11 +61,7 @@ public class TGeoIntersection( @Contextual override val fLeft: TGeoShape, @Contextual - override val fLeftMat: TGeoMatrix, - @Contextual override val fRight: TGeoShape, - @Contextual - override val fRightMat: TGeoMatrix ) : TGeoBoolNode() @@ -97,18 +86,15 @@ public class TGeoXtru( @Serializable @SerialName("TGeoTube") -public open class TGeoTube( - public val fRmin: Double, - public val fRmax: Double, - public val fDz: Double, -) : TGeoBBox() +public open class TGeoTube : TGeoBBox() { + public val fRmin: Double = 0.0 + public val fRmax: Double = 0.0 + public val fDz: Double = 0.0 +} @Serializable @SerialName("TGeoTubeSeg") public class TGeoTubeSeg( - public val fRmin: Double, - public val fRmax: Double, - public val fDz: Double, public val fPhi1: Double, public val fPhi2: Double, public val fS1: Double, @@ -118,7 +104,24 @@ public class TGeoTubeSeg( public val fSm: Double, public val fCm: Double, public val fCdfi: Double, -) : TGeoBBox() +) : TGeoTube() + +@Serializable +@SerialName("TGeoPcon") +public open class TGeoPcon : TGeoBBox() { + public val fNz: Int = 0 // number of z planes (at least two) + public val fPhi1: Double = 0.0 // lower phi limit (converted to [0,2*pi) + public val fDphi: Double = PI * 2 // phi range + public val fRmin: DoubleArray = doubleArrayOf() //[fNz] pointer to array of inner radii + public val fRmax: DoubleArray = doubleArrayOf() //[fNz] pointer to array of outer radii + public val fZ: DoubleArray = doubleArrayOf() //[fNz] pointer to array of Z planes positions +} + +@Serializable +@SerialName("TGeoPgon") +public open class TGeoPgon : TGeoPcon() { + public val fNedges: Int = 0 +} @Serializable @SerialName("TGeoShapeAssembly") diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt index 480c1ca7..9823eb1f 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt @@ -15,7 +15,7 @@ public open class TGeoVolume : TNamed() { public val fFillStyle: Int? = null @Contextual - public val fNodes: TObjArray? = null + public val fNodes: TObjArray? = null @Contextual public val fShape: TGeoShape? = null diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt index 50738d11..063cadfe 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt @@ -19,9 +19,9 @@ public open class TNamed : TObject() { @Serializable @SerialName("TObjArray") -public class TObjArray(public val arr: List<@Contextual TObject>): TObject() { +public class TObjArray(public val arr: List<@Contextual T>): TObject() { public companion object{ - public val empty: TObjArray = TObjArray(emptyList()) + public fun getEmpty(): TObjArray = TObjArray(emptyList()) } } diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootJson.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/jsonToRoot.kt similarity index 71% rename from cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootJson.kt rename to cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/jsonToRoot.kt index 8416368a..d0c3afb9 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootJson.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/jsonToRoot.kt @@ -1,12 +1,27 @@ package ru.mipt.npm.root +import kotlinx.serialization.DeserializationStrategy import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.KSerializer +import kotlinx.serialization.descriptors.SerialDescriptor import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.json.* import kotlinx.serialization.modules.* +private fun jsonRootDeserializer(tSerializer: KSerializer, builder: (JsonElement) -> T): DeserializationStrategy = object : + DeserializationStrategy { + private val jsonElementSerializer = JsonElement.serializer() + + override val descriptor: SerialDescriptor + get() = jsonElementSerializer.descriptor + + override fun deserialize(decoder: Decoder): T { + val json = decoder.decodeSerializableValue(jsonElementSerializer) + return builder(json) + } +} + /** * Load Json encoded TObject */ @@ -22,8 +37,7 @@ private object RootDecoder { private class RootUnrefSerializer( private val tSerializer: KSerializer, - private val refCache: List,// = ArrayList(4096) - //private val counter: ReferenceCounter + private val refCache: List, ) : KSerializer by tSerializer { override fun deserialize(decoder: Decoder): T { @@ -31,14 +45,14 @@ private object RootDecoder { val element = input.decodeJsonElement() val refId = (element as? JsonObject)?.get("\$ref")?.jsonPrimitive?.int val ref = if (refId != null) { - //println("Substituting ref $refId") + //println("Substituting ${tSerializer.descriptor.serialName} ref $refId") //Forward ref for shapes when (tSerializer.descriptor.serialName) { - "TGeoShape" -> return TGeoShapeRef{ + "TGeoShape" -> return TGeoShapeRef { //Should be not null at the moment of actualization refCache[refId].value as TGeoShape } as T - "TGeoVolumeAssembly" -> return TGeoVolumeAssemblyRef{ + "TGeoVolumeAssembly" -> return TGeoVolumeAssemblyRef { //Should be not null at the moment of actualization refCache[refId].value as TGeoVolumeAssembly } as T @@ -66,24 +80,50 @@ private object RootDecoder { include(serializersModule) contextual(TGeoManager.serializer().unref(refCache)) - contextual(TObjArray.serializer().unref(refCache)) + contextual(TObjArray::class) { TObjArray.serializer(it[0]).unref(refCache) } contextual(TGeoVolumeAssembly.serializer().unref(refCache)) contextual(TGeoShapeAssembly.serializer().unref(refCache)) contextual(TGeoRotation.serializer().unref(refCache)) contextual(TGeoMedium.serializer().unref(refCache)) contextual(TGeoVolume.serializer().unref(refCache)) contextual(TGeoMatrix.serializer().unref(refCache)) + contextual(TGeoNode.serializer().unref(refCache)) + contextual(TGeoNodeOffset.serializer().unref(refCache)) contextual(TGeoNodeMatrix.serializer().unref(refCache)) contextual(TGeoShape.serializer().unref(refCache)) contextual(TObject.serializer().unref(refCache)) polymorphicDefault(TGeoShape::class) { - TGeoShape.serializer().unref(refCache) + if (it == null) { + TGeoShape.serializer().unref(refCache) + } else { + error("Unrecognized shape $it") + } } polymorphicDefault(TGeoMatrix::class) { - TGeoMatrix.serializer().unref(refCache) + if (it == null) { + TGeoMatrix.serializer().unref(refCache) + } else { + error("Unrecognized matrix $it") + } + } + + polymorphicDefault(TGeoVolume::class) { + if (it == null) { + TGeoVolume.serializer().unref(refCache) + } else { + error("Unrecognized volume $it") + } + } + + polymorphicDefault(TGeoNode::class) { + if (it == null) { + TGeoNode.serializer().unref(refCache) + } else { + error("Unrecognized node $it") + } } } @@ -126,14 +166,6 @@ private object RootDecoder { return unrefJson(refCache).decodeFromJsonElement(sourceDeserializer.unref(refCache), source) } -// class ReferenceCounter(var value: Int = 0) { -// fun increment() { -// value += 1 -// } -// -// override fun toString(): String = value.toString() -// } - class RefEntry(val element: JsonElement) { var value: Any? = null @@ -154,6 +186,8 @@ private object RootDecoder { subclass(TGeoXtru.serializer()) subclass(TGeoTube.serializer()) subclass(TGeoTubeSeg.serializer()) + subclass(TGeoPcon.serializer()) + subclass(TGeoPgon.serializer()) subclass(TGeoShapeAssembly.serializer()) } @@ -173,25 +207,24 @@ private object RootDecoder { private val serializersModule = SerializersModule { - polymorphic(TObject::class) { - default { JsonRootSerializer } - subclass(TObjArray.serializer()) - - shapes() - matrices() - boolNodes() - - subclass(TGeoMaterial.serializer()) - subclass(TGeoMixture.serializer()) - - subclass(TGeoMedium.serializer()) - - subclass(TGeoNode.serializer()) - subclass(TGeoNodeMatrix.serializer()) - subclass(TGeoVolume.serializer()) - subclass(TGeoVolumeAssembly.serializer()) - subclass(TGeoManager.serializer()) - } +// polymorphic(TObject::class) { +// default { JsonRootSerializer } +// +// shapes() +// matrices() +// boolNodes() +// +// subclass(TGeoMaterial.serializer()) +// subclass(TGeoMixture.serializer()) +// +// subclass(TGeoMedium.serializer()) +// +// //subclass(TGeoNode.serializer()) +// subclass(TGeoNodeMatrix.serializer()) +// subclass(TGeoVolume.serializer()) +// subclass(TGeoVolumeAssembly.serializer()) +// subclass(TGeoManager.serializer()) +// } polymorphic(TGeoShape::class) { shapes() @@ -205,8 +238,9 @@ private object RootDecoder { boolNodes() } - polymorphic(TGeoNode::class, TGeoNode.serializer()) { + polymorphic(TGeoNode::class) { subclass(TGeoNodeMatrix.serializer()) + subclass(TGeoNodeOffset.serializer()) } polymorphic(TGeoVolume::class, TGeoVolume.serializer()) { diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootToSolid.kt new file mode 100644 index 00000000..ebfb7b06 --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootToSolid.kt @@ -0,0 +1,176 @@ +package ru.mipt.npm.root + +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.asName +import space.kscience.visionforge.setPropertyNode +import space.kscience.visionforge.solid.* +import kotlin.math.PI +import kotlin.math.atan2 +import kotlin.math.pow +import kotlin.math.sqrt + + +private val solidsName = "solids".asName() +private val volumesName = "volumes".asName() + +private operator fun Number.times(d: Double) = toDouble() * d + +private operator fun Number.times(f: Float) = toFloat() * f + +private fun degToRad(d: Double) = d * PI / 180.0 + +private class GdmlLoader { + + // converting to XYZ to Tait–Bryan angles according to https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix + private fun Solid.rotate(rot: DoubleArray) { + val xAngle = atan2(-rot[5], rot[8]) + val yAngle = atan2(rot[2], sqrt(1.0 - rot[2].pow(2))) + val zAngle = atan2(-rot[1], rot[0]) + rotation = Point3D(xAngle, yAngle, zAngle) + } + + private fun Solid.translate(trans: DoubleArray) { + val (x, y, z) = trans + position = Point3D(x, y, z) + } + + private fun Solid.useMatrix(matrix: TGeoMatrix?) { + when (matrix) { + null, is TGeoIdentity -> { + //do nothing + } + is TGeoTranslation -> { + translate(matrix.fTranslation) + } + is TGeoRotation -> { + rotate(matrix.fRotationMatrix) + } + is TGeoCombiTrans -> { + translate(matrix.fTranslation) + matrix.fRotation?.let { rotate(it.fRotationMatrix) } + } + is TGeoHMatrix -> { + translate(matrix.fTranslation) + rotate(matrix.fRotationMatrix) + val (xScale, yScale, zScale) = matrix.fScale + scale = Point3D(xScale, yScale, zScale) + } + } + } + + fun SolidGroup.addShape(shape: TGeoShape) { + when (shape) { + is TGeoShapeRef -> addShape(shape.value) + is TGeoCompositeShape -> { + val bool: TGeoBoolNode = shape.fNode + val compositeType = when (bool) { + is TGeoIntersection -> CompositeType.INTERSECT + is TGeoSubtraction -> CompositeType.SUBTRACT + is TGeoUnion -> CompositeType.UNION + } + composite(compositeType, name = shape.fName) { + addShape(bool.fLeft).apply { + useMatrix(bool.fLeftMat) + } + addShape(bool.fRight).apply { + useMatrix(bool.fRightMat) + } + } + } + is TGeoXtru -> extruded(name = shape.fName) { + + (0 until shape.fNvert).forEach { index -> + shape { + point(shape.fX[index], shape.fY[index]) + } + } + + (0 until shape.fNz).forEach { index -> + layer( + shape.fZ[index], + shape.fX0[index], + shape.fY0[index], + shape.fScale[index] + ) + } + } + is TGeoTube -> tube( + radius = shape.fRmax, + height = shape.fDz * 2, + innerRadius = shape.fRmin, + name = shape.fName + ) + is TGeoTubeSeg -> tube( + radius = shape.fRmax, + height = shape.fDz * 2, + innerRadius = shape.fRmin, + startAngle = degToRad(shape.fPhi1), + angle = degToRad(shape.fPhi2 - shape.fPhi1), + name = shape.fName + ) + is TGeoPcon -> TODO() + is TGeoPgon -> TODO() + is TGeoShapeAssembly -> volume(shape.fVolume) + is TGeoBBox -> box(shape.fDX * 2, shape.fDY * 2, shape.fDZ * 2, name = shape.fName) + } + } + + fun SolidGroup.node(obj: TGeoNode) { + if (obj.fVolume != null) { + volume(obj.fVolume).apply { + when (obj) { + is TGeoNodeMatrix -> { + useMatrix(obj.fMatrix) + } + is TGeoNodeOffset -> { + x = obj.fOffset + } + } + } + } + } + + fun buildGroup(volume: TGeoVolume): SolidGroup { + return if (volume is TGeoVolumeAssemblyRef) { + buildGroup(volume.value) + } else { + SolidGroup { + volume.fShape?.let { addShape(it) } + volume.fNodes?.let { + it.arr.forEach { obj -> + node(obj) + } + } + } + } + } + + private val SolidGroup.rootPrototypes: SolidGroup get() = (parent as? SolidGroup)?.rootPrototypes ?: this + + fun SolidGroup.volume(volume: TGeoVolume): SolidGroup { + val group = buildGroup(volume) + val ref = rootPrototypes.prototypes { + + } + set(volume.fName.ifEmpty { null }?.asName(), group) + return group + } + + fun load(geo: TGeoManager): SolidGroup { + /** + * A special group for local templates + */ + val proto = SolidGroup() + + val solids = proto.group(solidsName) { + setPropertyNode("edges.enabled", false) + } + + val volumes = proto.group(volumesName) + + val referenceStore = HashMap>() + + TODO() + } + +} \ No newline at end of file diff --git a/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt b/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt index 763b7e45..c6cec829 100644 --- a/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt +++ b/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt @@ -31,6 +31,7 @@ fun main() { val time = measureTimeMillis { val geo = TObject.decodeFromString(TGeoManager.serializer(), string) + println(geo) } println(Duration.ofMillis(time)) diff --git a/gradle.properties b/gradle.properties index 511d4130..5bce5b02 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ kotlin.mpp.enableGranularSourceSetsMetadata=true kotlin.mpp.stability.nowarn=true kotlin.native.enableDependencyPropagation=false -kotlin.jupyter.add.scanner=false +#kotlin.jupyter.add.scanner=false org.gradle.jvmargs=-XX:MaxMetaspaceSize=1G org.gradle.parallel=true \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt index 31611dc9..ccff7dcd 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt @@ -5,7 +5,10 @@ import kotlinx.serialization.Serializable import kotlinx.serialization.descriptors.SerialDescriptor import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Encoder -import space.kscience.dataforge.meta.* +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.MetaProvider +import space.kscience.dataforge.meta.float +import space.kscience.dataforge.meta.get import space.kscience.visionforge.solid.Solid.Companion.X_KEY import space.kscience.visionforge.solid.Solid.Companion.Y_KEY import space.kscience.visionforge.solid.Solid.Companion.Z_KEY @@ -54,7 +57,7 @@ internal object Point3DSerializer : KSerializer { override val descriptor: SerialDescriptor = Point3DImpl.serializer().descriptor - override fun deserialize(decoder: Decoder): Point3D = decoder.decodeSerializableValue(Point3DImpl.serializer()) + override fun deserialize(decoder: Decoder): MutablePoint3D = decoder.decodeSerializableValue(Point3DImpl.serializer()) override fun serialize(encoder: Encoder, value: Point3D) { val impl: Point3DImpl = (value as? Point3DImpl) ?: Point3DImpl(value.x, value.y, value.z) From 193665b99a30169d9aa208e94c6c551f9e7dcfa4 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 25 Aug 2021 23:00:05 +0300 Subject: [PATCH 070/109] WIP Root to Solid conversion --- .../kotlin/ru/mipt/npm/root/jsonToRoot.kt | 16 +- .../kotlin/ru/mipt/npm/root/rootToSolid.kt | 268 +++++++++--------- .../kotlin/ru/mipt/npm/root/loadBMN.kt | 4 +- .../visionforge/solid/SolidReference.kt | 23 +- .../visionforge/solid/SerializationTest.kt | 4 +- .../visionforge/solid/SolidReferenceTest.kt | 2 +- 6 files changed, 166 insertions(+), 151 deletions(-) diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/jsonToRoot.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/jsonToRoot.kt index d0c3afb9..585accf0 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/jsonToRoot.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/jsonToRoot.kt @@ -25,10 +25,10 @@ private fun jsonRootDeserializer(tSerializer: KSerializer, builder: (Json /** * Load Json encoded TObject */ -public fun TObject.Companion.decodeFromJson(serializer: KSerializer, jsonElement: JsonElement): TObject = +public fun TObject.Companion.decodeFromJson(serializer: KSerializer, jsonElement: JsonElement): T = RootDecoder.decode(serializer, jsonElement) -public fun TObject.Companion.decodeFromString(serializer: KSerializer, string: String): TObject { +public fun TObject.Companion.decodeFromString(serializer: KSerializer, string: String): T { val json = RootDecoder.json.parseToJsonElement(string) return RootDecoder.decode(serializer, json) } @@ -49,12 +49,14 @@ private object RootDecoder { //Forward ref for shapes when (tSerializer.descriptor.serialName) { "TGeoShape" -> return TGeoShapeRef { - //Should be not null at the moment of actualization - refCache[refId].value as TGeoShape + refCache[refId].getOrPutValue { + input.json.decodeFromJsonElement(tSerializer, it) as TGeoShape + } } as T "TGeoVolumeAssembly" -> return TGeoVolumeAssemblyRef { - //Should be not null at the moment of actualization - refCache[refId].value as TGeoVolumeAssembly + refCache[refId].getOrPutValue { + input.json.decodeFromJsonElement(tSerializer, it) as TGeoVolumeAssembly + } } as T //Do unref else -> refCache[refId] @@ -138,7 +140,7 @@ private object RootDecoder { } - fun decode(sourceDeserializer: KSerializer, source: JsonElement): TObject { + fun decode(sourceDeserializer: KSerializer, source: JsonElement): T { val refCache = ArrayList() fun fillCache(element: JsonElement) { diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootToSolid.kt index ebfb7b06..9cbbb64b 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootToSolid.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootToSolid.kt @@ -2,7 +2,7 @@ package ru.mipt.npm.root import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName -import space.kscience.visionforge.setPropertyNode +import space.kscience.dataforge.names.plus import space.kscience.visionforge.solid.* import kotlin.math.PI import kotlin.math.atan2 @@ -19,158 +19,162 @@ private operator fun Number.times(f: Float) = toFloat() * f private fun degToRad(d: Double) = d * PI / 180.0 -private class GdmlLoader { +// converting to XYZ to Tait–Bryan angles according to https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix +private fun Solid.rotate(rot: DoubleArray) { + val xAngle = atan2(-rot[5], rot[8]) + val yAngle = atan2(rot[2], sqrt(1.0 - rot[2].pow(2))) + val zAngle = atan2(-rot[1], rot[0]) + rotation = Point3D(xAngle, yAngle, zAngle) +} - // converting to XYZ to Tait–Bryan angles according to https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix - private fun Solid.rotate(rot: DoubleArray) { - val xAngle = atan2(-rot[5], rot[8]) - val yAngle = atan2(rot[2], sqrt(1.0 - rot[2].pow(2))) - val zAngle = atan2(-rot[1], rot[0]) - rotation = Point3D(xAngle, yAngle, zAngle) - } +private fun Solid.translate(trans: DoubleArray) { + val (x, y, z) = trans + position = Point3D(x, y, z) +} - private fun Solid.translate(trans: DoubleArray) { - val (x, y, z) = trans - position = Point3D(x, y, z) - } - - private fun Solid.useMatrix(matrix: TGeoMatrix?) { - when (matrix) { - null, is TGeoIdentity -> { - //do nothing - } - is TGeoTranslation -> { - translate(matrix.fTranslation) - } - is TGeoRotation -> { - rotate(matrix.fRotationMatrix) - } - is TGeoCombiTrans -> { - translate(matrix.fTranslation) - matrix.fRotation?.let { rotate(it.fRotationMatrix) } - } - is TGeoHMatrix -> { - translate(matrix.fTranslation) - rotate(matrix.fRotationMatrix) - val (xScale, yScale, zScale) = matrix.fScale - scale = Point3D(xScale, yScale, zScale) - } +private fun Solid.useMatrix(matrix: TGeoMatrix?) { + when (matrix) { + null, is TGeoIdentity -> { + //do nothing + } + is TGeoTranslation -> { + translate(matrix.fTranslation) + } + is TGeoRotation -> { + rotate(matrix.fRotationMatrix) + } + is TGeoCombiTrans -> { + translate(matrix.fTranslation) + matrix.fRotation?.let { rotate(it.fRotationMatrix) } + } + is TGeoHMatrix -> { + translate(matrix.fTranslation) + rotate(matrix.fRotationMatrix) + val (xScale, yScale, zScale) = matrix.fScale + scale = Point3D(xScale, yScale, zScale) } } +} - fun SolidGroup.addShape(shape: TGeoShape) { - when (shape) { - is TGeoShapeRef -> addShape(shape.value) - is TGeoCompositeShape -> { - val bool: TGeoBoolNode = shape.fNode - val compositeType = when (bool) { - is TGeoIntersection -> CompositeType.INTERSECT - is TGeoSubtraction -> CompositeType.SUBTRACT - is TGeoUnion -> CompositeType.UNION +private fun SolidGroup.addShape(shape: TGeoShape) { + when (shape) { + is TGeoShapeRef -> addShape(shape.value) + is TGeoCompositeShape -> { + val bool: TGeoBoolNode = shape.fNode + val compositeType = when (bool) { + is TGeoIntersection -> CompositeType.INTERSECT + is TGeoSubtraction -> CompositeType.SUBTRACT + is TGeoUnion -> CompositeType.UNION + } + composite(compositeType, name = shape.fName) { + addShape(bool.fLeft).apply { + useMatrix(bool.fLeftMat) } - composite(compositeType, name = shape.fName) { - addShape(bool.fLeft).apply { - useMatrix(bool.fLeftMat) - } - addShape(bool.fRight).apply { - useMatrix(bool.fRightMat) - } + addShape(bool.fRight).apply { + useMatrix(bool.fRightMat) } } - is TGeoXtru -> extruded(name = shape.fName) { - - (0 until shape.fNvert).forEach { index -> - shape { - point(shape.fX[index], shape.fY[index]) - } - } - - (0 until shape.fNz).forEach { index -> - layer( - shape.fZ[index], - shape.fX0[index], - shape.fY0[index], - shape.fScale[index] - ) - } - } - is TGeoTube -> tube( - radius = shape.fRmax, - height = shape.fDz * 2, - innerRadius = shape.fRmin, - name = shape.fName - ) - is TGeoTubeSeg -> tube( - radius = shape.fRmax, - height = shape.fDz * 2, - innerRadius = shape.fRmin, - startAngle = degToRad(shape.fPhi1), - angle = degToRad(shape.fPhi2 - shape.fPhi1), - name = shape.fName - ) - is TGeoPcon -> TODO() - is TGeoPgon -> TODO() - is TGeoShapeAssembly -> volume(shape.fVolume) - is TGeoBBox -> box(shape.fDX * 2, shape.fDY * 2, shape.fDZ * 2, name = shape.fName) } - } + is TGeoXtru -> extruded(name = shape.fName) { - fun SolidGroup.node(obj: TGeoNode) { - if (obj.fVolume != null) { - volume(obj.fVolume).apply { - when (obj) { - is TGeoNodeMatrix -> { - useMatrix(obj.fMatrix) - } - is TGeoNodeOffset -> { - x = obj.fOffset - } + (0 until shape.fNvert).forEach { index -> + shape { + point(shape.fX[index], shape.fY[index]) + } + } + + (0 until shape.fNz).forEach { index -> + layer( + shape.fZ[index], + shape.fX0[index], + shape.fY0[index], + shape.fScale[index] + ) + } + } + is TGeoTube -> tube( + radius = shape.fRmax, + height = shape.fDz * 2, + innerRadius = shape.fRmin, + name = shape.fName + ) + is TGeoTubeSeg -> tube( + radius = shape.fRmax, + height = shape.fDz * 2, + innerRadius = shape.fRmin, + startAngle = degToRad(shape.fPhi1), + angle = degToRad(shape.fPhi2 - shape.fPhi1), + name = shape.fName + ) + is TGeoPcon -> TODO() + is TGeoPgon -> TODO() + is TGeoShapeAssembly -> volume(shape.fVolume) + is TGeoBBox -> box(shape.fDX * 2, shape.fDY * 2, shape.fDZ * 2, name = shape.fName) + } +} + +private fun SolidGroup.node(obj: TGeoNode) { + if (obj.fVolume != null) { + volume(obj.fVolume).apply { + when (obj) { + is TGeoNodeMatrix -> { + useMatrix(obj.fMatrix) + } + is TGeoNodeOffset -> { + x = obj.fOffset } } } } +} - fun buildGroup(volume: TGeoVolume): SolidGroup { - return if (volume is TGeoVolumeAssemblyRef) { - buildGroup(volume.value) - } else { - SolidGroup { - volume.fShape?.let { addShape(it) } - volume.fNodes?.let { - it.arr.forEach { obj -> - node(obj) - } +private fun buildGroup(volume: TGeoVolume): SolidGroup { + return if (volume is TGeoVolumeAssemblyRef) { + buildGroup(volume.value) + } else { + SolidGroup { + volume.fShape?.let { addShape(it) } + volume.fNodes?.let { + it.arr.forEach { obj -> + node(obj) } } } } +} - private val SolidGroup.rootPrototypes: SolidGroup get() = (parent as? SolidGroup)?.rootPrototypes ?: this +private val SolidGroup.rootPrototypes: SolidGroup get() = (parent as? SolidGroup)?.rootPrototypes ?: this - fun SolidGroup.volume(volume: TGeoVolume): SolidGroup { - val group = buildGroup(volume) - val ref = rootPrototypes.prototypes { +private fun SolidGroup.volume(volume: TGeoVolume, cache: Boolean = true): Solid { + val group = buildGroup(volume) + return if (!cache) { + group + } else newRef( + name = volume.fName.ifEmpty { null }, + obj = group, + prototypeHolder = rootPrototypes, + templateName = volumesName + Name.parse(volume.fName.ifEmpty { group.toString() }) + ) +} - } - set(volume.fName.ifEmpty { null }?.asName(), group) - return group +// private fun load(geo: TGeoManager): SolidGroup { +//// /** +//// * A special group for local templates +//// */ +//// val proto = SolidGroup() +//// +//// val solids = proto.group(solidsName) { +//// setPropertyNode("edges.enabled", false) +//// } +//// +//// val volumes = proto.group(volumesName) +//// +//// val referenceStore = HashMap>() +// } + + +public fun TGeoManager.toSolid(): SolidGroup = SolidGroup { + fNodes.arr.forEach { + node(it) } - - fun load(geo: TGeoManager): SolidGroup { - /** - * A special group for local templates - */ - val proto = SolidGroup() - - val solids = proto.group(solidsName) { - setPropertyNode("edges.enabled", false) - } - - val volumes = proto.group(volumesName) - - val referenceStore = HashMap>() - - TODO() - } - } \ No newline at end of file diff --git a/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt b/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt index c6cec829..7d5f4b24 100644 --- a/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt +++ b/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt @@ -31,7 +31,9 @@ fun main() { val time = measureTimeMillis { val geo = TObject.decodeFromString(TGeoManager.serializer(), string) - println(geo) + val solid = geo.toSolid() + + println(solid) } println(Duration.ofMillis(time)) diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt index d2080924..f58bcf8b 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt @@ -158,21 +158,28 @@ public fun SolidGroup.ref( name: String? = null, ): SolidReferenceGroup = SolidReferenceGroup(templateName).also { set(name, it) } -/** - * Add new [SolidReferenceGroup] wrapping given object and automatically adding it to the prototypes - */ public fun SolidGroup.ref( - name: String, + templateName: String, + name: String? = null, +): SolidReferenceGroup = ref(Name.parse(templateName), name) + +/** + * Add new [SolidReferenceGroup] wrapping given object and automatically adding it to the prototypes. + * One must ensure that [prototypeHolder] is the owner of this group. + */ +public fun SolidGroup.newRef( + name: String?, obj: Solid, - templateName: Name = Name.parse(name), + prototypeHolder: PrototypeHolder = this, + templateName: Name = Name.parse(name ?: obj.toString()), ): SolidReferenceGroup { val existing = getPrototype(templateName) if (existing == null) { - prototypes { - this[templateName] = obj + prototypeHolder.prototypes { + set(templateName, obj) } } else if (existing != obj) { error("Can't add different prototype on top of existing one") } - return this@ref.ref(templateName, name) + return ref(templateName, name) } diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt index 8f5c3f57..f8af54a0 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SerializationTest.kt @@ -16,7 +16,7 @@ fun SolidGroup.refGroup( block: MutableVisionGroup.() -> Unit ): SolidReferenceGroup { val group = SolidGroup().apply(block) - return ref(name, group, templateName) + return newRef(name, group, templateName = templateName) } @@ -42,7 +42,7 @@ class SerializationTest { z = -100 } val group = SolidGroup { - ref("cube", cube) + newRef("cube", cube) refGroup("pg", Name.parse("pg.content")) { sphere(50) { x = -100 diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidReferenceTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidReferenceTest.kt index 2f8b7781..cfdd73f0 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidReferenceTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidReferenceTest.kt @@ -14,7 +14,7 @@ class SolidReferenceTest { val theStyle by style { SolidMaterial.MATERIAL_COLOR_KEY put "red" } - ref("test", Box(100f,100f,100f).apply { + newRef("test", Box(100f,100f,100f).apply { color("blue") useStyle(theStyle) }) From 68704086e9564689433d2db4112a1d4514bcf3f1 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Thu, 26 Aug 2021 09:52:35 +0300 Subject: [PATCH 071/109] WIP Root to Solid conversion --- .../kotlin/ru/mipt/npm/root/TGeoManager.kt | 8 +++---- .../kotlin/ru/mipt/npm/root/jsonToRoot.kt | 23 ++++++++++--------- .../kotlin/ru/mipt/npm/root/rootToSolid.kt | 15 ++++++++---- .../kotlin/ru/mipt/npm/root/loadBMN.kt | 6 ++--- 4 files changed, 30 insertions(+), 22 deletions(-) diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt index 41607fbd..8b2c3c26 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt @@ -9,14 +9,14 @@ import kotlinx.serialization.Serializable public class TGeoManager : TNamed() { @Contextual - public val fMatrices: TObjArray = TObjArray.getEmpty() + public val fMatrices: TObjArray<@Contextual TGeoMatrix> = TObjArray.getEmpty() @Contextual - public val fShapes: TObjArray = TObjArray.getEmpty() + public val fShapes: TObjArray<@Contextual TGeoShape> = TObjArray.getEmpty() @Contextual - public val fVolumes: TObjArray = TObjArray.getEmpty() + public val fVolumes: TObjArray<@Contextual TGeoVolume> = TObjArray.getEmpty() @Contextual - public val fNodes: TObjArray = TObjArray.getEmpty() + public val fNodes: TObjArray<@Contextual TGeoNode> = TObjArray.getEmpty() } diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/jsonToRoot.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/jsonToRoot.kt index 585accf0..1b7fe798 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/jsonToRoot.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/jsonToRoot.kt @@ -81,19 +81,19 @@ private object RootDecoder { ): SerializersModule = SerializersModule { include(serializersModule) - contextual(TGeoManager.serializer().unref(refCache)) + //contextual(TGeoManager.serializer().unref(refCache)) contextual(TObjArray::class) { TObjArray.serializer(it[0]).unref(refCache) } - contextual(TGeoVolumeAssembly.serializer().unref(refCache)) - contextual(TGeoShapeAssembly.serializer().unref(refCache)) + //contextual(TGeoVolumeAssembly.serializer().unref(refCache)) + //contextual(TGeoShapeAssembly.serializer().unref(refCache)) contextual(TGeoRotation.serializer().unref(refCache)) contextual(TGeoMedium.serializer().unref(refCache)) - contextual(TGeoVolume.serializer().unref(refCache)) - contextual(TGeoMatrix.serializer().unref(refCache)) - contextual(TGeoNode.serializer().unref(refCache)) - contextual(TGeoNodeOffset.serializer().unref(refCache)) - contextual(TGeoNodeMatrix.serializer().unref(refCache)) - contextual(TGeoShape.serializer().unref(refCache)) - contextual(TObject.serializer().unref(refCache)) + //contextual(TGeoVolume.serializer().unref(refCache)) + //contextual(TGeoMatrix.serializer().unref(refCache)) + //contextual(TGeoNode.serializer().unref(refCache)) + //contextual(TGeoNodeOffset.serializer().unref(refCache)) + //contextual(TGeoNodeMatrix.serializer().unref(refCache)) + //contextual(TGeoShape.serializer().unref(refCache)) + //contextual(TObject.serializer().unref(refCache)) polymorphicDefault(TGeoShape::class) { @@ -245,7 +245,8 @@ private object RootDecoder { subclass(TGeoNodeOffset.serializer()) } - polymorphic(TGeoVolume::class, TGeoVolume.serializer()) { + polymorphic(TGeoVolume::class) { + subclass(TGeoVolume.serializer()) subclass(TGeoVolumeAssembly.serializer()) } } diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootToSolid.kt index 9cbbb64b..ee14324d 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootToSolid.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootToSolid.kt @@ -115,7 +115,7 @@ private fun SolidGroup.addShape(shape: TGeoShape) { private fun SolidGroup.node(obj: TGeoNode) { if (obj.fVolume != null) { - volume(obj.fVolume).apply { + volume(obj.fVolume, obj.fName).apply { when (obj) { is TGeoNodeMatrix -> { useMatrix(obj.fMatrix) @@ -145,15 +145,22 @@ private fun buildGroup(volume: TGeoVolume): SolidGroup { private val SolidGroup.rootPrototypes: SolidGroup get() = (parent as? SolidGroup)?.rootPrototypes ?: this -private fun SolidGroup.volume(volume: TGeoVolume, cache: Boolean = true): Solid { +private fun SolidGroup.volume(volume: TGeoVolume, name: String? = null, cache: Boolean = true): Solid { val group = buildGroup(volume) + val combinedName = if (volume.fName.isEmpty()) { + name + } else if (name == null) { + volume.fName + } else { + "${name}_${volume.fName}" + } return if (!cache) { group } else newRef( - name = volume.fName.ifEmpty { null }, + name = combinedName, obj = group, prototypeHolder = rootPrototypes, - templateName = volumesName + Name.parse(volume.fName.ifEmpty { group.toString() }) + templateName = volumesName + Name.parse(combinedName ?: "volume[${group.hashCode()}]") ) } diff --git a/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt b/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt index 7d5f4b24..7fcd1e22 100644 --- a/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt +++ b/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt @@ -1,12 +1,12 @@ package ru.mipt.npm.root import kotlinx.serialization.json.* +import space.kscience.visionforge.solid.Solids import java.time.Duration import kotlin.system.measureTimeMillis private fun JsonElement.countTypes(): Sequence = sequence { - val json = this@countTypes - when (json){ + when (val json = this@countTypes){ is JsonObject -> { json["_typename"]?.let { yield(it.jsonPrimitive.content) } json.values.forEach { yieldAll(it.countTypes()) } @@ -33,7 +33,7 @@ fun main() { val geo = TObject.decodeFromString(TGeoManager.serializer(), string) val solid = geo.toSolid() - println(solid) + println(Solids.encodeToString(solid)) } println(Duration.ofMillis(time)) From 7b5faaa61e9ef77f196d0c1dd0ca7d6800fcd633 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Mon, 30 Aug 2021 12:58:41 +0300 Subject: [PATCH 072/109] dynamic root scheme parser --- .../kotlin/ru/mipt/npm/root/TGeoManager.kt | 22 -- .../kotlin/ru/mipt/npm/root/TObjectScheme.kt | 140 ++++++++++ .../kotlin/ru/mipt/npm/root/jsonToRoot.kt | 261 ------------------ .../ru/mipt/npm/root/rootSchemeToSolid.kt | 217 +++++++++++++++ .../npm/root/serialization/TGeoManager.kt | 17 ++ .../root/{ => serialization}/TGeoMaterial.kt | 2 +- .../root/{ => serialization}/TGeoMatrix.kt | 2 +- .../root/{ => serialization}/TGeoMedium.kt | 2 +- .../npm/root/{ => serialization}/TGeoNode.kt | 4 +- .../npm/root/{ => serialization}/TGeoShape.kt | 2 +- .../root/{ => serialization}/TGeoVolume.kt | 4 +- .../npm/root/{ => serialization}/TObject.kt | 2 +- .../mipt/npm/root/serialization/jsonToRoot.kt | 235 ++++++++++++++++ .../root/{ => serialization}/rootToSolid.kt | 2 +- .../kotlin/ru/mipt/npm/root/loadBMN.kt | 32 ++- gradle.properties | 2 - 16 files changed, 641 insertions(+), 305 deletions(-) delete mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObjectScheme.kt delete mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/jsonToRoot.kt create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootSchemeToSolid.kt create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoManager.kt rename cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/{ => serialization}/TGeoMaterial.kt (72%) rename cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/{ => serialization}/TGeoMatrix.kt (94%) rename cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/{ => serialization}/TGeoMedium.kt (85%) rename cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/{ => serialization}/TGeoNode.kt (89%) rename cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/{ => serialization}/TGeoShape.kt (98%) rename cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/{ => serialization}/TGeoVolume.kt (91%) rename cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/{ => serialization}/TObject.kt (94%) create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/jsonToRoot.kt rename cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/{ => serialization}/rootToSolid.kt (99%) diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt deleted file mode 100644 index 8b2c3c26..00000000 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoManager.kt +++ /dev/null @@ -1,22 +0,0 @@ -package ru.mipt.npm.root - -import kotlinx.serialization.Contextual -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable - -@Serializable -@SerialName("TGeoManager") -public class TGeoManager : TNamed() { - - @Contextual - public val fMatrices: TObjArray<@Contextual TGeoMatrix> = TObjArray.getEmpty() - - @Contextual - public val fShapes: TObjArray<@Contextual TGeoShape> = TObjArray.getEmpty() - - @Contextual - public val fVolumes: TObjArray<@Contextual TGeoVolume> = TObjArray.getEmpty() - - @Contextual - public val fNodes: TObjArray<@Contextual TGeoNode> = TObjArray.getEmpty() -} diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObjectScheme.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObjectScheme.kt new file mode 100644 index 00000000..0ec699bd --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObjectScheme.kt @@ -0,0 +1,140 @@ +package ru.mipt.npm.root + +import kotlinx.serialization.json.Json +import space.kscience.dataforge.meta.* +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.asName +import kotlin.properties.ReadOnlyProperty + +public typealias RefCache = List + +public interface ObjectRef { + public fun resolve(refCache: RefCache): T? +} + +private class ChildObjectRef( + val spec: Specification, + val metaProvider: () -> Meta? +) : ObjectRef { + override fun resolve(refCache: RefCache): T? { + val meta = metaProvider() ?: return null + meta["\$ref"]?.int?.let { refId -> + return spec.read(refCache[refId]) + } + return spec.read(meta) + } +} + +public fun List>.resolve(refCache: RefCache): List = map { it.resolve(refCache)!! } + + +public open class TObjectScheme : Scheme() { + + public val typename: String by string(key = "_typename".asName()) { error("Type is not defined") } + + internal fun tObjectArray( + spec: Specification + ): ReadOnlyProperty>> = ReadOnlyProperty { _, property -> + meta.getIndexed(Name.of(property.name, "arr")).values.map { ChildObjectRef(spec){it} } + } + + internal fun refSpec( + spec: Specification, + key: Name? = null + ): ReadOnlyProperty> = ReadOnlyProperty { _, property -> + ChildObjectRef(spec) { meta[key ?: property.name.asName()] } + } + + public companion object : SchemeSpec(::TObjectScheme) +} + +public open class TNamedScheme : TObjectScheme() { + public val fName: String by string("") + public val fTitle: String by string("") + + public companion object : SchemeSpec(::TNamedScheme) +} + +public class TGeoMaterialScheme : TNamedScheme() { + + public companion object : SchemeSpec(::TGeoMaterialScheme) +} + +public class TGeoMediumScheme : TNamedScheme() { + public val fMaterial: ObjectRef by refSpec(TGeoMaterialScheme) + public val fParams: DoubleArray by doubleArray() + + public companion object : SchemeSpec(::TGeoMediumScheme) +} + +public class TGeoShapeScheme : TNamedScheme() { + public val fDX: Double by double(0.0) + public val fDY: Double by double(0.0) + public val fDZ: Double by double(0.0) + + public companion object : SchemeSpec(::TGeoShapeScheme) +} + +public class TGeoVolumeScheme : TNamedScheme() { + public val fNodes: List> by tObjectArray(TGeoNodeScheme) + public val fShape: ObjectRef by refSpec(TGeoShapeScheme) + public val fMedium: ObjectRef by refSpec(TGeoMediumScheme) + + public companion object : SchemeSpec(::TGeoVolumeScheme) +} + +public class TGeoNodeScheme : TNamedScheme() { + public val fVolume: ObjectRef by refSpec(TGeoVolumeScheme) + + public companion object : SchemeSpec(::TGeoNodeScheme) +} + +public class TGeoMatrixScheme : TNamedScheme() { + public companion object : SchemeSpec(::TGeoMatrixScheme) +} + + +public class TGeoBoolNodeScheme : TObjectScheme() { + public val fLeft: ObjectRef by refSpec(TGeoShapeScheme) + public val fLeftMat: ObjectRef by refSpec(TGeoMatrixScheme) + + public val fRight: ObjectRef by refSpec(TGeoShapeScheme) + public val fRightMat: ObjectRef by refSpec(TGeoMatrixScheme) + + public companion object : SchemeSpec(::TGeoBoolNodeScheme) +} + + +public class TGeoManagerScheme : TNamedScheme() { + public val fMatrices: List> by tObjectArray(TGeoMatrixScheme) + + public val fShapes: List> by tObjectArray(TGeoShapeScheme) + + public val fVolumes: List> by tObjectArray(TGeoVolumeScheme) + + public val fNodes: List> by tObjectArray(TGeoNodeScheme) + + public val refCache: List by lazy { + val res = ArrayList(4096) + fun fillCache(element: Meta) { + if(element["\$ref"] == null) { + res.add(element) + element.items.values.forEach { + if (!it.isLeaf) { + fillCache(it) + } + } + } + } + fillCache(meta) + res + } + + public companion object : SchemeSpec(::TGeoManagerScheme) { + + public fun parse(string: String): TGeoManagerScheme { + val meta = Json.decodeFromString(MetaSerializer, string) + return read(meta) + } + } +} diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/jsonToRoot.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/jsonToRoot.kt deleted file mode 100644 index 1b7fe798..00000000 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/jsonToRoot.kt +++ /dev/null @@ -1,261 +0,0 @@ -package ru.mipt.npm.root - -import kotlinx.serialization.DeserializationStrategy -import kotlinx.serialization.ExperimentalSerializationApi -import kotlinx.serialization.KSerializer -import kotlinx.serialization.descriptors.SerialDescriptor -import kotlinx.serialization.encoding.Decoder -import kotlinx.serialization.json.* -import kotlinx.serialization.modules.* - - -private fun jsonRootDeserializer(tSerializer: KSerializer, builder: (JsonElement) -> T): DeserializationStrategy = object : - DeserializationStrategy { - private val jsonElementSerializer = JsonElement.serializer() - - override val descriptor: SerialDescriptor - get() = jsonElementSerializer.descriptor - - override fun deserialize(decoder: Decoder): T { - val json = decoder.decodeSerializableValue(jsonElementSerializer) - return builder(json) - } -} - -/** - * Load Json encoded TObject - */ -public fun TObject.Companion.decodeFromJson(serializer: KSerializer, jsonElement: JsonElement): T = - RootDecoder.decode(serializer, jsonElement) - -public fun TObject.Companion.decodeFromString(serializer: KSerializer, string: String): T { - val json = RootDecoder.json.parseToJsonElement(string) - return RootDecoder.decode(serializer, json) -} - -private object RootDecoder { - - private class RootUnrefSerializer( - private val tSerializer: KSerializer, - private val refCache: List, - ) : KSerializer by tSerializer { - - override fun deserialize(decoder: Decoder): T { - val input = decoder as JsonDecoder - val element = input.decodeJsonElement() - val refId = (element as? JsonObject)?.get("\$ref")?.jsonPrimitive?.int - val ref = if (refId != null) { - //println("Substituting ${tSerializer.descriptor.serialName} ref $refId") - //Forward ref for shapes - when (tSerializer.descriptor.serialName) { - "TGeoShape" -> return TGeoShapeRef { - refCache[refId].getOrPutValue { - input.json.decodeFromJsonElement(tSerializer, it) as TGeoShape - } - } as T - "TGeoVolumeAssembly" -> return TGeoVolumeAssemblyRef { - refCache[refId].getOrPutValue { - input.json.decodeFromJsonElement(tSerializer, it) as TGeoVolumeAssembly - } - } as T - //Do unref - else -> refCache[refId] - } - } else { - refCache.find { it.element == element } ?: error("Element '$element' not found in the cache") - } - - return ref.getOrPutValue { -// val actualTypeName = it.jsonObject["_typename"]?.jsonPrimitive?.content - input.json.decodeFromJsonElement(tSerializer, it) - } - } - } - - private fun KSerializer.unref(refCache: List): KSerializer = - RootUnrefSerializer(this, refCache) - - @OptIn(ExperimentalSerializationApi::class) - fun unrefSerializersModule( - refCache: List - ): SerializersModule = SerializersModule { - include(serializersModule) - - //contextual(TGeoManager.serializer().unref(refCache)) - contextual(TObjArray::class) { TObjArray.serializer(it[0]).unref(refCache) } - //contextual(TGeoVolumeAssembly.serializer().unref(refCache)) - //contextual(TGeoShapeAssembly.serializer().unref(refCache)) - contextual(TGeoRotation.serializer().unref(refCache)) - contextual(TGeoMedium.serializer().unref(refCache)) - //contextual(TGeoVolume.serializer().unref(refCache)) - //contextual(TGeoMatrix.serializer().unref(refCache)) - //contextual(TGeoNode.serializer().unref(refCache)) - //contextual(TGeoNodeOffset.serializer().unref(refCache)) - //contextual(TGeoNodeMatrix.serializer().unref(refCache)) - //contextual(TGeoShape.serializer().unref(refCache)) - //contextual(TObject.serializer().unref(refCache)) - - - polymorphicDefault(TGeoShape::class) { - if (it == null) { - TGeoShape.serializer().unref(refCache) - } else { - error("Unrecognized shape $it") - } - } - - polymorphicDefault(TGeoMatrix::class) { - if (it == null) { - TGeoMatrix.serializer().unref(refCache) - } else { - error("Unrecognized matrix $it") - } - } - - polymorphicDefault(TGeoVolume::class) { - if (it == null) { - TGeoVolume.serializer().unref(refCache) - } else { - error("Unrecognized volume $it") - } - } - - polymorphicDefault(TGeoNode::class) { - if (it == null) { - TGeoNode.serializer().unref(refCache) - } else { - error("Unrecognized node $it") - } - } - } - - /** - * Create an instance of Json with unfolding Root references. This instance could not be reused because of the cache. - */ - private fun unrefJson(refCache: MutableList): Json = Json { - encodeDefaults = true - ignoreUnknownKeys = true - classDiscriminator = "_typename" - serializersModule = unrefSerializersModule(refCache) - } - - - fun decode(sourceDeserializer: KSerializer, source: JsonElement): T { - val refCache = ArrayList() - - fun fillCache(element: JsonElement) { - when (element) { - is JsonObject -> { - if (element["_typename"] != null) { - refCache.add(RefEntry(element)) - } - element.values.forEach { - fillCache(it) - } - } - is JsonArray -> { - element.forEach { - fillCache(it) - } - } - else -> { - //ignore primitives - } - } - } - fillCache(source) - - return unrefJson(refCache).decodeFromJsonElement(sourceDeserializer.unref(refCache), source) - } - - class RefEntry(val element: JsonElement) { - - var value: Any? = null - - fun getOrPutValue(builder: (JsonElement) -> T): T { - if (value == null) { - value = builder(element) - } - return value as T - } - - override fun toString(): String = element.toString() - } - - private fun PolymorphicModuleBuilder.shapes() { - subclass(TGeoBBox.serializer()) - subclass(TGeoCompositeShape.serializer()) - subclass(TGeoXtru.serializer()) - subclass(TGeoTube.serializer()) - subclass(TGeoTubeSeg.serializer()) - subclass(TGeoPcon.serializer()) - subclass(TGeoPgon.serializer()) - subclass(TGeoShapeAssembly.serializer()) - } - - private fun PolymorphicModuleBuilder.matrices() { - subclass(TGeoIdentity.serializer()) - subclass(TGeoHMatrix.serializer()) - subclass(TGeoTranslation.serializer()) - subclass(TGeoRotation.serializer()) - subclass(TGeoCombiTrans.serializer()) - } - - private fun PolymorphicModuleBuilder.boolNodes() { - subclass(TGeoIntersection.serializer()) - subclass(TGeoUnion.serializer()) - subclass(TGeoSubtraction.serializer()) - } - - private val serializersModule = SerializersModule { - -// polymorphic(TObject::class) { -// default { JsonRootSerializer } -// -// shapes() -// matrices() -// boolNodes() -// -// subclass(TGeoMaterial.serializer()) -// subclass(TGeoMixture.serializer()) -// -// subclass(TGeoMedium.serializer()) -// -// //subclass(TGeoNode.serializer()) -// subclass(TGeoNodeMatrix.serializer()) -// subclass(TGeoVolume.serializer()) -// subclass(TGeoVolumeAssembly.serializer()) -// subclass(TGeoManager.serializer()) -// } - - polymorphic(TGeoShape::class) { - shapes() - } - - polymorphic(TGeoMatrix::class) { - matrices() - } - - polymorphic(TGeoBoolNode::class) { - boolNodes() - } - - polymorphic(TGeoNode::class) { - subclass(TGeoNodeMatrix.serializer()) - subclass(TGeoNodeOffset.serializer()) - } - - polymorphic(TGeoVolume::class) { - subclass(TGeoVolume.serializer()) - subclass(TGeoVolumeAssembly.serializer()) - } - } - - val json = Json { - encodeDefaults = true - ignoreUnknownKeys = true - classDiscriminator = "_typename" - serializersModule = this@RootDecoder.serializersModule - } - -} \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootSchemeToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootSchemeToSolid.kt new file mode 100644 index 00000000..89849613 --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootSchemeToSolid.kt @@ -0,0 +1,217 @@ +package ru.mipt.npm.root + +import space.kscience.dataforge.meta.* +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.asName +import space.kscience.dataforge.names.plus +import space.kscience.visionforge.solid.* +import kotlin.math.PI +import kotlin.math.atan2 +import kotlin.math.pow +import kotlin.math.sqrt + +private val solidsName = "solids".asName() +private val volumesName = "volumes".asName() + +private operator fun Number.times(d: Double) = toDouble() * d + +private operator fun Number.times(f: Float) = toFloat() * f + +private fun degToRad(d: Double) = d * PI / 180.0 + +// converting to XYZ to Tait–Bryan angles according to https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix +private fun Solid.rotate(rot: DoubleArray) { + val xAngle = atan2(-rot[5], rot[8]) + val yAngle = atan2(rot[2], sqrt(1.0 - rot[2].pow(2))) + val zAngle = atan2(-rot[1], rot[0]) + rotation = Point3D(xAngle, yAngle, zAngle) +} + +private fun Solid.translate(trans: DoubleArray) { + val (x, y, z) = trans + position = Point3D(x, y, z) +} + +private fun Solid.useMatrix(matrix: TGeoMatrixScheme?) { + if (matrix == null) return + when (matrix.typename) { + "TGeoIdentity" -> { + //do nothing + } + "TGeoTranslation" -> { + val fTranslation by matrix.doubleArray() + translate(fTranslation) + } + "TGeoRotation" -> { + val fRotationMatrix by matrix.doubleArray() + rotate(fRotationMatrix) + } + "TGeoCombiTrans" -> { + val fTranslation by matrix.doubleArray() + + translate(fTranslation) + if (matrix.meta["fRotationMatrix"] != null) { + val fRotationMatrix by matrix.doubleArray() + rotate(fRotationMatrix) + } + } + "TGeoHMatrix" -> { + val fTranslation by matrix.doubleArray() + val fRotationMatrix by matrix.doubleArray() + val fScale by matrix.doubleArray() + translate(fTranslation) + rotate(fRotationMatrix) + scale = Point3D(fScale[0], fScale[1], fScale[2]) + } + } +} + +private fun SolidGroup.addShape(shape: TGeoShapeScheme, refCache: RefCache) { + when (shape.typename) { + "TGeoCompositeShape" -> { + val bool by shape.spec(TGeoBoolNodeScheme) + val compositeType = when (bool.typename) { + "TGeoIntersection" -> CompositeType.INTERSECT + "TGeoSubtraction" -> CompositeType.SUBTRACT + "TGeoUnion" -> CompositeType.UNION + else -> error("Unknown bool node type ${bool.typename}") + } + composite(compositeType, name = shape.fName) { + addShape(bool.fLeft.resolve(refCache)!!, refCache).apply { + useMatrix(bool.fLeftMat.resolve(refCache)) + } + addShape(bool.fRight.resolve(refCache)!!, refCache).apply { + useMatrix(bool.fRightMat.resolve(refCache)) + } + } + } + "TGeoXtru" -> { + val fNvert by shape.meta.int(0) + val fX by shape.meta.doubleArray() + val fY by shape.meta.doubleArray() + val fNz by shape.meta.int(0) + val fZ by shape.meta.doubleArray() + val fX0 by shape.meta.doubleArray() + val fY0 by shape.meta.doubleArray() + val fScale by shape.meta.doubleArray() + + extruded(name = shape.fName) { + (0 until fNvert).forEach { index -> + shape { + point(fX[index], fY[index]) + } + } + + (0 until fNz).forEach { index -> + layer( + fZ[index], + fX0[index], + fY0[index], + fScale[index] + ) + } + } + } + "TGeoTube" -> { + val fRmax by shape.meta.double(0.0) + val fDz by shape.meta.double(0.0) + val fRmin by shape.meta.double(0.0) + + tube( + radius = fRmax, + height = fDz * 2, + innerRadius = fRmin, + name = shape.fName + ) + } + "TGeoTubeSeg" -> { + val fRmax by shape.meta.double(0.0) + val fDz by shape.meta.double(0.0) + val fRmin by shape.meta.double(0.0) + val fPhi1 by shape.meta.double(0.0) + val fPhi2 by shape.meta.double(0.0) + + tube( + radius = fRmax, + height = fDz * 2, + innerRadius = fRmin, + startAngle = degToRad(fPhi1), + angle = degToRad(fPhi2 - fPhi1), + name = shape.fName + ) + } + "TGeoPcon" -> { + TODO() + } + "TGeoPgon" -> { + TODO() + } + "TGeoShapeAssembly" -> { + val fVolume by shape.refSpec(TGeoVolumeScheme) + volume(fVolume.resolve(refCache)!!, refCache) + } + "TGeoBBox" -> { + box(shape.fDX * 2, shape.fDY * 2, shape.fDZ * 2, name = shape.fName) + } + } +} + +private fun SolidGroup.node(obj: TGeoNodeScheme, refCache: RefCache) { + val volume = obj.fVolume.resolve(refCache) + if (volume != null) { + volume(volume, refCache, obj.fName).apply { + when (obj.typename) { + "TGeoNodeMatrix" -> { + val fMatrix by obj.refSpec(TGeoMatrixScheme) + useMatrix(fMatrix.resolve(refCache)) + } + "TGeoNodeOffset" -> { + val fOffset by obj.meta.double(0.0) + x = fOffset + } + } + } + } +} + +private fun buildGroup(volume: TGeoVolumeScheme, refCache: RefCache): SolidGroup = SolidGroup { + volume.fShape.resolve(refCache)?.let { addShape(it, refCache) } + volume.fNodes.let { + it.forEach { obj -> + node(obj.resolve(refCache)!!, refCache) + } + } +} + +private val SolidGroup.rootPrototypes: SolidGroup get() = (parent as? SolidGroup)?.rootPrototypes ?: this + +private fun SolidGroup.volume( + volume: TGeoVolumeScheme, + refCache: RefCache, + name: String? = null, + cache: Boolean = true +): Solid { + val group = buildGroup(volume, refCache) + val combinedName = if (volume.fName.isEmpty()) { + name + } else if (name == null) { + volume.fName + } else { + "${name}_${volume.fName}" + } + return if (!cache) { + set(combinedName?.let { Name.parse(it)},group) + group + } else newRef( + name = combinedName, + obj = group, + prototypeHolder = rootPrototypes, + templateName = volumesName + Name.parse(combinedName ?: "volume[${group.hashCode()}]") + ) +} + +public fun TGeoManagerScheme.toSolid(): SolidGroup = SolidGroup { + fNodes.forEach { + node(it.resolve(refCache)!!, refCache) + } +} \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoManager.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoManager.kt new file mode 100644 index 00000000..59957364 --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoManager.kt @@ -0,0 +1,17 @@ +package ru.mipt.npm.root.serialization + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("TGeoManager") +public class TGeoManager : TNamed() { + + public val fMatrices: TObjArray = TObjArray.getEmpty() + + public val fShapes: TObjArray = TObjArray.getEmpty() + + public val fVolumes: TObjArray = TObjArray.getEmpty() + + public val fNodes: TObjArray = TObjArray.getEmpty() +} diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMaterial.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoMaterial.kt similarity index 72% rename from cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMaterial.kt rename to cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoMaterial.kt index f4883e0e..e13d30b4 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMaterial.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoMaterial.kt @@ -1,4 +1,4 @@ -package ru.mipt.npm.root +package ru.mipt.npm.root.serialization import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMatrix.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoMatrix.kt similarity index 94% rename from cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMatrix.kt rename to cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoMatrix.kt index 0c6ec7ab..63ee38a7 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMatrix.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoMatrix.kt @@ -1,4 +1,4 @@ -package ru.mipt.npm.root +package ru.mipt.npm.root.serialization import kotlinx.serialization.Contextual import kotlinx.serialization.SerialName diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMedium.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoMedium.kt similarity index 85% rename from cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMedium.kt rename to cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoMedium.kt index 72b72c4c..630826e8 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoMedium.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoMedium.kt @@ -1,4 +1,4 @@ -package ru.mipt.npm.root +package ru.mipt.npm.root.serialization import kotlinx.serialization.Contextual import kotlinx.serialization.SerialName diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoNode.kt similarity index 89% rename from cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt rename to cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoNode.kt index 75a8ac05..1babbbfc 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoNode.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoNode.kt @@ -1,4 +1,4 @@ -package ru.mipt.npm.root +package ru.mipt.npm.root.serialization import kotlinx.serialization.Contextual import kotlinx.serialization.SerialName @@ -6,7 +6,7 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("TGeoNode") -public sealed class TGeoNode : TNamed() { +public open class TGeoNode : TNamed() { public val fGeoAtt: UInt = 0u @Contextual diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoShape.kt similarity index 98% rename from cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt rename to cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoShape.kt index 7cf6876a..faf47121 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoShape.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoShape.kt @@ -1,4 +1,4 @@ -package ru.mipt.npm.root +package ru.mipt.npm.root.serialization import kotlinx.serialization.Contextual import kotlinx.serialization.SerialName diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoVolume.kt similarity index 91% rename from cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt rename to cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoVolume.kt index 9823eb1f..77c99e54 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TGeoVolume.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TGeoVolume.kt @@ -1,4 +1,4 @@ -package ru.mipt.npm.root +package ru.mipt.npm.root.serialization import kotlinx.serialization.Contextual import kotlinx.serialization.SerialName @@ -15,7 +15,7 @@ public open class TGeoVolume : TNamed() { public val fFillStyle: Int? = null @Contextual - public val fNodes: TObjArray? = null + public val fNodes: TObjArray<@Contextual TGeoNode>? = null @Contextual public val fShape: TGeoShape? = null diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TObject.kt similarity index 94% rename from cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt rename to cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TObject.kt index 063cadfe..644c05a4 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObject.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/TObject.kt @@ -1,4 +1,4 @@ -package ru.mipt.npm.root +package ru.mipt.npm.root.serialization import kotlinx.serialization.Contextual import kotlinx.serialization.SerialName diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/jsonToRoot.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/jsonToRoot.kt new file mode 100644 index 00000000..94079ccd --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/jsonToRoot.kt @@ -0,0 +1,235 @@ +package ru.mipt.npm.root.serialization + +import kotlinx.serialization.DeserializationStrategy +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.KSerializer +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.json.* +import kotlinx.serialization.modules.SerializersModule +import kotlinx.serialization.modules.contextual +import kotlinx.serialization.modules.polymorphic +import kotlinx.serialization.modules.subclass + + +private fun jsonRootDeserializer( + tSerializer: KSerializer, + builder: (JsonElement) -> T +): DeserializationStrategy = object : + DeserializationStrategy { + private val jsonElementSerializer = JsonElement.serializer() + + override val descriptor: SerialDescriptor + get() = jsonElementSerializer.descriptor + + override fun deserialize(decoder: Decoder): T { + val json = decoder.decodeSerializableValue(jsonElementSerializer) + return builder(json) + } +} + +/** + * Load Json encoded TObject + */ +public fun TObject.decodeFromJson(serializer: KSerializer, jsonElement: JsonElement): T = + RootDecoder.decode(serializer, jsonElement) + +public fun TObject.decodeFromString(serializer: KSerializer, string: String): T { + val json = Json.parseToJsonElement(string) + return RootDecoder.decode(serializer, json) +} + +private object RootDecoder { + + private class RootUnrefSerializer( + private val tSerializer: KSerializer, + private val refCache: List, + ) : KSerializer by tSerializer { + + override fun deserialize(decoder: Decoder): T { + val input = decoder as JsonDecoder + val element = input.decodeJsonElement() + val refId = (element as? JsonObject)?.get("\$ref")?.jsonPrimitive?.int + val ref = if (refId != null) { + println("Substituting ${tSerializer.descriptor.serialName} ref $refId") + //Forward ref for shapes + when (tSerializer.descriptor.serialName) { + "TGeoShape" -> return TGeoShapeRef { + refCache[refId].getOrPutValue { + input.json.decodeFromJsonElement(tSerializer, it) as TGeoShape + } + } as T + + "TGeoVolumeAssembly" -> return TGeoVolumeAssemblyRef { + refCache[refId].getOrPutValue { + input.json.decodeFromJsonElement(tSerializer, it) as TGeoVolumeAssembly + } + } as T + + "TGeoVolume" -> return TGeoVolumeRef { + refCache[refId].getOrPutValue { + input.json.decodeFromJsonElement(tSerializer, it) as TGeoVolume + } + } as T + + //Do unref + else -> refCache[refId] + } + } else { + refCache.find { it.element == element } ?: error("Element '$element' not found in the cache") + } + + return ref.getOrPutValue { +// println("Decoding $it") + val actualTypeName = it.jsonObject["_typename"]?.jsonPrimitive?.content + input.json.decodeFromJsonElement(tSerializer, it) + } + } + } + + private fun KSerializer.unref(refCache: List): KSerializer = RootUnrefSerializer(this, refCache) + + @OptIn(ExperimentalSerializationApi::class) + fun unrefSerializersModule( + refCache: List + ): SerializersModule = SerializersModule { + + contextual(TObjArray::class) { + TObjArray.serializer(it[0]).unref(refCache) + } + + contextual(TGeoMedium.serializer().unref(refCache)) + + polymorphic(TGeoBoolNode::class) { + subclass(TGeoIntersection.serializer().unref(refCache)) + subclass(TGeoUnion.serializer().unref(refCache)) + subclass(TGeoSubtraction.serializer().unref(refCache)) + } + + polymorphic(TGeoShape::class) { + subclass(TGeoBBox.serializer()) + subclass(TGeoXtru.serializer()) + subclass(TGeoTube.serializer()) + subclass(TGeoTubeSeg.serializer()) + subclass(TGeoPcon.serializer()) + subclass(TGeoPgon.serializer()) + + subclass(TGeoCompositeShape.serializer().unref(refCache)) + subclass(TGeoShapeAssembly.serializer().unref(refCache)) + + default { + if (it == null) { + TGeoShape.serializer().unref(refCache) + } else { + error("Unrecognized shape $it") + } + } + } + + polymorphic(TGeoMatrix::class) { + subclass(TGeoIdentity.serializer()) + subclass(TGeoHMatrix.serializer().unref(refCache)) + subclass(TGeoTranslation.serializer()) + subclass(TGeoRotation.serializer()) + subclass(TGeoCombiTrans.serializer().unref(refCache)) + + + val unrefed = TGeoMatrix.serializer().unref(refCache) + default { + if (it == null) { + unrefed + } else { + error("Unrecognized matrix $it") + } + } + } + + polymorphic(TGeoVolume::class, TGeoVolume.serializer().unref(refCache)) { + subclass(TGeoVolumeAssembly.serializer().unref(refCache)) + + val unrefed = TGeoVolume.serializer().unref(refCache) + default { + if (it == null) { + unrefed + } else { + error("Unrecognized volume $it") + } + } + } + + polymorphic(TGeoNode::class, TGeoNode.serializer().unref(refCache)) { + subclass(TGeoNodeMatrix.serializer().unref(refCache)) + subclass(TGeoNodeOffset.serializer().unref(refCache)) + + val unrefed = TGeoNode.serializer().unref(refCache) + default { + if (it == null) { + unrefed + } else { + error("Unrecognized node $it") + } + } + } + } + + /** + * Create an instance of Json with unfolding Root references. This instance could not be reused because of the cache. + */ + private fun unrefJson(refCache: MutableList): Json = Json { + encodeDefaults = true + ignoreUnknownKeys = true + classDiscriminator = "_typename" + serializersModule = unrefSerializersModule(refCache) + } + + + fun decode(sourceDeserializer: KSerializer, source: JsonElement): T { + val refCache = ArrayList() + + fun fillCache(element: JsonElement) { + when (element) { + is JsonObject -> { + if (element["_typename"] != null) { + refCache.add(RefEntry(element)) + } + element.values.forEach { + fillCache(it) + } + } + is JsonArray -> { + element.forEach { + fillCache(it) + } + } + else -> { + //ignore primitives + } + } + } + fillCache(source) + + return unrefJson(refCache).decodeFromJsonElement(sourceDeserializer.unref(refCache), source) + } + + class RefEntry(val element: JsonElement) { + + var value: Any? = null + + fun getOrPutValue(builder: (JsonElement) -> T): T { + if (value == null) { + value = builder(element) + } + return value as T + } + + override fun toString(): String = element.toString() + } + +// val json = Json { +// encodeDefaults = true +// ignoreUnknownKeys = true +// classDiscriminator = "_typename" +// serializersModule = this@RootDecoder.serializersModule +// } + +} \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/rootToSolid.kt similarity index 99% rename from cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootToSolid.kt rename to cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/rootToSolid.kt index ee14324d..117e51b3 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootToSolid.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/rootToSolid.kt @@ -1,4 +1,4 @@ -package ru.mipt.npm.root +package ru.mipt.npm.root.serialization import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName diff --git a/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt b/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt index 7fcd1e22..fbd7482e 100644 --- a/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt +++ b/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt @@ -1,12 +1,16 @@ package ru.mipt.npm.root -import kotlinx.serialization.json.* +import kotlinx.serialization.json.JsonArray +import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.JsonObject +import kotlinx.serialization.json.jsonPrimitive +import ru.mipt.npm.root.serialization.TGeoManager import space.kscience.visionforge.solid.Solids import java.time.Duration import kotlin.system.measureTimeMillis private fun JsonElement.countTypes(): Sequence = sequence { - when (val json = this@countTypes){ + when (val json = this@countTypes) { is JsonObject -> { json["_typename"]?.let { yield(it.jsonPrimitive.content) } json.values.forEach { yieldAll(it.countTypes()) } @@ -16,25 +20,33 @@ private fun JsonElement.countTypes(): Sequence = sequence { yieldAll(it.countTypes()) } } - else -> {} + else -> { + } } } fun main() { val string = TGeoManager::class.java.getResourceAsStream("/BM@N.root.json")!! .readAllBytes().decodeToString() - val json = Json.parseToJsonElement(string) - val sizes = json.countTypes().groupBy { it }.mapValues { it.value.size } - sizes.forEach { - println(it) - } - val time = measureTimeMillis { - val geo = TObject.decodeFromString(TGeoManager.serializer(), string) + val geo = TGeoManagerScheme.parse(string) val solid = geo.toSolid() println(Solids.encodeToString(solid)) } +// val json = Json.parseToJsonElement(string) +// val sizes = json.countTypes().groupBy { it }.mapValues { it.value.size } +// sizes.forEach { +// println(it) +// } +// +// val time = measureTimeMillis { +// val geo = TObject.decodeFromString(TGeoManager.serializer(), string) +// val solid = geo.toSolid() +// +// println(Solids.encodeToString(solid)) +// } +// println(Duration.ofMillis(time)) } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 5bce5b02..0ed8858a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,5 @@ kotlin.code.style=official -kotlin.mpp.enableGranularSourceSetsMetadata=true kotlin.mpp.stability.nowarn=true -kotlin.native.enableDependencyPropagation=false #kotlin.jupyter.add.scanner=false From e25c1bd49b26046ff049a40b13a3f096fcc0c38b Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 5 Sep 2021 18:37:16 +0300 Subject: [PATCH 073/109] Finished Root converter --- .../kotlin/ru/mipt/npm/root/DObject.kt | 160 ++++++++++ .../kotlin/ru/mipt/npm/root/TObjectScheme.kt | 140 --------- .../kotlin/ru/mipt/npm/root/dRootToSolid.kt | 280 ++++++++++++++++++ .../ru/mipt/npm/root/rootSchemeToSolid.kt | 217 -------------- .../kotlin/ru/mipt/npm/root/loadBMN.kt | 24 +- .../kscience/visionforge/solid/Composite.kt | 5 +- .../visionforge/solid/SolidReference.kt | 2 +- 7 files changed, 466 insertions(+), 362 deletions(-) create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt delete mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObjectScheme.kt create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt delete mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootSchemeToSolid.kt diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt new file mode 100644 index 00000000..361e0ae2 --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt @@ -0,0 +1,160 @@ +package ru.mipt.npm.root + +import kotlinx.serialization.json.Json +import space.kscience.dataforge.meta.* +import space.kscience.dataforge.misc.Named +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.asName +import space.kscience.dataforge.values.doubleArray +import kotlin.properties.ReadOnlyProperty + +public fun MetaProvider.doubleArray( + vararg default: Double, + key: Name? = null, +): ReadOnlyProperty = value(key) { + it?.doubleArray ?: doubleArrayOf(*default) +} + + +public class DObjectCache(private val cache: List, public val refStack: List = emptyList()) { + public operator fun get(index: Int): Meta = cache[index] + + public fun stack(ref: Int): DObjectCache = DObjectCache(cache, refStack + ref) + + public companion object { + public val empty: DObjectCache = DObjectCache(emptyList(), emptyList()) + } +} +// +//public interface ObjectRef { +// public fun resolve(): T? +//} + +//public class ChildObjectRef( +// public val builder: (Meta, DObjectCache) -> T, +// public val refCache: DObjectCache, +// public val metaProvider: () -> Meta? +//) : ObjectRef { +// override fun resolve(): T? { +// val meta = metaProvider() ?: return null +// meta["\$ref"]?.int?.let { refId -> +// if (refCache.refStack.contains(refId)) { +// println("Circular reference $refId in stack ${refCache.refStack}") +// return null +// } +// return builder(refCache[refId], refCache.stack(refId)) +// } +// return builder(meta, refCache) +// } +//} + +public open class DObject(public val meta: Meta, private val refCache: DObjectCache) { + + public val typename: String by meta.string(key = "_typename".asName()) { + error("Type is not defined") + } + + private fun resolve(builder: (Meta, DObjectCache) -> T, meta: Meta): T? { + meta["\$ref"]?.int?.let { refId -> + if (refCache.refStack.contains(refId)) { + println("Circular reference $refId in stack ${refCache.refStack}") + return null + } + return builder(refCache[refId], refCache.stack(refId)) + } + return builder(meta, refCache) + } + + internal fun tObjectArray( + builder: (Meta, DObjectCache) -> T + ): ReadOnlyProperty> = ReadOnlyProperty { _, property -> + meta.getIndexed(Name.of(property.name, "arr")).values.mapNotNull { + resolve(builder, it) + } + } + + internal fun dObject( + builder: (Meta, DObjectCache) -> T, + key: Name? = null + ): ReadOnlyProperty = ReadOnlyProperty { _, property -> + meta[key ?: property.name.asName()]?.let { resolve(builder, it) } + } +} + +public open class DNamed(meta: Meta, refCache: DObjectCache) : DObject(meta, refCache) { + public val fName: String by meta.string("") + public val fTitle: String by meta.string("") +} + +public class DGeoMaterial(meta: Meta, refCache: DObjectCache) : DNamed(meta, refCache) { +} + +public class DGeoMedium(meta: Meta, refCache: DObjectCache) : DNamed(meta, refCache) { + public val fMaterial: DGeoMaterial? by dObject(::DGeoMaterial) + public val fParams: DoubleArray by meta.doubleArray() +} + +public class DGeoShape(meta: Meta, refCache: DObjectCache) : DNamed(meta, refCache) { + public val fDX: Double by meta.double(0.0) + public val fDY: Double by meta.double(0.0) + public val fDZ: Double by meta.double(0.0) +} + +public class DGeoVolume(meta: Meta, refCache: DObjectCache) : DNamed(meta, refCache), Named { + public val fNodes: List by tObjectArray(::DGeoNode) + public val fShape: DGeoShape? by dObject(::DGeoShape) + public val fMedium: DGeoMedium? by dObject(::DGeoMedium) + + override val name: Name by lazy { Name.parse(fName.ifEmpty { "volume[${meta.hashCode().toUInt()}]" }) } +} + +public class DGeoNode(meta: Meta, refCache: DObjectCache) : DNamed(meta, refCache) { + public val fVolume: DGeoVolume? by dObject(::DGeoVolume) +} + +public class DGeoMatrix(meta: Meta, refCache: DObjectCache) : DNamed(meta, refCache) { +} + + +public class DGeoBoolNode(meta: Meta, refCache: DObjectCache) : DObject(meta, refCache) { + public val fLeft: DGeoShape? by dObject(::DGeoShape) + public val fLeftMat: DGeoMatrix? by dObject(::DGeoMatrix) + + public val fRight: DGeoShape? by dObject(::DGeoShape) + public val fRightMat: DGeoMatrix? by dObject(::DGeoMatrix) +} + + +public class DGeoManager(meta: Meta, refCache: DObjectCache) : DNamed(meta, refCache) { + public val fMatrices: List by tObjectArray(::DGeoMatrix) + + public val fShapes: List by tObjectArray(::DGeoShape) + + public val fVolumes: List by tObjectArray(::DGeoVolume) + + public val fNodes: List by tObjectArray(::DGeoNode) + + public companion object { + + public fun parse(string: String): DGeoManager { + val meta = Json.decodeFromString(MetaSerializer, string) + val res = ArrayList(4096) + + fun fillCache(element: Meta) { + if (element["\$ref"] == null) { + res.add(element) + element.items.values.forEach { + if (!it.isLeaf) { + fillCache(it) + } + } + } + } + + fillCache(meta) + + val refCache = DObjectCache(res) + return DGeoManager(meta, refCache) + } + } +} diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObjectScheme.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObjectScheme.kt deleted file mode 100644 index 0ec699bd..00000000 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/TObjectScheme.kt +++ /dev/null @@ -1,140 +0,0 @@ -package ru.mipt.npm.root - -import kotlinx.serialization.json.Json -import space.kscience.dataforge.meta.* -import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.asName -import kotlin.properties.ReadOnlyProperty - -public typealias RefCache = List - -public interface ObjectRef { - public fun resolve(refCache: RefCache): T? -} - -private class ChildObjectRef( - val spec: Specification, - val metaProvider: () -> Meta? -) : ObjectRef { - override fun resolve(refCache: RefCache): T? { - val meta = metaProvider() ?: return null - meta["\$ref"]?.int?.let { refId -> - return spec.read(refCache[refId]) - } - return spec.read(meta) - } -} - -public fun List>.resolve(refCache: RefCache): List = map { it.resolve(refCache)!! } - - -public open class TObjectScheme : Scheme() { - - public val typename: String by string(key = "_typename".asName()) { error("Type is not defined") } - - internal fun tObjectArray( - spec: Specification - ): ReadOnlyProperty>> = ReadOnlyProperty { _, property -> - meta.getIndexed(Name.of(property.name, "arr")).values.map { ChildObjectRef(spec){it} } - } - - internal fun refSpec( - spec: Specification, - key: Name? = null - ): ReadOnlyProperty> = ReadOnlyProperty { _, property -> - ChildObjectRef(spec) { meta[key ?: property.name.asName()] } - } - - public companion object : SchemeSpec(::TObjectScheme) -} - -public open class TNamedScheme : TObjectScheme() { - public val fName: String by string("") - public val fTitle: String by string("") - - public companion object : SchemeSpec(::TNamedScheme) -} - -public class TGeoMaterialScheme : TNamedScheme() { - - public companion object : SchemeSpec(::TGeoMaterialScheme) -} - -public class TGeoMediumScheme : TNamedScheme() { - public val fMaterial: ObjectRef by refSpec(TGeoMaterialScheme) - public val fParams: DoubleArray by doubleArray() - - public companion object : SchemeSpec(::TGeoMediumScheme) -} - -public class TGeoShapeScheme : TNamedScheme() { - public val fDX: Double by double(0.0) - public val fDY: Double by double(0.0) - public val fDZ: Double by double(0.0) - - public companion object : SchemeSpec(::TGeoShapeScheme) -} - -public class TGeoVolumeScheme : TNamedScheme() { - public val fNodes: List> by tObjectArray(TGeoNodeScheme) - public val fShape: ObjectRef by refSpec(TGeoShapeScheme) - public val fMedium: ObjectRef by refSpec(TGeoMediumScheme) - - public companion object : SchemeSpec(::TGeoVolumeScheme) -} - -public class TGeoNodeScheme : TNamedScheme() { - public val fVolume: ObjectRef by refSpec(TGeoVolumeScheme) - - public companion object : SchemeSpec(::TGeoNodeScheme) -} - -public class TGeoMatrixScheme : TNamedScheme() { - public companion object : SchemeSpec(::TGeoMatrixScheme) -} - - -public class TGeoBoolNodeScheme : TObjectScheme() { - public val fLeft: ObjectRef by refSpec(TGeoShapeScheme) - public val fLeftMat: ObjectRef by refSpec(TGeoMatrixScheme) - - public val fRight: ObjectRef by refSpec(TGeoShapeScheme) - public val fRightMat: ObjectRef by refSpec(TGeoMatrixScheme) - - public companion object : SchemeSpec(::TGeoBoolNodeScheme) -} - - -public class TGeoManagerScheme : TNamedScheme() { - public val fMatrices: List> by tObjectArray(TGeoMatrixScheme) - - public val fShapes: List> by tObjectArray(TGeoShapeScheme) - - public val fVolumes: List> by tObjectArray(TGeoVolumeScheme) - - public val fNodes: List> by tObjectArray(TGeoNodeScheme) - - public val refCache: List by lazy { - val res = ArrayList(4096) - fun fillCache(element: Meta) { - if(element["\$ref"] == null) { - res.add(element) - element.items.values.forEach { - if (!it.isLeaf) { - fillCache(it) - } - } - } - } - fillCache(meta) - res - } - - public companion object : SchemeSpec(::TGeoManagerScheme) { - - public fun parse(string: String): TGeoManagerScheme { - val meta = Json.decodeFromString(MetaSerializer, string) - return read(meta) - } - } -} diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt new file mode 100644 index 00000000..87422b97 --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt @@ -0,0 +1,280 @@ +package ru.mipt.npm.root + +import space.kscience.dataforge.meta.double +import space.kscience.dataforge.meta.get +import space.kscience.dataforge.meta.int +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.plus +import space.kscience.visionforge.solid.* +import kotlin.math.* + +private val volumesName = Name.EMPTY //"volumes".asName() + +private operator fun Number.times(d: Double) = toDouble() * d + +private operator fun Number.times(f: Float) = toFloat() * f + +private fun degToRad(d: Double) = d * PI / 180.0 + +private class RootToSolidContext(val prototypeHolder: PrototypeHolder) + +// converting to XYZ to Tait–Bryan angles according to https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix +private fun Solid.rotate(rot: DoubleArray) { + val xAngle = atan2(-rot[5], rot[8]) + val yAngle = atan2(rot[2], sqrt(1.0 - rot[2].pow(2))) + val zAngle = atan2(-rot[1], rot[0]) + rotation = Point3D(xAngle, yAngle, zAngle) +} + +private fun Solid.translate(trans: DoubleArray) { + val (x, y, z) = trans + position = Point3D(x, y, z) +} + +private fun Solid.useMatrix(matrix: DGeoMatrix?) { + if (matrix == null) return + when (matrix.typename) { + "TGeoIdentity" -> { + //do nothing + } + "TGeoTranslation" -> { + val fTranslation by matrix.meta.doubleArray() + translate(fTranslation) + } + "TGeoRotation" -> { + val fRotationMatrix by matrix.meta.doubleArray() + rotate(fRotationMatrix) + } + "TGeoCombiTrans" -> { + val fTranslation by matrix.meta.doubleArray() + + translate(fTranslation) + if (matrix.meta["fRotationMatrix"] != null) { + val fRotationMatrix by matrix.meta.doubleArray() + rotate(fRotationMatrix) + } + } + "TGeoHMatrix" -> { + val fTranslation by matrix.meta.doubleArray() + val fRotationMatrix by matrix.meta.doubleArray() + val fScale by matrix.meta.doubleArray() + translate(fTranslation) + rotate(fRotationMatrix) + scale = Point3D(fScale[0], fScale[1], fScale[2]) + } + } +} + +private fun SolidGroup.addShape( + shape: DGeoShape, + context: RootToSolidContext, + name: String? = shape.fName.ifEmpty { null } +): Solid? = when (shape.typename) { + "TGeoCompositeShape" -> { + val fNode: DGeoBoolNode? by shape.dObject(::DGeoBoolNode) + val node = fNode ?: error("Composite shape node not resolved") + val compositeType = when (node.typename) { + "TGeoIntersection" -> CompositeType.INTERSECT + "TGeoSubtraction" -> CompositeType.SUBTRACT + "TGeoUnion" -> CompositeType.UNION + else -> error("Unknown bool node type ${node.typename}") + } + composite(compositeType, name = name) { + addShape(node.fLeft!!, context, "left").also { + if (it == null) TODO() + it.useMatrix(node.fLeftMat) + } + addShape(node.fRight!!, context, "right").also { + if (it == null) TODO() + it.useMatrix(node.fRightMat) + } + } + } + "TGeoXtru" -> { + val fNvert by shape.meta.int(0) + val fX by shape.meta.doubleArray() + val fY by shape.meta.doubleArray() + val fNz by shape.meta.int(0) + val fZ by shape.meta.doubleArray() + val fX0 by shape.meta.doubleArray() + val fY0 by shape.meta.doubleArray() + val fScale by shape.meta.doubleArray() + + extruded(name = name) { + (0 until fNvert).forEach { index -> + shape { + point(fX[index], fY[index]) + } + } + + (0 until fNz).forEach { index -> + layer( + fZ[index], + fX0[index], + fY0[index], + fScale[index] + ) + } + } + } + "TGeoTube" -> { + val fRmax by shape.meta.double(0.0) + val fDz by shape.meta.double(0.0) + val fRmin by shape.meta.double(0.0) + + tube( + radius = fRmax, + height = fDz * 2, + innerRadius = fRmin, + name = name + ) + } + "TGeoTubeSeg" -> { + val fRmax by shape.meta.double(0.0) + val fDz by shape.meta.double(0.0) + val fRmin by shape.meta.double(0.0) + val fPhi1 by shape.meta.double(0.0) + val fPhi2 by shape.meta.double(0.0) + + tube( + radius = fRmax, + height = fDz * 2, + innerRadius = fRmin, + startAngle = degToRad(fPhi1), + angle = degToRad(fPhi2 - fPhi1), + name = name + ) + } + "TGeoPcon" -> { + val fDphi by shape.meta.double(0.0) + val fNz by shape.meta.int(2) + val fPhi1 by shape.meta.double(360.0) + val fRmax by shape.meta.doubleArray() + val fRmin by shape.meta.doubleArray() + val fZ by shape.meta.doubleArray() + if (fNz == 2) { + coneSurface( + bottomOuterRadius = fRmax[0], + bottomInnerRadius = fRmin[0], + height = fZ[1] - fZ[0], + topOuterRadius = fRmax[1], + topInnerRadius = fRmin[1], + startAngle = degToRad(fPhi1), + angle = degToRad(fDphi), + name = name + ) { + z = (fZ[1] + fZ[0]) / 2 + } + } else { + TODO() + } + } + "TGeoPgon" -> { + val fDphi by shape.meta.double(0.0) + val fNz by shape.meta.int(2) + val fPhi1 by shape.meta.double(360.0) + val fRmax by shape.meta.doubleArray() + val fRmin by shape.meta.doubleArray() + val fZ by shape.meta.doubleArray() + + val fNedges by shape.meta.int(1) + + val startphi = degToRad(fPhi1) + val deltaphi = degToRad(fDphi) + + extruded(name) { + //getting the radius of first + require(fNz > 1) { "The polyhedron geometry requires at least two planes" } + val baseRadius = fRmax[0] + shape { + (0..fNedges).forEach { + val phi = deltaphi * fNedges * it + startphi + (baseRadius * cos(phi) to baseRadius * sin(phi)) + } + } + (0 until fNz).forEach { index -> + //scaling all radii relative to first layer radius + layer(fZ[index], scale = fRmax[index] / baseRadius) + } + } + } + "TGeoShapeAssembly" -> { + val fVolume by shape.dObject(::DGeoVolume) + fVolume?.let { volume -> + addRootVolume(volume, context) + } + } + "TGeoBBox" -> { + box(shape.fDX * 2, shape.fDY * 2, shape.fDZ * 2, name = name) + } + else -> { + TODO("A shape with type ${shape.typename} not implemented") + } +} + +private fun SolidGroup.addRootNode(obj: DGeoNode, context: RootToSolidContext) { + val volume = obj.fVolume ?: return + addRootVolume(volume, context, obj.fName).apply { + when (obj.typename) { + "TGeoNodeMatrix" -> { + val fMatrix by obj.dObject(::DGeoMatrix) + useMatrix(fMatrix) + } + "TGeoNodeOffset" -> { + val fOffset by obj.meta.double(0.0) + x = fOffset + } + } + } +} + +private fun buildGroup(volume: DGeoVolume, context: RootToSolidContext): SolidGroup = SolidGroup { + volume.fShape?.let { + addShape(it, context) + } + volume.fNodes.let { + it.forEach { node -> + addRootNode(node, context) + } + } +} + +//private val SolidGroup.rootPrototypes: SolidGroup get() = (parent as? SolidGroup)?.rootPrototypes ?: this + +private fun SolidGroup.addRootVolume( + volume: DGeoVolume, + context: RootToSolidContext, + name: String? = null, + cache: Boolean = true +): Solid { + val combinedName = if (volume.fName.isEmpty()) { + name + } else if (name == null) { + volume.fName + } else { + "${name}_${volume.fName}" + } + + return if (!cache) { + val group = buildGroup(volume, context) + set(combinedName?.let { Name.parse(it) }, group) + group + } else { + val templateName = volumesName + volume.name + val existing = getPrototype(templateName) + if (existing == null) { + context.prototypeHolder.prototypes { + set(templateName, buildGroup(volume, context)) + } + } + + return ref(templateName, name) + } +} + +public fun DGeoManager.toSolid(): SolidGroup = SolidGroup { + val context = RootToSolidContext(this) + fNodes.forEach { node -> + addRootNode(node, context) + } +} \ No newline at end of file diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootSchemeToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootSchemeToSolid.kt deleted file mode 100644 index 89849613..00000000 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootSchemeToSolid.kt +++ /dev/null @@ -1,217 +0,0 @@ -package ru.mipt.npm.root - -import space.kscience.dataforge.meta.* -import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.asName -import space.kscience.dataforge.names.plus -import space.kscience.visionforge.solid.* -import kotlin.math.PI -import kotlin.math.atan2 -import kotlin.math.pow -import kotlin.math.sqrt - -private val solidsName = "solids".asName() -private val volumesName = "volumes".asName() - -private operator fun Number.times(d: Double) = toDouble() * d - -private operator fun Number.times(f: Float) = toFloat() * f - -private fun degToRad(d: Double) = d * PI / 180.0 - -// converting to XYZ to Tait–Bryan angles according to https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix -private fun Solid.rotate(rot: DoubleArray) { - val xAngle = atan2(-rot[5], rot[8]) - val yAngle = atan2(rot[2], sqrt(1.0 - rot[2].pow(2))) - val zAngle = atan2(-rot[1], rot[0]) - rotation = Point3D(xAngle, yAngle, zAngle) -} - -private fun Solid.translate(trans: DoubleArray) { - val (x, y, z) = trans - position = Point3D(x, y, z) -} - -private fun Solid.useMatrix(matrix: TGeoMatrixScheme?) { - if (matrix == null) return - when (matrix.typename) { - "TGeoIdentity" -> { - //do nothing - } - "TGeoTranslation" -> { - val fTranslation by matrix.doubleArray() - translate(fTranslation) - } - "TGeoRotation" -> { - val fRotationMatrix by matrix.doubleArray() - rotate(fRotationMatrix) - } - "TGeoCombiTrans" -> { - val fTranslation by matrix.doubleArray() - - translate(fTranslation) - if (matrix.meta["fRotationMatrix"] != null) { - val fRotationMatrix by matrix.doubleArray() - rotate(fRotationMatrix) - } - } - "TGeoHMatrix" -> { - val fTranslation by matrix.doubleArray() - val fRotationMatrix by matrix.doubleArray() - val fScale by matrix.doubleArray() - translate(fTranslation) - rotate(fRotationMatrix) - scale = Point3D(fScale[0], fScale[1], fScale[2]) - } - } -} - -private fun SolidGroup.addShape(shape: TGeoShapeScheme, refCache: RefCache) { - when (shape.typename) { - "TGeoCompositeShape" -> { - val bool by shape.spec(TGeoBoolNodeScheme) - val compositeType = when (bool.typename) { - "TGeoIntersection" -> CompositeType.INTERSECT - "TGeoSubtraction" -> CompositeType.SUBTRACT - "TGeoUnion" -> CompositeType.UNION - else -> error("Unknown bool node type ${bool.typename}") - } - composite(compositeType, name = shape.fName) { - addShape(bool.fLeft.resolve(refCache)!!, refCache).apply { - useMatrix(bool.fLeftMat.resolve(refCache)) - } - addShape(bool.fRight.resolve(refCache)!!, refCache).apply { - useMatrix(bool.fRightMat.resolve(refCache)) - } - } - } - "TGeoXtru" -> { - val fNvert by shape.meta.int(0) - val fX by shape.meta.doubleArray() - val fY by shape.meta.doubleArray() - val fNz by shape.meta.int(0) - val fZ by shape.meta.doubleArray() - val fX0 by shape.meta.doubleArray() - val fY0 by shape.meta.doubleArray() - val fScale by shape.meta.doubleArray() - - extruded(name = shape.fName) { - (0 until fNvert).forEach { index -> - shape { - point(fX[index], fY[index]) - } - } - - (0 until fNz).forEach { index -> - layer( - fZ[index], - fX0[index], - fY0[index], - fScale[index] - ) - } - } - } - "TGeoTube" -> { - val fRmax by shape.meta.double(0.0) - val fDz by shape.meta.double(0.0) - val fRmin by shape.meta.double(0.0) - - tube( - radius = fRmax, - height = fDz * 2, - innerRadius = fRmin, - name = shape.fName - ) - } - "TGeoTubeSeg" -> { - val fRmax by shape.meta.double(0.0) - val fDz by shape.meta.double(0.0) - val fRmin by shape.meta.double(0.0) - val fPhi1 by shape.meta.double(0.0) - val fPhi2 by shape.meta.double(0.0) - - tube( - radius = fRmax, - height = fDz * 2, - innerRadius = fRmin, - startAngle = degToRad(fPhi1), - angle = degToRad(fPhi2 - fPhi1), - name = shape.fName - ) - } - "TGeoPcon" -> { - TODO() - } - "TGeoPgon" -> { - TODO() - } - "TGeoShapeAssembly" -> { - val fVolume by shape.refSpec(TGeoVolumeScheme) - volume(fVolume.resolve(refCache)!!, refCache) - } - "TGeoBBox" -> { - box(shape.fDX * 2, shape.fDY * 2, shape.fDZ * 2, name = shape.fName) - } - } -} - -private fun SolidGroup.node(obj: TGeoNodeScheme, refCache: RefCache) { - val volume = obj.fVolume.resolve(refCache) - if (volume != null) { - volume(volume, refCache, obj.fName).apply { - when (obj.typename) { - "TGeoNodeMatrix" -> { - val fMatrix by obj.refSpec(TGeoMatrixScheme) - useMatrix(fMatrix.resolve(refCache)) - } - "TGeoNodeOffset" -> { - val fOffset by obj.meta.double(0.0) - x = fOffset - } - } - } - } -} - -private fun buildGroup(volume: TGeoVolumeScheme, refCache: RefCache): SolidGroup = SolidGroup { - volume.fShape.resolve(refCache)?.let { addShape(it, refCache) } - volume.fNodes.let { - it.forEach { obj -> - node(obj.resolve(refCache)!!, refCache) - } - } -} - -private val SolidGroup.rootPrototypes: SolidGroup get() = (parent as? SolidGroup)?.rootPrototypes ?: this - -private fun SolidGroup.volume( - volume: TGeoVolumeScheme, - refCache: RefCache, - name: String? = null, - cache: Boolean = true -): Solid { - val group = buildGroup(volume, refCache) - val combinedName = if (volume.fName.isEmpty()) { - name - } else if (name == null) { - volume.fName - } else { - "${name}_${volume.fName}" - } - return if (!cache) { - set(combinedName?.let { Name.parse(it)},group) - group - } else newRef( - name = combinedName, - obj = group, - prototypeHolder = rootPrototypes, - templateName = volumesName + Name.parse(combinedName ?: "volume[${group.hashCode()}]") - ) -} - -public fun TGeoManagerScheme.toSolid(): SolidGroup = SolidGroup { - fNodes.forEach { - node(it.resolve(refCache)!!, refCache) - } -} \ No newline at end of file diff --git a/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt b/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt index fbd7482e..fdbcea6d 100644 --- a/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt +++ b/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt @@ -5,8 +5,14 @@ import kotlinx.serialization.json.JsonElement import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.jsonPrimitive import ru.mipt.npm.root.serialization.TGeoManager +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.get +import space.kscience.dataforge.meta.isLeaf +import space.kscience.dataforge.values.string import space.kscience.visionforge.solid.Solids +import java.nio.file.Paths import java.time.Duration +import kotlin.io.path.writeText import kotlin.system.measureTimeMillis private fun JsonElement.countTypes(): Sequence = sequence { @@ -25,14 +31,28 @@ private fun JsonElement.countTypes(): Sequence = sequence { } } +private fun Meta.countTypes() :Sequence = sequence { + if(!isLeaf){ + get("_typename")?.value?.let { yield(it.string) } + items.forEach { yieldAll(it.value.countTypes()) } + } +} + fun main() { val string = TGeoManager::class.java.getResourceAsStream("/BM@N.root.json")!! .readAllBytes().decodeToString() val time = measureTimeMillis { - val geo = TGeoManagerScheme.parse(string) + val geo = DGeoManager.parse(string) + + val sizes = geo.meta.countTypes().groupBy { it }.mapValues { it.value.size } + sizes.forEach { + println(it) + } + val solid = geo.toSolid() - println(Solids.encodeToString(solid)) + Paths.get("BM@N.vf.json").writeText(Solids.encodeToString(solid)) + //println(Solids.encodeToString(solid)) } // val json = Json.parseToJsonElement(string) diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt index 9debf612..00db285c 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt @@ -5,6 +5,7 @@ import kotlinx.serialization.Serializable import space.kscience.dataforge.meta.update import space.kscience.visionforge.VisionBuilder import space.kscience.visionforge.VisionContainerBuilder +import space.kscience.visionforge.VisionPropertyContainer import space.kscience.visionforge.set public enum class CompositeType { @@ -20,7 +21,7 @@ public class Composite( public val compositeType: CompositeType, public val first: Solid, public val second: Solid, -) : SolidBase(), Solid +) : SolidBase(), VisionPropertyContainer @VisionBuilder public inline fun VisionContainerBuilder.composite( @@ -30,7 +31,7 @@ public inline fun VisionContainerBuilder.composite( ): Composite { val group = SolidGroup().apply(builder) val children = group.children.values.filterIsInstance() - if (children.size != 2) error("Composite requires exactly two children") + if (children.size != 2) error("Composite requires exactly two children, but found ${children.size}") val res = Composite(type, children[0], children[1]) res.meta.update(group.meta) diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt index f58bcf8b..eeab05ff 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt @@ -165,7 +165,7 @@ public fun SolidGroup.ref( /** * Add new [SolidReferenceGroup] wrapping given object and automatically adding it to the prototypes. - * One must ensure that [prototypeHolder] is the owner of this group. + * One must ensure that [prototypeHolder] is a parent of this group. */ public fun SolidGroup.newRef( name: String?, From 0ee14aa90e58a12f32a77e51c0f436525516bfa9 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 5 Sep 2021 18:58:55 +0300 Subject: [PATCH 074/109] Minor fix to solid signatures --- .../kotlin/space/kscience/visionforge/solid/ConeSurface.kt | 3 ++- .../kotlin/space/kscience/visionforge/solid/Convex.kt | 3 ++- .../kotlin/space/kscience/visionforge/solid/PolyLine.kt | 7 ++----- .../kotlin/space/kscience/visionforge/solid/SolidLabel.kt | 3 ++- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSurface.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSurface.kt index a9c5622b..25f79ee8 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSurface.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/ConeSurface.kt @@ -4,6 +4,7 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import space.kscience.visionforge.VisionBuilder import space.kscience.visionforge.VisionContainerBuilder +import space.kscience.visionforge.VisionPropertyContainer import space.kscience.visionforge.set import kotlin.math.PI import kotlin.math.cos @@ -23,7 +24,7 @@ public class ConeSurface( public val topInnerRadius: Float, public val startAngle: Float = 0f, public val angle: Float = PI2, -) : SolidBase(), GeometrySolid { +) : SolidBase(), GeometrySolid, VisionPropertyContainer { init { require(bottomRadius > 0) { "Cone surface bottom radius must be positive" } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Convex.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Convex.kt index 2d242391..24d1ff16 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Convex.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Convex.kt @@ -3,11 +3,12 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import space.kscience.visionforge.VisionContainerBuilder +import space.kscience.visionforge.VisionPropertyContainer import space.kscience.visionforge.set @Serializable @SerialName("solid.convex") -public class Convex(public val points: List) : SolidBase(), Solid +public class Convex(public val points: List) : SolidBase(), VisionPropertyContainer public inline fun VisionContainerBuilder.convex(name: String? = null, action: ConvexBuilder.() -> Unit = {}): Convex = ConvexBuilder().apply(action).build().also { set(name, it) } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/PolyLine.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/PolyLine.kt index d8aa937c..05d58744 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/PolyLine.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/PolyLine.kt @@ -5,14 +5,11 @@ import kotlinx.serialization.Serializable import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus -import space.kscience.visionforge.VisionBuilder -import space.kscience.visionforge.VisionContainerBuilder -import space.kscience.visionforge.numberProperty -import space.kscience.visionforge.set +import space.kscience.visionforge.* @Serializable @SerialName("solid.line") -public class PolyLine(public val points: List) : SolidBase(), Solid { +public class PolyLine(public val points: List) : SolidBase(), VisionPropertyContainer { //var lineType by string() public var thickness: Number by numberProperty(name = SolidMaterial.MATERIAL_KEY + THICKNESS_KEY) { 1.0 } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidLabel.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidLabel.kt index 3e725d0d..8cf27881 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidLabel.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidLabel.kt @@ -4,6 +4,7 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import space.kscience.visionforge.VisionBuilder import space.kscience.visionforge.VisionContainerBuilder +import space.kscience.visionforge.VisionPropertyContainer import space.kscience.visionforge.set @Serializable @@ -12,7 +13,7 @@ public class SolidLabel( public val text: String, public val fontSize: Double, public val fontFamily: String, -) : SolidBase(), Solid +) : SolidBase(), VisionPropertyContainer @VisionBuilder public fun VisionContainerBuilder.label( From aea4eb7d45ae6ae39219a0fdec82c0419e295571 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 5 Sep 2021 22:59:12 +0300 Subject: [PATCH 075/109] Hot fix for circular top volume reference --- .../kotlin/ru/mipt/npm/root/dRootToSolid.kt | 25 +++++++++++++------ .../visionforge/gdml/demo/GdmlFxDemoApp.kt | 1 - gradle.properties | 1 + .../kscience/visionforge/VisionGroupBase.kt | 2 +- .../kscience/visionforge/solid/FX3DPlugin.kt | 3 +++ .../kscience/visionforge/solid/Solids.kt | 1 + 6 files changed, 23 insertions(+), 10 deletions(-) diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt index 87422b97..582389e2 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt @@ -3,6 +3,7 @@ package ru.mipt.npm.root import space.kscience.dataforge.meta.double import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.int +import space.kscience.dataforge.meta.isEmpty import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.plus import space.kscience.visionforge.solid.* @@ -228,15 +229,23 @@ private fun SolidGroup.addRootNode(obj: DGeoNode, context: RootToSolidContext) { } } -private fun buildGroup(volume: DGeoVolume, context: RootToSolidContext): SolidGroup = SolidGroup { - volume.fShape?.let { - addShape(it, context) - } - volume.fNodes.let { - it.forEach { node -> +private fun buildVolume(volume: DGeoVolume, context: RootToSolidContext): Solid { + val group = SolidGroup { + if(volume.fNodes.isEmpty()) { + //TODO add smart filter + volume.fShape?.let { shape -> + addShape(shape, context) + } + } + volume.fNodes.forEach { node -> addRootNode(node, context) } } + return if (group.children.size == 1 && group.meta.isEmpty()) { + (group.children.values.first() as Solid).apply { parent = null } + } else { + group + } } //private val SolidGroup.rootPrototypes: SolidGroup get() = (parent as? SolidGroup)?.rootPrototypes ?: this @@ -256,7 +265,7 @@ private fun SolidGroup.addRootVolume( } return if (!cache) { - val group = buildGroup(volume, context) + val group = buildVolume(volume, context) set(combinedName?.let { Name.parse(it) }, group) group } else { @@ -264,7 +273,7 @@ private fun SolidGroup.addRootVolume( val existing = getPrototype(templateName) if (existing == null) { context.prototypeHolder.prototypes { - set(templateName, buildGroup(volume, context)) + set(templateName, buildVolume(volume, context)) } } diff --git a/demo/gdml/src/jvmMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlFxDemoApp.kt b/demo/gdml/src/jvmMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlFxDemoApp.kt index f2371f44..83e750ba 100644 --- a/demo/gdml/src/jvmMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlFxDemoApp.kt +++ b/demo/gdml/src/jvmMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlFxDemoApp.kt @@ -21,7 +21,6 @@ class GDMLDemoApp : App(GDMLView::class) class GDMLView : View() { private val context = Context { plugin(FX3DPlugin) - plugin(VisionManager) } private val fx3d = context.fetch(FX3DPlugin) diff --git a/gradle.properties b/gradle.properties index 0ed8858a..24f28924 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,6 +2,7 @@ kotlin.code.style=official kotlin.mpp.stability.nowarn=true #kotlin.jupyter.add.scanner=false +kotlin.incremental.js.klib=false org.gradle.jvmargs=-XX:MaxMetaspaceSize=1G org.gradle.parallel=true \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt index 7280ae1f..d4af712d 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt @@ -76,7 +76,7 @@ public open class VisionGroupBase( * Set parent for given child and attach it */ private fun attachChild(token: NameToken, child: Vision?) { - val before = children[token] + val before = childrenInternal[token] when { child == null -> { childrenInternal.remove(token) diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt index 9aed5d50..48f99ac1 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt @@ -27,6 +27,8 @@ import kotlin.reflect.KClass public class FX3DPlugin : AbstractPlugin() { override val tag: PluginTag get() = Companion.tag + public val solids: Solids by require(Solids) + private val objectFactories = HashMap, FX3DFactory<*>>() private val compositeFactory = FXCompositeFactory(this) private val referenceFactory = FXReferenceFactory(this) @@ -50,6 +52,7 @@ public class FX3DPlugin : AbstractPlugin() { is SolidGroup -> { Group(obj.children.mapNotNull { (token, obj) -> (obj as? Solid)?.let { + logger.info { token.toString() } buildNode(it).apply { properties["name"] = token.toString() } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt index ca83f00f..c5b9b04b 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt @@ -18,6 +18,7 @@ import kotlin.reflect.KClass public class Solids(meta: Meta) : VisionPlugin(meta) { override val tag: PluginTag get() = Companion.tag + override val visionSerializersModule: SerializersModule get() = serializersModuleForSolids public companion object : PluginFactory { From 2e3b63c0f464fac2c7213726efa453c272409f5e Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Mon, 6 Sep 2021 22:48:03 +0300 Subject: [PATCH 076/109] Composite Union is replaced by a Group. Colors for root --- .../kotlin/ru/mipt/npm/root/DObject.kt | 2 + .../kotlin/ru/mipt/npm/root/dRootToSolid.kt | 26 +++-- .../kotlin/ru/mipt/npm/root/rootColor.kt | 42 +++++++ .../kotlin/ru/mipt/npm/root/loadBMN.kt | 72 ------------ demo/playground/build.gradle.kts | 1 + .../src/jvmMain/kotlin/rootParser.kt | 104 ++++++++++++++++++ .../jvmMain/resources/root}/BM@N.root.json | 0 .../visionforge/solid/FXCompositeFactory.kt | 2 +- .../kscience/visionforge/gdml/gdmlLoader.kt | 4 +- .../kscience/visionforge/solid/Composite.kt | 28 ++++- .../kscience/visionforge/solid/SolidGroup.kt | 4 +- visionforge-threejs/build.gradle.kts | 2 +- .../visionforge/solid/three/ThreeCanvas.kt | 22 ++-- .../solid/three/ThreeCompositeFactory.kt | 5 +- 14 files changed, 207 insertions(+), 107 deletions(-) create mode 100644 cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootColor.kt delete mode 100644 cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt create mode 100644 demo/playground/src/jvmMain/kotlin/rootParser.kt rename {cern-root-loader/src/commonTest/resources => demo/playground/src/jvmMain/resources/root}/BM@N.root.json (100%) diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt index 361e0ae2..e0933614 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt @@ -105,6 +105,8 @@ public class DGeoVolume(meta: Meta, refCache: DObjectCache) : DNamed(meta, refCa public val fShape: DGeoShape? by dObject(::DGeoShape) public val fMedium: DGeoMedium? by dObject(::DGeoMedium) + public val fFillColor: Int? by meta.int() + override val name: Name by lazy { Name.parse(fName.ifEmpty { "volume[${meta.hashCode().toUInt()}]" }) } } diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt index 582389e2..0fa40340 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt @@ -1,12 +1,11 @@ package ru.mipt.npm.root -import space.kscience.dataforge.meta.double -import space.kscience.dataforge.meta.get -import space.kscience.dataforge.meta.int -import space.kscience.dataforge.meta.isEmpty +import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.plus +import space.kscience.dataforge.values.doubleArray import space.kscience.visionforge.solid.* +import space.kscience.visionforge.solid.SolidMaterial.Companion.MATERIAL_COLOR_KEY import kotlin.math.* private val volumesName = Name.EMPTY //"volumes".asName() @@ -50,9 +49,8 @@ private fun Solid.useMatrix(matrix: DGeoMatrix?) { val fTranslation by matrix.meta.doubleArray() translate(fTranslation) - if (matrix.meta["fRotationMatrix"] != null) { - val fRotationMatrix by matrix.meta.doubleArray() - rotate(fRotationMatrix) + matrix.meta["fRotation.fRotationMatrix"]?.value?.let { + rotate(it.doubleArray) } } "TGeoHMatrix" -> { @@ -77,15 +75,15 @@ private fun SolidGroup.addShape( val compositeType = when (node.typename) { "TGeoIntersection" -> CompositeType.INTERSECT "TGeoSubtraction" -> CompositeType.SUBTRACT - "TGeoUnion" -> CompositeType.UNION + "TGeoUnion" -> CompositeType.GROUP else -> error("Unknown bool node type ${node.typename}") } - composite(compositeType, name = name) { - addShape(node.fLeft!!, context, "left").also { + smartComposite(compositeType, name = name) { + addShape(node.fLeft!!, context, null).also { if (it == null) TODO() it.useMatrix(node.fLeftMat) } - addShape(node.fRight!!, context, "right").also { + addShape(node.fRight!!, context, null).also { if (it == null) TODO() it.useMatrix(node.fRightMat) } @@ -277,7 +275,11 @@ private fun SolidGroup.addRootVolume( } } - return ref(templateName, name) + ref(templateName, name) + }.apply { + volume.fFillColor?.let { + meta[MATERIAL_COLOR_KEY] = RootColors[it] + } } } diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootColor.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootColor.kt new file mode 100644 index 00000000..9ea9c040 --- /dev/null +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/rootColor.kt @@ -0,0 +1,42 @@ +package ru.mipt.npm.root + +public object RootColors { + private val colorMap = Array(924) { "white" } + + //colorMap[110] = "white" + + private val moreCol = listOf( + 11 to "c1b7ad4d4d4d6666668080809a9a9ab3b3b3cdcdcde6e6e6f3f3f3cdc8accdc8acc3c0a9bbb6a4b3a697b8a49cae9a8d9c8f83886657b1cfc885c3a48aa9a1839f8daebdc87b8f9a768a926983976e7b857d9ad280809caca6c0d4cf88dfbb88bd9f83c89a7dc08378cf5f61ac8f94a6787b946971d45a549300ff7b00ff6300ff4b00ff3300ff1b00ff0300ff0014ff002cff0044ff005cff0074ff008cff00a4ff00bcff00d4ff00ecff00fffd00ffe500ffcd00ffb500ff9d00ff8500ff6d00ff5500ff3d00ff2600ff0e0aff0022ff003aff0052ff006aff0082ff009aff00b1ff00c9ff00e1ff00f9ff00ffef00ffd700ffbf00ffa700ff8f00ff7700ff6000ff4800ff3000ff1800ff0000", + 201 to "5c5c5c7b7b7bb8b8b8d7d7d78a0f0fb81414ec4848f176760f8a0f14b81448ec4876f1760f0f8a1414b84848ec7676f18a8a0fb8b814ecec48f1f1768a0f8ab814b8ec48ecf176f10f8a8a14b8b848ecec76f1f1", + 390 to "ffffcdffff9acdcd9affff66cdcd669a9a66ffff33cdcd339a9a33666633ffff00cdcd009a9a00666600333300", + 406 to "cdffcd9aff9a9acd9a66ff6666cd66669a6633ff3333cd33339a3333663300ff0000cd00009a00006600003300", + 422 to "cdffff9affff9acdcd66ffff66cdcd669a9a33ffff33cdcd339a9a33666600ffff00cdcd009a9a006666003333", + 590 to "cdcdff9a9aff9a9acd6666ff6666cd66669a3333ff3333cd33339a3333660000ff0000cd00009a000066000033", + 606 to "ffcdffff9affcd9acdff66ffcd66cd9a669aff33ffcd33cd9a339a663366ff00ffcd00cd9a009a660066330033", + 622 to "ffcdcdff9a9acd9a9aff6666cd66669a6666ff3333cd33339a3333663333ff0000cd00009a0000660000330000", + 791 to "ffcd9acd9a669a66339a6600cd9a33ffcd66ff9a00ffcd33cd9a00ffcd00ff9a33cd66006633009a3300cd6633ff9a66ff6600ff6633cd3300ff33009aff3366cd00336600339a0066cd339aff6666ff0066ff3333cd0033ff00cdff9a9acd66669a33669a009acd33cdff669aff00cdff339acd00cdff009affcd66cd9a339a66009a6633cd9a66ffcd00ff6633ffcd00cd9a00ffcd33ff9a00cd66006633009a3333cd6666ff9a00ff9a33ff6600cd3300ff339acdff669acd33669a00339a3366cd669aff0066ff3366ff0033cd0033ff339aff0066cd00336600669a339acd66cdff009aff33cdff009acd00cdffcd9aff9a66cd66339a66009a9a33cdcd66ff9a00ffcd33ff9a00cdcd00ff9a33ff6600cd33006633009a6633cd9a66ff6600ff6633ff3300cd3300ffff339acd00666600339a0033cd3366ff669aff0066ff3366cd0033ff0033ff9acdcd669a9a33669a0066cd339aff66cdff009acd009aff33cdff009a", + 920 to "cdcdcd9a9a9a666666333333" + ) + + init { + colorMap[0] = "white" + colorMap[1] = "black" + colorMap[2] = "red" + colorMap[3] = "green" + colorMap[4] = "blue" + colorMap[5] = "yellow" + colorMap[6] = "magenta" + colorMap[7] = "cyan" + colorMap[8] = "rgb(89,212,84)" + colorMap[9] = "rgb(89,84,217)" + colorMap[10] = "white" + + moreCol.forEach { (n, s) -> + for (i in 0 until (s.length / 6)) { + colorMap[n + i] = "#" + s.substring(i * 6, (i + 1) * 6) + } + } + } + + public operator fun get(index: Int): String = colorMap[index] +} \ No newline at end of file diff --git a/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt b/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt deleted file mode 100644 index fdbcea6d..00000000 --- a/cern-root-loader/src/jvmTest/kotlin/ru/mipt/npm/root/loadBMN.kt +++ /dev/null @@ -1,72 +0,0 @@ -package ru.mipt.npm.root - -import kotlinx.serialization.json.JsonArray -import kotlinx.serialization.json.JsonElement -import kotlinx.serialization.json.JsonObject -import kotlinx.serialization.json.jsonPrimitive -import ru.mipt.npm.root.serialization.TGeoManager -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.get -import space.kscience.dataforge.meta.isLeaf -import space.kscience.dataforge.values.string -import space.kscience.visionforge.solid.Solids -import java.nio.file.Paths -import java.time.Duration -import kotlin.io.path.writeText -import kotlin.system.measureTimeMillis - -private fun JsonElement.countTypes(): Sequence = sequence { - when (val json = this@countTypes) { - is JsonObject -> { - json["_typename"]?.let { yield(it.jsonPrimitive.content) } - json.values.forEach { yieldAll(it.countTypes()) } - } - is JsonArray -> { - json.forEach { - yieldAll(it.countTypes()) - } - } - else -> { - } - } -} - -private fun Meta.countTypes() :Sequence = sequence { - if(!isLeaf){ - get("_typename")?.value?.let { yield(it.string) } - items.forEach { yieldAll(it.value.countTypes()) } - } -} - -fun main() { - val string = TGeoManager::class.java.getResourceAsStream("/BM@N.root.json")!! - .readAllBytes().decodeToString() - val time = measureTimeMillis { - val geo = DGeoManager.parse(string) - - val sizes = geo.meta.countTypes().groupBy { it }.mapValues { it.value.size } - sizes.forEach { - println(it) - } - - val solid = geo.toSolid() - - Paths.get("BM@N.vf.json").writeText(Solids.encodeToString(solid)) - //println(Solids.encodeToString(solid)) - } - -// val json = Json.parseToJsonElement(string) -// val sizes = json.countTypes().groupBy { it }.mapValues { it.value.size } -// sizes.forEach { -// println(it) -// } -// -// val time = measureTimeMillis { -// val geo = TObject.decodeFromString(TGeoManager.serializer(), string) -// val solid = geo.toSolid() -// -// println(Solids.encodeToString(solid)) -// } -// - println(Duration.ofMillis(time)) -} \ No newline at end of file diff --git a/demo/playground/build.gradle.kts b/demo/playground/build.gradle.kts index 515cb165..f06c209e 100644 --- a/demo/playground/build.gradle.kts +++ b/demo/playground/build.gradle.kts @@ -55,6 +55,7 @@ kotlin { api(project(":visionforge-gdml")) api(project(":visionforge-plotly")) api(projects.visionforge.visionforgeMarkdown) + api(projects.visionforge.cernRootLoader) } } diff --git a/demo/playground/src/jvmMain/kotlin/rootParser.kt b/demo/playground/src/jvmMain/kotlin/rootParser.kt new file mode 100644 index 00000000..e8995009 --- /dev/null +++ b/demo/playground/src/jvmMain/kotlin/rootParser.kt @@ -0,0 +1,104 @@ +package space.kscience.visionforge.examples + +import ru.mipt.npm.root.DGeoManager +import ru.mipt.npm.root.serialization.TGeoManager +import ru.mipt.npm.root.toSolid +import space.kscience.dataforge.context.Context +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.get +import space.kscience.dataforge.meta.isLeaf +import space.kscience.dataforge.values.string +import space.kscience.visionforge.solid.Solids + + +private fun Meta.countTypes(): Sequence = sequence { + if (!isLeaf) { + get("_typename")?.value?.let { yield(it.string) } + items.forEach { yieldAll(it.value.countTypes()) } + } +} + +fun main() { + val context = Context { + plugin(Solids) + } + + val string = TGeoManager::class.java.getResourceAsStream("/root/BM@N.root.json")!! + .readAllBytes().decodeToString() + + val geo = DGeoManager.parse(string) + + + val sizes = geo.meta.countTypes().groupBy { it }.mapValues { it.value.size } + sizes.forEach { + println(it) + } + + + val solid = geo.toSolid() + + //Paths.get("BM@N.vf.json").writeText(Solids.encodeToString(solid)) + //println(Solids.encodeToString(solid)) + + context.makeVisionFile { + vision("canvas") { + solid +/* SolidGroup { + set( + "Coil", + solid.getPrototype("Coil".asName())!!.apply { + parent = null + } + ) + *//* group("Shade") { + y = 200 + color("red") + coneSurface( + bottomOuterRadius = 135, + bottomInnerRadius = 25, + height = 50, + topOuterRadius = 135, + topInnerRadius = 25, + angle = 1.5707964 + ) { + position = Point3D(79.6, 0, -122.1) + rotation = Point3D(-1.5707964, 0, 0) + } + coneSurface( + bottomOuterRadius = 135, + bottomInnerRadius = 25, + height = 50, + topOuterRadius = 135, + topInnerRadius = 25, + angle = 1.5707964 + ) { + position = Point3D(-79.6, 0, -122.1) + rotation = Point3D(1.5707964, 0, -3.1415927) + } + coneSurface( + bottomOuterRadius = 135, + bottomInnerRadius = 25, + height = 50, + topOuterRadius = 135, + topInnerRadius = 25, + angle = 1.5707964 + ) { + position = Point3D(79.6, 0, 122.1) + rotation = Point3D(1.5707964, 0, 0) + } + coneSurface( + bottomOuterRadius = 135, + bottomInnerRadius = 25, + height = 50, + topOuterRadius = 135, + topInnerRadius = 25, + angle = 1.5707964 + ) { + position = Point3D(-79.6, 0, 122.1) + rotation = Point3D(-1.5707964, 0, -3.1415927) + } + }*//* + }*/ + } + } +} \ No newline at end of file diff --git a/cern-root-loader/src/commonTest/resources/BM@N.root.json b/demo/playground/src/jvmMain/resources/root/BM@N.root.json similarity index 100% rename from cern-root-loader/src/commonTest/resources/BM@N.root.json rename to demo/playground/src/jvmMain/resources/root/BM@N.root.json diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXCompositeFactory.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXCompositeFactory.kt index 1cdcf914..588f15cf 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXCompositeFactory.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXCompositeFactory.kt @@ -48,7 +48,7 @@ public class FXCompositeFactory(public val plugin: FX3DPlugin) : FX3DFactory firstCSG.union(secondCSG) + CompositeType.GROUP, CompositeType.UNION -> firstCSG.union(secondCSG) CompositeType.INTERSECT -> firstCSG.intersect(secondCSG) CompositeType.SUBTRACT -> firstCSG.difference(secondCSG) } diff --git a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt index 8eca342c..8d5ebd49 100644 --- a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt +++ b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt @@ -215,12 +215,12 @@ private class GdmlLoader(val settings: GdmlLoaderOptions) { val first: GdmlSolid = solid.first.resolve(root) ?: error("") val second: GdmlSolid = solid.second.resolve(root) ?: error("") val type: CompositeType = when (solid) { - is GdmlUnion -> CompositeType.SUM // dumb sum for better performance + is GdmlUnion -> CompositeType.GROUP // dumb sum for better performance is GdmlSubtraction -> CompositeType.SUBTRACT is GdmlIntersection -> CompositeType.INTERSECT } - return composite(type, name) { + return smartComposite(type, name) { addSolid(root, first).withPosition( solid.resolveFirstPosition(root), solid.resolveFirstRotation(root), diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt index 00db285c..a68ff645 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt @@ -2,6 +2,7 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import space.kscience.dataforge.meta.isEmpty import space.kscience.dataforge.meta.update import space.kscience.visionforge.VisionBuilder import space.kscience.visionforge.VisionContainerBuilder @@ -9,7 +10,7 @@ import space.kscience.visionforge.VisionPropertyContainer import space.kscience.visionforge.set public enum class CompositeType { - SUM, // Dumb sum of meshes + GROUP, // Dumb sum of meshes UNION, //CSG union INTERSECT, SUBTRACT @@ -50,6 +51,31 @@ public inline fun VisionContainerBuilder.composite( return res } +/** + * A smart form of [Composite] that in case of [CompositeType.GROUP] creates a static group instead + */ +@VisionBuilder +public fun SolidGroup.smartComposite( + type: CompositeType, + name: String? = null, + builder: SolidGroup.() -> Unit, +): Solid = if (type == CompositeType.GROUP) { + val group = SolidGroup(builder) + if (name == null && group.meta.isEmpty()) { + //append directly to group if no properties are defined + group.children.forEach { (key, value) -> + value.parent = null + set(null, value) + } + this + } else { + set(name, group) + group + } +} else { + composite(type, name, builder) +} + @VisionBuilder public inline fun VisionContainerBuilder.union( name: String? = null, diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt index ec6dd5f1..604aac01 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt @@ -82,8 +82,8 @@ public fun SolidGroup(block: SolidGroup.() -> Unit): SolidGroup { @VisionBuilder public fun VisionContainerBuilder.group( name: Name? = null, - action: SolidGroup.() -> Unit = {}, -): SolidGroup = SolidGroup().apply(action).also { set(name, it) } + builder: SolidGroup.() -> Unit = {}, +): SolidGroup = SolidGroup().apply(builder).also { set(name, it) } /** * Define a group with given [name], attach it to this parent and return it. diff --git a/visionforge-threejs/build.gradle.kts b/visionforge-threejs/build.gradle.kts index a6407d13..37b8772f 100644 --- a/visionforge-threejs/build.gradle.kts +++ b/visionforge-threejs/build.gradle.kts @@ -5,5 +5,5 @@ plugins { dependencies { api(project(":visionforge-solid")) implementation(npm("three", "0.130.1")) - implementation(npm("three-csg-ts", "3.1.6")) + implementation(npm("three-csg-ts", "3.1.9")) } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt index 3b5ae6ae..d715a20f 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt @@ -167,7 +167,7 @@ public class ThreeCanvas( } //Clipping planes - options.useProperty(Canvas3DOptions::clipping){clipping -> + options.useProperty(Canvas3DOptions::clipping) { clipping -> if (!clipping.meta.isEmpty()) { renderer.localClippingEnabled = true boundingBox?.let { boundingBox -> @@ -192,7 +192,7 @@ public class ThreeCanvas( } } - options.useProperty(Canvas3DOptions::size){ + options.useProperty(Canvas3DOptions::size) { canvas.style.apply { minWidth = "${options.size.minWith.toInt()}px" maxWidth = "${options.size.maxWith.toInt()}px" @@ -273,18 +273,14 @@ public class ThreeCanvas( return } if (this is Mesh) { - if (highlight) { - val edges = LineSegments( - EdgesGeometry(geometry), - material - ).apply { - name = edgesName - } - add(edges) - } else { - val highlightEdges = children.find { it.name == edgesName } - highlightEdges?.let { remove(it) } + val edges = getObjectByName(edgesName) ?: LineSegments( + EdgesGeometry(geometry), + material + ).also { + it.name = edgesName + add(it) } + edges.visible = highlight } else { children.filter { it.name != edgesName }.forEach { it.toggleHighlight(highlight, edgesName, material) diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt index 5705459a..f57530b3 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt @@ -1,7 +1,6 @@ package space.kscience.visionforge.solid.three import CSG -import info.laht.threekt.core.Object3D import info.laht.threekt.objects.Mesh import space.kscience.dataforge.names.startsWith import space.kscience.visionforge.onPropertyChange @@ -38,11 +37,11 @@ public class ThreeCompositeFactory(public val three: ThreePlugin) : ThreeFactory override val type: KClass get() = Composite::class - override fun invoke(three: ThreePlugin, obj: Composite): Object3D { + override fun invoke(three: ThreePlugin, obj: Composite): Mesh { val first = three.buildObject3D(obj.first) as? Mesh ?: error("First part of composite is not a mesh") val second = three.buildObject3D(obj.second) as? Mesh ?: error("Second part of composite is not a mesh") return when (obj.compositeType) { - CompositeType.SUM, CompositeType.UNION -> CSG.union(first, second) + CompositeType.GROUP, CompositeType.UNION -> CSG.union(first, second) CompositeType.INTERSECT -> CSG.intersect(first, second) CompositeType.SUBTRACT -> CSG.subtract(first, second) }.apply { From bdbe9402721e4b0fe49ac27472b1b558ebde56a0 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sat, 11 Sep 2021 14:26:21 +0300 Subject: [PATCH 077/109] Fixed issues with root importer --- build.gradle.kts | 2 +- .../kotlin/ru/mipt/npm/root/DObject.kt | 23 -- .../kotlin/ru/mipt/npm/root/dRootToSolid.kt | 326 ++++++++++-------- demo/muon-monitor/build.gradle.kts | 6 - .../src/jvmMain/kotlin/rootParser.kt | 13 +- gradle.properties | 2 +- .../kscience/visionforge/react/VisionTree.kt | 2 +- .../space/kscience/visionforge/VisionGroup.kt | 2 +- .../kscience/visionforge/html/headers.kt | 4 +- .../kscience/visionforge/solid/Hexagon.kt | 4 +- 10 files changed, 200 insertions(+), 184 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 20d1a1bd..1984e3d3 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -16,7 +16,7 @@ allprojects { } group = "space.kscience" - version = "0.2.0-dev-23" + version = "0.2.0-dev-24" } subprojects { diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt index e0933614..712e1a4e 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt @@ -15,7 +15,6 @@ public fun MetaProvider.doubleArray( it?.doubleArray ?: doubleArrayOf(*default) } - public class DObjectCache(private val cache: List, public val refStack: List = emptyList()) { public operator fun get(index: Int): Meta = cache[index] @@ -25,28 +24,6 @@ public class DObjectCache(private val cache: List, public val refStack: Li public val empty: DObjectCache = DObjectCache(emptyList(), emptyList()) } } -// -//public interface ObjectRef { -// public fun resolve(): T? -//} - -//public class ChildObjectRef( -// public val builder: (Meta, DObjectCache) -> T, -// public val refCache: DObjectCache, -// public val metaProvider: () -> Meta? -//) : ObjectRef { -// override fun resolve(): T? { -// val meta = metaProvider() ?: return null -// meta["\$ref"]?.int?.let { refId -> -// if (refCache.refStack.contains(refId)) { -// println("Circular reference $refId in stack ${refCache.refStack}") -// return null -// } -// return builder(refCache[refId], refCache.stack(refId)) -// } -// return builder(meta, refCache) -// } -//} public open class DObject(public val meta: Meta, private val refCache: DObjectCache) { diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt index 0fa40340..ed0b76fd 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt @@ -4,6 +4,7 @@ import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.plus import space.kscience.dataforge.values.doubleArray +import space.kscience.visionforge.isEmpty import space.kscience.visionforge.solid.* import space.kscience.visionforge.solid.SolidMaterial.Companion.MATERIAL_COLOR_KEY import kotlin.math.* @@ -16,7 +17,16 @@ private operator fun Number.times(f: Float) = toFloat() * f private fun degToRad(d: Double) = d * PI / 180.0 -private class RootToSolidContext(val prototypeHolder: PrototypeHolder) +private class RootToSolidContext(val prototypeHolder: PrototypeHolder, val maxLayer: Int = 3) { + val layers: MutableList = mutableListOf(0) + + val layerLimits = listOf(10_000, 25_000, 50_000, 100_000, 200_000, 400_000, 600_000) + + val bottomLayer: Int get() = layers.size - 1 + fun addLayer() { + layers.add(0) + } +} // converting to XYZ to Tait–Bryan angles according to https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix private fun Solid.rotate(rot: DoubleArray) { @@ -67,157 +77,164 @@ private fun Solid.useMatrix(matrix: DGeoMatrix?) { private fun SolidGroup.addShape( shape: DGeoShape, context: RootToSolidContext, - name: String? = shape.fName.ifEmpty { null } -): Solid? = when (shape.typename) { - "TGeoCompositeShape" -> { - val fNode: DGeoBoolNode? by shape.dObject(::DGeoBoolNode) - val node = fNode ?: error("Composite shape node not resolved") - val compositeType = when (node.typename) { - "TGeoIntersection" -> CompositeType.INTERSECT - "TGeoSubtraction" -> CompositeType.SUBTRACT - "TGeoUnion" -> CompositeType.GROUP - else -> error("Unknown bool node type ${node.typename}") - } - smartComposite(compositeType, name = name) { - addShape(node.fLeft!!, context, null).also { - if (it == null) TODO() - it.useMatrix(node.fLeftMat) + name: String? = shape.fName.ifEmpty { null }, + block: Solid.() -> Unit = {} +) { + when (shape.typename) { + "TGeoCompositeShape" -> { + val fNode: DGeoBoolNode? by shape.dObject(::DGeoBoolNode) + val node = fNode ?: error("Composite shape node not resolved") + val compositeType = when (node.typename) { + "TGeoIntersection" -> CompositeType.INTERSECT + "TGeoSubtraction" -> CompositeType.SUBTRACT + "TGeoUnion" -> CompositeType.GROUP + else -> error("Unknown bool node type ${node.typename}") } - addShape(node.fRight!!, context, null).also { - if (it == null) TODO() - it.useMatrix(node.fRightMat) - } - } - } - "TGeoXtru" -> { - val fNvert by shape.meta.int(0) - val fX by shape.meta.doubleArray() - val fY by shape.meta.doubleArray() - val fNz by shape.meta.int(0) - val fZ by shape.meta.doubleArray() - val fX0 by shape.meta.doubleArray() - val fY0 by shape.meta.doubleArray() - val fScale by shape.meta.doubleArray() - - extruded(name = name) { - (0 until fNvert).forEach { index -> - shape { - point(fX[index], fY[index]) + smartComposite(compositeType, name = name) { + addShape(node.fLeft!!, context, null) { + this.useMatrix(node.fLeftMat) } - } - - (0 until fNz).forEach { index -> - layer( - fZ[index], - fX0[index], - fY0[index], - fScale[index] - ) - } + addShape(node.fRight!!, context, null) { + this.useMatrix(node.fRightMat) + } + }.apply(block) } - } - "TGeoTube" -> { - val fRmax by shape.meta.double(0.0) - val fDz by shape.meta.double(0.0) - val fRmin by shape.meta.double(0.0) + "TGeoXtru" -> { + val fNvert by shape.meta.int(0) + val fX by shape.meta.doubleArray() + val fY by shape.meta.doubleArray() + val fNz by shape.meta.int(0) + val fZ by shape.meta.doubleArray() + val fX0 by shape.meta.doubleArray() + val fY0 by shape.meta.doubleArray() + val fScale by shape.meta.doubleArray() - tube( - radius = fRmax, - height = fDz * 2, - innerRadius = fRmin, - name = name - ) - } - "TGeoTubeSeg" -> { - val fRmax by shape.meta.double(0.0) - val fDz by shape.meta.double(0.0) - val fRmin by shape.meta.double(0.0) - val fPhi1 by shape.meta.double(0.0) - val fPhi2 by shape.meta.double(0.0) + extruded(name = name) { + (0 until fNvert).forEach { index -> + shape { + point(fX[index], fY[index]) + } + } - tube( - radius = fRmax, - height = fDz * 2, - innerRadius = fRmin, - startAngle = degToRad(fPhi1), - angle = degToRad(fPhi2 - fPhi1), - name = name - ) - } - "TGeoPcon" -> { - val fDphi by shape.meta.double(0.0) - val fNz by shape.meta.int(2) - val fPhi1 by shape.meta.double(360.0) - val fRmax by shape.meta.doubleArray() - val fRmin by shape.meta.doubleArray() - val fZ by shape.meta.doubleArray() - if (fNz == 2) { - coneSurface( - bottomOuterRadius = fRmax[0], - bottomInnerRadius = fRmin[0], - height = fZ[1] - fZ[0], - topOuterRadius = fRmax[1], - topInnerRadius = fRmin[1], + (0 until fNz).forEach { index -> + layer( + fZ[index], + fX0[index], + fY0[index], + fScale[index] + ) + } + }.apply(block) + } + "TGeoTube" -> { + val fRmax by shape.meta.double(0.0) + val fDz by shape.meta.double(0.0) + val fRmin by shape.meta.double(0.0) + + tube( + radius = fRmax, + height = fDz * 2, + innerRadius = fRmin, + name = name, + block = block + ) + } + "TGeoTubeSeg" -> { + val fRmax by shape.meta.double(0.0) + val fDz by shape.meta.double(0.0) + val fRmin by shape.meta.double(0.0) + val fPhi1 by shape.meta.double(0.0) + val fPhi2 by shape.meta.double(0.0) + + tube( + radius = fRmax, + height = fDz * 2, + innerRadius = fRmin, startAngle = degToRad(fPhi1), - angle = degToRad(fDphi), - name = name - ) { - z = (fZ[1] + fZ[0]) / 2 - } - } else { - TODO() + angle = degToRad(fPhi2 - fPhi1), + name = name, + block = block + ) } - } - "TGeoPgon" -> { - val fDphi by shape.meta.double(0.0) - val fNz by shape.meta.int(2) - val fPhi1 by shape.meta.double(360.0) - val fRmax by shape.meta.doubleArray() - val fRmin by shape.meta.doubleArray() - val fZ by shape.meta.doubleArray() + "TGeoPcon" -> { + val fDphi by shape.meta.double(0.0) + val fNz by shape.meta.int(2) + val fPhi1 by shape.meta.double(360.0) + val fRmax by shape.meta.doubleArray() + val fRmin by shape.meta.doubleArray() + val fZ by shape.meta.doubleArray() + if (fNz == 2) { + coneSurface( + bottomOuterRadius = fRmax[0], + bottomInnerRadius = fRmin[0], + height = fZ[1] - fZ[0], + topOuterRadius = fRmax[1], + topInnerRadius = fRmin[1], + startAngle = degToRad(fPhi1), + angle = degToRad(fDphi), + name = name, + ) { + z = (fZ[1] + fZ[0]) / 2 - val fNedges by shape.meta.int(1) + }.apply(block) + } else { + TODO() + } + } + "TGeoPgon" -> { + val fDphi by shape.meta.double(0.0) + val fNz by shape.meta.int(2) + val fPhi1 by shape.meta.double(360.0) + val fRmax by shape.meta.doubleArray() + val fRmin by shape.meta.doubleArray() + val fZ by shape.meta.doubleArray() - val startphi = degToRad(fPhi1) - val deltaphi = degToRad(fDphi) + val fNedges by shape.meta.int(1) - extruded(name) { - //getting the radius of first - require(fNz > 1) { "The polyhedron geometry requires at least two planes" } - val baseRadius = fRmax[0] - shape { - (0..fNedges).forEach { - val phi = deltaphi * fNedges * it + startphi - (baseRadius * cos(phi) to baseRadius * sin(phi)) + val startphi = degToRad(fPhi1) + val deltaphi = degToRad(fDphi) + + extruded(name) { + //getting the radius of first + require(fNz > 1) { "The polyhedron geometry requires at least two planes" } + val baseRadius = fRmax[0] + shape { + (0..fNedges).forEach { + val phi = deltaphi * fNedges * it + startphi + (baseRadius * cos(phi) to baseRadius * sin(phi)) + } } - } - (0 until fNz).forEach { index -> - //scaling all radii relative to first layer radius - layer(fZ[index], scale = fRmax[index] / baseRadius) + (0 until fNz).forEach { index -> + //scaling all radii relative to first layer radius + layer(fZ[index], scale = fRmax[index] / baseRadius) + } + }.apply(block) + } + "TGeoShapeAssembly" -> { + val fVolume by shape.dObject(::DGeoVolume) + fVolume?.let { volume -> + addRootVolume(volume, context, block = block) } } - } - "TGeoShapeAssembly" -> { - val fVolume by shape.dObject(::DGeoVolume) - fVolume?.let { volume -> - addRootVolume(volume, context) + "TGeoBBox" -> { + box(shape.fDX * 2, shape.fDY * 2, shape.fDZ * 2, name = name, block = block) + } + else -> { + TODO("A shape with type ${shape.typename} not implemented") } - } - "TGeoBBox" -> { - box(shape.fDX * 2, shape.fDY * 2, shape.fDZ * 2, name = name) - } - else -> { - TODO("A shape with type ${shape.typename} not implemented") } } private fun SolidGroup.addRootNode(obj: DGeoNode, context: RootToSolidContext) { val volume = obj.fVolume ?: return - addRootVolume(volume, context, obj.fName).apply { + addRootVolume(volume, context, obj.fName) { + if (context.bottomLayer > 0) { + this.layer = context.bottomLayer + } when (obj.typename) { "TGeoNodeMatrix" -> { val fMatrix by obj.dObject(::DGeoMatrix) - useMatrix(fMatrix) + this.useMatrix(fMatrix) } "TGeoNodeOffset" -> { val fOffset by obj.meta.double(0.0) @@ -227,19 +244,29 @@ private fun SolidGroup.addRootNode(obj: DGeoNode, context: RootToSolidContext) { } } -private fun buildVolume(volume: DGeoVolume, context: RootToSolidContext): Solid { +private fun buildVolume(volume: DGeoVolume, context: RootToSolidContext): Solid? { val group = SolidGroup { - if(volume.fNodes.isEmpty()) { + val nodesNum = volume.fNodes.size + if (nodesNum == 0) { //TODO add smart filter volume.fShape?.let { shape -> addShape(shape, context) } } + val expectedLayerSize = context.layers.last() + nodesNum + //If expected number exceeds layer limit, move everything else to the bottom layer. + if (expectedLayerSize >= context.layerLimits[context.bottomLayer]) { + context.addLayer() + println("Adding new layer. Sizes after add: ${context.layers}") + } + context.layers[context.bottomLayer] += nodesNum volume.fNodes.forEach { node -> addRootNode(node, context) } } - return if (group.children.size == 1 && group.meta.isEmpty()) { + return if (group.isEmpty()) { + null + } else if (group.children.size == 1 && group.meta.isEmpty()) { (group.children.values.first() as Solid).apply { parent = null } } else { group @@ -252,8 +279,15 @@ private fun SolidGroup.addRootVolume( volume: DGeoVolume, context: RootToSolidContext, name: String? = null, - cache: Boolean = true -): Solid { + cache: Boolean = true, + block: Solid.() -> Unit = {} +) { + //skip if maximum layer number is reached + if (context.bottomLayer > context.maxLayer){ + println("Maximum layer depth reached. Skipping ${volume.fName}") + return + } + val combinedName = if (volume.fName.isEmpty()) { name } else if (name == null) { @@ -262,23 +296,29 @@ private fun SolidGroup.addRootVolume( "${name}_${volume.fName}" } - return if (!cache) { - val group = buildVolume(volume, context) + if (!cache) { + val group = buildVolume(volume, context)?.apply { + volume.fFillColor?.let { + meta[MATERIAL_COLOR_KEY] = RootColors[it] + } + block() + } set(combinedName?.let { Name.parse(it) }, group) - group } else { val templateName = volumesName + volume.name val existing = getPrototype(templateName) if (existing == null) { context.prototypeHolder.prototypes { - set(templateName, buildVolume(volume, context)) + val group = buildVolume(volume, context) + set(templateName, group) } } - ref(templateName, name) - }.apply { - volume.fFillColor?.let { - meta[MATERIAL_COLOR_KEY] = RootColors[it] + ref(templateName, name).apply { + volume.fFillColor?.let { + meta[MATERIAL_COLOR_KEY] = RootColors[it] + } + block() } } } diff --git a/demo/muon-monitor/build.gradle.kts b/demo/muon-monitor/build.gradle.kts index 3818cada..a7bf2709 100644 --- a/demo/muon-monitor/build.gradle.kts +++ b/demo/muon-monitor/build.gradle.kts @@ -65,12 +65,6 @@ application { mainClass.set("ru.mipt.npm.muon.monitor.server.MMServerKt") } -tasks.withType() { - kotlinOptions { - freeCompilerArgs = freeCompilerArgs + "-Xir-property-lazy-initialization" - } -} - //distributions { // main { // contents { diff --git a/demo/playground/src/jvmMain/kotlin/rootParser.kt b/demo/playground/src/jvmMain/kotlin/rootParser.kt index e8995009..16e1b3fe 100644 --- a/demo/playground/src/jvmMain/kotlin/rootParser.kt +++ b/demo/playground/src/jvmMain/kotlin/rootParser.kt @@ -9,6 +9,8 @@ import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.isLeaf import space.kscience.dataforge.values.string import space.kscience.visionforge.solid.Solids +import java.nio.file.Paths +import kotlin.io.path.writeText private fun Meta.countTypes(): Sequence = sequence { @@ -37,12 +39,18 @@ fun main() { val solid = geo.toSolid() - //Paths.get("BM@N.vf.json").writeText(Solids.encodeToString(solid)) + Paths.get("BM@N.vf.json").writeText(Solids.encodeToString(solid)) //println(Solids.encodeToString(solid)) context.makeVisionFile { vision("canvas") { solid + } + } +} + + + /* SolidGroup { set( "Coil", @@ -99,6 +107,3 @@ fun main() { } }*//* }*/ - } - } -} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 24f28924..a1def2dd 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ kotlin.code.style=official kotlin.mpp.stability.nowarn=true #kotlin.jupyter.add.scanner=false -kotlin.incremental.js.klib=false +#kotlin.incremental.js.klib=false org.gradle.jvmargs=-XX:MaxMetaspaceSize=1G org.gradle.parallel=true \ No newline at end of file diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt index 6be045d6..d746e14a 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt @@ -83,7 +83,7 @@ private fun RBuilder.visionTree(props: ObjectTreeProps): Unit { } obj.children.entries .filter { !it.key.toString().startsWith("@") } // ignore statics and other hidden children - .sortedBy { (it.value as? VisionGroup)?.isEmpty ?: true } // ignore empty groups + .sortedBy { (it.value as? VisionGroup)?.isEmpty() ?: true } // ignore empty groups .forEach { (childToken, child) -> styledDiv { css { diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt index 12fe243b..a8ad1dcd 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt @@ -63,7 +63,7 @@ public interface VisionGroup : Provider, Vision, VisionContainer { */ public operator fun VisionGroup.iterator(): Iterator = children.values.iterator() -public val VisionGroup.isEmpty: Boolean get() = this.children.isEmpty() +public fun VisionGroup.isEmpty(): Boolean = this.children.isEmpty() public interface VisionContainerBuilder { //TODO add documentation diff --git a/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/headers.kt b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/headers.kt index ffe35cc7..9837c60a 100644 --- a/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/headers.kt +++ b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/headers.kt @@ -67,8 +67,8 @@ internal fun checkOrStoreFile(htmlPath: Path, filePath: Path, resource: String): if (!skip) { logger.debug("File $fullPath does not exist or wrong checksum. Writing file") Files.createDirectories(fullPath.parent) - Files.write(fullPath, bytes, StandardOpenOption.CREATE, StandardOpenOption.WRITE) - Files.write(md5File, checksum.encodeToByteArray(), StandardOpenOption.CREATE, StandardOpenOption.WRITE) + Files.write(fullPath, bytes, StandardOpenOption.CREATE,StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.WRITE) + Files.write(md5File, checksum.encodeToByteArray(), StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.WRITE) } return if (htmlPath.isAbsolute && fullPath.startsWith(htmlPath.parent)) { diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Hexagon.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Hexagon.kt index baced452..7f42a3eb 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Hexagon.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Hexagon.kt @@ -57,8 +57,8 @@ public inline fun VisionContainerBuilder.box( ySize: Number, zSize: Number, name: String? = null, - action: Box.() -> Unit = {}, -): Box = Box(xSize.toFloat(), ySize.toFloat(), zSize.toFloat()).apply(action).also { set(name, it) } + block: Box.() -> Unit = {}, +): Box = Box(xSize.toFloat(), ySize.toFloat(), zSize.toFloat()).apply(block).also { set(name, it) } @Serializable @SerialName("solid.hexagon") From d131dc49abad5f48a88c39d83b87bfdf8ea66ec2 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sat, 11 Sep 2021 15:24:52 +0300 Subject: [PATCH 078/109] Removed KApt --- .../src/main/kotlin/VisionForgePlayGroundForJupyter.kt | 2 -- gradle.properties | 2 +- jupyter/visionforge-gdml-jupyter/build.gradle.kts | 6 +++++- .../src/jvmMain/kotlin/GdmlForJupyter.kt | 2 -- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/demo/jupyter-playground/src/main/kotlin/VisionForgePlayGroundForJupyter.kt b/demo/jupyter-playground/src/main/kotlin/VisionForgePlayGroundForJupyter.kt index 12426672..5ada35ec 100644 --- a/demo/jupyter-playground/src/main/kotlin/VisionForgePlayGroundForJupyter.kt +++ b/demo/jupyter-playground/src/main/kotlin/VisionForgePlayGroundForJupyter.kt @@ -6,7 +6,6 @@ import kotlinx.html.script import kotlinx.html.stream.createHTML import kotlinx.html.unsafe import org.jetbrains.kotlinx.jupyter.api.HTML -import org.jetbrains.kotlinx.jupyter.api.annotations.JupyterLibrary import org.jetbrains.kotlinx.jupyter.api.libraries.* import space.kscience.dataforge.context.Context import space.kscience.dataforge.misc.DFExperimental @@ -22,7 +21,6 @@ import space.kscience.visionforge.plotly.asVision import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.visionManager -@JupyterLibrary @DFExperimental public class VisionForgePlayGroundForJupyter : JupyterIntegration() { diff --git a/gradle.properties b/gradle.properties index a1def2dd..d472c5ef 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ kotlin.code.style=official kotlin.mpp.stability.nowarn=true -#kotlin.jupyter.add.scanner=false +kotlin.jupyter.add.scanner=false #kotlin.incremental.js.klib=false org.gradle.jvmargs=-XX:MaxMetaspaceSize=1G diff --git a/jupyter/visionforge-gdml-jupyter/build.gradle.kts b/jupyter/visionforge-gdml-jupyter/build.gradle.kts index 896b44a4..6c1d7c43 100644 --- a/jupyter/visionforge-gdml-jupyter/build.gradle.kts +++ b/jupyter/visionforge-gdml-jupyter/build.gradle.kts @@ -56,4 +56,8 @@ kscience { readme { maturity = ru.mipt.npm.gradle.Maturity.EXPERIMENTAL -} \ No newline at end of file +} + +tasks.named("processJupyterApiResources") { + libraryProducers = listOf("space.kscience.visionforge.gdml.jupyter.GdmlForJupyter") +} diff --git a/jupyter/visionforge-gdml-jupyter/src/jvmMain/kotlin/GdmlForJupyter.kt b/jupyter/visionforge-gdml-jupyter/src/jvmMain/kotlin/GdmlForJupyter.kt index 0b12d3fb..ce32f012 100644 --- a/jupyter/visionforge-gdml-jupyter/src/jvmMain/kotlin/GdmlForJupyter.kt +++ b/jupyter/visionforge-gdml-jupyter/src/jvmMain/kotlin/GdmlForJupyter.kt @@ -2,7 +2,6 @@ package space.kscience.visionforge.gdml.jupyter import kotlinx.html.stream.createHTML import org.jetbrains.kotlinx.jupyter.api.HTML -import org.jetbrains.kotlinx.jupyter.api.annotations.JupyterLibrary import org.jetbrains.kotlinx.jupyter.api.libraries.JupyterIntegration import org.jetbrains.kotlinx.jupyter.api.libraries.resources import space.kscience.dataforge.context.Context @@ -16,7 +15,6 @@ import space.kscience.visionforge.html.embedAndRenderVisionFragment import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.visionManager -@JupyterLibrary @DFExperimental internal class GdmlForJupyter : JupyterIntegration() { From 42eb0a6f6614024a851ac2dacd38d95ebe9ae8fa Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sat, 11 Sep 2021 18:50:59 +0300 Subject: [PATCH 079/109] Revert dumb composite for GDML --- .../kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt | 2 +- .../kotlin/space/kscience/visionforge/solid/Composite.kt | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt index 8d5ebd49..2d3da074 100644 --- a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt +++ b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt @@ -215,7 +215,7 @@ private class GdmlLoader(val settings: GdmlLoaderOptions) { val first: GdmlSolid = solid.first.resolve(root) ?: error("") val second: GdmlSolid = solid.second.resolve(root) ?: error("") val type: CompositeType = when (solid) { - is GdmlUnion -> CompositeType.GROUP // dumb sum for better performance + is GdmlUnion -> CompositeType.UNION // dumb sum for better performance is GdmlSubtraction -> CompositeType.SUBTRACT is GdmlIntersection -> CompositeType.INTERSECT } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt index a68ff645..ecbb4177 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt @@ -32,7 +32,9 @@ public inline fun VisionContainerBuilder.composite( ): Composite { val group = SolidGroup().apply(builder) val children = group.children.values.filterIsInstance() - if (children.size != 2) error("Composite requires exactly two children, but found ${children.size}") + if (children.size != 2){ + error("Composite requires exactly two children, but found ${children.size}") + } val res = Composite(type, children[0], children[1]) res.meta.update(group.meta) From 0ec903370279758a4c40ac138c1cba29cbae609f Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 14 Sep 2021 14:02:36 +0300 Subject: [PATCH 080/109] Add Trapezioid and scaled to root converter --- build.gradle.kts | 4 +- .../kotlin/ru/mipt/npm/root/DObject.kt | 12 +- .../kotlin/ru/mipt/npm/root/dRootToSolid.kt | 41 +- demo/gdml/src/jsMain/kotlin/drop/FileDrop.kt | 8 +- .../visionforge/gdml/demo/GDMLAppComponent.kt | 7 +- .../src/main/kotlin/gravityDemo.kt | 5 +- .../src/main/kotlin/markupComponent.kt | 4 +- .../src/main/kotlin/plotlyComponent.kt | 2 +- .../mipt/npm/muon/monitor/MMAppComponent.kt | 7 +- .../src/jvmMain/kotlin/rootParser.kt | 11 +- .../src/jvmMain/resources/root/BM@N.root.json | 26920 ---------------- .../jvmMain/resources/root/BM@N_geometry.zip | Bin 0 -> 84791 bytes settings.gradle.kts | 4 +- .../visionforge/bootstrap/outputConfig.kt | 11 +- .../visionforge/bootstrap/reactBootstrap.kt | 17 +- .../visionforge/bootstrap/tabComponent.kt | 8 +- .../visionforge/bootstrap/threeControls.kt | 9 +- .../kscience/visionforge/react/MetaViewer.kt | 19 +- .../visionforge/react/MultiSelectChooser.kt | 4 +- .../visionforge/react/PropertyEditor.kt | 4 +- .../visionforge/react/RangeValueChooser.kt | 4 +- .../visionforge/react/ThreeCanvasComponent.kt | 2 +- .../kscience/visionforge/react/VisionTree.kt | 4 +- .../kscience/visionforge/react/layout.kt | 5 +- .../visionforge/react/valueChooser.kt | 17 +- ui/ring/src/main/kotlin/ringui/Loader.kt | 5 +- .../src/main/kotlin/ringui/LoaderScreen.kt | 4 +- .../ThreeViewWithControls.kt | 4 +- .../ringThreeControls.kt | 15 +- 29 files changed, 153 insertions(+), 27004 deletions(-) delete mode 100644 demo/playground/src/jvmMain/resources/root/BM@N.root.json create mode 100644 demo/playground/src/jvmMain/resources/root/BM@N_geometry.zip diff --git a/build.gradle.kts b/build.gradle.kts index 1984e3d3..4ad95112 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,7 +1,7 @@ plugins { id("ru.mipt.npm.gradle.project") - kotlin("multiplatform") version "1.5.30" apply false - kotlin("js") version "1.5.30" apply false +// kotlin("multiplatform") version "1.5.30" apply false +// kotlin("js") version "1.5.30" apply false } val dataforgeVersion by extra("0.5.1") diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt index 712e1a4e..9f4d1971 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt @@ -85,13 +85,23 @@ public class DGeoVolume(meta: Meta, refCache: DObjectCache) : DNamed(meta, refCa public val fFillColor: Int? by meta.int() override val name: Name by lazy { Name.parse(fName.ifEmpty { "volume[${meta.hashCode().toUInt()}]" }) } + + public val numberOfChildren: Int by lazy { + fNodes.sumOf { (it.fVolume?.numberOfChildren ?: 0) + 1 } + } } public class DGeoNode(meta: Meta, refCache: DObjectCache) : DNamed(meta, refCache) { public val fVolume: DGeoVolume? by dObject(::DGeoVolume) } -public class DGeoMatrix(meta: Meta, refCache: DObjectCache) : DNamed(meta, refCache) { +public open class DGeoMatrix(meta: Meta, refCache: DObjectCache) : DNamed(meta, refCache) + +public open class DGeoScale(meta: Meta, refCache: DObjectCache) : DGeoMatrix(meta, refCache) { + public val fScale: DoubleArray by meta.doubleArray(1.0, 1.0, 1.0) + public val x: Double get() = fScale[0] + public val y: Double get() = fScale[1] + public val z: Double get() = fScale[2] } diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt index ed0b76fd..a11f1996 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt @@ -182,6 +182,7 @@ private fun SolidGroup.addShape( } } "TGeoPgon" -> { + //TODO add a inner polygone layer val fDphi by shape.meta.double(0.0) val fNz by shape.meta.int(2) val fPhi1 by shape.meta.double(360.0) @@ -219,6 +220,44 @@ private fun SolidGroup.addShape( "TGeoBBox" -> { box(shape.fDX * 2, shape.fDY * 2, shape.fDZ * 2, name = name, block = block) } + "TGeoTrap" -> { + val fTheta by shape.meta.double(0.0) + val fPhi by shape.meta.double(0.0) + val fAlpha1 by shape.meta.double(0.0) + val fAlpha2 by shape.meta.double(0.0) + if (fAlpha1 != 0.0 || fAlpha2 != 0.0 || fTheta != 0.0 || fPhi != 0.0) { + TODO("Angled trapezoid not implemented") + } + val fH1 by shape.meta.double(0.0) + val fBl1 by shape.meta.double(0.0) + val fTl1 by shape.meta.double(0.0) + val fH2 by shape.meta.double(0.0) + val fBl2 by shape.meta.double(0.0) + val fTl2 by shape.meta.double(0.0) + + val fDz by shape.meta.double(0.0) + //TODO check proper node order + val node1 = Point3D(-fBl1, -fH1, -fDz) + val node2 = Point3D(fBl1, -fH1, -fDz) + val node3 = Point3D(fTl1, fH1, -fDz) + val node4 = Point3D(-fTl1, fH1, -fDz) + val node5 = Point3D(-fBl2, -fH2, fDz) + val node6 = Point3D(fBl2, -fH2, fDz) + val node7 = Point3D(fTl2, fH2, fDz) + val node8 = Point3D(-fTl2, fH2, fDz) + hexagon(node1, node2, node3, node4, node5, node6, node7, node8, name) + } + "TGeoScaledShape" -> { + val fShape by shape.dObject(::DGeoShape) + val fScale by shape.dObject(::DGeoScale) + fShape?.let { scaledShape -> + group(name?.let { Name.parse(it) }) { + scale = Point3D(fScale?.x ?: 1.0, fScale?.y ?: 1.0, fScale?.z ?: 1.0) + addShape(scaledShape, context) + apply(block) + } + } + } else -> { TODO("A shape with type ${shape.typename} not implemented") } @@ -283,7 +322,7 @@ private fun SolidGroup.addRootVolume( block: Solid.() -> Unit = {} ) { //skip if maximum layer number is reached - if (context.bottomLayer > context.maxLayer){ + if (context.bottomLayer > context.maxLayer) { println("Maximum layer depth reached. Skipping ${volume.fName}") return } diff --git a/demo/gdml/src/jsMain/kotlin/drop/FileDrop.kt b/demo/gdml/src/jsMain/kotlin/drop/FileDrop.kt index a52343b0..635c4580 100644 --- a/demo/gdml/src/jsMain/kotlin/drop/FileDrop.kt +++ b/demo/gdml/src/jsMain/kotlin/drop/FileDrop.kt @@ -6,8 +6,8 @@ package drop import org.w3c.dom.DragEvent import org.w3c.files.FileList import react.Component -import react.RProps -import react.RState +import react.Props +import react.State external enum class DropEffects { copy, @@ -16,7 +16,7 @@ external enum class DropEffects { none } -external interface FileDropProps: RProps { +external interface FileDropProps: Props { var className: String? var targetClassName: String? var draggingOverFrameClassName: String? @@ -32,7 +32,7 @@ external interface FileDropProps: RProps { var dropEffect: DropEffects? } -external interface FileDropState: RState { +external interface FileDropState: State { var draggingOverFrame: Boolean var draggingOverTarget: Boolean } diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt index 4c4fc43c..ae8b8ac8 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt @@ -7,8 +7,11 @@ import kotlinx.css.* import org.w3c.files.File import org.w3c.files.FileReader import org.w3c.files.get -import react.* +import react.RProps import react.dom.h2 +import react.functionComponent +import react.useMemo +import react.useState import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.fetch import space.kscience.dataforge.names.Name @@ -31,7 +34,7 @@ external interface GDMLAppProps : RProps { } @JsExport -val GDMLApp = functionalComponent("GDMLApp") { props -> +val GDMLApp = functionComponent("GDMLApp") { props -> val visionManager = useMemo(props.context) { props.context.fetch(Solids).visionManager } var deferredVision: Deferred by useState { CompletableDeferred(props.vision) diff --git a/demo/js-playground/src/main/kotlin/gravityDemo.kt b/demo/js-playground/src/main/kotlin/gravityDemo.kt index eec16afe..e6f2273a 100644 --- a/demo/js-playground/src/main/kotlin/gravityDemo.kt +++ b/demo/js-playground/src/main/kotlin/gravityDemo.kt @@ -3,8 +3,7 @@ import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import kotlinx.css.* import react.RProps -import react.child -import react.functionalComponent +import react.functionComponent import space.kscience.dataforge.context.Context import space.kscience.plotly.layout import space.kscience.plotly.models.Trace @@ -21,7 +20,7 @@ external interface DemoProps : RProps { var context: Context } -val GravityDemo = functionalComponent { props -> +val GravityDemo = functionComponent { props -> val velocityTrace = Trace{ name = "velocity" } diff --git a/demo/js-playground/src/main/kotlin/markupComponent.kt b/demo/js-playground/src/main/kotlin/markupComponent.kt index 879ab3df..52696f8a 100644 --- a/demo/js-playground/src/main/kotlin/markupComponent.kt +++ b/demo/js-playground/src/main/kotlin/markupComponent.kt @@ -7,7 +7,7 @@ import org.intellij.markdown.flavours.gfm.GFMFlavourDescriptor import org.w3c.dom.Element import org.w3c.dom.HTMLElement import react.RProps -import react.functionalComponent +import react.functionComponent import react.useEffect import react.useRef import space.kscience.visionforge.markup.VisionOfMarkup @@ -20,7 +20,7 @@ external interface MarkupProps : RProps { var markup: VisionOfMarkup? } -val Markup = functionalComponent("Markup") { props -> +val Markup = functionComponent("Markup") { props -> val elementRef = useRef(null) useEffect(props.markup, elementRef) { diff --git a/demo/js-playground/src/main/kotlin/plotlyComponent.kt b/demo/js-playground/src/main/kotlin/plotlyComponent.kt index 22f63ac8..fa73f298 100644 --- a/demo/js-playground/src/main/kotlin/plotlyComponent.kt +++ b/demo/js-playground/src/main/kotlin/plotlyComponent.kt @@ -14,7 +14,7 @@ external interface PlotlyProps : RProps { } -val Plotly = functionalComponent("Plotly") { props -> +val Plotly = functionComponent("Plotly") { props -> val elementRef = useRef(null) useEffect(props.plot, elementRef) { diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt index 1a7fe071..f4ea0206 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt @@ -7,10 +7,13 @@ import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.launch import kotlinx.css.* import kotlinx.html.js.onClickFunction -import react.* +import react.RProps import react.dom.attrs import react.dom.button import react.dom.p +import react.functionComponent +import react.useMemo +import react.useState import space.kscience.dataforge.context.Context import space.kscience.dataforge.names.Name import space.kscience.visionforge.react.flexColumn @@ -34,7 +37,7 @@ external interface MMAppProps : RProps { @OptIn(DelicateCoroutinesApi::class) @JsExport -val MMApp = functionalComponent("Muon monitor") { props -> +val MMApp = functionComponent("Muon monitor") { props -> val mmOptions = useMemo { Canvas3DOptions { diff --git a/demo/playground/src/jvmMain/kotlin/rootParser.kt b/demo/playground/src/jvmMain/kotlin/rootParser.kt index 16e1b3fe..80555bc5 100644 --- a/demo/playground/src/jvmMain/kotlin/rootParser.kt +++ b/demo/playground/src/jvmMain/kotlin/rootParser.kt @@ -10,6 +10,7 @@ import space.kscience.dataforge.meta.isLeaf import space.kscience.dataforge.values.string import space.kscience.visionforge.solid.Solids import java.nio.file.Paths +import java.util.zip.ZipInputStream import kotlin.io.path.writeText @@ -25,8 +26,11 @@ fun main() { plugin(Solids) } - val string = TGeoManager::class.java.getResourceAsStream("/root/BM@N.root.json")!! - .readAllBytes().decodeToString() + + val string = ZipInputStream(TGeoManager::class.java.getResourceAsStream("/root/BM@N_geometry.zip")!!).use { + it.nextEntry + it.readAllBytes().decodeToString() + } val geo = DGeoManager.parse(string) @@ -45,12 +49,11 @@ fun main() { context.makeVisionFile { vision("canvas") { solid - } + } } } - /* SolidGroup { set( "Coil", diff --git a/demo/playground/src/jvmMain/resources/root/BM@N.root.json b/demo/playground/src/jvmMain/resources/root/BM@N.root.json deleted file mode 100644 index 9058d156..00000000 --- a/demo/playground/src/jvmMain/resources/root/BM@N.root.json +++ /dev/null @@ -1,26920 +0,0 @@ -{ - "_typename" : "TGeoManager", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "FAIRGeom", - "fTitle" : "FAIR geometry", - "fNNodes" : 413815, - "fVisDensity" : 0, - "fExplodedView" : 0, - "fVisOption" : 1, - "fVisLevel" : 3, - "fNsegments" : 20, - "fNtracks" : 0, - "fMaxVisNodes" : 10000, - "fNpdg" : 257, - "fPdgId" : [1, -1, 2, -2, 3, -3, 4, -4, 5, -5, 6, -6, 7, -7, 8, -8, 11, -11, 12, -12, 13, -13, 14, -14, 15, -15, 16, -16, 17, -17, 18, -18, 21, 22, 23, 24, -24, 25, 28, 29, 32, 33, 34, -34, 35, 36, 37, -37, 38, 39, -39, 40, -40, 51, 52, -52, 53, 54, 55, -55, 56, 61, -61, 62, -62, 63, -63, 64, -64, 65, -65, 66, -66, 81, 82, -82, 83, 84, -84, 85, -85, 91, 92, 93, 94, 95, 96, 97, 98, 99, 110, 111, 113, 115, 130, 210, -210, 211, -211, 213, -213, 215, -215, 220, 221, 223, 225, 310, 311, -311, 313, -313, 315, -315, 321, -321, 323, -323, 325, -325, 330, 331, 333, 335, 411, -411, 413, -413, 415, -415, 421, -421, 423, -423, 425, -425, 431, -431, 433, -433, 435, -435, 440, 441, 443, 445, 511, -511, 513, -513, 515, -515, 521, -521, 523, -523, 525, -525, 531, -531, 533, -533, 535, -535, 541, -541, 543, -543, 545, -545, 551, 553, 555, 1103, -1103, 1114, -1114, 2101, -2101, 2103, -2103, 2110, -2110, 2112, -2112, 2114, -2114, 2203, -2203, 2210, -2210, 2212, -2212, 2214, -2214, 2224, -2224, 3101, -3101, 3103, -3103, 3112, -3112, 3114, -3114, 3122, -3122, 3201, -3201, 3203, -3203, 3212, -3212, 3214, -3214, 3222, -3222, 3224, -3224, 3303, -3303, 3312, -3312, 3314, -3314, 3322, -3322, 3324, -3324, 3334, -3334, 4101, -4101, 4103, -4103, 4112, -4112, 4114, -4114, 4122, -4122, 4132, -4132, 4201, -4201, 4203, -4203, 4212, -4212, 4214, -4214, 4222, -4222, 4224, -4224, 4232, -4232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fStreamVoxels" : false, - "fPhiCut" : false, - "fTimeCut" : false, - "fMatrices" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoIdentity", - "fUniqueID" : 1, - "fBits" : 52428800, - "fName" : "Identity", - "fTitle" : "" - }, { - "_typename" : "TGeoHMatrix", - "fUniqueID" : 2, - "fBits" : 52428800, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 0], - "fRotationMatrix" : [1, 0, 0, 0, 1, 0, 0, 0, 1], - "fScale" : [1, 1, 1] - }, { - "_typename" : "TGeoIdentity", - "fUniqueID" : 3, - "fBits" : 52428800, - "fName" : "Identity", - "fTitle" : "" - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 4, - "fBits" : 52559872, - "fName" : "t5", - "fTitle" : "", - "fTranslation" : [0, -7.13984375, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 5, - "fBits" : 52559872, - "fName" : "t9", - "fTitle" : "", - "fTranslation" : [0, -4.7421875, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 6, - "fBits" : 52559872, - "fName" : "GlassLayer1PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [0, 0, -0.475] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 7, - "fBits" : 52559872, - "fName" : "GlassLayer2PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [0, 0, 0.219] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 8, - "fBits" : 52559872, - "fName" : "G10LayerPosTOF2_trans", - "fTitle" : "", - "fTranslation" : [0, 0, 0.642] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 9, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [45, 0, 1052.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 10, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [7.2, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 11, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [3.65, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 12, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -50.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 13, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 50.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 14, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -50.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 15, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 50.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 16, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -49.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 17, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [7.2, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 18, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -48.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 19, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [7.2, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 20, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -49.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 21, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [3.55, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 22, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -48.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 23, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -47.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 24, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -47] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 25, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -47.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 26, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -47] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 27, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -46.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 28, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -45.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 29, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -46.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 30, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -45.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 31, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -44.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 32, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -44] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 33, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -44.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 34, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -44] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 35, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -43.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 36, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -42.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 37, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -43.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 38, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -42.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 39, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -41.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 40, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -41] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 41, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -41.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 42, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -41] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 43, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -40.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 44, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -39.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 45, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -40.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 46, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -39.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 47, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -38.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 48, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -38] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 49, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -38.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 50, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -38] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 51, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -37.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 52, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -36.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 53, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -37.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 54, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -36.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 55, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -35.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 56, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -35] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 57, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -35.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 58, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -35] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 59, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -34.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 60, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -33.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 61, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -34.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 62, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -33.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 63, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -32.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 64, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -32] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 65, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -32.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 66, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -32] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 67, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -31.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 68, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -30.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 69, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -31.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 70, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -30.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 71, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -29.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 72, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -29] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 73, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -29.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 74, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -29] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 75, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -28.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 76, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -27.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 77, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -28.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 78, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -27.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 79, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -26.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 80, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -26] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 81, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -26.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 82, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -26] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 83, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -25.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 84, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -24.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 85, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -25.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 86, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -24.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 87, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -23.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 88, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -23] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 89, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -23.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 90, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -23] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 91, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -22.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 92, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -21.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 93, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -22.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 94, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -21.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 95, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -20.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 96, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -20] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 97, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -20.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 98, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -20] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 99, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -19.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 100, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -18.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 101, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -19.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 102, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -18.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 103, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -17.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 104, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -17] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 105, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -17.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 106, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -17] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 107, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -16.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 108, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -15.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 109, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -16.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 110, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -15.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 111, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -14.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 112, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -14] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 113, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -14.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 114, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -14] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 115, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -13.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 116, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -12.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 117, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -13.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 118, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -12.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 119, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -11.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 120, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -11] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 121, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -11.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 122, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -11] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 123, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -10.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 124, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -9.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 125, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -10.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 126, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -9.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 127, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -8.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 128, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -8] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 129, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -8.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 130, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -8] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 131, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -7.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 132, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -6.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 133, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -7.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 134, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -6.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 135, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -5.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 136, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 137, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -5.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 138, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 139, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -4.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 140, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -3.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 141, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -4.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 142, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -3.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 143, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -2.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 144, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -2] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 145, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -2.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 146, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -2] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 147, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -1.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 148, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -0.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 149, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -1.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 150, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -0.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 151, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 0.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 152, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 1] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 153, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 0.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 154, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 1] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 155, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 1.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 156, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 2.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 157, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 1.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 158, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 2.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 159, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 3.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 160, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 4] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 161, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 3.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 162, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 4] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 163, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 4.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 164, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 5.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 165, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 4.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 166, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 5.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 167, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 6.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 168, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 7] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 169, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 6.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 170, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 7] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 171, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 7.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 172, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 8.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 173, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 7.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 174, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 8.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 175, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 9.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 176, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 10] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 177, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 9.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 178, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 10] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 179, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 10.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 180, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 11.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 181, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 10.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 182, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 11.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 183, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 12.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 184, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 13] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 185, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 12.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 186, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 13] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 187, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 13.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 188, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 14.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 189, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 13.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 190, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 14.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 191, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 15.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 192, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 16] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 193, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 15.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 194, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 16] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 195, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 16.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 196, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 17.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 197, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 16.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 198, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 17.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 199, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 18.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 200, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 19] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 201, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 18.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 202, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 19] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 203, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 19.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 204, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 20.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 205, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 19.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 206, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 20.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 207, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 21.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 208, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 22] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 209, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 21.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 210, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 22] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 211, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 22.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 212, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 23.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 213, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 22.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 214, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 23.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 215, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 24.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 216, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 217, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 24.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 218, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 219, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 25.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 220, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 26.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 221, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 25.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 222, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 26.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 223, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 27.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 224, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 28] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 225, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 27.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 226, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 28] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 227, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 28.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 228, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 29.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 229, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 28.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 230, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 29.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 231, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 30.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 232, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 31] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 233, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 30.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 234, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 31] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 235, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 31.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 236, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 32.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 237, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 31.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 238, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 32.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 239, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 33.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 240, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 34] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 241, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 33.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 242, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 34] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 243, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 34.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 244, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 35.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 245, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 34.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 246, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 35.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 247, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 36.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 248, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 37] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 249, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 36.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 250, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 37] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 251, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 37.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 252, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 38.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 253, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 37.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 254, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 38.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 255, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 39.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 256, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 40] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 257, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 39.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 258, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 40] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 259, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 40.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 260, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 41.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 261, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 40.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 262, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 41.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 263, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 42.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 264, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 43] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 265, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 42.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 266, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 43] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 267, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 43.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 268, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 44.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 269, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 43.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 270, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 44.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 271, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 45.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 272, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 46] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 273, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 45.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 274, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 46] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 275, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 46.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 276, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 47.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 277, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 46.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 278, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 47.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 279, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 48.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 280, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 49] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 281, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 48.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 282, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 49] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 283, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-75, -45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 284, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-60, -45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 285, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-45, -45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 286, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-30, -45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 287, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-15, -45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 288, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, -45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 289, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [15, -45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 290, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [30, -45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 291, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [45, -45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 292, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [60, -45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 293, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [75, -45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 294, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-75, -30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 295, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-60, -30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 296, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-45, -30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 297, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-30, -30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 298, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-15, -30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 299, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, -30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 300, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [15, -30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 301, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [30, -30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 302, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [45, -30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 303, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [60, -30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 304, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [75, -30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 305, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-75, -15, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 306, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-60, -15, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 307, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-45, -15, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 308, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-30, -15, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 309, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-18.75, -18.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 310, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-11.25, -18.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 311, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-18.75, -11.25, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 312, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-11.25, -11.25, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 313, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-3.75, -18.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 314, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [3.75, -18.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 315, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-3.75, -11.25, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 316, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [3.75, -11.25, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 317, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [11.25, -18.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 318, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [18.75, -18.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 319, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [11.25, -11.25, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 320, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [18.75, -11.25, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 321, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [30, -15, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 322, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [45, -15, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 323, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [60, -15, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 324, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [75, -15, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 325, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-75, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 326, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-60, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 327, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-45, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 328, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-30, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 329, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-18.75, -3.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 330, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-11.25, -3.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 331, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-18.75, 3.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 332, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-11.25, 3.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 333, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-3.75, -3.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 334, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-3.75, 3.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 335, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [18.75, -3.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 336, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [18.75, 3.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 337, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [30, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 338, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [45, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 339, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [60, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 340, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [75, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 341, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-75, 15, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 342, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-60, 15, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 343, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-45, 15, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 344, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-30, 15, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 345, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-18.75, 11.25, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 346, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-11.25, 11.25, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 347, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-18.75, 18.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 348, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-11.25, 18.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 349, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-3.75, 11.25, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 350, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [3.75, 11.25, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 351, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-3.75, 18.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 352, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [3.75, 18.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 353, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [11.25, 11.25, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 354, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [18.75, 11.25, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 355, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [11.25, 18.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 356, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [18.75, 18.75, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 357, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [30, 15, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 358, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [45, 15, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 359, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [60, 15, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 360, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [75, 15, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 361, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-75, 30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 362, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-60, 30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 363, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-45, 30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 364, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-30, 30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 365, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-15, 30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 366, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 367, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [15, 30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 368, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [30, 30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 369, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [45, 30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 370, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [60, 30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 371, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [75, 30, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 372, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-75, 45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 373, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-60, 45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 374, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-45, 45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 375, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-30, 45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 376, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-15, 45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 377, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 378, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [15, 45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 379, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [30, 45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 380, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [45, 45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 381, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [60, 45, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 382, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [75, 45, 0] - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 383, - "fBits" : 52559872, - "fName" : "t383", - "fTitle" : "", - "fTranslation" : [35.5, 0, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 384, - "fBits" : 52559872, - "fName" : "t383", - "fTitle" : "", - "fTranslation" : [-35.5, 0, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 385, - "fBits" : 52559872, - "fName" : "t383", - "fTitle" : "", - "fTranslation" : [0, 22.375, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 386, - "fBits" : 52559872, - "fName" : "t383", - "fTitle" : "", - "fTranslation" : [0, -22.375, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 387, - "fBits" : 52559872, - "fName" : "t383", - "fTitle" : "", - "fTranslation" : [0, 0, 0.45], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 388, - "fBits" : 52559872, - "fName" : "t383", - "fTitle" : "", - "fTranslation" : [0, 0, 0.45], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 389, - "fBits" : 52559872, - "fName" : "t389", - "fTitle" : "", - "fTranslation" : [35.5, 0, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 390, - "fBits" : 52559872, - "fName" : "t389", - "fTitle" : "", - "fTranslation" : [-35.5, 0, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 391, - "fBits" : 52559872, - "fName" : "t389", - "fTitle" : "", - "fTranslation" : [0, 22.375, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 392, - "fBits" : 52559872, - "fName" : "t389", - "fTitle" : "", - "fTranslation" : [0, -22.375, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 393, - "fBits" : 52559872, - "fName" : "t389", - "fTitle" : "", - "fTranslation" : [0, 0, 0.45], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 394, - "fBits" : 52559872, - "fName" : "t389", - "fTitle" : "", - "fTranslation" : [0, 0, 0.45], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 395, - "fBits" : 52559872, - "fName" : "t395", - "fTitle" : "", - "fTranslation" : [35.5, 0, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 396, - "fBits" : 52559872, - "fName" : "t395", - "fTitle" : "", - "fTranslation" : [-35.5, 0, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 397, - "fBits" : 52559872, - "fName" : "t395", - "fTitle" : "", - "fTranslation" : [0, 22.375, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 398, - "fBits" : 52559872, - "fName" : "t395", - "fTitle" : "", - "fTranslation" : [0, -22.375, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 399, - "fBits" : 52559872, - "fName" : "t395", - "fTitle" : "", - "fTranslation" : [0, 0, 0.45], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 400, - "fBits" : 52559872, - "fName" : "t395", - "fTitle" : "", - "fTranslation" : [0, 0, 0.45], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 401, - "fBits" : 52559872, - "fName" : "t401", - "fTitle" : "", - "fTranslation" : [35.5, 0, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 402, - "fBits" : 52559872, - "fName" : "t401", - "fTitle" : "", - "fTranslation" : [-35.5, 0, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 403, - "fBits" : 52559872, - "fName" : "t401", - "fTitle" : "", - "fTranslation" : [0, 22.375, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 404, - "fBits" : 52559872, - "fName" : "t401", - "fTitle" : "", - "fTranslation" : [0, -22.375, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 405, - "fBits" : 52559872, - "fName" : "t405", - "fTitle" : "", - "fTranslation" : [35.5, 0, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 406, - "fBits" : 52559872, - "fName" : "t405", - "fTitle" : "", - "fTranslation" : [-35.5, 0, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 407, - "fBits" : 52559872, - "fName" : "t405", - "fTitle" : "", - "fTranslation" : [0, 22.375, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 408, - "fBits" : 52559872, - "fName" : "t405", - "fTitle" : "", - "fTranslation" : [0, -22.375, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 409, - "fBits" : 52559872, - "fName" : "t401", - "fTitle" : "", - "fTranslation" : [27.7, 0, 0.55], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 410, - "fBits" : 52559872, - "fName" : "t401", - "fTitle" : "", - "fTranslation" : [-34.7, 0.2, 2.95], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 411, - "fBits" : 52559872, - "fName" : "t401", - "fTitle" : "", - "fTranslation" : [27.7, 0, 0.55], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 412, - "fBits" : 52559872, - "fName" : "t405", - "fTitle" : "", - "fTranslation" : [-34.7, 0.2, 2.95], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 413, - "fBits" : 52559872, - "fName" : "t413", - "fTitle" : "", - "fTranslation" : [43.3, 0, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 414, - "fBits" : 52559872, - "fName" : "t413", - "fTitle" : "", - "fTranslation" : [0, 24.375, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 415, - "fBits" : 52559872, - "fName" : "t413", - "fTitle" : "", - "fTranslation" : [2.875, -24.375, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 416, - "fBits" : 52559872, - "fName" : "t416", - "fTitle" : "", - "fTranslation" : [43.3, 0, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 417, - "fBits" : 52559872, - "fName" : "t416", - "fTitle" : "", - "fTranslation" : [0, 24.375, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 418, - "fBits" : 52559872, - "fName" : "t416", - "fTitle" : "", - "fTranslation" : [2.875, -24.375, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 419, - "fBits" : 52559872, - "fName" : "t413", - "fTitle" : "", - "fTranslation" : [40.8, 0, 0.45], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 420, - "fBits" : 62259200, - "fName" : "c413", - "fTitle" : "", - "fTranslation" : [-40.8, 0, 0.45], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 53739520, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [-1, -0, -0, 0, 1, 0, 0, 0, 1] - } - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 421, - "fBits" : 52559872, - "fName" : "t413", - "fTitle" : "", - "fTranslation" : [40.8, 0, 0.45], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 422, - "fBits" : 62259200, - "fName" : "c416", - "fTitle" : "", - "fTranslation" : [-40.8, 0, 0.45], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 53739520, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [-1, -0, -0, 0, 1, 0, 0, 0, 1] - } - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 423, - "fBits" : 52559872, - "fName" : "t423", - "fTitle" : "", - "fTranslation" : [43.3, 0, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 424, - "fBits" : 52559872, - "fName" : "t423", - "fTitle" : "", - "fTranslation" : [0, 24.375, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 425, - "fBits" : 52559872, - "fName" : "t423", - "fTitle" : "", - "fTranslation" : [2.875, -24.375, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 426, - "fBits" : 52559872, - "fName" : "t426", - "fTitle" : "", - "fTranslation" : [43.3, 0, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 427, - "fBits" : 52559872, - "fName" : "t426", - "fTitle" : "", - "fTranslation" : [0, 24.375, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 428, - "fBits" : 52559872, - "fName" : "t426", - "fTitle" : "", - "fTranslation" : [2.875, -24.375, 0], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 429, - "fBits" : 52559872, - "fName" : "t423", - "fTitle" : "", - "fTranslation" : [40.8, 0, 0.45], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 430, - "fBits" : 62259200, - "fName" : "c423", - "fTitle" : "", - "fTranslation" : [-40.8, 0, 0.45], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 53739520, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [-1, -0, -0, 0, 1, 0, 0, 0, 1] - } - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 431, - "fBits" : 52559872, - "fName" : "t423", - "fTitle" : "", - "fTranslation" : [40.8, 0, 0.45], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 432, - "fBits" : 62259200, - "fName" : "c426", - "fTitle" : "", - "fTranslation" : [-40.8, 0, 0.45], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 53739520, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [-1, -0, -0, 0, 1, 0, 0, 0, 1] - } - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 433, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-29.375, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 434, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-28.125, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 435, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-26.875, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 436, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-25.625, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 437, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-24.375, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 438, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-23.125, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 439, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-21.875, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 440, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-20.625, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 441, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-19.375, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 442, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-18.125, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 443, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-16.875, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 444, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-15.625, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 445, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-14.375, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 446, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-13.125, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 447, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-11.875, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 448, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-10.625, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 449, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-9.375, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 450, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-8.125, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 451, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-6.875, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 452, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-5.625, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 453, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-4.375, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 454, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-3.125, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 455, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-1.875, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 456, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [-0.625, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 457, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [0.625, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 458, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [1.875, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 459, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [3.125, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 460, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [4.375, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 461, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [5.625, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 462, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [6.875, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 463, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [8.125, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 464, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [9.375, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 465, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [10.625, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 466, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [11.875, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 467, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [13.125, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 468, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [14.375, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 469, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [15.625, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 470, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [16.875, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 471, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [18.125, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 472, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [19.375, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 473, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [20.625, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 474, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [21.875, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 475, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [23.125, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 476, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [24.375, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 477, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [25.625, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 478, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [26.875, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 479, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [28.125, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 480, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [29.375, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 481, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [0, 0, -0.304499998688698] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 482, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [0, 0, 0.304499998688698] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 483, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [0, 0, -1.34000000357628] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 484, - "fBits" : 52559872, - "fName" : "t433", - "fTitle" : "", - "fTranslation" : [0, 0, 1.34000000357628] - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 485, - "fBits" : 52559872, - "fName" : "t485", - "fTitle" : "", - "fTranslation" : [0, 0, -11.59375], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 486, - "fBits" : 52559872, - "fName" : "t485", - "fTitle" : "", - "fTranslation" : [0, 0, -8.28125], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 487, - "fBits" : 52559872, - "fName" : "t485", - "fTitle" : "", - "fTranslation" : [0, 0, -4.96875], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 488, - "fBits" : 52559872, - "fName" : "t485", - "fTitle" : "", - "fTranslation" : [0, 0, -1.65625], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 489, - "fBits" : 52559872, - "fName" : "t485", - "fTitle" : "", - "fTranslation" : [0, 0, 1.65625], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 490, - "fBits" : 52559872, - "fName" : "t485", - "fTitle" : "", - "fTranslation" : [0, 0, 4.96875], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 491, - "fBits" : 52559872, - "fName" : "t485", - "fTitle" : "", - "fTranslation" : [0, 0, 8.28125], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 492, - "fBits" : 52559872, - "fName" : "t485", - "fTitle" : "", - "fTranslation" : [0, 0, 11.59375], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 493, - "fBits" : 52559872, - "fName" : "t493", - "fTitle" : "", - "fTranslation" : [0, 0, -2.50375], - "fRotation" : null - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 494, - "fBits" : 61210624, - "fName" : "c493", - "fTitle" : "", - "fTranslation" : [0, 0, -1.50225], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "r0", - "fTitle" : "", - "fRotationMatrix" : [0.5, -0.866025403784439, 0, 0.866025403784439, 0.5, -0, 0, 0, 1] - } - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 495, - "fBits" : 61210624, - "fName" : "c493", - "fTitle" : "", - "fTranslation" : [0, 0, -0.50075], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "r0", - "fTitle" : "", - "fRotationMatrix" : [-0.5, -0.866025403784439, 0, 0.866025403784439, -0.5, -0, 0, -0, 1] - } - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 496, - "fBits" : 61210624, - "fName" : "c493", - "fTitle" : "", - "fTranslation" : [0, 0, 0.50075], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "r0", - "fTitle" : "", - "fRotationMatrix" : [-1, -1.22464679914735e-16, 0, 1.22464679914735e-16, -1, -0, 0, -0, 1] - } - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 497, - "fBits" : 61210624, - "fName" : "c493", - "fTitle" : "", - "fTranslation" : [0, 0, 1.50225], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "r0", - "fTitle" : "", - "fRotationMatrix" : [-0.5, 0.866025403784438, 0, -0.866025403784438, -0.5, -0, -0, -0, 1] - } - }, { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 498, - "fBits" : 61210624, - "fName" : "c493", - "fTitle" : "", - "fTranslation" : [0, 0, 2.50375], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "r0", - "fTitle" : "", - "fRotationMatrix" : [0.5, 0.866025403784439, 0, -0.866025403784439, 0.5, -0, -0, 0, 1] - } - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 499, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-48, 0, 800] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 500, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [42, 54, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 501, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -19.9] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 502, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -19.71] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 503, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -0.075] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 504, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [4, 4, 0.015] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 505, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [4, 0, 0.015] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 506, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [4, -4, 0.015] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 507, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 4, 0.015] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 508, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 0.015] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 509, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, -4, 0.015] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 510, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-4, 4, 0.015] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 511, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-4, 0, 0.015] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 512, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-4, -4, 0.015] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 513, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -19.53] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 514, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -19.35] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 515, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -19.17] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 516, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -18.99] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 517, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -18.81] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 518, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -18.63] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 519, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -18.45] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 520, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -18.27] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 521, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -18.09] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 522, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -17.91] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 523, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -17.73] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 524, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -17.55] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 525, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -17.37] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 526, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -17.19] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 527, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -17.01] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 528, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -16.83] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 529, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -16.65] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 530, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -16.47] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 531, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -16.29] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 532, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -16.11] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 533, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -15.93] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 534, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -15.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 535, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -15.57] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 536, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -15.39] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 537, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -15.21] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 538, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -15.03] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 539, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -14.85] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 540, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -14.67] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 541, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -14.49] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 542, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -14.31] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 543, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -14.13] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 544, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -13.95] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 545, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -13.77] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 546, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -13.59] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 547, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -13.41] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 548, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -13.23] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 549, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -13.05] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 550, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -12.87] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 551, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -12.69] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 552, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -12.51] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 553, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -12.33] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 554, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -12.15] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 555, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -11.97] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 556, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -11.79] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 557, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -11.61] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 558, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -11.43] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 559, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -11.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 560, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -11.07] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 561, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -10.89] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 562, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -10.71] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 563, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -10.53] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 564, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -10.35] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 565, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -10.17] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 566, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -9.99] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 567, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -9.81] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 568, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -9.63] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 569, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -9.45] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 570, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -9.27] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 571, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -9.09] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 572, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -8.91] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 573, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -8.73] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 574, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -8.55] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 575, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -8.37] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 576, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -8.19] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 577, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -8.01] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 578, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -7.83] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 579, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -7.65] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 580, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -7.47] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 581, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -7.29] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 582, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -7.11] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 583, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -6.93] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 584, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -6.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 585, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -6.57] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 586, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -6.39] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 587, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -6.21] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 588, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -6.03] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 589, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -5.85] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 590, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -5.67] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 591, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -5.49] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 592, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -5.31] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 593, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -5.13] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 594, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -4.95] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 595, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -4.77] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 596, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -4.59] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 597, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -4.41] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 598, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -4.23] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 599, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -4.05] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 600, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -3.87] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 601, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -3.69] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 602, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -3.51] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 603, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -3.33] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 604, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -3.15] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 605, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -2.97] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 606, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -2.79] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 607, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -2.61] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 608, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -2.43] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 609, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -2.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 610, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -2.07] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 611, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -1.89] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 612, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -1.71] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 613, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -1.53] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 614, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -1.35] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 615, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -1.17] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 616, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -0.99] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 617, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -0.81] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 618, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -0.63] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 619, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -0.45] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 620, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -0.27] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 621, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, -0.09] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 622, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 0.09] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 623, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 0.27] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 624, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 0.45] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 625, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 0.63] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 626, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 0.81] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 627, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 0.99] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 628, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 1.17] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 629, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 1.35] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 630, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 1.53] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 631, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 1.71] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 632, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 1.89] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 633, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 2.07] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 634, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 2.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 635, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 2.43] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 636, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 2.61] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 637, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 2.79] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 638, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 2.97] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 639, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 3.15] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 640, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 3.33] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 641, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 3.51] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 642, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 3.69] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 643, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 3.87] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 644, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 4.05] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 645, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 4.23] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 646, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 4.41] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 647, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 4.59] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 648, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 4.77] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 649, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 4.95] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 650, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 5.13] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 651, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 5.31] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 652, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 5.49] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 653, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 5.67] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 654, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 5.85] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 655, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 6.03] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 656, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 6.21] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 657, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 6.39] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 658, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 6.57] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 659, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 6.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 660, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 6.93] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 661, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 7.11] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 662, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 7.29] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 663, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 7.47] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 664, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 7.65] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 665, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 7.83] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 666, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 8.01] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 667, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 8.19] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 668, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 8.37] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 669, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 8.55] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 670, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 8.73] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 671, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 8.91] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 672, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 9.09] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 673, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 9.27] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 674, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 9.45] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 675, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 9.63] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 676, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 9.81] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 677, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 9.99] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 678, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 10.17] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 679, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 10.35] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 680, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 10.53] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 681, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 10.71] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 682, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 10.89] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 683, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 11.07] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 684, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 11.25] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 685, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 11.43] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 686, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 11.61] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 687, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 11.79] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 688, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 11.97] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 689, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 12.15] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 690, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 12.33] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 691, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 12.51] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 692, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 12.69] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 693, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 12.87] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 694, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 13.05] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 695, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 13.23] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 696, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 13.41] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 697, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 13.59] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 698, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 13.77] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 699, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 13.95] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 700, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 14.13] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 701, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 14.31] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 702, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 14.49] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 703, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 14.67] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 704, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 14.85] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 705, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 15.03] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 706, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 15.21] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 707, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 15.39] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 708, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 15.57] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 709, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 15.75] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 710, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 15.93] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 711, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 16.11] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 712, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 16.29] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 713, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 16.47] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 714, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 16.65] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 715, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 16.83] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 716, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 17.01] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 717, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 17.19] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 718, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 17.37] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 719, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 17.55] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 720, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 17.73] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 721, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 17.91] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 722, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 18.09] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 723, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 18.27] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 724, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 18.45] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 725, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 18.63] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 726, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 18.81] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 727, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 18.99] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 728, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 19.17] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 729, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 19.35] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 730, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 19.53] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 731, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 19.71] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 732, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [42, 42, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 733, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [42, 30, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 734, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [42, 18, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 735, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [42, 6, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 736, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [42, -6, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 737, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [42, -18, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 738, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [42, -30, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 739, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [42, -42, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 740, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [42, -54, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 741, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [30, 54, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 742, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [30, 42, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 743, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [30, 30, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 744, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [30, 18, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 745, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [30, 6, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 746, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [30, -6, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 747, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [30, -18, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 748, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [30, -30, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 749, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [30, -42, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 750, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [30, -54, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 751, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [18, 54, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 752, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [18, 42, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 753, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [18, 30, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 754, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [18, 18, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 755, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [18, 6, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 756, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [18, -6, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 757, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [18, -18, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 758, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [18, -30, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 759, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [18, -42, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 760, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [18, -54, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 761, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [6, 54, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 762, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [6, 42, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 763, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [6, 30, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 764, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [6, 18, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 765, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [6, 6, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 766, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [6, -6, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 767, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [6, -18, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 768, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [6, -30, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 769, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [6, -42, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 770, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [6, -54, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 771, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-6, 54, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 772, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-6, 42, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 773, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-6, 30, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 774, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-6, 18, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 775, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-6, 6, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 776, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-6, -6, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 777, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-6, -18, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 778, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-6, -30, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 779, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-6, -42, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 780, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-6, -54, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 781, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-18, 54, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 782, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-18, 42, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 783, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-18, 30, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 784, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-18, 18, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 785, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-18, 6, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 786, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-18, -6, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 787, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-18, -18, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 788, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-18, -30, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 789, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-18, -42, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 790, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-18, -54, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 791, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-30, 54, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 792, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-30, 42, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 793, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-30, 30, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 794, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-30, 18, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 795, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-30, 6, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 796, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-30, -6, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 797, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-30, -18, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 798, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-30, -30, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 799, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-30, -42, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 800, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-30, -54, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 801, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-42, 54, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 802, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-42, 42, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 803, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-42, 30, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 804, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-42, 18, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 805, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-42, 6, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 806, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-42, -6, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 807, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-42, -18, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 808, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-42, -30, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 809, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-42, -42, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 810, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [-42, -54, -7.5] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 811, - "fBits" : 52559872, - "fName" : "", - "fTitle" : "", - "fTranslation" : [108, 0, 800] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t812", - "fTitle" : "", - "fTranslation" : [0, 3.15175, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t812", - "fTitle" : "", - "fTranslation" : [0, -3.15175, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t814", - "fTitle" : "", - "fTranslation" : [0, 3.15175, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t814", - "fTitle" : "", - "fTranslation" : [0, -3.15175, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t816", - "fTitle" : "", - "fTranslation" : [0, 3.15175, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t816", - "fTitle" : "", - "fTranslation" : [0, -3.15175, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t818", - "fTitle" : "", - "fTranslation" : [0, 3.15175, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t818", - "fTitle" : "", - "fTranslation" : [0, -3.15175, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t820", - "fTitle" : "", - "fTranslation" : [0, 3.15175, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t820", - "fTitle" : "", - "fTranslation" : [0, -3.15175, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t822", - "fTitle" : "", - "fTranslation" : [0, 3.15175, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t822", - "fTitle" : "", - "fTranslation" : [0, -3.15175, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t824", - "fTitle" : "", - "fTranslation" : [0, 3.15175, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t824", - "fTitle" : "", - "fTranslation" : [0, -3.15175, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t826", - "fTitle" : "", - "fTranslation" : [0, 3.15175, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t826", - "fTitle" : "", - "fTranslation" : [0, -3.15175, 0] - }, { - "_typename" : "TGeoIdentity", - "fUniqueID" : 0, - "fBits" : 52428800, - "fName" : "Identity", - "fTitle" : "" - }, { - "_typename" : "TGeoIdentity", - "fUniqueID" : 0, - "fBits" : 52428800, - "fName" : "Identity", - "fTitle" : "" - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52428800, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 0] - }, { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52428800, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 0] - }, { - "_typename" : "TGeoIdentity", - "fUniqueID" : 0, - "fBits" : 52428800, - "fName" : "Identity", - "fTitle" : "" - }, { - "_typename" : "TGeoIdentity", - "fUniqueID" : 0, - "fBits" : 52428800, - "fName" : "Identity", - "fTitle" : "" - }, { - "_typename" : "TGeoIdentity", - "fUniqueID" : 0, - "fBits" : 52428800, - "fName" : "Identity", - "fTitle" : "" - }, { - "_typename" : "TGeoHMatrix", - "fUniqueID" : 1, - "fBits" : 52428800, - "fName" : "Identity", - "fTitle" : "", - "fTranslation" : [0, 0, 0], - "fRotationMatrix" : [1, 0, 0, 0, 1, 0, 0, 0, 1], - "fScale" : [1, 1, 1] - }, { - "_typename" : "TGeoHMatrix", - "fUniqueID" : 0, - "fBits" : 52428800, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 0], - "fRotationMatrix" : [1, 0, 0, 0, 1, 0, 0, 0, 1], - "fScale" : [1, 1, 1] - }] - }, - "fShapes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoBBox", - "fUniqueID" : 1, - "fBits" : 50331648, - "fName" : "cave", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 2000, - "fDY" : 2000, - "fDZ" : 2000, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 2, - "fBits" : 50331648, - "fName" : "CoilTS", - "fTitle" : "CoilCornerS:combitran_CoilCorner1+CoilCornerS:combitran_CoilCorner2+CoilCornerS:combitran_CoilCorner3+CoilCornerS:combitran_CoilCorner4+CoilShortSideS:tran_CoilShortSide1+CoilShortSideS:tran_CoilShortSide2+CoilLongSideS:tran_CoilLongSide1+CoilLongSideS:tran_CoilLongSide2", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 214.6, - "fDY" : 25, - "fDZ" : 257.1, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoUnion", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 3, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "CoilCornerS:combitran_CoilCorner1+CoilCornerS:combitran_CoilCorner2+CoilCornerS:combitran_CoilCorner3+CoilCornerS:combitran_CoilCorner4+CoilShortSideS:tran_CoilShortSide1+CoilShortSideS:tran_CoilShortSide2+CoilLongSideS:tran_CoilLongSide1", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 214.6, - "fDY" : 25, - "fDZ" : 257.1, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoUnion", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 4, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "CoilCornerS:combitran_CoilCorner1+CoilCornerS:combitran_CoilCorner2+CoilCornerS:combitran_CoilCorner3+CoilCornerS:combitran_CoilCorner4+CoilShortSideS:tran_CoilShortSide1+CoilShortSideS:tran_CoilShortSide2", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 214.6, - "fDY" : 25, - "fDZ" : 257.1, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoUnion", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 5, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "CoilCornerS:combitran_CoilCorner1+CoilCornerS:combitran_CoilCorner2+CoilCornerS:combitran_CoilCorner3+CoilCornerS:combitran_CoilCorner4+CoilShortSideS:tran_CoilShortSide1", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 214.6, - "fDY" : 25, - "fDZ" : 257.1, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoUnion", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 6, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "CoilCornerS:combitran_CoilCorner1+CoilCornerS:combitran_CoilCorner2+CoilCornerS:combitran_CoilCorner3+CoilCornerS:combitran_CoilCorner4", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 214.6, - "fDY" : 25, - "fDZ" : 257.1, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoUnion", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 7, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "CoilCornerS:combitran_CoilCorner1+CoilCornerS:combitran_CoilCorner2+CoilCornerS:combitran_CoilCorner3", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 214.6, - "fDY" : 25, - "fDZ" : 257.1, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoUnion", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 8, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "CoilCornerS:combitran_CoilCorner1+CoilCornerS:combitran_CoilCorner2", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 214.6, - "fDY" : 25, - "fDZ" : 67.5, - "fOrigin" : [0, 0, -189.6], - "fNode" : { - "_typename" : "TGeoUnion", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoTubeSeg", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "CoilCornerS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 25600, - "fDX" : 67.5, - "fDY" : 67.5, - "fDZ" : 25, - "fOrigin" : [67.5, 67.5, 0], - "fRmin" : 25, - "fRmax" : 135, - "fDz" : 25, - "fPhi1" : 0, - "fPhi2" : 90, - "fS1" : 0, - "fC1" : 1, - "fS2" : 1, - "fC2" : 6.12323399573677e-17, - "fSm" : 0.707106781186547, - "fCm" : 0.707106781186548, - "fCdfi" : 0.707106781186548 - }, - "fRight" : {"$ref":863}, - "fLeftMat" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 61210624, - "fName" : "combitran_CoilCorner1", - "fTitle" : "", - "fTranslation" : [79.6, 0, -122.1], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [1, 0, 0, 0, 0, 1, 0, -1, 0] - } - }, - "fRightMat" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 61210624, - "fName" : "combitran_CoilCorner2", - "fTitle" : "", - "fTranslation" : [-79.6, 0, -122.1], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [-1, 0, 0, 0, 0, -1, 0, -1, 0] - } - } - } - }, - "fRight" : {"$ref":863}, - "fLeftMat" : {"$ref":4}, - "fRightMat" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 61210624, - "fName" : "combitran_CoilCorner3", - "fTitle" : "", - "fTranslation" : [-79.6, 0, 122.1], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [-1, 0, 0, 0, 0, 1, 0, 1, 0] - } - } - } - }, - "fRight" : {"$ref":863}, - "fLeftMat" : {"$ref":4}, - "fRightMat" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 61210624, - "fName" : "combitran_CoilCorner4", - "fTitle" : "", - "fTranslation" : [79.6, 0, 122.1], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [1, 0, 0, 0, 0, -1, 0, 1, 0] - } - } - } - }, - "fRight" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "CoilShortSideS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 79.6, - "fDY" : 25, - "fDZ" : 55, - "fOrigin" : [0, 0, 0] - }, - "fLeftMat" : {"$ref":4}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "tran_CoilShortSide1", - "fTitle" : "", - "fTranslation" : [0, 0, -202.1] - } - } - }, - "fRight" : {"$ref":872}, - "fLeftMat" : {"$ref":4}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "tran_CoilShortSide2", - "fTitle" : "", - "fTranslation" : [0, 0, 202.1] - } - } - }, - "fRight" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "CoilLongSideS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 55, - "fDY" : 25, - "fDZ" : 122.1, - "fOrigin" : [0, 0, 0] - }, - "fLeftMat" : {"$ref":4}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "tran_CoilLongSide1", - "fTitle" : "", - "fTranslation" : [-159.6, 0, 0] - } - } - }, - "fRight" : {"$ref":875}, - "fLeftMat" : {"$ref":4}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "tran_CoilLongSide2", - "fTitle" : "", - "fTranslation" : [159.6, 0, 0] - } - } - }, {"$ref":851}, {"$ref":853}, {"$ref":855}, {"$ref":857}, {"$ref":859}, {"$ref":861}, { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 9, - "fBits" : 50331648, - "fName" : "YokeS", - "fTitle" : "YokeContainerS-InnerSpaceInYokeS", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 350, - "fDY" : 224, - "fDZ" : 130, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoXtru", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "YokeContainerS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 134218752, - "fDX" : 350, - "fDY" : 224, - "fDZ" : 130, - "fOrigin" : [0, 0, 0], - "fNvert" : 8, - "fNz" : 2, - "fZcurrent" : 0, - "fX" : [-303.81197846483, -350, -350, -303.81197846483, 303.81197846483, 350, 350, 303.81197846483], - "fY" : [-224, -144, 144, 224, 224, 144, -144, -224], - "fZ" : [-130, 130], - "fScale" : [1, 1], - "fX0" : [0, 0], - "fY0" : [0, 0] - }, - "fRight" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "InnerSpaceInYokeS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 230, - "fDY" : 115, - "fDZ" : 130.005, - "fOrigin" : [0, 0, 0] - }, - "fLeftMat" : {"$ref":4}, - "fRightMat" : {"$ref":4} - } - }, { - "_typename" : "TGeoXtru", - "fUniqueID" : 10, - "fBits" : 50331648, - "fName" : "PoleS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 134218752, - "fDX" : 84, - "fDY" : 124.5, - "fDZ" : 30.75, - "fOrigin" : [0, 0, 0], - "fNvert" : 8, - "fNz" : 2, - "fZcurrent" : 0, - "fX" : [-54, -84, -84, -54, 54, 84, 84, 54], - "fY" : [-124.5, -94.5, 94.5, 124.5, 124.5, 94.5, -94.5, -124.5], - "fZ" : [-30.75, 30.75], - "fScale" : [1, 1], - "fX0" : [0, 0], - "fY0" : [0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 11, - "fBits" : 50331648, - "fName" : "TOF2GlassVolumeS0", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 8, - "fDY" : 17.575, - "fDZ" : 0.215, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 12, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 8, - "fDY" : 0.54921875, - "fDZ" : 0.132, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 13, - "fBits" : 50331648, - "fName" : "TOF2ActiveGasVolumeS0", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 8, - "fDY" : 17.575, - "fDZ" : 0.132, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 14, - "fBits" : 50331648, - "fName" : "TOF2G10VolumeS0", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 8, - "fDY" : 17.575, - "fDZ" : 0.208, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 15, - "fBits" : 50331648, - "fName" : "TOF2ChamberS0", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 9.501, - "fDY" : 19.076, - "fDZ" : 0.841, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 16, - "fBits" : 50331648, - "fName" : "TOF2GlassVolumeS1", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 28, - "fDY" : 15.175, - "fDZ" : 0.215, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 17, - "fBits" : 50331648, - "fName" : "TOF2ActiveGasVolumeS1", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 28, - "fDY" : 15.175, - "fDZ" : 0.132, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 18, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 28, - "fDY" : 0.9484375, - "fDZ" : 0.132, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 19, - "fBits" : 50331648, - "fName" : "TOF2G10VolumeS1", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 28, - "fDY" : 15.175, - "fDZ" : 0.208, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 20, - "fBits" : 50331648, - "fName" : "TOF2ChamberS1", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 29.501, - "fDY" : 16.676, - "fDZ" : 0.841, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 21, - "fBits" : 50331648, - "fName" : "VETO", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 83.5, - "fDY" : 53.5, - "fDZ" : 52.5, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 22, - "fBits" : 50331648, - "fName" : "VMDL", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 7.5, - "fDY" : 7.5, - "fDZ" : 52, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 23, - "fBits" : 50331648, - "fName" : "VFEL", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 7.3, - "fDY" : 7.3, - "fDZ" : 1, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 24, - "fBits" : 50331648, - "fName" : "VPBL", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 7.3, - "fDY" : 7.3, - "fDZ" : 0.5, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 25, - "fBits" : 50331648, - "fName" : "VSCL", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 7.3, - "fDY" : 7.3, - "fDZ" : 0.25, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 26, - "fBits" : 50331648, - "fName" : "VRFL", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 0.2, - "fDY" : 7.3, - "fDZ" : 1, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 27, - "fBits" : 50331648, - "fName" : "VRPL", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 0.2, - "fDY" : 7.3, - "fDZ" : 0.5, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 28, - "fBits" : 50331648, - "fName" : "VRSL", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 0.2, - "fDY" : 7.3, - "fDZ" : 0.25, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 29, - "fBits" : 50331648, - "fName" : "UMDL", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.75, - "fDY" : 3.75, - "fDZ" : 52, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 30, - "fBits" : 50331648, - "fName" : "USCL", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.65, - "fDY" : 3.65, - "fDZ" : 0.25, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 31, - "fBits" : 50331648, - "fName" : "URSL", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 0.1, - "fDY" : 3.65, - "fDZ" : 0.25, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 32, - "fBits" : 50331648, - "fName" : "UPBL", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.65, - "fDY" : 3.65, - "fDZ" : 0.5, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 33, - "fBits" : 50331648, - "fName" : "UFEL", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.65, - "fDY" : 3.65, - "fDZ" : 1, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 34, - "fBits" : 50331648, - "fName" : "URFL", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 0.1, - "fDY" : 3.65, - "fDZ" : 1, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 35, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "module_partS - holeS:hole_module_trans_6051", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 40.8, - "fDY" : 22.5, - "fDZ" : 0.45, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "module_partS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 40.8, - "fDY" : 22.5, - "fDZ" : 0.45, - "fOrigin" : [0, 0, 0] - }, - "fRight" : { - "_typename" : "TGeoTube", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "holeS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 9216, - "fDX" : 5.75, - "fDY" : 5.75, - "fDZ" : 0.46, - "fOrigin" : [0, 0, 0], - "fRmin" : 0, - "fRmax" : 5.75, - "fDz" : 0.46 - }, - "fLeftMat" : {"$ref":838}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "hole_module_trans_6051", - "fTitle" : "", - "fTranslation" : [-40.8, -22.5, 0] - } - } - }, { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 36, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "module_partS - holeS:hole_module_trans_9663", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 40.8, - "fDY" : 22.5, - "fDZ" : 0.45, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : {"$ref":909}, - "fRight" : {"$ref":910}, - "fLeftMat" : {"$ref":838}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "hole_module_trans_9663", - "fTitle" : "", - "fTranslation" : [-40.8, -22.5, 0] - } - } - }, { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 37, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "module_partS - holeS:hole_module_trans_3220", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 40.8, - "fDY" : 22.5, - "fDZ" : 0.45, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : {"$ref":909}, - "fRight" : {"$ref":910}, - "fLeftMat" : {"$ref":838}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "hole_module_trans_3220", - "fTitle" : "", - "fTranslation" : [-40.8, -22.5, 0] - } - } - }, { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 38, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "module_partS - holeS:hole_module_trans_9357", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 40.8, - "fDY" : 22.5, - "fDZ" : 0.45, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : {"$ref":909}, - "fRight" : {"$ref":910}, - "fLeftMat" : {"$ref":838}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "hole_module_trans_9357", - "fTitle" : "", - "fTranslation" : [-40.8, -22.5, 0] - } - } - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 39, - "fBits" : 50331648, - "fName" : "moduleS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 33, - "fDY" : 20.5, - "fDZ" : 0.45, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 40, - "fBits" : 50331648, - "fName" : "vertical_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 2.5, - "fDY" : 24.25, - "fDZ" : 1.15, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 41, - "fBits" : 50331648, - "fName" : "horizontal_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 33, - "fDY" : 1.875, - "fDZ" : 1.15, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 42, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 38, - "fDY" : 24.25, - "fDZ" : 1.15, - "fOrigin" : [0, 0, 0], - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "frame0_station0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station0_vertical_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "frame0_station0_vertical_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":922}, - "fMedium" : { - "_typename" : "TGeoMedium", - "fUniqueID" : 12, - "fBits" : 50331648, - "fName" : "HE_GAS", - "fTitle" : "", - "fId" : 12, - "fParams" : [0, 1, 0.19, 0.25, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : { - "_typename" : "TGeoMaterial", - "fUniqueID" : 14, - "fBits" : 50331648, - "fName" : "HE_GAS", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 13, - "fA" : 4, - "fZ" : 2, - "fDensity" : 1.78e-4, - "fRadLen" : 479968.980732484, - "fIntLen" : 312331.95325677, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null - } - }, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 32, - "fNtotal" : 1, - "fRefCount" : 2 - }, - "fMother" : {"$ref":925}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":384} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station0_vertical_frameV_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":928}, - "fMother" : {"$ref":925}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":385} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station0_horizontal_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "frame0_station0_horizontal_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":923}, - "fMedium" : { - "_typename" : "TGeoMedium", - "fUniqueID" : 18, - "fBits" : 50331648, - "fName" : "carbon", - "fTitle" : "", - "fId" : 18, - "fParams" : [0, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : { - "_typename" : "TGeoMaterial", - "fUniqueID" : 18, - "fBits" : 50331648, - "fName" : "carbon", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 17, - "fA" : 12.011, - "fZ" : 6, - "fDensity" : 2.265, - "fRadLen" : 18.7627684755763, - "fIntLen" : 35.4089682265511, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null - } - }, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 33, - "fNtotal" : 1, - "fRefCount" : 2 - }, - "fMother" : {"$ref":925}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":386} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station0_horizontal_frameV_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":933}, - "fMother" : {"$ref":925}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":387} - }] - }, - "fShape" : {"$ref":924}, - "fMedium" : { - "_typename" : "TGeoMedium", - "fUniqueID" : 1, - "fBits" : 50331648, - "fName" : "air", - "fTitle" : "", - "fId" : 1, - "fParams" : [0, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : { - "_typename" : "TGeoMixture", - "fUniqueID" : 1, - "fBits" : 50462720, - "fName" : "air", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 0, - "fA" : 14.6873, - "fZ" : 7.32, - "fDensity" : 0.001205, - "fRadLen" : 30422.5122009781, - "fIntLen" : 70886.8082068035, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null, - "fNelements" : 3, - "fZmixture" : [7, 8, 18], - "fAmixture" : [14.01, 16, 39.95], - "fWeights" : [0.78, 0.21, 0.01], - "fNatoms" : [], - "fVecNbOfAtomsPerVolume" : [], - "fElements" : null - } - }, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 34, - "fNtotal" : 5, - "fRefCount" : 5 - }, - "fBBoxOK" : true - }, { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 43, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 38, - "fDY" : 24.25, - "fDZ" : 1.15, - "fOrigin" : [0, 0, 0.45], - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "station0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_module0_station0_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_module0_station0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 7, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":921}, - "fMedium" : { - "_typename" : "TGeoMedium", - "fUniqueID" : 11, - "fBits" : 50331648, - "fName" : "IRON", - "fTitle" : "", - "fId" : 11, - "fParams" : [0, 1, 0.19, 1, -1, -1, 0.1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : { - "_typename" : "TGeoMaterial", - "fUniqueID" : 9, - "fBits" : 50462720, - "fName" : "IRON", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 8, - "fA" : 55.85, - "fZ" : 26, - "fDensity" : 7.87, - "fRadLen" : 1.75771664360148, - "fIntLen" : 16.9675125483994, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null - } - }, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 31, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":940}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":388} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station0_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":925}, - "fMother" : {"$ref":940}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":389} - }] - }, - "fShape" : {"$ref":939}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 35, - "fNtotal" : 7, - "fRefCount" : 3 - }, - "fBBoxOK" : true - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 44, - "fBits" : 50331648, - "fName" : "moduleS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 33, - "fDY" : 20.5, - "fDZ" : 0.45, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 45, - "fBits" : 50331648, - "fName" : "vertical_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 2.5, - "fDY" : 24.25, - "fDZ" : 1.15, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 46, - "fBits" : 50331648, - "fName" : "horizontal_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 33, - "fDY" : 1.875, - "fDZ" : 1.15, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 47, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 38, - "fDY" : 24.25, - "fDZ" : 1.15, - "fOrigin" : [0, 0, 0], - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "frame0_station1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station1_vertical_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "frame0_station1_vertical_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":948}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 37, - "fNtotal" : 1, - "fRefCount" : 2 - }, - "fMother" : {"$ref":951}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":390} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station1_vertical_frameV_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":954}, - "fMother" : {"$ref":951}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":391} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station1_horizontal_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "frame0_station1_horizontal_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":949}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 38, - "fNtotal" : 1, - "fRefCount" : 2 - }, - "fMother" : {"$ref":951}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":392} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station1_horizontal_frameV_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":957}, - "fMother" : {"$ref":951}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":393} - }] - }, - "fShape" : {"$ref":950}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 39, - "fNtotal" : 5, - "fRefCount" : 5 - }, - "fBBoxOK" : true - }, { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 48, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 38, - "fDY" : 24.25, - "fDZ" : 1.15, - "fOrigin" : [0, 0, 0.45], - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "station1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_module0_station1_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_module0_station1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 7, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":947}, - "fMedium" : { - "_typename" : "TGeoMedium", - "fUniqueID" : 17, - "fBits" : 50331648, - "fName" : "arco27030", - "fTitle" : "", - "fId" : 17, - "fParams" : [1, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : { - "_typename" : "TGeoMixture", - "fUniqueID" : 17, - "fBits" : 50331648, - "fName" : "arco27030", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 16, - "fA" : 36.5434594614837, - "fZ" : 16.5659958077497, - "fDensity" : 0.0019, - "fRadLen" : 10960.19206385, - "fIntLen" : 59730.4440787846, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null, - "fNelements" : 3, - "fZmixture" : [18, 6, 8], - "fAmixture" : [39.948, 12.01, 15.9994], - "fWeights" : [0.864021297422359, 0.0371085832369314, 0.0988701193407093], - "fNatoms" : [], - "fVecNbOfAtomsPerVolume" : [], - "fElements" : null - } - }, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 36, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":960}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":394} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station1_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":951}, - "fMother" : {"$ref":960}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":395} - }] - }, - "fShape" : {"$ref":959}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 40, - "fNtotal" : 7, - "fRefCount" : 3 - }, - "fBBoxOK" : true - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 49, - "fBits" : 50331648, - "fName" : "moduleS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 33, - "fDY" : 20.5, - "fDZ" : 0.45, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 50, - "fBits" : 50331648, - "fName" : "vertical_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 2.5, - "fDY" : 24.25, - "fDZ" : 1.15, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 51, - "fBits" : 50331648, - "fName" : "horizontal_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 33, - "fDY" : 1.875, - "fDZ" : 1.15, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 52, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 38, - "fDY" : 24.25, - "fDZ" : 1.15, - "fOrigin" : [0, 0, 0], - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "frame0_station2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station2_vertical_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "frame0_station2_vertical_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":968}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 42, - "fNtotal" : 1, - "fRefCount" : 2 - }, - "fMother" : {"$ref":971}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":396} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station2_vertical_frameV_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":974}, - "fMother" : {"$ref":971}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":397} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station2_horizontal_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "frame0_station2_horizontal_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":969}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 43, - "fNtotal" : 1, - "fRefCount" : 2 - }, - "fMother" : {"$ref":971}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":398} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station2_horizontal_frameV_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":977}, - "fMother" : {"$ref":971}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":399} - }] - }, - "fShape" : {"$ref":970}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 44, - "fNtotal" : 5, - "fRefCount" : 5 - }, - "fBBoxOK" : true - }, { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 53, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 38, - "fDY" : 24.25, - "fDZ" : 1.15, - "fOrigin" : [0, 0, 0.45], - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "station2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_module0_station2_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_module0_station2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 7, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":967}, - "fMedium" : {"$ref":964}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 41, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":980}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":400} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station2_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":971}, - "fMother" : {"$ref":980}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":401} - }] - }, - "fShape" : {"$ref":979}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 45, - "fNtotal" : 7, - "fRefCount" : 3 - }, - "fBBoxOK" : true - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 54, - "fBits" : 50331648, - "fName" : "moduleS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 33, - "fDY" : 20.5, - "fDZ" : 0.55, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 55, - "fBits" : 50331648, - "fName" : "moduleS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 33, - "fDY" : 20.5, - "fDZ" : 0.45, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 56, - "fBits" : 50331648, - "fName" : "vertical_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 2.5, - "fDY" : 24.25, - "fDZ" : 1.25, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 57, - "fBits" : 50331648, - "fName" : "horizontal_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 33, - "fDY" : 1.875, - "fDZ" : 1.25, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 58, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 38, - "fDY" : 24.25, - "fDZ" : 1.25, - "fOrigin" : [0, 0, 0], - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "frame0_station3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station3_vertical_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "frame0_station3_vertical_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":987}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 48, - "fNtotal" : 1, - "fRefCount" : 2 - }, - "fMother" : {"$ref":990}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":402} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station3_vertical_frameV_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":993}, - "fMother" : {"$ref":990}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":403} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station3_horizontal_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "frame0_station3_horizontal_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":988}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 49, - "fNtotal" : 1, - "fRefCount" : 2 - }, - "fMother" : {"$ref":990}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":404} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station3_horizontal_frameV_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":996}, - "fMother" : {"$ref":990}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":405} - }] - }, - "fShape" : {"$ref":989}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 50, - "fNtotal" : 5, - "fRefCount" : 5 - }, - "fBBoxOK" : true - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 59, - "fBits" : 50331648, - "fName" : "vertical_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 2.5, - "fDY" : 24.25, - "fDZ" : 1.15, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 60, - "fBits" : 50331648, - "fName" : "horizontal_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 33, - "fDY" : 1.875, - "fDZ" : 1.15, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 61, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 38, - "fDY" : 24.25, - "fDZ" : 1.15, - "fOrigin" : [0, 0, 0], - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "frame1_station3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame1_station3_vertical_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "frame1_station3_vertical_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":998}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 51, - "fNtotal" : 1, - "fRefCount" : 2 - }, - "fMother" : {"$ref":1001}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":406} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame1_station3_vertical_frameV_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1004}, - "fMother" : {"$ref":1001}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":407} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame1_station3_horizontal_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "frame1_station3_horizontal_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":999}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 52, - "fNtotal" : 1, - "fRefCount" : 2 - }, - "fMother" : {"$ref":1001}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":408} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame1_station3_horizontal_frameV_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1007}, - "fMother" : {"$ref":1001}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":409} - }] - }, - "fShape" : {"$ref":1000}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 53, - "fNtotal" : 5, - "fRefCount" : 5 - }, - "fBBoxOK" : true - }, { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 62, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 69.2, - "fDY" : 24.35, - "fDZ" : 2.4, - "fOrigin" : [-3.5, 0.0999999999999996, 1.7], - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "station3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_module0_station3_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_module0_station3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 7, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":985}, - "fMedium" : {"$ref":964}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 46, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1010}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":410} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_module1_station3_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_module1_station3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 7, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":986}, - "fMedium" : {"$ref":964}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 47, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1010}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":411} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station3_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":990}, - "fMother" : {"$ref":1010}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":412} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame1_station3_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1001}, - "fMother" : {"$ref":1010}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":413} - }] - }, - "fShape" : {"$ref":1009}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 54, - "fNtotal" : 13, - "fRefCount" : 5 - }, - "fBBoxOK" : true - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 63, - "fBits" : 50331648, - "fName" : "vertical_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 2.5, - "fDY" : 26.25, - "fDZ" : 1.95, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 64, - "fBits" : 50331648, - "fName" : "horizontal_upper_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 40.8, - "fDY" : 1.875, - "fDZ" : 1.95, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 65, - "fBits" : 50331648, - "fName" : "horizontal_upper_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 37.925, - "fDY" : 1.875, - "fDZ" : 1.95, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 66, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 43.3, - "fDY" : 26.25, - "fDZ" : 1.95, - "fOrigin" : [2.5, 0, 0], - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "frame0_station4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station4_vertical_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frame0_station4_vertical_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1018}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 57, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1022}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":414} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station4_horizontal_upper_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frame0_station4_horizontal_upper_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1019}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 58, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1022}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":415} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station4_horizontal_bottom_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frame0_station4_horizontal_bottom_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1020}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 59, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1022}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":416} - }] - }, - "fShape" : {"$ref":1021}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 60, - "fNtotal" : 4, - "fRefCount" : 4 - }, - "fBBoxOK" : true - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 67, - "fBits" : 50331648, - "fName" : "vertical_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 2.5, - "fDY" : 26.25, - "fDZ" : 1.95, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 68, - "fBits" : 50331648, - "fName" : "horizontal_upper_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 40.8, - "fDY" : 1.875, - "fDZ" : 1.95, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 69, - "fBits" : 50331648, - "fName" : "horizontal_upper_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 37.925, - "fDY" : 1.875, - "fDZ" : 1.95, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 70, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 43.3, - "fDY" : 26.25, - "fDZ" : 1.95, - "fOrigin" : [2.5, 0, 0], - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "frame1_station4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame1_station4_vertical_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frame1_station4_vertical_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1030}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 61, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1034}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":417} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame1_station4_horizontal_upper_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frame1_station4_horizontal_upper_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1031}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 62, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1034}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":418} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame1_station4_horizontal_bottom_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frame1_station4_horizontal_bottom_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1032}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 63, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1034}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":419} - }] - }, - "fShape" : {"$ref":1033}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 64, - "fNtotal" : 4, - "fRefCount" : 4 - }, - "fBBoxOK" : true - }, { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 71, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 86.6, - "fDY" : 26.25, - "fDZ" : 1.95, - "fOrigin" : [0, 0, 0.45], - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "station4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_module0_station4_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_module0_station4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 7, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":907}, - "fMedium" : {"$ref":964}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 55, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1043}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":420} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_module1_station4_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_module1_station4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 7, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":912}, - "fMedium" : {"$ref":964}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 56, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1043}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":421} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station4_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1022}, - "fMother" : {"$ref":1043}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":423} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame1_station4_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1034}, - "fMother" : {"$ref":1043}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":424} - }] - }, - "fShape" : {"$ref":1042}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 65, - "fNtotal" : 11, - "fRefCount" : 5 - }, - "fBBoxOK" : true - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 72, - "fBits" : 50331648, - "fName" : "vertical_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 2.5, - "fDY" : 26.25, - "fDZ" : 1.95, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 73, - "fBits" : 50331648, - "fName" : "horizontal_upper_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 40.8, - "fDY" : 1.875, - "fDZ" : 1.95, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 74, - "fBits" : 50331648, - "fName" : "horizontal_upper_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 37.925, - "fDY" : 1.875, - "fDZ" : 1.95, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 75, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 43.3, - "fDY" : 26.25, - "fDZ" : 1.95, - "fOrigin" : [2.5, 0, 0], - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "frame0_station5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station5_vertical_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frame0_station5_vertical_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1051}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 68, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1055}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":426} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station5_horizontal_upper_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frame0_station5_horizontal_upper_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1052}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 69, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1055}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":427} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station5_horizontal_bottom_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frame0_station5_horizontal_bottom_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1053}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 70, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1055}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":428} - }] - }, - "fShape" : {"$ref":1054}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 71, - "fNtotal" : 4, - "fRefCount" : 4 - }, - "fBBoxOK" : true - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 76, - "fBits" : 50331648, - "fName" : "vertical_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 2.5, - "fDY" : 26.25, - "fDZ" : 1.95, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 77, - "fBits" : 50331648, - "fName" : "horizontal_upper_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 40.8, - "fDY" : 1.875, - "fDZ" : 1.95, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 78, - "fBits" : 50331648, - "fName" : "horizontal_upper_frameS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 37.925, - "fDY" : 1.875, - "fDZ" : 1.95, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 79, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 43.3, - "fDY" : 26.25, - "fDZ" : 1.95, - "fOrigin" : [2.5, 0, 0], - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "frame1_station5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame1_station5_vertical_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frame1_station5_vertical_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1063}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 72, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1067}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":429} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame1_station5_horizontal_upper_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frame1_station5_horizontal_upper_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1064}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 73, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1067}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":430} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame1_station5_horizontal_bottom_frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frame1_station5_horizontal_bottom_frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1065}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 74, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1067}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":431} - }] - }, - "fShape" : {"$ref":1066}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 75, - "fNtotal" : 4, - "fRefCount" : 4 - }, - "fBBoxOK" : true - }, { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 80, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 86.6, - "fDY" : 26.25, - "fDZ" : 1.95, - "fOrigin" : [0, 0, 0.45], - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "station5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_module0_station5_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_module0_station5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 7, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":915}, - "fMedium" : {"$ref":964}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 66, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1076}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":432} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_module1_station5_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_module1_station5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 7, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":918}, - "fMedium" : {"$ref":964}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 67, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1076}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":433} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame0_station5_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1055}, - "fMother" : {"$ref":1076}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":435} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frame1_station5_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1067}, - "fMother" : {"$ref":1076}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":436} - }] - }, - "fShape" : {"$ref":1075}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 76, - "fNtotal" : 11, - "fRefCount" : 5 - }, - "fBBoxOK" : true - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 81, - "fBits" : 50331648, - "fName" : "StripGas", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 0.5, - "fDY" : 15, - "fDZ" : 0.150000005960464, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 82, - "fBits" : 50331648, - "fName" : "DetectorGlass", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 30, - "fDY" : 15, - "fDZ" : 0.154499992728233, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 83, - "fBits" : 50331648, - "fName" : "DetectorPlate", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 30, - "fDY" : 15, - "fDZ" : 0.159999996423721, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 84, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 30, - "fDY" : 15, - "fDZ" : 1.5, - "fOrigin" : [0, 0, 0], - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "tof1Detector", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "tof1StripActiveGasV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1084}, - "fMedium" : { - "_typename" : "TGeoMedium", - "fUniqueID" : 6, - "fBits" : 50331648, - "fName" : "RPCgas", - "fTitle" : "", - "fId" : 6, - "fParams" : [1, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : { - "_typename" : "TGeoMixture", - "fUniqueID" : 6, - "fBits" : 50331648, - "fName" : "RPCgas", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 5, - "fA" : 13.134094, - "fZ" : 6.433, - "fDensity" : 0.00375, - "fRadLen" : 10290.7323640963, - "fIntLen" : 17251.1264038771, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null, - "fNelements" : 4, - "fZmixture" : [6, 1, 9, 16], - "fAmixture" : [12.01, 1.008, 19, 32.06], - "fWeights" : [0.227, 0.248, 0.511, 0.014], - "fNatoms" : [], - "fVecNbOfAtomsPerVolume" : [], - "fElements" : null - } - }, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 78, - "fNtotal" : 1, - "fRefCount" : 48 - }, - "fMother" : {"$ref":1088}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":438} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":439} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 3, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":440} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 4, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":441} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 5, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":442} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_6", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 6, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":443} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_7", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 7, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":444} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_8", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 8, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":445} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_9", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 9, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":446} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_10", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 10, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":447} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_11", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 11, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":448} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_12", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 12, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":449} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_13", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 13, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":450} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_14", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 14, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":451} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_15", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 15, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":452} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_16", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 16, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":453} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_17", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 17, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":454} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_18", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 18, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":455} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_19", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 19, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":456} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_20", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 20, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":457} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_21", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 21, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":458} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_22", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 22, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":459} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_23", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 23, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":460} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_24", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 24, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":461} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_25", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 25, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":462} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_26", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 26, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":463} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_27", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 27, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":464} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_28", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 28, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":465} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_29", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 29, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":466} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_30", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 30, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":467} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_31", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 31, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":468} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_32", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 32, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":469} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_33", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 33, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":470} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_34", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 34, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":471} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_35", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 35, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":472} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_36", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 36, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":473} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_37", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 37, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":474} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_38", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 38, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":475} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_39", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 39, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":476} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_40", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 40, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":477} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_41", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 41, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":478} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_42", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 42, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":479} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_43", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 43, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":480} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_44", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 44, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":481} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_45", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 45, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":482} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_46", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 46, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":483} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_47", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 47, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":484} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1StripActiveGasV_48", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1091}, - "fMother" : {"$ref":1088}, - "fNumber" : 48, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":485} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1DetGlassV_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "tof1DetGlassV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 7, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1085}, - "fMedium" : { - "_typename" : "TGeoMedium", - "fUniqueID" : 5, - "fBits" : 50331648, - "fName" : "RPCglass", - "fTitle" : "", - "fId" : 5, - "fParams" : [0, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : { - "_typename" : "TGeoMixture", - "fUniqueID" : 5, - "fBits" : 50331648, - "fName" : "RPCglass", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 4, - "fA" : 21.6516575137294, - "fZ" : 10.8047928107838, - "fDensity" : 2.55, - "fRadLen" : 10.5807291507198, - "fIntLen" : 37.6225717576057, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null, - "fNelements" : 2, - "fZmixture" : [14, 8], - "fAmixture" : [28.09, 16], - "fWeights" : [0.467465468463971, 0.532534531536029], - "fNatoms" : [], - "fVecNbOfAtomsPerVolume" : [], - "fElements" : null - } - }, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 79, - "fNtotal" : 1, - "fRefCount" : 2 - }, - "fMother" : {"$ref":1088}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":486} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1DetGlassV_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1142}, - "fMother" : {"$ref":1088}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":487} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1DetPlateV_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "tof1DetPlateV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 3, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1086}, - "fMedium" : { - "_typename" : "TGeoMedium", - "fUniqueID" : 7, - "fBits" : 50331648, - "fName" : "G10", - "fTitle" : "", - "fId" : 7, - "fParams" : [0, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : { - "_typename" : "TGeoMixture", - "fUniqueID" : 7, - "fBits" : 50331648, - "fName" : "G10", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 6, - "fA" : 13.127344, - "fZ" : 6.696, - "fDensity" : 1.7, - "fRadLen" : 21.1963817958332, - "fIntLen" : 36.4724641224032, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null, - "fNelements" : 4, - "fZmixture" : [6, 1, 8, 14], - "fAmixture" : [12.01, 1.008, 16, 28.09], - "fWeights" : [0.259, 0.288, 0.248, 0.205], - "fNatoms" : [], - "fVecNbOfAtomsPerVolume" : [], - "fElements" : null - } - }, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 80, - "fNtotal" : 1, - "fRefCount" : 2 - }, - "fMother" : {"$ref":1088}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":488} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1DetPlateV_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1147}, - "fMother" : {"$ref":1088}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":489} - }] - }, - "fShape" : {"$ref":1087}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 81, - "fNtotal" : 53, - "fRefCount" : 62 - }, - "fBBoxOK" : true - }, { - "_typename" : "TGeoPgon", - "fUniqueID" : 85, - "fBits" : 50331648, - "fName" : "OctagonActivePlaneS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 67503104, - "fDX" : 156.77368629035, - "fDY" : 156.77368629035, - "fDZ" : 0.05, - "fOrigin" : [0, 0, 0], - "fNz" : 2, - "fPhi1" : 0, - "fDphi" : 360, - "fRmin" : [12, 12], - "fRmax" : [144.84, 144.84], - "fZ" : [-0.05, 0.05], - "fNedges" : 8 - }, { - "_typename" : "TGeoPgon", - "fUniqueID" : 86, - "fBits" : 50331648, - "fName" : "OctagonS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 67503104, - "fDX" : 156.77368629035, - "fDY" : 156.77368629035, - "fDZ" : 13.25, - "fOrigin" : [0, 0, 0], - "fNz" : 2, - "fPhi1" : 0, - "fDphi" : 360, - "fRmin" : [12, 12], - "fRmax" : [144.84, 144.84], - "fZ" : [-13.25, 13.25], - "fNedges" : 8 - }, { - "_typename" : "TGeoPgon", - "fUniqueID" : 87, - "fBits" : 50331648, - "fName" : "MWPCContainerS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 67503104, - "fDX" : 26.15396719429, - "fDY" : 26.15396719429, - "fDZ" : 3.5045, - "fOrigin" : [0, 0, 0], - "fNz" : 2, - "fPhi1" : 0, - "fDphi" : 360, - "fRmin" : [0, 0], - "fRmax" : [22.65, 22.65], - "fZ" : [-3.5045, 3.5045], - "fNedges" : 6 - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 88, - "fBits" : 50331648, - "fName" : "MWPCActivePlaneS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 12, - "fDY" : 21.65, - "fDZ" : 0.1, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 89, - "fBits" : 50331648, - "fName" : "ecal01", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 48, - "fDY" : 60, - "fDZ" : 27.5, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 90, - "fBits" : 50331648, - "fName" : "ecal01mod", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 6, - "fDY" : 6, - "fDZ" : 20, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 91, - "fBits" : 50331648, - "fName" : "ecal01front", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 6, - "fDY" : 6, - "fDZ" : 0.1, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 92, - "fBits" : 50331648, - "fName" : "ecal01lay", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 6, - "fDY" : 6, - "fDZ" : 0.09, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 93, - "fBits" : 50331648, - "fName" : "ecal01lead", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 6, - "fDY" : 6, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 94, - "fBits" : 50331648, - "fName" : "ecal01scint", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 2, - "fDY" : 2, - "fDZ" : 0.075, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 95, - "fBits" : 50331648, - "fName" : "frame_with_windowsS", - "fTitle" : "(frameS0-upper_window_frameS0:upper_window_frame_pos0)-lower_window_rect_frameS0:lower_window_rect_frame_pos0", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 0, - "fDY" : 0, - "fDZ" : 0, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 96, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "frameS0-upper_window_frameS0:upper_window_frame_pos0", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.09, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frameS0", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.09, - "fOrigin" : [0, 0, 0] - }, - "fRight" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "upper_window_frameS0", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.0905, - "fOrigin" : [0, 0, 0] - }, - "fLeftMat" : {"$ref":839}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "upper_window_frame_pos0", - "fTitle" : "", - "fTranslation" : [0, 3.15175, 0] - } - } - }, - "fRight" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "lower_window_rect_frameS0", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.0905, - "fOrigin" : [0, 0, 0] - }, - "fLeftMat" : {"$ref":839}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "lower_window_rect_frame_pos0", - "fTitle" : "", - "fTranslation" : [0, -3.15175, 0] - } - } - }, {"$ref":1163}, { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 97, - "fBits" : 50331648, - "fName" : "frame_with_windowsS", - "fTitle" : "(frameS1-upper_window_frameS1:upper_window_frame_pos1)-lower_window_bevel_frameS1:lower_window_bevel_frame_pos1", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 0, - "fDY" : 0, - "fDZ" : 0, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 98, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "frameS1-upper_window_frameS1:upper_window_frame_pos1", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.09, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoXtru", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frameS1", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 134218752, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.09, - "fOrigin" : [0, 0, 0], - "fNvert" : 5, - "fNz" : 2, - "fZcurrent" : 0, - "fX" : [3.15, -3.15, -3.15, -0.67, 3.15], - "fY" : [6.30175, 6.30175, -6.30175, -6.30175, -2.48175], - "fZ" : [-0.09, 0.09], - "fScale" : [1, 1], - "fX0" : [0, 0], - "fY0" : [0, 0] - }, - "fRight" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "upper_window_frameS1", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.0905, - "fOrigin" : [0, 0, 0] - }, - "fLeftMat" : {"$ref":839}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "upper_window_frame_pos1", - "fTitle" : "", - "fTranslation" : [0, 3.15175, 0] - } - } - }, - "fRight" : { - "_typename" : "TGeoXtru", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "lower_window_bevel_frameS1", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 134218752, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.0905, - "fOrigin" : [0, 0, 0], - "fNvert" : 5, - "fNz" : 2, - "fZcurrent" : 0, - "fX" : [3.05, -3.05, -3.05, -0.711421356237309, 3.05], - "fY" : [3.05, 3.05, -3.05, -3.05, 0.71142135623731], - "fZ" : [-0.0905, 0.0905], - "fScale" : [1, 1], - "fX0" : [0, 0], - "fY0" : [0, 0] - }, - "fLeftMat" : {"$ref":839}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "lower_window_bevel_frame_pos1", - "fTitle" : "", - "fTranslation" : [0, -3.15175, 0] - } - } - }, {"$ref":1172}, { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 99, - "fBits" : 50331648, - "fName" : "frame_with_windowsS", - "fTitle" : "(frameS2-upper_window_frameS2:upper_window_frame_pos2)-lower_window_bevel_frameS2:lower_window_bevel_frame_pos2", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 0, - "fDY" : 0, - "fDZ" : 0, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 100, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "frameS2-upper_window_frameS2:upper_window_frame_pos2", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.09, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoXtru", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frameS2", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 134218752, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.09, - "fOrigin" : [0, 0, 0], - "fNvert" : 5, - "fNz" : 2, - "fZcurrent" : 0, - "fX" : [3.15, -3.15, -3.15, -0.67, 3.15], - "fY" : [6.30175, 6.30175, -6.30175, -6.30175, -2.48175], - "fZ" : [-0.09, 0.09], - "fScale" : [1, 1], - "fX0" : [0, 0], - "fY0" : [0, 0] - }, - "fRight" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "upper_window_frameS2", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.0905, - "fOrigin" : [0, 0, 0] - }, - "fLeftMat" : {"$ref":839}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "upper_window_frame_pos2", - "fTitle" : "", - "fTranslation" : [0, 3.15175, 0] - } - } - }, - "fRight" : { - "_typename" : "TGeoXtru", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "lower_window_bevel_frameS2", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 134218752, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.0905, - "fOrigin" : [0, 0, 0], - "fNvert" : 5, - "fNz" : 2, - "fZcurrent" : 0, - "fX" : [3.05, -3.05, -3.05, -0.711421356237309, 3.05], - "fY" : [3.05, 3.05, -3.05, -3.05, 0.71142135623731], - "fZ" : [-0.0905, 0.0905], - "fScale" : [1, 1], - "fX0" : [0, 0], - "fY0" : [0, 0] - }, - "fLeftMat" : {"$ref":839}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "lower_window_bevel_frame_pos2", - "fTitle" : "", - "fTranslation" : [0, -3.15175, 0] - } - } - }, {"$ref":1181}, { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 101, - "fBits" : 50331648, - "fName" : "frame_with_windowsS", - "fTitle" : "(frameS3-upper_window_frameS3:upper_window_frame_pos3)-lower_window_rect_frameS3:lower_window_rect_frame_pos3", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 0, - "fDY" : 0, - "fDZ" : 0, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 102, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "frameS3-upper_window_frameS3:upper_window_frame_pos3", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.09, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frameS3", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.09, - "fOrigin" : [0, 0, 0] - }, - "fRight" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "upper_window_frameS3", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.0905, - "fOrigin" : [0, 0, 0] - }, - "fLeftMat" : {"$ref":839}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "upper_window_frame_pos3", - "fTitle" : "", - "fTranslation" : [0, 3.15175, 0] - } - } - }, - "fRight" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "lower_window_rect_frameS3", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.0905, - "fOrigin" : [0, 0, 0] - }, - "fLeftMat" : {"$ref":839}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "lower_window_rect_frame_pos3", - "fTitle" : "", - "fTranslation" : [0, -3.15175, 0] - } - } - }, {"$ref":1190}, { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 103, - "fBits" : 50331648, - "fName" : "frame_with_windowsS", - "fTitle" : "(frameS4-upper_window_frameS4:upper_window_frame_pos4)-lower_window_rect_frameS4:lower_window_rect_frame_pos4", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 0, - "fDY" : 0, - "fDZ" : 0, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 104, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "frameS4-upper_window_frameS4:upper_window_frame_pos4", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.09, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frameS4", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.09, - "fOrigin" : [0, 0, 0] - }, - "fRight" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "upper_window_frameS4", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.0905, - "fOrigin" : [0, 0, 0] - }, - "fLeftMat" : {"$ref":839}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "upper_window_frame_pos4", - "fTitle" : "", - "fTranslation" : [0, 3.15175, 0] - } - } - }, - "fRight" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "lower_window_rect_frameS4", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.0905, - "fOrigin" : [0, 0, 0] - }, - "fLeftMat" : {"$ref":839}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "lower_window_rect_frame_pos4", - "fTitle" : "", - "fTranslation" : [0, -3.15175, 0] - } - } - }, {"$ref":1199}, { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 105, - "fBits" : 50331648, - "fName" : "frame_with_windowsS", - "fTitle" : "(frameS5-upper_window_frameS5:upper_window_frame_pos5)-lower_window_bevel_frameS5:lower_window_bevel_frame_pos5", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 0, - "fDY" : 0, - "fDZ" : 0, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 106, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "frameS5-upper_window_frameS5:upper_window_frame_pos5", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.09, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoXtru", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frameS5", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 134218752, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.09, - "fOrigin" : [0, 0, 0], - "fNvert" : 5, - "fNz" : 2, - "fZcurrent" : 0, - "fX" : [3.15, -3.15, -3.15, -0.67, 3.15], - "fY" : [6.30175, 6.30175, -6.30175, -6.30175, -2.48175], - "fZ" : [-0.09, 0.09], - "fScale" : [1, 1], - "fX0" : [0, 0], - "fY0" : [0, 0] - }, - "fRight" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "upper_window_frameS5", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.0905, - "fOrigin" : [0, 0, 0] - }, - "fLeftMat" : {"$ref":839}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "upper_window_frame_pos5", - "fTitle" : "", - "fTranslation" : [0, 3.15175, 0] - } - } - }, - "fRight" : { - "_typename" : "TGeoXtru", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "lower_window_bevel_frameS5", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 134218752, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.0905, - "fOrigin" : [0, 0, 0], - "fNvert" : 5, - "fNz" : 2, - "fZcurrent" : 0, - "fX" : [3.05, -3.05, -3.05, -0.711421356237309, 3.05], - "fY" : [3.05, 3.05, -3.05, -3.05, 0.71142135623731], - "fZ" : [-0.0905, 0.0905], - "fScale" : [1, 1], - "fX0" : [0, 0], - "fY0" : [0, 0] - }, - "fLeftMat" : {"$ref":839}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "lower_window_bevel_frame_pos5", - "fTitle" : "", - "fTranslation" : [0, -3.15175, 0] - } - } - }, {"$ref":1208}, { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 107, - "fBits" : 50331648, - "fName" : "frame_with_windowsS", - "fTitle" : "(frameS6-upper_window_frameS6:upper_window_frame_pos6)-lower_window_bevel_frameS6:lower_window_bevel_frame_pos6", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 0, - "fDY" : 0, - "fDZ" : 0, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 108, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "frameS6-upper_window_frameS6:upper_window_frame_pos6", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.09, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoXtru", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frameS6", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 134218752, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.09, - "fOrigin" : [0, 0, 0], - "fNvert" : 5, - "fNz" : 2, - "fZcurrent" : 0, - "fX" : [3.15, -3.15, -3.15, -0.67, 3.15], - "fY" : [6.30175, 6.30175, -6.30175, -6.30175, -2.48175], - "fZ" : [-0.09, 0.09], - "fScale" : [1, 1], - "fX0" : [0, 0], - "fY0" : [0, 0] - }, - "fRight" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "upper_window_frameS6", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.0905, - "fOrigin" : [0, 0, 0] - }, - "fLeftMat" : {"$ref":839}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "upper_window_frame_pos6", - "fTitle" : "", - "fTranslation" : [0, 3.15175, 0] - } - } - }, - "fRight" : { - "_typename" : "TGeoXtru", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "lower_window_bevel_frameS6", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 134218752, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.0905, - "fOrigin" : [0, 0, 0], - "fNvert" : 5, - "fNz" : 2, - "fZcurrent" : 0, - "fX" : [3.05, -3.05, -3.05, -0.711421356237309, 3.05], - "fY" : [3.05, 3.05, -3.05, -3.05, 0.71142135623731], - "fZ" : [-0.0905, 0.0905], - "fScale" : [1, 1], - "fX0" : [0, 0], - "fY0" : [0, 0] - }, - "fLeftMat" : {"$ref":839}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "lower_window_bevel_frame_pos6", - "fTitle" : "", - "fTranslation" : [0, -3.15175, 0] - } - } - }, {"$ref":1217}, { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 109, - "fBits" : 50331648, - "fName" : "frame_with_windowsS", - "fTitle" : "(frameS7-upper_window_frameS7:upper_window_frame_pos7)-lower_window_rect_frameS7:lower_window_rect_frame_pos7", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 0, - "fDY" : 0, - "fDZ" : 0, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoCompositeShape", - "fUniqueID" : 110, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "frameS7-upper_window_frameS7:upper_window_frame_pos7", - "fShapeId" : 256, - "fShapeBits" : 33555456, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.09, - "fOrigin" : [0, 0, 0], - "fNode" : { - "_typename" : "TGeoSubtraction", - "fUniqueID" : 0, - "fBits" : 50331648, - "fLeft" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frameS7", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.09, - "fOrigin" : [0, 0, 0] - }, - "fRight" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "upper_window_frameS7", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.0905, - "fOrigin" : [0, 0, 0] - }, - "fLeftMat" : {"$ref":839}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "upper_window_frame_pos7", - "fTitle" : "", - "fTranslation" : [0, 3.15175, 0] - } - } - }, - "fRight" : { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "lower_window_rect_frameS7", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.0905, - "fOrigin" : [0, 0, 0] - }, - "fLeftMat" : {"$ref":839}, - "fRightMat" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "lower_window_rect_frame_pos7", - "fTitle" : "", - "fTranslation" : [0, -3.15175, 0] - } - } - }, {"$ref":1226}, { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sensor_zone_upper_partS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sensor_zone_lower_part_rectS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "moduleS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoXtru", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sensor_zone_lower_part_bevelS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 134218752, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0], - "fNvert" : 5, - "fNz" : 2, - "fZcurrent" : 0, - "fX" : [3.05, -3.05, -3.05, -0.711421356237309, 3.05], - "fY" : [3.05, 3.05, -3.05, -3.05, 0.71142135623731], - "fZ" : [-0.015, 0.015], - "fScale" : [1, 1], - "fX0" : [0, 0], - "fY0" : [0, 0] - }, { - "_typename" : "TGeoXtru", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "moduleS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 134218752, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0], - "fNvert" : 5, - "fNz" : 2, - "fZcurrent" : 0, - "fX" : [3.15, -3.15, -3.15, -0.67, 3.15], - "fY" : [6.30175, 6.30175, -6.30175, -6.30175, -2.48175], - "fZ" : [-0.015, 0.015], - "fScale" : [1, 1], - "fX0" : [0, 0], - "fY0" : [0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sensor_zone_upper_partS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoXtru", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "moduleS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 134218752, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0], - "fNvert" : 5, - "fNz" : 2, - "fZcurrent" : 0, - "fX" : [3.15, -3.15, -3.15, -0.67, 3.15], - "fY" : [6.30175, 6.30175, -6.30175, -6.30175, -2.48175], - "fZ" : [-0.015, 0.015], - "fScale" : [1, 1], - "fX0" : [0, 0], - "fY0" : [0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sensor_zone_upper_partS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoXtru", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sensor_zone_lower_part_bevelS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 134218752, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0], - "fNvert" : 5, - "fNz" : 2, - "fZcurrent" : 0, - "fX" : [3.05, -3.05, -3.05, -0.711421356237309, 3.05], - "fY" : [3.05, 3.05, -3.05, -3.05, 0.71142135623731], - "fZ" : [-0.015, 0.015], - "fScale" : [1, 1], - "fX0" : [0, 0], - "fY0" : [0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "moduleS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sensor_zone_upper_partS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sensor_zone_lower_part_rectS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "moduleS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sensor_zone_upper_partS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sensor_zone_lower_part_rectS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoXtru", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "moduleS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 134218752, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0], - "fNvert" : 5, - "fNz" : 2, - "fZcurrent" : 0, - "fX" : [3.15, -3.15, -3.15, -0.67, 3.15], - "fY" : [6.30175, 6.30175, -6.30175, -6.30175, -2.48175], - "fZ" : [-0.015, 0.015], - "fScale" : [1, 1], - "fX0" : [0, 0], - "fY0" : [0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sensor_zone_upper_partS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoXtru", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sensor_zone_lower_part_bevelS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 134218752, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0], - "fNvert" : 5, - "fNz" : 2, - "fZcurrent" : 0, - "fX" : [3.05, -3.05, -3.05, -0.711421356237309, 3.05], - "fY" : [3.05, 3.05, -3.05, -3.05, 0.71142135623731], - "fZ" : [-0.015, 0.015], - "fScale" : [1, 1], - "fX0" : [0, 0], - "fY0" : [0, 0] - }, { - "_typename" : "TGeoXtru", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "moduleS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 134218752, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0], - "fNvert" : 5, - "fNz" : 2, - "fZcurrent" : 0, - "fX" : [3.15, -3.15, -3.15, -0.67, 3.15], - "fY" : [6.30175, 6.30175, -6.30175, -6.30175, -2.48175], - "fZ" : [-0.015, 0.015], - "fScale" : [1, 1], - "fX0" : [0, 0], - "fY0" : [0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sensor_zone_upper_partS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoXtru", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sensor_zone_lower_part_bevelS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 134218752, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0], - "fNvert" : 5, - "fNz" : 2, - "fZcurrent" : 0, - "fX" : [3.05, -3.05, -3.05, -0.711421356237309, 3.05], - "fY" : [3.05, 3.05, -3.05, -3.05, 0.71142135623731], - "fZ" : [-0.015, 0.015], - "fScale" : [1, 1], - "fX0" : [0, 0], - "fY0" : [0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "moduleS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.15, - "fDY" : 6.30175, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sensor_zone_upper_partS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0] - }, { - "_typename" : "TGeoBBox", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sensor_zone_lower_part_rectS", - "fTitle" : "", - "fShapeId" : 256, - "fShapeBits" : 1024, - "fDX" : 3.05, - "fDY" : 3.05, - "fDZ" : 0.015, - "fOrigin" : [0, 0, 0] - }] - }, - "fVolumes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "cave", - "fTitle" : "Top volume", - "fGeoAtt" : 3084, - "fLineColor" : 3, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Magnet_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "Magnet", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Coil_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "Coil", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 4, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":849}, - "fMedium" : { - "_typename" : "TGeoMedium", - "fUniqueID" : 2, - "fBits" : 50331648, - "fName" : "copper", - "fTitle" : "", - "fId" : 2, - "fParams" : [0, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : { - "_typename" : "TGeoMaterial", - "fUniqueID" : 2, - "fBits" : 50331648, - "fName" : "copper", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 1, - "fA" : 63.54, - "fZ" : 29, - "fDensity" : 8.96, - "fRadLen" : 1.43502863740006, - "fIntLen" : 15.5141335257514, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null - } - }, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 3, - "fNtotal" : 1, - "fRefCount" : 2 - }, - "fMother" : {"$ref":1261}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t3", - "fTitle" : "", - "fTranslation" : [0, -85, 0] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Coil_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1264}, - "fMother" : {"$ref":1261}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t3", - "fTitle" : "", - "fTranslation" : [0, 85, 0] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Pole_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "Pole", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":882}, - "fMedium" : { - "_typename" : "TGeoMedium", - "fUniqueID" : 3, - "fBits" : 50331648, - "fName" : "iron", - "fTitle" : "", - "fId" : 3, - "fParams" : [1, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : { - "_typename" : "TGeoMaterial", - "fUniqueID" : 3, - "fBits" : 50331648, - "fName" : "iron", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 2, - "fA" : 55.847, - "fZ" : 26, - "fDensity" : 7.87, - "fRadLen" : 1.75762222730907, - "fIntLen" : 16.9675125483994, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null - } - }, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 4, - "fNtotal" : 1, - "fRefCount" : 2 - }, - "fMother" : {"$ref":1261}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 52822016, - "fName" : "c3", - "fTitle" : "", - "fTranslation" : [0, -84.25, 0], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [1, 0, 0, 0, 0, 1, 0, -1, 0] - } - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Pole_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1271}, - "fMother" : {"$ref":1261}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 52822016, - "fName" : "c3", - "fTitle" : "", - "fTranslation" : [0, 84.25, 0], - "fRotation" : {"$ref":1275} - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Yoke_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Yoke", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 6, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":878}, - "fMedium" : { - "_typename" : "TGeoMedium", - "fUniqueID" : 4, - "fBits" : 50331648, - "fName" : "steel", - "fTitle" : "", - "fId" : 4, - "fParams" : [0, 1, 30, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : { - "_typename" : "TGeoMixture", - "fUniqueID" : 4, - "fBits" : 50462720, - "fName" : "steel", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 3, - "fA" : 55.3021846147983, - "fZ" : 25.7733568999496, - "fDensity" : 8.02, - "fRadLen" : 1.73601610180003, - "fIntLen" : 16.5874229502559, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null, - "fNelements" : 5, - "fZmixture" : [25, 14, 24, 28, 26], - "fAmixture" : [54.938, 28.09, 51.996, 58.693, 55.85], - "fWeights" : [0.0199389542374542, 0.00509743005324265, 0.179276379064425, 0.106508886477384, 0.689178350167495], - "fNatoms" : [], - "fVecNbOfAtomsPerVolume" : [], - "fElements" : null - } - }, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 5, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1261}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":4} - }] - }, - "fShape" : { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 350, - "fDY" : 224, - "fDZ" : 257.1, - "fOrigin" : [0, 0, 0], - "fVolume" : {"$ref":1261}, - "fBBoxOK" : true - }, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 2, - "fNtotal" : 6, - "fRefCount" : 7 - }, - "fMother" : {"$ref":1258}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t3", - "fTitle" : "", - "fTranslation" : [0, 0, 124.5] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof700_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "tof700", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "TOF2ChamberV0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 4, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2GlassVolumeV0_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "TOF2GlassVolumeV0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 7, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":883}, - "fMedium" : {"$ref":1143}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 7, - "fNtotal" : 1, - "fRefCount" : 2 - }, - "fMother" : {"$ref":1288}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":7} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ActiveGasVolumeV0_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "TOF2ActiveGasVolumeV0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 1, - "fBits" : 58736640, - "fName" : "ActiveGasStrip", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":884}, - "fMedium" : {"$ref":1092}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 8, - "fNtotal" : 1, - "fRefCount" : 32 - }, - "fMother" : {"$ref":1293}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -17.02578125, - "fIndex" : 0, - "fFinder" : { - "_typename" : "TGeoPatternY", - "fUniqueID" : 0, - "fBits" : 50331648, - "fStep" : 1.0984375, - "fStart" : -17.575, - "fEnd" : 17.575, - "fNdivisions" : 32, - "fDivIndex" : 0, - "fVolume" : {"$ref":1293} - } - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -15.92734375, - "fIndex" : 1, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 3, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -14.82890625, - "fIndex" : 2, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 4, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -13.73046875, - "fIndex" : 3, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 5, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -12.63203125, - "fIndex" : 4, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_6", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 6, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -11.53359375, - "fIndex" : 5, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_7", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 7, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -10.43515625, - "fIndex" : 6, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_8", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 8, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -9.33671875, - "fIndex" : 7, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_9", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 9, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -8.23828125, - "fIndex" : 8, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_10", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 10, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -7.13984375, - "fIndex" : 9, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_11", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 11, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -6.04140625, - "fIndex" : 10, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_12", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 12, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -4.94296875, - "fIndex" : 11, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_13", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 13, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -3.84453125, - "fIndex" : 12, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_14", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 14, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -2.74609375, - "fIndex" : 13, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_15", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 15, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -1.64765625, - "fIndex" : 14, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_16", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 16, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -0.549218749999998, - "fIndex" : 15, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_17", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 17, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 0.549218750000001, - "fIndex" : 16, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_18", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 18, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 1.64765625, - "fIndex" : 17, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_19", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 19, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 2.74609375, - "fIndex" : 18, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_20", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 20, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 3.84453125, - "fIndex" : 19, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_21", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 21, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 4.94296875, - "fIndex" : 20, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_22", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 22, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 6.04140625, - "fIndex" : 21, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_23", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 23, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 7.13984375, - "fIndex" : 22, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_24", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 24, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 8.23828125, - "fIndex" : 23, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_25", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 25, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 9.33671875, - "fIndex" : 24, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_26", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 26, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 10.43515625, - "fIndex" : 25, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_27", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 27, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 11.53359375, - "fIndex" : 26, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_28", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 28, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 12.63203125, - "fIndex" : 27, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_29", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 29, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 13.73046875, - "fIndex" : 28, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_30", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 30, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 14.82890625, - "fIndex" : 29, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_31", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 31, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 15.92734375, - "fIndex" : 30, - "fFinder" : {"$ref":1297} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_32", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1296}, - "fMother" : {"$ref":1293}, - "fNumber" : 32, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 17.02578125, - "fIndex" : 31, - "fFinder" : {"$ref":1297} - }] - }, - "fShape" : {"$ref":885}, - "fMedium" : {"$ref":1092}, - "fFinder" : {"$ref":1297}, - "fVoxels" : null, - "fNumber" : 9, - "fNtotal" : 33, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1288}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "GasLayerPosTOF2_trans", - "fTitle" : "", - "fTranslation" : [0, 0, -0.128] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2GlassVolumeV0_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1291}, - "fMother" : {"$ref":1288}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":8} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2G10VolumeV0_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "TOF2G10VolumeV0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 3, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":886}, - "fMedium" : {"$ref":1148}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 10, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1288}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":9} - }] - }, - "fShape" : {"$ref":887}, - "fMedium" : { - "_typename" : "TGeoMedium", - "fUniqueID" : 8, - "fBits" : 50331648, - "fName" : "aluminium", - "fTitle" : "", - "fId" : 8, - "fParams" : [0, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : { - "_typename" : "TGeoMaterial", - "fUniqueID" : 8, - "fBits" : 50331648, - "fName" : "aluminium", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 7, - "fA" : 26.98, - "fZ" : 13, - "fDensity" : 2.7, - "fRadLen" : 8.87510465963777, - "fIntLen" : 38.8622319406182, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null - } - }, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 11, - "fNtotal" : 37, - "fRefCount" : 25 - }, - "fMother" : {"$ref":1285}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_1_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [86.1, 29.65, 605.9] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_2_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [71.9, 29.65, 597.1] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 3, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_3_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [55.8, 29.65, 605.9] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 4, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_4_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [42.1, 29.65, 597.1] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 5, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_5_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [25.7, 29.65, 605.9] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_6", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 6, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_6_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [12.3, 29.65, 597.1] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_7", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 7, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_7_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [-4.5, 27.15, 605.9] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_8", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 8, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_8_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [88.2, -3.55, 635.9] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_9", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 9, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_9_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [72.1, -4.35, 627.1] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_10", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 10, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_10_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [58, -3.55, 635.9] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_11", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 11, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_11_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [42.3, -4.35, 627.1] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_12", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 12, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_12_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [27.8, -3.55, 635.9] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_13", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 13, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_13_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [27.8, -3.55, 647] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_14", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 14, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_14_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [12.5, -4.35, 627.1] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_15", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 15, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_15_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [86, -36.45, 605.9] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_16", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 16, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_16_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [71.9, -36.45, 597.1] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_17", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 17, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_17_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [55.8, -36.45, 605.9] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_18", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 18, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_18_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [42.1, -36.45, 597.1] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_19", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 19, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_19_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [25.7, -36.45, 605.9] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_20", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 20, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_20_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [12.3, -36.45, 597.1] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV0_21", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1288}, - "fMother" : {"$ref":1285}, - "fNumber" : 21, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_21_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [-4.5, -34.15, 605.9] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV1_22", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "TOF2ChamberV1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 4, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2GlassVolumeV1_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "TOF2GlassVolumeV1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 7, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":888}, - "fMedium" : {"$ref":1143}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 12, - "fNtotal" : 1, - "fRefCount" : 2 - }, - "fMother" : {"$ref":1377}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":7} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ActiveGasVolumeV1_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "TOF2ActiveGasVolumeV1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 1, - "fBits" : 58736640, - "fName" : "ActiveGasStrip", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":890}, - "fMedium" : {"$ref":1092}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 8, - "fNtotal" : 1, - "fRefCount" : 16 - }, - "fMother" : {"$ref":1382}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -14.2265625, - "fIndex" : 0, - "fFinder" : { - "_typename" : "TGeoPatternY", - "fUniqueID" : 0, - "fBits" : 50331648, - "fStep" : 1.896875, - "fStart" : -15.175, - "fEnd" : 15.175, - "fNdivisions" : 16, - "fDivIndex" : 0, - "fVolume" : {"$ref":1382} - } - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1385}, - "fMother" : {"$ref":1382}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -12.3296875, - "fIndex" : 1, - "fFinder" : {"$ref":1386} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1385}, - "fMother" : {"$ref":1382}, - "fNumber" : 3, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -10.4328125, - "fIndex" : 2, - "fFinder" : {"$ref":1386} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1385}, - "fMother" : {"$ref":1382}, - "fNumber" : 4, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -8.5359375, - "fIndex" : 3, - "fFinder" : {"$ref":1386} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1385}, - "fMother" : {"$ref":1382}, - "fNumber" : 5, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -6.6390625, - "fIndex" : 4, - "fFinder" : {"$ref":1386} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_6", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1385}, - "fMother" : {"$ref":1382}, - "fNumber" : 6, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -4.7421875, - "fIndex" : 5, - "fFinder" : {"$ref":1386} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_7", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1385}, - "fMother" : {"$ref":1382}, - "fNumber" : 7, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -2.8453125, - "fIndex" : 6, - "fFinder" : {"$ref":1386} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_8", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1385}, - "fMother" : {"$ref":1382}, - "fNumber" : 8, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : -0.948437499999999, - "fIndex" : 7, - "fFinder" : {"$ref":1386} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_9", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1385}, - "fMother" : {"$ref":1382}, - "fNumber" : 9, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 0.948437500000001, - "fIndex" : 8, - "fFinder" : {"$ref":1386} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_10", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1385}, - "fMother" : {"$ref":1382}, - "fNumber" : 10, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 2.8453125, - "fIndex" : 9, - "fFinder" : {"$ref":1386} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_11", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1385}, - "fMother" : {"$ref":1382}, - "fNumber" : 11, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 4.7421875, - "fIndex" : 10, - "fFinder" : {"$ref":1386} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_12", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1385}, - "fMother" : {"$ref":1382}, - "fNumber" : 12, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 6.6390625, - "fIndex" : 11, - "fFinder" : {"$ref":1386} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_13", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1385}, - "fMother" : {"$ref":1382}, - "fNumber" : 13, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 8.5359375, - "fIndex" : 12, - "fFinder" : {"$ref":1386} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_14", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1385}, - "fMother" : {"$ref":1382}, - "fNumber" : 14, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 10.4328125, - "fIndex" : 13, - "fFinder" : {"$ref":1386} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_15", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1385}, - "fMother" : {"$ref":1382}, - "fNumber" : 15, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 12.3296875, - "fIndex" : 14, - "fFinder" : {"$ref":1386} - }, { - "_typename" : "TGeoNodeOffset", - "fUniqueID" : 0, - "fBits" : 50364416, - "fName" : "ActiveGasStrip_16", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1385}, - "fMother" : {"$ref":1382}, - "fNumber" : 16, - "fNovlp" : 0, - "fOverlaps" : [], - "fOffset" : 14.2265625, - "fIndex" : 15, - "fFinder" : {"$ref":1386} - }] - }, - "fShape" : {"$ref":889}, - "fMedium" : {"$ref":1092}, - "fFinder" : {"$ref":1386}, - "fVoxels" : null, - "fNumber" : 13, - "fNtotal" : 17, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1377}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":1329} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2GlassVolumeV1_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1380}, - "fMother" : {"$ref":1377}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":8} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2G10VolumeV1_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "TOF2G10VolumeV1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 3, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":891}, - "fMedium" : {"$ref":1148}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 14, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1377}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":9} - }] - }, - "fShape" : {"$ref":892}, - "fMedium" : {"$ref":1333}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 15, - "fNtotal" : 21, - "fRefCount" : 7 - }, - "fMother" : {"$ref":1285}, - "fNumber" : 22, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_22_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [120.3, 25.15, 597.1] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV1_23", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1377}, - "fMother" : {"$ref":1285}, - "fNumber" : 23, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_23_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [120.5, -4.25, 627.1] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF2ChamberV1_24", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1377}, - "fMother" : {"$ref":1285}, - "fNumber" : 24, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "Module_24_PosTOF2_trans", - "fTitle" : "", - "fTranslation" : [120.3, -31.95, 597.1] - } - }] - }, - "fShape" : { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 82.001, - "fDY" : 52.126, - "fDZ" : 25.791, - "fOrigin" : [68, -3.4, 622.05], - "fVolume" : {"$ref":1285}, - "fBBoxOK" : true - }, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 6, - "fNtotal" : 841, - "fRefCount" : 26 - }, - "fMother" : {"$ref":1258}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":842} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VETO_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "VETO", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "VMDL", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 7, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VFEL_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "VFEL", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 7, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VRFL_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "VRFL", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":898}, - "fMedium" : { - "_typename" : "TGeoMedium", - "fUniqueID" : 15, - "fBits" : 50331648, - "fName" : "PLASTIC", - "fTitle" : "", - "fId" : 15, - "fParams" : [0, 1, 0.19, 1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : { - "_typename" : "TGeoMixture", - "fUniqueID" : 15, - "fBits" : 50462720, - "fName" : "PLASTIC", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 14, - "fA" : 11.158100787, - "fZ" : 5.61284345, - "fDensity" : 1.032, - "fRadLen" : 42.0401716084694, - "fIntLen" : 70.7393809758668, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null, - "fNelements" : 2, - "fZmixture" : [6, 1], - "fAmixture" : [12.01, 1.008], - "fWeights" : [0.9225687, 0.07743125], - "fNatoms" : [], - "fVecNbOfAtomsPerVolume" : [], - "fElements" : null - } - }, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 21, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1418}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":11} - }] - }, - "fShape" : {"$ref":895}, - "fMedium" : {"$ref":944}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 18, - "fNtotal" : 2, - "fRefCount" : 3 - }, - "fMother" : {"$ref":1415}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":13} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VFEL_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1418}, - "fMother" : {"$ref":1415}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":14} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "VSCL", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 3, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VRSL_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "VRSL", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":900}, - "fMedium" : {"$ref":1422}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 23, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1426}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":18} - }] - }, - "fShape" : {"$ref":897}, - "fMedium" : { - "_typename" : "TGeoMedium", - "fUniqueID" : 13, - "fBits" : 50331648, - "fName" : "PLASTIC", - "fTitle" : "", - "fId" : 13, - "fParams" : [1, 0, 0, 1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : {"$ref":1423} - }, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 20, - "fNtotal" : 2, - "fRefCount" : 67 - }, - "fMother" : {"$ref":1415}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":17} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "VPBL", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 4, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VRPL_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "VRPL", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":899}, - "fMedium" : {"$ref":1422}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 22, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1432}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":20} - }] - }, - "fShape" : {"$ref":896}, - "fMedium" : { - "_typename" : "TGeoMedium", - "fUniqueID" : 14, - "fBits" : 50331648, - "fName" : "LEAD", - "fTitle" : "", - "fId" : 14, - "fParams" : [0, 0, 0, 1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : { - "_typename" : "TGeoMaterial", - "fUniqueID" : 10, - "fBits" : 50462720, - "fName" : "LEAD", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 9, - "fA" : 207.19, - "fZ" : 82, - "fDensity" : 11.35, - "fRadLen" : 0.561704911574565, - "fIntLen" : 18.2591661751475, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null - } - }, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 19, - "fNtotal" : 2, - "fRefCount" : 67 - }, - "fMother" : {"$ref":1415}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":19} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":24} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":25} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 3, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":28} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 3, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":29} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 4, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":32} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 4, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":33} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 5, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":36} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 5, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":37} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_6", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 6, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":40} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_6", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 6, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":41} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_7", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 7, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":44} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_7", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 7, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":45} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_8", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 8, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":48} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_8", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 8, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":49} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_9", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 9, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":52} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_9", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 9, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":53} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_10", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 10, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":56} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_10", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 10, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":57} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_11", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 11, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":60} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_11", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 11, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":61} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_12", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 12, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":64} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_12", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 12, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":65} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_13", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 13, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":68} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_13", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 13, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":69} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_14", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 14, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":72} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_14", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 14, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":73} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_15", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 15, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":76} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_15", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 15, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":77} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_16", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 16, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":80} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_16", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 16, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":81} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_17", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 17, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":84} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_17", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 17, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":85} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_18", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 18, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":88} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_18", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 18, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":89} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_19", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 19, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":92} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_19", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 19, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":93} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_20", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 20, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":96} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_20", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 20, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":97} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_21", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 21, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":100} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_21", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 21, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":101} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_22", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 22, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":104} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_22", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 22, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":105} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_23", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 23, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":108} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_23", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 23, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":109} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_24", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 24, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":112} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_24", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 24, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":113} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_25", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 25, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":116} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_25", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 25, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":117} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_26", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 26, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":120} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_26", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 26, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":121} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_27", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 27, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":124} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_27", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 27, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":125} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_28", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 28, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":128} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_28", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 28, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":129} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_29", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 29, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":132} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_29", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 29, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":133} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_30", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 30, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":136} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_30", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 30, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":137} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_31", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 31, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":140} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_31", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 31, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":141} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_32", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 32, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":144} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_32", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 32, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":145} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_33", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 33, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":148} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_33", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 33, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":149} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_34", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 34, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":152} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_34", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 34, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":153} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_35", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 35, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":156} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_35", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 35, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":157} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_36", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 36, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":160} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_36", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 36, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":161} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_37", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 37, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":164} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_37", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 37, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":165} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_38", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 38, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":168} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_38", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 38, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":169} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_39", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 39, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":172} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_39", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 39, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":173} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_40", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 40, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":176} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_40", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 40, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":177} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_41", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 41, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":180} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_41", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 41, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":181} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_42", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 42, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":184} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_42", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 42, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":185} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_43", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 43, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":188} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_43", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 43, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":189} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_44", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 44, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":192} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_44", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 44, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":193} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_45", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 45, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":196} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_45", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 45, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":197} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_46", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 46, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":200} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_46", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 46, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":201} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_47", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 47, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":204} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_47", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 47, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":205} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_48", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 48, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":208} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_48", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 48, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":209} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_49", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 49, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":212} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_49", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 49, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":213} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_50", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 50, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":216} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_50", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 50, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":217} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_51", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 51, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":220} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_51", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 51, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":221} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_52", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 52, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":224} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_52", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 52, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":225} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_53", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 53, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":228} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_53", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 53, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":229} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_54", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 54, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":232} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_54", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 54, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":233} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_55", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 55, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":236} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_55", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 55, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":237} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_56", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 56, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":240} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_56", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 56, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":241} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_57", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 57, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":244} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_57", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 57, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":245} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_58", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 58, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":248} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_58", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 58, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":249} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_59", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 59, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":252} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_59", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 59, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":253} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_60", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 60, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":256} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_60", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 60, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":257} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_61", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 61, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":260} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_61", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 61, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":261} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_62", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 62, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":264} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_62", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 62, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":265} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_63", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 63, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":268} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_63", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 63, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":269} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_64", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 64, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":272} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_64", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 64, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":273} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_65", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 65, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":276} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_65", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 65, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":277} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VSCL_66", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1426}, - "fMother" : {"$ref":1415}, - "fNumber" : 66, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":280} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VPBL_66", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1432}, - "fMother" : {"$ref":1415}, - "fNumber" : 66, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":281} - }] - }, - "fShape" : {"$ref":894}, - "fMedium" : {"$ref":944}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 17, - "fNtotal" : 269, - "fRefCount" : 202 - }, - "fMother" : {"$ref":1412}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":284} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":285} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 3, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":286} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 4, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":287} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 5, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":288} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_6", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 6, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":289} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_7", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 7, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":290} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_8", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 8, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":291} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_9", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 9, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":292} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_10", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 10, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":293} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_11", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 11, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":294} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_12", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 12, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":295} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_13", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 13, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":296} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_14", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 14, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":297} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_15", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 15, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":298} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_16", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 16, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":299} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_17", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 17, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":300} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_18", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 18, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":301} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_19", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 19, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":302} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_20", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 20, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":303} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_21", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 21, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":304} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_22", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 22, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":305} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_23", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 23, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":306} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_24", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 24, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":307} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_25", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 25, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":308} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_26", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 26, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":309} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "UMDL", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 7, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UFEL_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "UFEL", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 7, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "URFL_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "URFL", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":906}, - "fMedium" : {"$ref":1422}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 29, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1597}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":12} - }] - }, - "fShape" : {"$ref":905}, - "fMedium" : {"$ref":944}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 28, - "fNtotal" : 2, - "fRefCount" : 3 - }, - "fMother" : {"$ref":1594}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":15} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UFEL_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1597}, - "fMother" : {"$ref":1594}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":16} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "USCL", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 3, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "URSL_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "URSL", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":903}, - "fMedium" : {"$ref":1422}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 26, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1603}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":22} - }] - }, - "fShape" : {"$ref":902}, - "fMedium" : {"$ref":1430}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 25, - "fNtotal" : 2, - "fRefCount" : 67 - }, - "fMother" : {"$ref":1594}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":21} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "UPBL", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 4, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":904}, - "fMedium" : {"$ref":1436}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 27, - "fNtotal" : 1, - "fRefCount" : 66 - }, - "fMother" : {"$ref":1594}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":23} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":26} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":27} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 3, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":30} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 3, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":31} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 4, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":34} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 4, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":35} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 5, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":38} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 5, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":39} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_6", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 6, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":42} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_6", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 6, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":43} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_7", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 7, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":46} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_7", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 7, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":47} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_8", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 8, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":50} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_8", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 8, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":51} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_9", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 9, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":54} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_9", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 9, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":55} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_10", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 10, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":58} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_10", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 10, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":59} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_11", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 11, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":62} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_11", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 11, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":63} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_12", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 12, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":66} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_12", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 12, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":67} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_13", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 13, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":70} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_13", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 13, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":71} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_14", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 14, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":74} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_14", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 14, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":75} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_15", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 15, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":78} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_15", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 15, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":79} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_16", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 16, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":82} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_16", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 16, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":83} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_17", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 17, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":86} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_17", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 17, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":87} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_18", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 18, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":90} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_18", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 18, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":91} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_19", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 19, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":94} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_19", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 19, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":95} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_20", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 20, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":98} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_20", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 20, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":99} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_21", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 21, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":102} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_21", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 21, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":103} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_22", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 22, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":106} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_22", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 22, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":107} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_23", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 23, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":110} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_23", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 23, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":111} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_24", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 24, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":114} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_24", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 24, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":115} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_25", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 25, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":118} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_25", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 25, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":119} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_26", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 26, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":122} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_26", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 26, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":123} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_27", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 27, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":126} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_27", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 27, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":127} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_28", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 28, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":130} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_28", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 28, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":131} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_29", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 29, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":134} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_29", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 29, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":135} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_30", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 30, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":138} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_30", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 30, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":139} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_31", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 31, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":142} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_31", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 31, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":143} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_32", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 32, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":146} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_32", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 32, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":147} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_33", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 33, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":150} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_33", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 33, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":151} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_34", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 34, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":154} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_34", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 34, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":155} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_35", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 35, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":158} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_35", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 35, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":159} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_36", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 36, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":162} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_36", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 36, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":163} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_37", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 37, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":166} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_37", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 37, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":167} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_38", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 38, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":170} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_38", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 38, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":171} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_39", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 39, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":174} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_39", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 39, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":175} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_40", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 40, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":178} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_40", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 40, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":179} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_41", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 41, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":182} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_41", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 41, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":183} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_42", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 42, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":186} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_42", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 42, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":187} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_43", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 43, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":190} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_43", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 43, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":191} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_44", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 44, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":194} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_44", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 44, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":195} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_45", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 45, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":198} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_45", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 45, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":199} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_46", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 46, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":202} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_46", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 46, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":203} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_47", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 47, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":206} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_47", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 47, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":207} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_48", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 48, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":210} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_48", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 48, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":211} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_49", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 49, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":214} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_49", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 49, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":215} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_50", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 50, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":218} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_50", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 50, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":219} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_51", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 51, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":222} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_51", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 51, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":223} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_52", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 52, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":226} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_52", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 52, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":227} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_53", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 53, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":230} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_53", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 53, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":231} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_54", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 54, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":234} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_54", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 54, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":235} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_55", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 55, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":238} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_55", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 55, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":239} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_56", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 56, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":242} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_56", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 56, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":243} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_57", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 57, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":246} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_57", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 57, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":247} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_58", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 58, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":250} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_58", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 58, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":251} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_59", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 59, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":254} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_59", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 59, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":255} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_60", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 60, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":258} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_60", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 60, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":259} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_61", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 61, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":262} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_61", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 61, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":263} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_62", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 62, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":266} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_62", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 62, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":267} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_63", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 63, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":270} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_63", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 63, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":271} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_64", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 64, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":274} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_64", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 64, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":275} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_65", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 65, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":278} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_65", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 65, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":279} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "USCL_66", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1603}, - "fMother" : {"$ref":1594}, - "fNumber" : 66, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":282} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UPBL_66", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1608}, - "fMother" : {"$ref":1594}, - "fNumber" : 66, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":283} - }] - }, - "fShape" : {"$ref":901}, - "fMedium" : {"$ref":944}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 24, - "fNtotal" : 203, - "fRefCount" : 166 - }, - "fMother" : {"$ref":1412}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":310} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":311} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 3, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":312} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 4, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":313} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 5, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":314} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_6", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 6, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":315} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_7", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 7, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":316} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_8", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 8, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":317} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_9", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 9, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":318} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_10", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 10, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":319} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_11", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 11, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":320} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_12", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 12, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":321} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_27", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 27, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":322} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_28", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 28, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":323} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_29", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 29, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":324} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_30", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 30, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":325} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_31", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 31, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":326} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_32", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 32, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":327} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_33", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 33, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":328} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_34", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 34, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":329} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_13", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 13, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":330} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_14", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 14, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":331} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_15", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 15, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":332} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_16", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 16, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":333} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_17", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 17, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":334} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_19", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 19, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":335} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_22", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 22, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":336} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_24", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 24, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":337} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_35", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 35, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":338} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_36", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 36, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":339} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_37", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 37, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":340} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_38", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 38, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":341} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_39", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 39, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":342} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_40", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 40, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":343} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_41", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 41, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":344} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_42", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 42, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":345} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_25", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 25, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":346} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_26", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 26, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":347} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_27", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 27, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":348} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_28", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 28, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":349} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_29", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 29, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":350} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_30", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 30, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":351} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_31", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 31, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":352} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_32", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 32, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":353} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_33", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 33, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":354} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_34", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 34, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":355} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_35", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 35, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":356} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "UMDL_36", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1594}, - "fMother" : {"$ref":1412}, - "fNumber" : 36, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":357} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_43", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 43, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":358} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_44", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 44, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":359} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_45", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 45, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":360} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_46", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 46, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":361} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_47", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 47, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":362} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_48", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 48, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":363} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_49", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 49, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":364} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_50", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 50, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":365} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_51", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 51, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":366} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_52", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 52, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":367} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_53", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 53, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":368} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_54", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 54, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":369} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_55", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 55, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":370} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_56", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 56, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":371} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_57", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 57, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":372} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_58", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 58, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":373} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_59", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 59, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":374} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_60", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 60, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":375} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_61", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 61, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":376} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_62", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 62, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":377} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_63", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 63, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":378} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_64", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 64, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":379} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_65", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 65, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":380} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_66", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 66, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":381} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_67", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 67, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":382} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "VMDL_68", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1415}, - "fMother" : {"$ref":1412}, - "fNumber" : 68, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":383} - }] - }, - "fShape" : {"$ref":893}, - "fMedium" : { - "_typename" : "TGeoMedium", - "fUniqueID" : 9, - "fBits" : 50331648, - "fName" : "AIR", - "fTitle" : "", - "fId" : 9, - "fParams" : [0, 1, 0.19, 0.25, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : { - "_typename" : "TGeoMaterial", - "fUniqueID" : 11, - "fBits" : 50462720, - "fName" : "AIR", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 10, - "fA" : 14.61, - "fZ" : 7.3, - "fDensity" : 0.001205, - "fRadLen" : 30412.608512906, - "fIntLen" : 70037.7174700344, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null - } - }, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 16, - "fNtotal" : 24789, - "fRefCount" : 101 - }, - "fMother" : {"$ref":1258}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":10} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "GEMS_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "GEMS", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "station0_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":940}, - "fMother" : {"$ref":1815}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t383", - "fTitle" : "", - "fTranslation" : [-1.5, -4.5, 32.7], - "fRotation" : null - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "station1_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":960}, - "fMother" : {"$ref":1815}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t389", - "fTitle" : "", - "fTranslation" : [-1.5, -4.5, 64.5], - "fRotation" : null - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "station2_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":980}, - "fMother" : {"$ref":1815}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t395", - "fTitle" : "", - "fTranslation" : [-1.5, -4.5, 96.5], - "fRotation" : null - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "station3_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1010}, - "fMother" : {"$ref":1815}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t401", - "fTitle" : "", - "fTranslation" : [0, -4.5, 128.5], - "fRotation" : null - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "station4_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1043}, - "fMother" : {"$ref":1815}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t413", - "fTitle" : "", - "fTranslation" : [0, -6.9, 161.1], - "fRotation" : null - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "station5_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1076}, - "fMother" : {"$ref":1815}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t423", - "fTitle" : "", - "fTranslation" : [0, -6.9, 193.1], - "fRotation" : null - } - }] - }, - "fShape" : { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 86.6, - "fDY" : 26.55, - "fDZ" : 81.75, - "fOrigin" : [0, -6.6, 113.75], - "fVolume" : {"$ref":1815}, - "fBBoxOK" : true - }, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 30, - "fNtotal" : 57, - "fRefCount" : 8 - }, - "fMother" : {"$ref":1258}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":838} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "TOF400_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "TOF400", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1Detector_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1088}, - "fMother" : {"$ref":1831}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t1", - "fTitle" : "", - "fTranslation" : [54.4, 54, 458.66] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1Detector_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1088}, - "fMother" : {"$ref":1831}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t1", - "fTitle" : "", - "fTranslation" : [54.4, 27, 454.8] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1Detector_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1088}, - "fMother" : {"$ref":1831}, - "fNumber" : 3, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t1", - "fTitle" : "", - "fTranslation" : [54.4, 0, 458.66] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1Detector_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1088}, - "fMother" : {"$ref":1831}, - "fNumber" : 4, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t1", - "fTitle" : "", - "fTranslation" : [54.4, -27, 454.8] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1Detector_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1088}, - "fMother" : {"$ref":1831}, - "fNumber" : 5, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t1", - "fTitle" : "", - "fTranslation" : [54.4, -54, 458.66] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1Detector_6", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1088}, - "fMother" : {"$ref":1831}, - "fNumber" : 6, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t1", - "fTitle" : "", - "fTranslation" : [54.4, 54, 446.46] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1Detector_7", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1088}, - "fMother" : {"$ref":1831}, - "fNumber" : 7, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t1", - "fTitle" : "", - "fTranslation" : [54.4, 27, 442.6] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1Detector_8", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1088}, - "fMother" : {"$ref":1831}, - "fNumber" : 8, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t1", - "fTitle" : "", - "fTranslation" : [54.4, 0, 446.46] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1Detector_9", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1088}, - "fMother" : {"$ref":1831}, - "fNumber" : 9, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t1", - "fTitle" : "", - "fTranslation" : [54.4, -27, 442.6] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tof1Detector_10", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1088}, - "fMother" : {"$ref":1831}, - "fNumber" : 10, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t1", - "fTitle" : "", - "fTranslation" : [54.4, -54, 446.46] - } - }] - }, - "fShape" : { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 30, - "fDY" : 69, - "fDZ" : 9.53, - "fOrigin" : [54.4, 0, 450.63], - "fVolume" : {"$ref":1831}, - "fBBoxOK" : true - }, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 77, - "fNtotal" : 531, - "fRefCount" : 12 - }, - "fMother" : {"$ref":1258}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52428800, - "fName" : "tw", - "fTitle" : "", - "fTranslation" : [0, 0, 0] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "DCH_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "DCH", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "DCHDetV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "DCHDetV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 3, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "DCHActivePlaneV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "DCHActivePlaneV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 7, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1151}, - "fMedium" : {"$ref":964}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 83, - "fNtotal" : 1, - "fRefCount" : 8 - }, - "fMother" : {"$ref":1859}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":490} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "DCHActivePlaneV_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1862}, - "fMother" : {"$ref":1859}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":491} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "DCHActivePlaneV_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1862}, - "fMother" : {"$ref":1859}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":492} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "DCHActivePlaneV_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1862}, - "fMother" : {"$ref":1859}, - "fNumber" : 3, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":493} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "DCHActivePlaneV_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1862}, - "fMother" : {"$ref":1859}, - "fNumber" : 4, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":494} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "DCHActivePlaneV_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1862}, - "fMother" : {"$ref":1859}, - "fNumber" : 5, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":495} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "DCHActivePlaneV_6", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1862}, - "fMother" : {"$ref":1859}, - "fNumber" : 6, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":496} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "DCHActivePlaneV_7", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1862}, - "fMother" : {"$ref":1859}, - "fNumber" : 7, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":497} - }] - }, - "fShape" : {"$ref":1152}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 84, - "fNtotal" : 9, - "fRefCount" : 10 - }, - "fMother" : {"$ref":1856}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 52822016, - "fName" : "c485", - "fTitle" : "", - "fTranslation" : [0, 0, 514], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "rot", - "fTitle" : "", - "fRotationMatrix" : [0.923879532511287, -0.38268343236509, 0, 0.38268343236509, 0.923879532511287, -0, 0, 0, 1] - } - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "DCHDetV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1859}, - "fMother" : {"$ref":1856}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 52822016, - "fName" : "c493", - "fTitle" : "", - "fTranslation" : [0, 0, 713], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "rot", - "fTitle" : "", - "fRotationMatrix" : [0.923879532511287, -0.38268343236509, 0, 0.38268343236509, 0.923879532511287, -0, 0, 0, 1] - } - } - }] - }, - "fShape" : { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 204.834692374119, - "fDY" : 204.834692374119, - "fDZ" : 112.75, - "fOrigin" : [0, 0, 613.5], - "fVolume" : {"$ref":1856}, - "fBBoxOK" : true - }, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 82, - "fNtotal" : 19, - "fRefCount" : 4 - }, - "fMother" : {"$ref":1258}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":843} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "MWPC_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "MWPC", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "MWPCContainerV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "MWPCContainerV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 3, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "MWPCActivePlaneV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "MWPCActivePlaneV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 7, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1154}, - "fMedium" : {"$ref":964}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 86, - "fNtotal" : 1, - "fRefCount" : 6 - }, - "fMother" : {"$ref":1880}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":498} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "MWPCActivePlaneV_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1883}, - "fMother" : {"$ref":1880}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":499} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "MWPCActivePlaneV_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1883}, - "fMother" : {"$ref":1880}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":501} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "MWPCActivePlaneV_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1883}, - "fMother" : {"$ref":1880}, - "fNumber" : 3, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":503} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "MWPCActivePlaneV_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1883}, - "fMother" : {"$ref":1880}, - "fNumber" : 4, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":505} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "MWPCActivePlaneV_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1883}, - "fMother" : {"$ref":1880}, - "fNumber" : 5, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":507} - }] - }, - "fShape" : {"$ref":1153}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 87, - "fNtotal" : 7, - "fRefCount" : 8 - }, - "fMother" : {"$ref":1877}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "DetPos0_trans", - "fTitle" : "", - "fTranslation" : [0, 0, -362.41265] - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "MWPCContainerV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1880}, - "fMother" : {"$ref":1877}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "DetPos1_trans", - "fTitle" : "", - "fTranslation" : [0, 0, -212.63755] - } - }] - }, - "fShape" : { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 26.15396719429, - "fDY" : 26.15396719429, - "fDZ" : 78.39205, - "fOrigin" : [0, 0, -287.5251], - "fVolume" : {"$ref":1877}, - "fBBoxOK" : true - }, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 85, - "fNtotal" : 15, - "fRefCount" : 4 - }, - "fMother" : {"$ref":1258}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":844} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "ecal01", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 3, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "ecal01mod", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 3, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01front_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "ecal01front", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 6, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1157}, - "fMedium" : {"$ref":1280}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 90, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1897}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":511} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "ecal01lay", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 3, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lead_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "ecal01lead", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 3, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1159}, - "fMedium" : {"$ref":1430}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 92, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":1902}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":513} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01scint_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58736640, - "fName" : "ecal01scint", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 4, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1160}, - "fMedium" : { - "_typename" : "TGeoMedium", - "fUniqueID" : 20, - "fBits" : 50331648, - "fName" : "FscScint", - "fTitle" : "", - "fId" : 20, - "fParams" : [1, 1, 20, -1, -1, -1, 1e-4, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : { - "_typename" : "TGeoMixture", - "fUniqueID" : 20, - "fBits" : 50462720, - "fName" : "FscScint", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 19, - "fA" : 11.0715201827875, - "fZ" : 5.57349581111957, - "fDensity" : 1.032, - "fRadLen" : 42.1299811568047, - "fIntLen" : 70.0999370078305, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null, - "fNelements" : 2, - "fZmixture" : [6, 1], - "fAmixture" : [12.01, 1.008], - "fWeights" : [0.914699162223915, 0.0853008377760853], - "fNatoms" : [], - "fVecNbOfAtomsPerVolume" : [], - "fElements" : null - } - }, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 93, - "fNtotal" : 1, - "fRefCount" : 9 - }, - "fMother" : {"$ref":1902}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":514} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01scint_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1907}, - "fMother" : {"$ref":1902}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":515} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01scint_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1907}, - "fMother" : {"$ref":1902}, - "fNumber" : 3, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":516} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01scint_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1907}, - "fMother" : {"$ref":1902}, - "fNumber" : 4, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":517} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01scint_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1907}, - "fMother" : {"$ref":1902}, - "fNumber" : 5, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":518} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01scint_6", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1907}, - "fMother" : {"$ref":1902}, - "fNumber" : 6, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":519} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01scint_7", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1907}, - "fMother" : {"$ref":1902}, - "fNumber" : 7, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":520} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01scint_8", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1907}, - "fMother" : {"$ref":1902}, - "fNumber" : 8, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":521} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01scint_9", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1907}, - "fMother" : {"$ref":1902}, - "fNumber" : 9, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":522} - }] - }, - "fShape" : {"$ref":1158}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 91, - "fNtotal" : 11, - "fRefCount" : 230 - }, - "fMother" : {"$ref":1897}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":512} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":523} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 3, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":524} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 4, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":525} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 5, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":526} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_6", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 6, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":527} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_7", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 7, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":528} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_8", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 8, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":529} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_9", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 9, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":530} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_10", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 10, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":531} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_11", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 11, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":532} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_12", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 12, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":533} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_13", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 13, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":534} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_14", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 14, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":535} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_15", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 15, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":536} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_16", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 16, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":537} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_17", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 17, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":538} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_18", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 18, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":539} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_19", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 19, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":540} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_20", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 20, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":541} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_21", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 21, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":542} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_22", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 22, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":543} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_23", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 23, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":544} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_24", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 24, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":545} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_25", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 25, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":546} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_26", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 26, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":547} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_27", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 27, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":548} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_28", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 28, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":549} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_29", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 29, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":550} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_30", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 30, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":551} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_31", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 31, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":552} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_32", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 32, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":553} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_33", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 33, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":554} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_34", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 34, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":555} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_35", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 35, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":556} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_36", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 36, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":557} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_37", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 37, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":558} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_38", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 38, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":559} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_39", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 39, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":560} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_40", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 40, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":561} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_41", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 41, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":562} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_42", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 42, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":563} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_43", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 43, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":564} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_44", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 44, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":565} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_45", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 45, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":566} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_46", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 46, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":567} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_47", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 47, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":568} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_48", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 48, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":569} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_49", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 49, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":570} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_50", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 50, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":571} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_51", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 51, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":572} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_52", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 52, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":573} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_53", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 53, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":574} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_54", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 54, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":575} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_55", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 55, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":576} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_56", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 56, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":577} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_57", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 57, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":578} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_58", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 58, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":579} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_59", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 59, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":580} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_60", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 60, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":581} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_61", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 61, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":582} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_62", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 62, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":583} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_63", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 63, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":584} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_64", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 64, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":585} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_65", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 65, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":586} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_66", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 66, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":587} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_67", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 67, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":588} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_68", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 68, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":589} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_69", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 69, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":590} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_70", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 70, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":591} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_71", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 71, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":592} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_72", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 72, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":593} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_73", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 73, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":594} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_74", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 74, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":595} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_75", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 75, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":596} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_76", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 76, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":597} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_77", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 77, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":598} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_78", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 78, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":599} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_79", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 79, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":600} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_80", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 80, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":601} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_81", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 81, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":602} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_82", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 82, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":603} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_83", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 83, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":604} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_84", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 84, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":605} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_85", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 85, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":606} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_86", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 86, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":607} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_87", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 87, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":608} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_88", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 88, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":609} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_89", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 89, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":610} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_90", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 90, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":611} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_91", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 91, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":612} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_92", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 92, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":613} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_93", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 93, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":614} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_94", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 94, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":615} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_95", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 95, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":616} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_96", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 96, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":617} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_97", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 97, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":618} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_98", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 98, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":619} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_99", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 99, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":620} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_100", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 100, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":621} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_101", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 101, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":622} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_102", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 102, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":623} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_103", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 103, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":624} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_104", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 104, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":625} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_105", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 105, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":626} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_106", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 106, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":627} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_107", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 107, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":628} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_108", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 108, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":629} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_109", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 109, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":630} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_110", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 110, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":631} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_111", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 111, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":632} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_112", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 112, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":633} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_113", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 113, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":634} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_114", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 114, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":635} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_115", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 115, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":636} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_116", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 116, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":637} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_117", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 117, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":638} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_118", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 118, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":639} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_119", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 119, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":640} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_120", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 120, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":641} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_121", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 121, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":642} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_122", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 122, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":643} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_123", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 123, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":644} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_124", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 124, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":645} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_125", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 125, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":646} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_126", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 126, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":647} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_127", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 127, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":648} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_128", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 128, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":649} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_129", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 129, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":650} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_130", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 130, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":651} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_131", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 131, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":652} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_132", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 132, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":653} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_133", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 133, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":654} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_134", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 134, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":655} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_135", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 135, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":656} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_136", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 136, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":657} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_137", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 137, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":658} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_138", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 138, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":659} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_139", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 139, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":660} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_140", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 140, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":661} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_141", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 141, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":662} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_142", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 142, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":663} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_143", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 143, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":664} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_144", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 144, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":665} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_145", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 145, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":666} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_146", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 146, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":667} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_147", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 147, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":668} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_148", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 148, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":669} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_149", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 149, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":670} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_150", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 150, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":671} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_151", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 151, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":672} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_152", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 152, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":673} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_153", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 153, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":674} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_154", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 154, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":675} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_155", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 155, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":676} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_156", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 156, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":677} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_157", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 157, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":678} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_158", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 158, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":679} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_159", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 159, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":680} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_160", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 160, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":681} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_161", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 161, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":682} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_162", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 162, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":683} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_163", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 163, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":684} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_164", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 164, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":685} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_165", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 165, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":686} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_166", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 166, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":687} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_167", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 167, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":688} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_168", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 168, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":689} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_169", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 169, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":690} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_170", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 170, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":691} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_171", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 171, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":692} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_172", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 172, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":693} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_173", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 173, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":694} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_174", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 174, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":695} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_175", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 175, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":696} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_176", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 176, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":697} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_177", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 177, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":698} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_178", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 178, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":699} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_179", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 179, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":700} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_180", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 180, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":701} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_181", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 181, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":702} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_182", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 182, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":703} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_183", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 183, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":704} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_184", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 184, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":705} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_185", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 185, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":706} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_186", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 186, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":707} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_187", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 187, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":708} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_188", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 188, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":709} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_189", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 189, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":710} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_190", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 190, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":711} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_191", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 191, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":712} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_192", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 192, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":713} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_193", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 193, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":714} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_194", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 194, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":715} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_195", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 195, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":716} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_196", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 196, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":717} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_197", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 197, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":718} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_198", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 198, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":719} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_199", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 199, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":720} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_200", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 200, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":721} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_201", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 201, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":722} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_202", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 202, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":723} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_203", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 203, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":724} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_204", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 204, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":725} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_205", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 205, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":726} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_206", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 206, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":727} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_207", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 207, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":728} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_208", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 208, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":729} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_209", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 209, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":730} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_210", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 210, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":731} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_211", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 211, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":732} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_212", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 212, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":733} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_213", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 213, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":734} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_214", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 214, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":735} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_215", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 215, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":736} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_216", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 216, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":737} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_217", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 217, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":738} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_218", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 218, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":739} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_219", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 219, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":740} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01lay_220", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1902}, - "fMother" : {"$ref":1897}, - "fNumber" : 220, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":741} - }] - }, - "fShape" : {"$ref":1156}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 89, - "fNtotal" : 2422, - "fRefCount" : 301 - }, - "fMother" : {"$ref":1894}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":510} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":742} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 3, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":743} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 4, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":744} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 5, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":745} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_6", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 6, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":746} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_7", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 7, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":747} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_8", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 8, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":748} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_9", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 9, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":749} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_10", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 10, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":750} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_11", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 11, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":751} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_12", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 12, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":752} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_13", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 13, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":753} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_14", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 14, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":754} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_15", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 15, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":755} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_16", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 16, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":756} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_17", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 17, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":757} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_18", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 18, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":758} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_19", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 19, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":759} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_20", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 20, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":760} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_21", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 21, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":761} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_22", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 22, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":762} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_23", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 23, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":763} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_24", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 24, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":764} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_25", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 25, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":765} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_26", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 26, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":766} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_27", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 27, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":767} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_28", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 28, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":768} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_29", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 29, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":769} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_30", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 30, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":770} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_31", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 31, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":771} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_32", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 32, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":772} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_33", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 33, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":773} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_34", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 34, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":774} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_35", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 35, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":775} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_36", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 36, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":776} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_37", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 37, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":777} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_38", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 38, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":778} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_39", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 39, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":779} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_40", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 40, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":780} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_41", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 41, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":781} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_42", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 42, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":782} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_43", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 43, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":783} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_44", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 44, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":784} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_45", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 45, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":785} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_46", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 46, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":786} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_47", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 47, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":787} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_48", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 48, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":788} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_49", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 49, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":789} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_50", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 50, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":790} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_51", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 51, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":791} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_52", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 52, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":792} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_53", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 53, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":793} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_54", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 54, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":794} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_55", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 55, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":795} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_56", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 56, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":796} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_57", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 57, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":797} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_58", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 58, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":798} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_59", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 59, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":799} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_60", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 60, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":800} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_61", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 61, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":801} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_62", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 62, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":802} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_63", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 63, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":803} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_64", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 64, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":804} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_65", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 65, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":805} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_66", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 66, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":806} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_67", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 67, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":807} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_68", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 68, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":808} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_69", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 69, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":809} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_70", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 70, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":810} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_71", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 71, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":811} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_72", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 72, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":812} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_73", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 73, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":813} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_74", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 74, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":814} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_75", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 75, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":815} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_76", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 76, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":816} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_77", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 77, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":817} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_78", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 78, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":818} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_79", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 79, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":819} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01mod_80", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1897}, - "fMother" : {"$ref":1894}, - "fNumber" : 80, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":820} - }] - }, - "fShape" : {"$ref":1155}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 88, - "fNtotal" : 193761, - "fRefCount" : 82 - }, - "fMother" : {"$ref":1258}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":509} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ecal01_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1894}, - "fMother" : {"$ref":1258}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":821} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Silicon_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59785216, - "fName" : "Silicon", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "station0_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolumeAssembly", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "station0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 1, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "moduleV_0_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "moduleV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_zone_upper_partV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_zone_upper_partV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1233}, - "fMedium" : { - "_typename" : "TGeoMedium", - "fUniqueID" : 21, - "fBits" : 50331648, - "fName" : "silicon", - "fTitle" : "", - "fId" : 21, - "fParams" : [1, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : { - "_typename" : "TGeoMaterial", - "fUniqueID" : 21, - "fBits" : 50331648, - "fName" : "silicon", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 20, - "fA" : 28.0855, - "fZ" : 14, - "fDensity" : 2.33, - "fRadLen" : 9.34960746942193, - "fIntLen" : 45.753205754866, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null - } - }, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 95, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2224}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":822} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_zone_lower_part_rectV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_zone_lower_part_rectV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1234}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 96, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2224}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":823} - }] - }, - "fShape" : {"$ref":1235}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 97, - "fNtotal" : 3, - "fRefCount" : 3 - }, - "fMother" : {"$ref":2221}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 61210624, - "fName" : "c812", - "fTitle" : "", - "fTranslation" : [9, 6.15175, 3.325], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [-1, 0, 1.22464679914735e-16, 0, 1, 0, -1.22464679914735e-16, -0, -1] - } - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frameV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 2, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1161}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 98, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2221}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 61210624, - "fName" : "c814", - "fTitle" : "", - "fTranslation" : [9, 6.15175, 3.22], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [-1, 0, 1.22464679914735e-16, 0, 1, 0, -1.22464679914735e-16, -0, -1] - } - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "moduleV_1_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "moduleV_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_zone_upper_partV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_zone_upper_partV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1238}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 95, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2239}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":824} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_zone_lower_part_bevelV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_zone_lower_part_bevelV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1236}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 99, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2239}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":825} - }] - }, - "fShape" : {"$ref":1237}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 100, - "fNtotal" : 3, - "fRefCount" : 3 - }, - "fMother" : {"$ref":2221}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 61210624, - "fName" : "c814", - "fTitle" : "", - "fTranslation" : [3, 6.15175, 1.795], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [-1, 0, 1.22464679914735e-16, 0, 1, 0, -1.22464679914735e-16, -0, -1] - } - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frameV_1", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 17, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1170}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 8, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2221}, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 61210624, - "fName" : "c816", - "fTitle" : "", - "fTranslation" : [3, 6.15175, 1.69], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [-1, 0, 1.22464679914735e-16, 0, 1, 0, -1.22464679914735e-16, -0, -1] - } - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "moduleV_2_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "moduleV_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_zone_upper_partV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_zone_upper_partV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1240}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 95, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2252}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":826} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_zone_lower_part_bevelV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_zone_lower_part_bevelV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1241}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 99, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2252}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":827} - }] - }, - "fShape" : {"$ref":1239}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 101, - "fNtotal" : 3, - "fRefCount" : 3 - }, - "fMother" : {"$ref":2221}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t816", - "fTitle" : "", - "fTranslation" : [-3, 6.15175, 3.105], - "fRotation" : null - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frameV_2", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 17, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1179}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 8, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2221}, - "fNumber" : 2, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t818", - "fTitle" : "", - "fTranslation" : [-3, 6.15175, 3.21], - "fRotation" : null - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "moduleV_3_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "moduleV_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_zone_upper_partV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_zone_upper_partV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1243}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 95, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2263}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":828} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_zone_lower_part_rectV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_zone_lower_part_rectV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1244}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 96, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2263}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":829} - }] - }, - "fShape" : {"$ref":1242}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 102, - "fNtotal" : 3, - "fRefCount" : 3 - }, - "fMother" : {"$ref":2221}, - "fNumber" : 3, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t818", - "fTitle" : "", - "fTranslation" : [-9, 6.15175, 1.575], - "fRotation" : null - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frameV_3", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 17, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1188}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 8, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2221}, - "fNumber" : 3, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t820", - "fTitle" : "", - "fTranslation" : [-9, 6.15175, 1.68], - "fRotation" : null - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "moduleV_4_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "moduleV_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_zone_upper_partV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_zone_upper_partV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1246}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 95, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2274}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":830} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_zone_lower_part_rectV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_zone_lower_part_rectV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1247}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 96, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2274}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":831} - }] - }, - "fShape" : {"$ref":1245}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 103, - "fNtotal" : 3, - "fRefCount" : 3 - }, - "fMother" : {"$ref":2221}, - "fNumber" : 4, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 61210624, - "fName" : "c820", - "fTitle" : "", - "fTranslation" : [9, -6.15175, 2.065], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [-1, 0, 1.22464679914735e-16, 1.49975978266186e-32, -1, 1.22464679914735e-16, 1.22464679914735e-16, 1.22464679914735e-16, 1] - } - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frameV_4", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 17, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1197}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 8, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2221}, - "fNumber" : 4, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 61210624, - "fName" : "c822", - "fTitle" : "", - "fTranslation" : [9, -6.15175, 2.17], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [-1, 0, 1.22464679914735e-16, 1.49975978266186e-32, -1, 1.22464679914735e-16, 1.22464679914735e-16, 1.22464679914735e-16, 1] - } - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "moduleV_5_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "moduleV_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_zone_upper_partV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_zone_upper_partV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1249}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 95, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2287}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":832} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_zone_lower_part_bevelV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_zone_lower_part_bevelV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1250}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 99, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2287}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":833} - }] - }, - "fShape" : {"$ref":1248}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 104, - "fNtotal" : 3, - "fRefCount" : 3 - }, - "fMother" : {"$ref":2221}, - "fNumber" : 5, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 61210624, - "fName" : "c822", - "fTitle" : "", - "fTranslation" : [3, -6.15175, 3.595], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [-1, 0, 1.22464679914735e-16, 1.49975978266186e-32, -1, 1.22464679914735e-16, 1.22464679914735e-16, 1.22464679914735e-16, 1] - } - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frameV_5", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 17, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1206}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 8, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2221}, - "fNumber" : 5, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 61210624, - "fName" : "c824", - "fTitle" : "", - "fTranslation" : [3, -6.15175, 3.7], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [-1, 0, 1.22464679914735e-16, 1.49975978266186e-32, -1, 1.22464679914735e-16, 1.22464679914735e-16, 1.22464679914735e-16, 1] - } - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "moduleV_6_6", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "moduleV_6", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_zone_upper_partV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_zone_upper_partV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1252}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 95, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2300}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":834} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_zone_lower_part_bevelV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_zone_lower_part_bevelV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1253}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 99, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2300}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":835} - }] - }, - "fShape" : {"$ref":1251}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 105, - "fNtotal" : 3, - "fRefCount" : 3 - }, - "fMother" : {"$ref":2221}, - "fNumber" : 6, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 61210624, - "fName" : "c824", - "fTitle" : "", - "fTranslation" : [-3, -6.15175, 2.285], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [1, 0, 0, -0, -1, -1.22464679914735e-16, 0, 1.22464679914735e-16, -1] - } - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frameV_6", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 17, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1215}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 8, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2221}, - "fNumber" : 6, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 61210624, - "fName" : "c826", - "fTitle" : "", - "fTranslation" : [-3, -6.15175, 2.18], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [1, 0, 0, -0, -1, -1.22464679914735e-16, 0, 1.22464679914735e-16, -1] - } - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "moduleV_7_7", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 59768832, - "fName" : "moduleV_7", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_zone_upper_partV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_zone_upper_partV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1255}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 95, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2313}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":836} - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sensor_zone_lower_part_rectV_0", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "Sensor_zone_lower_part_rectV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 5, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1256}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 96, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2313}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":837} - }] - }, - "fShape" : {"$ref":1254}, - "fMedium" : {"$ref":2228}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 106, - "fNtotal" : 3, - "fRefCount" : 3 - }, - "fMother" : {"$ref":2221}, - "fNumber" : 7, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 61210624, - "fName" : "c826", - "fTitle" : "", - "fTranslation" : [-9, -6.15175, 3.815], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [1, 0, 0, -0, -1, -1.22464679914735e-16, 0, 1.22464679914735e-16, -1] - } - } - }, { - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "frameV_7", - "fTitle" : "", - "fGeoAtt" : 3084, - "fVolume" : { - "_typename" : "TGeoVolume", - "fUniqueID" : 0, - "fBits" : 58720256, - "fName" : "frameV", - "fTitle" : "", - "fGeoAtt" : 3084, - "fLineColor" : 17, - "fLineStyle" : 1, - "fLineWidth" : 1, - "fFillColor" : 19, - "fFillStyle" : 1001, - "fNodes" : null, - "fShape" : {"$ref":1224}, - "fMedium" : {"$ref":934}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 8, - "fNtotal" : 1, - "fRefCount" : 1 - }, - "fMother" : {"$ref":2221}, - "fNumber" : 7, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoCombiTrans", - "fUniqueID" : 0, - "fBits" : 61210624, - "fName" : "c828", - "fTitle" : "", - "fTranslation" : [-9, -6.15175, 3.71], - "fRotation" : { - "_typename" : "TGeoRotation", - "fUniqueID" : 0, - "fBits" : 52690944, - "fName" : "", - "fTitle" : "", - "fRotationMatrix" : [1, 0, 0, -0, -1, -1.22464679914735e-16, 0, 1.22464679914735e-16, -1] - } - } - }] - }, - "fShape" : { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 12.15, - "fDY" : 12.4535, - "fDZ" : 1.135, - "fOrigin" : [0, 0, 2.695], - "fVolume" : {"$ref":2221}, - "fBBoxOK" : true - }, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 3, - "fNtotal" : 33, - "fRefCount" : 17 - }, - "fMother" : {"$ref":2218}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : { - "_typename" : "TGeoTranslation", - "fUniqueID" : 0, - "fBits" : 52559872, - "fName" : "t812", - "fTitle" : "", - "fTranslation" : [0, -4.5, 0] - } - }] - }, - "fShape" : { - "_typename" : "TGeoShapeAssembly", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fShapeId" : 0, - "fShapeBits" : 1024, - "fDX" : 12.15, - "fDY" : 12.4535, - "fDZ" : 1.135, - "fOrigin" : [0, -4.5, 2.695], - "fVolume" : {"$ref":2218}, - "fBBoxOK" : true - }, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 94, - "fNtotal" : 34, - "fRefCount" : 3 - }, - "fMother" : {"$ref":1258}, - "fNumber" : 0, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":839} - }] - }, - "fShape" : {"$ref":848}, - "fMedium" : {"$ref":937}, - "fFinder" : null, - "fVoxels" : null, - "fNumber" : 1, - "fNtotal" : 413815, - "fRefCount" : 10 - }, {"$ref":1261}, {"$ref":1264}, {"$ref":1271}, {"$ref":1279}, {"$ref":1285}, {"$ref":1291}, {"$ref":1296}, {"$ref":1293}, {"$ref":1332}, {"$ref":1288}, {"$ref":1380}, {"$ref":1382}, {"$ref":1385}, {"$ref":1404}, {"$ref":1377}, {"$ref":1412}, {"$ref":1415}, {"$ref":1418}, {"$ref":1432}, {"$ref":1426}, {"$ref":1421}, {"$ref":1435}, {"$ref":1429}, {"$ref":1594}, {"$ref":1603}, {"$ref":1606}, {"$ref":1608}, {"$ref":1597}, {"$ref":1600}, {"$ref":1815}, {"$ref":943}, {"$ref":928}, {"$ref":933}, {"$ref":925}, {"$ref":940}, {"$ref":963}, {"$ref":954}, {"$ref":957}, {"$ref":951}, {"$ref":960}, {"$ref":983}, {"$ref":974}, {"$ref":977}, {"$ref":971}, {"$ref":980}, {"$ref":1013}, {"$ref":1015}, {"$ref":993}, {"$ref":996}, {"$ref":990}, {"$ref":1004}, {"$ref":1007}, {"$ref":1001}, {"$ref":1010}, {"$ref":1046}, {"$ref":1048}, {"$ref":1025}, {"$ref":1027}, {"$ref":1029}, {"$ref":1022}, {"$ref":1037}, {"$ref":1039}, {"$ref":1041}, {"$ref":1034}, {"$ref":1043}, {"$ref":1079}, {"$ref":1081}, {"$ref":1058}, {"$ref":1060}, {"$ref":1062}, {"$ref":1055}, {"$ref":1070}, {"$ref":1072}, {"$ref":1074}, {"$ref":1067}, {"$ref":1076}, {"$ref":1831}, {"$ref":1091}, {"$ref":1142}, {"$ref":1147}, {"$ref":1088}, {"$ref":1856}, {"$ref":1862}, {"$ref":1859}, {"$ref":1877}, {"$ref":1883}, {"$ref":1880}, {"$ref":1894}, {"$ref":1897}, {"$ref":1900}, {"$ref":1902}, {"$ref":1905}, {"$ref":1907}, {"$ref":2218}, {"$ref":2227}, {"$ref":2231}, {"$ref":2224}, {"$ref":2235}, {"$ref":2244}, {"$ref":2239}, {"$ref":2242}, {"$ref":2252}, {"$ref":2255}, {"$ref":2257}, {"$ref":2263}, {"$ref":2266}, {"$ref":2268}, {"$ref":2274}, {"$ref":2277}, {"$ref":2279}, {"$ref":2287}, {"$ref":2290}, {"$ref":2292}, {"$ref":2300}, {"$ref":2303}, {"$ref":2305}, {"$ref":2313}, {"$ref":2316}, {"$ref":2318}] - }, - "fPhysicalNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [] - }, - "fTracks" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [] - }, - "fPdgNames" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "d", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "d_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "u", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "u_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "s", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "s_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "c", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "c_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "b", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "b_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "t", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "t_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "b'", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "b'_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "t'", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "t'_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "e-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "e+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "nu_e", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "nu_e_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "mu-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "mu+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "nu_mu", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "nu_mu_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tau-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tau+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "nu_tau", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "nu_tau_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tau'-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "tau'+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "nu'_tau", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "nu'_tau_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "g", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "gamma", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Z0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "W+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "W-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "h0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "reggeon", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "pomeron", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Z'0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Z\"0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "W'+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "W'-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "H0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "A0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "H+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "H-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "eta_tech0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "LQ_ue", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "LQ_ue_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "R0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "R0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "pi_tech0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "pi_tech+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "pi_tech-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "pi'_tech0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "rho_tech0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "rho_tech+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "rho_tech-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "omega_tech", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "H_L++", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "H_L--", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "H_R++", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "H_R--", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "W_R+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "W_R-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "nu_Re", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "nu_Re_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "nu_Rmu", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "nu_Rmu_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "nu_Rtau", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "nu_Rtau_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "specflav", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "rndmflav", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "rndmflav_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "phasespa", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "c-hadron", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "c-hadron_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "b-hadron", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "b-hadron_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "cluster", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "string", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "indep.", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "CMshower", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "SPHEaxis", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "THRUaxis", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "CLUSjet", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "CELLjet", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "table", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "rho_diff0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "pi0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "rho0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "a_20", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "K_L0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "pi_diffr+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "pi_diffr-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "pi+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "pi-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "rho+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "rho-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "a_2+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "a_2-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "omega_di", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "eta", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "omega", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "f_2", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "K_S0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "K0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "K0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "K*0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "K*0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "K*_20", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "K*_20_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "K+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "K-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "K*+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "K*-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "K*_2+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "K*_2-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "phi_diff", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "eta'", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "phi", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "f'_2", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "D+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "D-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "D*+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "D*-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "D*_2+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "D*_2-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "D0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "D0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "D*0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "D*0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "D*_20", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "D*_20_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "D_s+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "D_s-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "D*_s+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "D*_s-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "D*_2s+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "D*_2s-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "J\/psi_di", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "eta_c", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "J\/psi", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "chi_2c", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B*0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B*0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B*_20", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B*_20_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B*+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B*-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B*_2+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B*_2-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B_s0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B_s0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B*_s0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B*_s0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B*_2s0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B*_2s0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B_c+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B_c-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B*_c+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B*_c-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B*_2c+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "B*_2c-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "eta_b", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Upsilon", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "chi_2b", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "dd_1", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "dd_1_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Delta-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Delta-_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ud_0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ud_0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ud_1", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ud_1_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "n_diffr0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "n_diffr0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "neutron", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "antineutron", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Delta0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Delta0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "uu_1", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "uu_1_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "p_diffr+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "p_diffr+_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "proton", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "antiproton", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Delta+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Delta+_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Delta++", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Delta--", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sd_0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sd_0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sd_1", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "sd_1_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma-_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma*-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma*-_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Lambda0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Lambda0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "su_0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "su_0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "su_1", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "su_1_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma*0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma*0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma+_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma*+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma*+_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ss_1", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "ss_1_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Xi-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Xi-_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Xi*-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Xi*+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Xi0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Xi0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Xi*0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Xi*0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Omega-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Omega+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "cd_0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "cd_0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "cd_1", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "cd_1_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma_c0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma_c0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma*_c0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma*_c0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Lambda_c+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Lambda_c-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Xi_c0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Xi_c0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "cu_0", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "cu_0_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "cu_1", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "cu_1_bar", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma_c+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma_c-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma*_c+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma*_c-", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma_c++", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma_c--", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma*_c++", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Sigma*_c--", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Xi_c+", - "fTitle" : "" - }, { - "_typename" : "TNamed", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "Xi_c-", - "fTitle" : "" - }] - }, - "fMaterials" : { - "_typename" : "TList", - "name" : "THashList", - "arr" : [{"$ref":938}, {"$ref":1266}, {"$ref":1273}, {"$ref":1281}, {"$ref":1144}, {"$ref":1093}, {"$ref":1149}, {"$ref":1334}, {"$ref":945}, {"$ref":1437}, {"$ref":1813}, { - "_typename" : "TGeoMaterial", - "fUniqueID" : 12, - "fBits" : 50331648, - "fName" : "VACUUM", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 11, - "fA" : 0, - "fZ" : 0, - "fDensity" : 0, - "fRadLen" : 1e30, - "fIntLen" : 1e30, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null - }, { - "_typename" : "TGeoMaterial", - "fUniqueID" : 13, - "fBits" : 50331648, - "fName" : "SILICON", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 12, - "fA" : 28.09, - "fZ" : 14, - "fDensity" : 2.33, - "fRadLen" : 9.35110551053256, - "fIntLen" : 45.753205754866, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null - }, {"$ref":930}, {"$ref":1423}, { - "_typename" : "TGeoMixture", - "fUniqueID" : 16, - "fBits" : 50331648, - "fName" : "TYVEC", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 15, - "fA" : 10.4296180316, - "fZ" : 5.281386, - "fDensity" : 0.93, - "fRadLen" : 47.5076063184073, - "fIntLen" : 72.8965033104632, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null, - "fNelements" : 2, - "fZmixture" : [6, 1], - "fAmixture" : [12.011, 1.008], - "fWeights" : [0.8562772, 0.1437228], - "fNatoms" : [], - "fVecNbOfAtomsPerVolume" : [], - "fElements" : null - }, {"$ref":965}, {"$ref":935}, { - "_typename" : "TGeoMaterial", - "fUniqueID" : 19, - "fBits" : 50331648, - "fName" : "lead", - "fTitle" : "", - "fFillColor" : 19, - "fFillStyle" : 1001, - "fIndex" : 18, - "fA" : 207.1, - "fZ" : 82, - "fDensity" : 11.34, - "fRadLen" : 0.561956031451292, - "fIntLen" : 18.2752677326212, - "fTemperature" : 273.15, - "fPressure" : 632420000, - "fState" : 0, - "fShader" : null, - "fCerenkov" : null, - "fElement" : null - }, {"$ref":1909}, {"$ref":2229}], - "opt" : ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""] - }, - "fMedia" : { - "_typename" : "TList", - "name" : "THashList", - "arr" : [{"$ref":937}, {"$ref":1265}, {"$ref":1272}, {"$ref":1280}, {"$ref":1143}, {"$ref":1092}, {"$ref":1148}, {"$ref":1333}, {"$ref":1812}, { - "_typename" : "TGeoMedium", - "fUniqueID" : 10, - "fBits" : 50331648, - "fName" : "VACUUM", - "fTitle" : "", - "fId" : 10, - "fParams" : [0, 1, 0.19, 0.25, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : {"$ref":2589} - }, {"$ref":944}, {"$ref":929}, {"$ref":1430}, {"$ref":1436}, {"$ref":1422}, { - "_typename" : "TGeoMedium", - "fUniqueID" : 16, - "fBits" : 50331648, - "fName" : "TYVEC", - "fTitle" : "", - "fId" : 16, - "fParams" : [0, 0, 0, 1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : {"$ref":2591} - }, {"$ref":964}, {"$ref":934}, { - "_typename" : "TGeoMedium", - "fUniqueID" : 19, - "fBits" : 50331648, - "fName" : "lead", - "fTitle" : "", - "fId" : 19, - "fParams" : [0, 1, 20, -1, -1, -1, 0.001, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "fMaterial" : {"$ref":2592} - }, {"$ref":1908}, {"$ref":2228}], - "opt" : ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""] - }, - "fNodes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{ - "_typename" : "TGeoNodeMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "cave_1", - "fTitle" : "Top logical node", - "fGeoAtt" : 3084, - "fVolume" : {"$ref":1258}, - "fMother" : null, - "fNumber" : 1, - "fNovlp" : 0, - "fOverlaps" : [], - "fMatrix" : {"$ref":2} - }] - }, - "fOverlaps" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [] - }, - "fRegions" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [] - }, - "fMasterVolume" : {"$ref":1258}, - "fGLMatrix" : { - "_typename" : "TGeoHMatrix", - "fUniqueID" : 0, - "fBits" : 50331648, - "fName" : "", - "fTitle" : "", - "fTranslation" : [0, 0, 0], - "fRotationMatrix" : [1, 0, 0, 0, 1, 0, 0, 0, 1], - "fScale" : [1, 1, 1] - }, - "fUniqueVolumes" : { - "_typename" : "TObjArray", - "name" : "TObjArray", - "arr" : [{"$ref":1258}, {"$ref":1258}, {"$ref":1261}, {"$ref":1264}, {"$ref":1271}, {"$ref":1279}, {"$ref":1285}, {"$ref":1291}, {"$ref":1296}, {"$ref":1293}, {"$ref":1332}, {"$ref":1288}, {"$ref":1380}, {"$ref":1382}, {"$ref":1404}, {"$ref":1377}, {"$ref":1412}, {"$ref":1415}, {"$ref":1418}, {"$ref":1432}, {"$ref":1426}, {"$ref":1421}, {"$ref":1435}, {"$ref":1429}, {"$ref":1594}, {"$ref":1603}, {"$ref":1606}, {"$ref":1608}, {"$ref":1597}, {"$ref":1600}, {"$ref":1815}, {"$ref":943}, {"$ref":928}, {"$ref":933}, {"$ref":925}, {"$ref":940}, {"$ref":963}, {"$ref":954}, {"$ref":957}, {"$ref":951}, {"$ref":960}, {"$ref":983}, {"$ref":974}, {"$ref":977}, {"$ref":971}, {"$ref":980}, {"$ref":1013}, {"$ref":1015}, {"$ref":993}, {"$ref":996}, {"$ref":990}, {"$ref":1004}, {"$ref":1007}, {"$ref":1001}, {"$ref":1010}, {"$ref":1046}, {"$ref":1048}, {"$ref":1025}, {"$ref":1027}, {"$ref":1029}, {"$ref":1022}, {"$ref":1037}, {"$ref":1039}, {"$ref":1041}, {"$ref":1034}, {"$ref":1043}, {"$ref":1079}, {"$ref":1081}, {"$ref":1058}, {"$ref":1060}, {"$ref":1062}, {"$ref":1055}, {"$ref":1070}, {"$ref":1072}, {"$ref":1074}, {"$ref":1067}, {"$ref":1076}, {"$ref":1831}, {"$ref":1091}, {"$ref":1142}, {"$ref":1147}, {"$ref":1088}, {"$ref":1856}, {"$ref":1862}, {"$ref":1859}, {"$ref":1877}, {"$ref":1883}, {"$ref":1880}, {"$ref":1894}, {"$ref":1897}, {"$ref":1900}, {"$ref":1902}, {"$ref":1905}, {"$ref":1907}, {"$ref":2218}, {"$ref":2227}, {"$ref":2231}, {"$ref":2224}, {"$ref":2235}, {"$ref":2244}, {"$ref":2239}, {"$ref":2252}, {"$ref":2263}, {"$ref":2274}, {"$ref":2287}, {"$ref":2300}, {"$ref":2313}] - }, - "fNLevel" : 100, - "fHashPNE" : { - "_typename" : "THashList", - "name" : "THashList", - "arr" : [], - "opt" : [] - }, - "fSizePNEId" : 0, - "fNPNEId" : 0, - "fKeyPNEId" : [], - "fValuePNEId" : [], - "fUsePWNav" : false, - "fParallelWorld" : null -} \ No newline at end of file diff --git a/demo/playground/src/jvmMain/resources/root/BM@N_geometry.zip b/demo/playground/src/jvmMain/resources/root/BM@N_geometry.zip new file mode 100644 index 0000000000000000000000000000000000000000..47701be0b5a9ea2751ef0e50cad6d2b13eb2445e GIT binary patch literal 84791 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 +public val CanvasControls: FunctionComponent = functionComponent("CanvasControls") { props -> flexColumn { flexRow { css { diff --git a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/reactBootstrap.kt b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/reactBootstrap.kt index dca591fe..b37637fe 100644 --- a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/reactBootstrap.kt +++ b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/reactBootstrap.kt @@ -5,7 +5,6 @@ import kotlinx.html.DIV import kotlinx.html.id import kotlinx.html.js.onClickFunction import react.RBuilder -import react.ReactElement import react.dom.* import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.NameToken @@ -16,7 +15,7 @@ import styled.styledDiv import styled.styledNav -public inline fun RBuilder.card(title: String, crossinline block: StyledDOMBuilder

.() -> Unit): ReactElement = +public inline fun RBuilder.card(title: String, crossinline block: StyledDOMBuilder
.() -> Unit): Unit = styledDiv { css { +"card" @@ -36,7 +35,7 @@ public inline fun RBuilder.card(title: String, crossinline block: StyledDOMBuild public fun RBuilder.accordion( id: String, elements: List.() -> Unit>>, -): ReactElement = styledDiv { +): Unit = styledDiv { css { +"accordion" //+"p-1" @@ -82,7 +81,7 @@ public fun RBuilder.accordion( } -public fun RBuilder.nameCrumbs(name: Name?, rootTitle: String, link: (Name) -> Unit): ReactElement = styledNav { +public fun RBuilder.nameCrumbs(name: Name?, rootTitle: String, link: (Name) -> Unit): Unit = styledNav { css { +"p-0" } @@ -127,9 +126,9 @@ public fun RSectionsBuilder.entry(title: String, builder: StyledDOMBuilder
. add(title to builder) } -public fun RBuilder.accordion(id: String, builder: RSectionsBuilder.() -> Unit): ReactElement { +public fun RBuilder.accordion(id: String, builder: RSectionsBuilder.() -> Unit): Unit { val list = ArrayList.() -> Unit>>().apply(builder) - return accordion(id, list) + accordion(id, list) } public enum class ContainerSize(public val suffix: String) { @@ -144,7 +143,7 @@ public enum class ContainerSize(public val suffix: String) { public inline fun RBuilder.container( size: ContainerSize = ContainerSize.FLUID, block: StyledDOMBuilder
.() -> Unit, -): ReactElement = styledDiv { +): Unit = styledDiv { css { classes.add("container${size.suffix}") } @@ -164,7 +163,7 @@ public inline fun RBuilder.gridColumn( weight: Int? = null, maxSize: GridMaxSize = GridMaxSize.NONE, block: StyledDOMBuilder
.() -> Unit, -): ReactElement = styledDiv { +): Unit = styledDiv { val weightSuffix = weight?.let { "-$it" } ?: "" css { classes.add("col${maxSize.suffix}$weightSuffix") @@ -174,7 +173,7 @@ public inline fun RBuilder.gridColumn( public inline fun RBuilder.gridRow( block: StyledDOMBuilder
.() -> Unit, -): ReactElement = styledDiv { +): Unit = styledDiv { css { classes.add("row") } diff --git a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/tabComponent.kt b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/tabComponent.kt index 987dbc0e..fc58fed7 100644 --- a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/tabComponent.kt +++ b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/tabComponent.kt @@ -12,22 +12,22 @@ import space.kscience.visionforge.react.flexColumn import styled.StyledDOMBuilder import styled.styledDiv -public external class TabProps : RProps { +public external interface TabProps : PropsWithChildren { public var id: String public var title: String? } @JsExport -public val Tab: FunctionComponent = functionalComponent { props -> +public val Tab: FunctionComponent = functionComponent { props -> props.children() } -public external class TabPaneProps : RProps { +public external interface TabPaneProps : PropsWithChildren { public var activeTab: String? } @JsExport -public val TabPane: FunctionComponent = functionalComponent("TabPane") { props -> +public val TabPane: FunctionComponent = functionComponent("TabPane") { props -> var activeTab: String? by useState(props.activeTab) val children: Array = Children.map(props.children) { diff --git a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/threeControls.kt b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/threeControls.kt index 95219db1..deacc025 100644 --- a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/threeControls.kt +++ b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/threeControls.kt @@ -2,8 +2,11 @@ package space.kscience.visionforge.bootstrap import kotlinx.css.* import kotlinx.css.properties.border -import react.* +import react.FunctionComponent +import react.RBuilder +import react.RProps import react.dom.h2 +import react.functionComponent import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.isEmpty import space.kscience.visionforge.Vision @@ -21,7 +24,7 @@ public external interface ThreeControlsProps : RProps { } @JsExport -public val ThreeControls: FunctionComponent = functionalComponent { props -> +public val ThreeControls: FunctionComponent = functionComponent { props -> tabPane(if (props.selected != null) "Properties" else null) { tab("Canvas") { card("Canvas configuration") { @@ -67,7 +70,7 @@ public fun RBuilder.threeControls( selected: Name?, onSelect: (Name) -> Unit = {}, builder: TabBuilder.() -> Unit = {}, -): ReactElement = child(ThreeControls) { +): Unit = child(ThreeControls) { attrs { this.canvasOptions = canvasOptions this.vision = vision diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MetaViewer.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MetaViewer.kt index 69683bc5..ed51f566 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MetaViewer.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MetaViewer.kt @@ -42,7 +42,7 @@ public external interface MetaViewerProps : RProps { public var descriptor: MetaDescriptor? } -private val MetaViewerItem: FunctionComponent = functionalComponent("MetaViewerItem") { props -> +private val MetaViewerItem: FunctionComponent = functionComponent("MetaViewerItem") { props -> metaViewerItem(props) } @@ -127,17 +127,16 @@ private fun RBuilder.metaViewerItem(props: MetaViewerProps) { } @JsExport -public val MetaViewer: FunctionComponent = - functionalComponent("MetaViewer") { props -> - child(MetaViewerItem) { - attrs { - this.key = "" - this.root = props.root - this.name = Name.EMPTY - this.descriptor = props.descriptor - } +public val MetaViewer: FunctionComponent = functionComponent("MetaViewer") { props -> + child(MetaViewerItem) { + attrs { + this.key = "" + this.root = props.root + this.name = Name.EMPTY + this.descriptor = props.descriptor } } +} public fun RBuilder.metaViewer(meta: Meta, descriptor: MetaDescriptor? = null, key: Any? = null) { child(MetaViewer) { diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt index 84181340..45a98abd 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt @@ -9,14 +9,14 @@ import react.FunctionComponent import react.dom.attrs import react.dom.option import react.dom.select -import react.functionalComponent +import react.functionComponent import space.kscience.dataforge.meta.descriptors.allowedValues import space.kscience.dataforge.values.asValue import space.kscience.dataforge.values.string @JsExport public val MultiSelectChooser: FunctionComponent = - functionalComponent("MultiSelectChooser") { props -> + functionComponent("MultiSelectChooser") { props -> val onChange: (Event) -> Unit = { event: Event -> val newSelected = (event.target as HTMLSelectElement).selectedOptions.asList() .map { (it as HTMLOptionElement).value.asValue() } diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt index 9ff77f2c..ea643813 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt @@ -48,7 +48,7 @@ public external interface PropertyEditorProps : RProps { } private val PropertyEditorItem: FunctionComponent = - functionalComponent("PropertyEditorItem") { props -> + functionComponent("PropertyEditorItem") { props -> propertyEditorItem(props) } @@ -193,7 +193,7 @@ private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { } @JsExport -public val PropertyEditor: FunctionComponent = functionalComponent("PropertyEditor") { props -> +public val PropertyEditor: FunctionComponent = functionComponent("PropertyEditor") { props -> child(PropertyEditorItem) { attrs { this.key = "" diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt index c753271f..bda76147 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt @@ -8,7 +8,7 @@ import org.w3c.dom.HTMLInputElement import org.w3c.dom.events.Event import react.FunctionComponent import react.dom.attrs -import react.functionalComponent +import react.functionComponent import react.useState import space.kscience.dataforge.meta.descriptors.ValueRequirement import space.kscience.dataforge.meta.double @@ -20,7 +20,7 @@ import styled.styledInput @JsExport public val RangeValueChooser: FunctionComponent = - functionalComponent("RangeValueChooser") { props -> + functionComponent("RangeValueChooser") { props -> var innerValue by useState(props.actual.double) var rangeDisabled: Boolean by useState(props.meta.value == null) diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt index 6be75689..b78ec7d9 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt @@ -21,7 +21,7 @@ public external interface ThreeCanvasProps : RProps { public var selected: Name? } -public val ThreeCanvasComponent: FunctionComponent = functionalComponent( +public val ThreeCanvasComponent: FunctionComponent = functionComponent( "ThreeCanvasComponent" ) { props -> val elementRef = useRef(null) diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt index d746e14a..5fa44bfd 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt @@ -28,7 +28,7 @@ public external interface ObjectTreeProps : RProps { public var clickCallback: (Name) -> Unit } -private val TreeLabel = functionalComponent { props -> +private val TreeLabel = functionComponent { props -> val token = useMemo(props.name) { props.name.lastOrNull()?.toString() ?: "World" } styledSpan { css { @@ -107,7 +107,7 @@ private fun RBuilder.visionTree(props: ObjectTreeProps): Unit { } @JsExport -public val ObjectTree: FunctionComponent = functionalComponent("ObjectTree") { props -> +public val ObjectTree: FunctionComponent = functionComponent("ObjectTree") { props -> visionTree(props) } diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/layout.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/layout.kt index e8d928f5..11a13561 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/layout.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/layout.kt @@ -6,14 +6,13 @@ import kotlinx.css.display import kotlinx.css.flexDirection import kotlinx.html.DIV import react.RBuilder -import react.ReactElement import styled.StyledDOMBuilder import styled.css import styled.styledDiv public inline fun RBuilder.flexColumn( block: StyledDOMBuilder
.() -> Unit -): ReactElement = styledDiv { +): Unit = styledDiv { css { display = Display.flex flexDirection = FlexDirection.column @@ -23,7 +22,7 @@ public inline fun RBuilder.flexColumn( public inline fun RBuilder.flexRow( block: StyledDOMBuilder
.() -> Unit -): ReactElement = styledDiv { +): Unit = styledDiv { css { display = Display.flex flexDirection = FlexDirection.row diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt index 711710f6..cd686498 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt @@ -10,9 +10,12 @@ import kotlinx.html.js.onKeyDownFunction import org.w3c.dom.HTMLInputElement import org.w3c.dom.HTMLSelectElement import org.w3c.dom.events.Event -import react.* +import react.FunctionComponent +import react.RProps import react.dom.attrs import react.dom.option +import react.functionComponent +import react.useState import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.allowedValues @@ -34,7 +37,7 @@ public external interface ValueChooserProps : RProps { @JsExport public val StringValueChooser: FunctionComponent = - functionalComponent("StringValueChooser") { props -> + functionComponent("StringValueChooser") { props -> var value by useState(props.actual.string ?: "") val keyDown: (Event) -> Unit = { event -> if (event.type == "keydown" && event.asDynamic().key == "Enter") { @@ -59,7 +62,7 @@ public val StringValueChooser: FunctionComponent = @JsExport public val BooleanValueChooser: FunctionComponent = - functionalComponent("BooleanValueChooser") { props -> + functionComponent("BooleanValueChooser") { props -> val handleChange: (Event) -> Unit = { val newValue = (it.target as HTMLInputElement).checked props.meta.value = newValue.asValue() @@ -78,7 +81,7 @@ public val BooleanValueChooser: FunctionComponent = @JsExport public val NumberValueChooser: FunctionComponent = - functionalComponent("NumberValueChooser") { props -> + functionComponent("NumberValueChooser") { props -> var innerValue by useState(props.actual.string ?: "") val keyDown: (Event) -> Unit = { event -> if (event.type == "keydown" && event.asDynamic().key == "Enter") { @@ -117,7 +120,7 @@ public val NumberValueChooser: FunctionComponent = @JsExport public val ComboValueChooser: FunctionComponent = - functionalComponent("ComboValueChooser") { props -> + functionComponent("ComboValueChooser") { props -> var selected by useState(props.actual.string ?: "") val handleChange: (Event) -> Unit = { selected = (it.target as HTMLSelectElement).value @@ -142,7 +145,7 @@ public val ComboValueChooser: FunctionComponent = @JsExport public val ColorValueChooser: FunctionComponent = - functionalComponent("ColorValueChooser") { props -> + functionComponent("ColorValueChooser") { props -> val handleChange: (Event) -> Unit = { props.meta.value = (it.target as HTMLInputElement).value.asValue() } @@ -162,7 +165,7 @@ public val ColorValueChooser: FunctionComponent = } @JsExport -public val ValueChooser: FunctionComponent = functionalComponent("ValueChooser") { props -> +public val ValueChooser: FunctionComponent = functionComponent("ValueChooser") { props -> val rawInput by useState(false) val descriptor = props.descriptor diff --git a/ui/ring/src/main/kotlin/ringui/Loader.kt b/ui/ring/src/main/kotlin/ringui/Loader.kt index c58d51c1..b7bc63a9 100644 --- a/ui/ring/src/main/kotlin/ringui/Loader.kt +++ b/ui/ring/src/main/kotlin/ringui/Loader.kt @@ -4,10 +4,11 @@ package ringui import react.ComponentClass -import react.dom.WithClassName +import react.PropsWithClassName + // https://github.com/JetBrains/ring-ui/blob/master/components/loader/loader.js -public external interface LoaderProps : WithClassName { +public external interface LoaderProps : PropsWithClassName { public var size: Number public var colors: Array public var message: String diff --git a/ui/ring/src/main/kotlin/ringui/LoaderScreen.kt b/ui/ring/src/main/kotlin/ringui/LoaderScreen.kt index 8d0bf578..d662ee2b 100644 --- a/ui/ring/src/main/kotlin/ringui/LoaderScreen.kt +++ b/ui/ring/src/main/kotlin/ringui/LoaderScreen.kt @@ -4,10 +4,10 @@ package ringui import react.ComponentClass -import react.dom.WithClassName +import react.PropsWithClassName // https://github.com/JetBrains/ring-ui/blob/master/components/loader-screen/loader-screen.js -public external interface LoaderScreenProps : WithClassName { +public external interface LoaderScreenProps : PropsWithClassName { public var containerClassName: String public var message: String } diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt index 94f02fdd..03420cba 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt @@ -43,7 +43,7 @@ public fun ThreeCanvasWithControlsProps.tab(title: String, block: RBuilder.() -> } -public fun RBuilder.nameCrumbs(name: Name?, link: (Name) -> Unit): ReactElement = styledDiv { +public fun RBuilder.nameCrumbs(name: Name?, link: (Name) -> Unit): Unit = styledDiv { div { Link { attrs { @@ -77,7 +77,7 @@ public fun RBuilder.nameCrumbs(name: Name?, link: (Name) -> Unit): ReactElement @JsExport public val ThreeCanvasWithControls: FunctionComponent = - functionalComponent("ThreeViewWithControls") { props -> + functionComponent("ThreeViewWithControls") { props -> var selected by useState { props.selected } var solid: Solid? by useState(null) diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt index 016ce4e0..46543106 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt @@ -9,9 +9,12 @@ import kotlinx.html.js.onClickFunction import org.w3c.dom.events.Event import org.w3c.files.Blob import org.w3c.files.BlobPropertyBag -import react.* +import react.FunctionComponent +import react.RBuilder +import react.RProps import react.dom.attrs import react.dom.button +import react.functionComponent import ringui.Island import ringui.SmartTabs import ringui.Tab @@ -35,8 +38,8 @@ internal fun saveData(event: Event, fileName: String, mimeType: String = "text/p fileSaver.saveAs(blob, fileName) } -internal fun RBuilder.canvasControls(options: Canvas3DOptions, vision: Vision?): ReactElement { - return child(CanvasControls) { +internal fun RBuilder.canvasControls(options: Canvas3DOptions, vision: Vision?): Unit { + child(CanvasControls) { attrs { this.options = options this.vision = vision @@ -49,7 +52,7 @@ internal external interface CanvasControlsProps : RProps { public var vision: Vision? } -internal val CanvasControls: FunctionComponent = functionalComponent("CanvasControls") { props -> +internal val CanvasControls: FunctionComponent = functionComponent("CanvasControls") { props -> flexColumn { flexRow { css { @@ -91,7 +94,7 @@ public external interface ThreeControlsProps : RProps { } @JsExport -public val ThreeControls: FunctionComponent = functionalComponent { props -> +public val ThreeControls: FunctionComponent = functionComponent { props -> SmartTabs("Tree") { props.vision?.let { Tab("Tree") { @@ -119,7 +122,7 @@ public fun RBuilder.ringThreeControls( selected: Name?, onSelect: (Name?) -> Unit = {}, additionalTabs: Map Unit>? = null -): ReactElement = child(ThreeControls) { +): Unit = child(ThreeControls) { attrs { this.canvasOptions = canvasOptions this.vision = vision From dee2cf848ca1709e053cc71ab9fef1aef3c0aeba Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 14 Sep 2021 16:30:18 +0300 Subject: [PATCH 081/109] Minor adjustment to root conversion --- .../kotlin/ru/mipt/npm/root/DObject.kt | 6 +-- .../kotlin/ru/mipt/npm/root/dRootToSolid.kt | 54 ++++++++----------- .../visionforge-gdml-jupyter/build.gradle.kts | 8 +-- settings.gradle.kts | 2 +- 4 files changed, 27 insertions(+), 43 deletions(-) diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt index 9f4d1971..5af50c3f 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/DObject.kt @@ -25,7 +25,7 @@ public class DObjectCache(private val cache: List, public val refStack: Li } } -public open class DObject(public val meta: Meta, private val refCache: DObjectCache) { +public open class DObject(public val meta: Meta, public val refCache: DObjectCache) { public val typename: String by meta.string(key = "_typename".asName()) { error("Type is not defined") @@ -85,10 +85,6 @@ public class DGeoVolume(meta: Meta, refCache: DObjectCache) : DNamed(meta, refCa public val fFillColor: Int? by meta.int() override val name: Name by lazy { Name.parse(fName.ifEmpty { "volume[${meta.hashCode().toUInt()}]" }) } - - public val numberOfChildren: Int by lazy { - fNodes.sumOf { (it.fVolume?.numberOfChildren ?: 0) + 1 } - } } public class DGeoNode(meta: Meta, refCache: DObjectCache) : DNamed(meta, refCache) { diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt index a11f1996..7c345dd4 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt @@ -17,16 +17,11 @@ private operator fun Number.times(f: Float) = toFloat() * f private fun degToRad(d: Double) = d * PI / 180.0 -private class RootToSolidContext(val prototypeHolder: PrototypeHolder, val maxLayer: Int = 3) { - val layers: MutableList = mutableListOf(0) - - val layerLimits = listOf(10_000, 25_000, 50_000, 100_000, 200_000, 400_000, 600_000) - - val bottomLayer: Int get() = layers.size - 1 - fun addLayer() { - layers.add(0) - } -} +private data class RootToSolidContext( + val prototypeHolder: PrototypeHolder, + val currentLayer: Int = 0, + val maxLayer: Int = 5 +) // converting to XYZ to Tait–Bryan angles according to https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix private fun Solid.rotate(rot: DoubleArray) { @@ -267,9 +262,6 @@ private fun SolidGroup.addShape( private fun SolidGroup.addRootNode(obj: DGeoNode, context: RootToSolidContext) { val volume = obj.fVolume ?: return addRootVolume(volume, context, obj.fName) { - if (context.bottomLayer > 0) { - this.layer = context.bottomLayer - } when (obj.typename) { "TGeoNodeMatrix" -> { val fMatrix by obj.dObject(::DGeoMatrix) @@ -285,22 +277,28 @@ private fun SolidGroup.addRootNode(obj: DGeoNode, context: RootToSolidContext) { private fun buildVolume(volume: DGeoVolume, context: RootToSolidContext): Solid? { val group = SolidGroup { - val nodesNum = volume.fNodes.size - if (nodesNum == 0) { + //set current layer + layer = context.currentLayer + val nodes = volume.fNodes + + if (nodes.isEmpty() || context.currentLayer >= context.maxLayer) { //TODO add smart filter volume.fShape?.let { shape -> addShape(shape, context) } - } - val expectedLayerSize = context.layers.last() + nodesNum - //If expected number exceeds layer limit, move everything else to the bottom layer. - if (expectedLayerSize >= context.layerLimits[context.bottomLayer]) { - context.addLayer() - println("Adding new layer. Sizes after add: ${context.layers}") - } - context.layers[context.bottomLayer] += nodesNum - volume.fNodes.forEach { node -> - addRootNode(node, context) + } else { + val newLayer = if (nodes.size <= 2) { + context.currentLayer + } else if (nodes.size > 10) { + context.currentLayer + 2 + } else { + context.currentLayer + 1 + } + val newContext = context.copy(currentLayer = newLayer) + nodes.forEach { node -> + //add children to the next layer + addRootNode(node, newContext) + } } } return if (group.isEmpty()) { @@ -321,12 +319,6 @@ private fun SolidGroup.addRootVolume( cache: Boolean = true, block: Solid.() -> Unit = {} ) { - //skip if maximum layer number is reached - if (context.bottomLayer > context.maxLayer) { - println("Maximum layer depth reached. Skipping ${volume.fName}") - return - } - val combinedName = if (volume.fName.isEmpty()) { name } else if (name == null) { diff --git a/jupyter/visionforge-gdml-jupyter/build.gradle.kts b/jupyter/visionforge-gdml-jupyter/build.gradle.kts index 6c1d7c43..c2c77516 100644 --- a/jupyter/visionforge-gdml-jupyter/build.gradle.kts +++ b/jupyter/visionforge-gdml-jupyter/build.gradle.kts @@ -51,13 +51,9 @@ kotlin { } kscience { - useJupyter() + jupyterLibrary("space.kscience.visionforge.gdml.jupyter.GdmlForJupyter") } readme { maturity = ru.mipt.npm.gradle.Maturity.EXPERIMENTAL -} - -tasks.named("processJupyterApiResources") { - libraryProducers = listOf("space.kscience.visionforge.gdml.jupyter.GdmlForJupyter") -} +} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index ad1b4aef..a6f4db0d 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -3,7 +3,7 @@ pluginManagement { val toolsVersion = "0.10.3" repositories { - mavenLocal() + //mavenLocal() maven("https://repo.kotlin.link") mavenCentral() gradlePluginPortal() From 9eb5def13c4579164a1f9c43c07259244086a689 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 28 Sep 2021 12:27:58 +0000 Subject: [PATCH 082/109] Build --- .space.kts | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .space.kts diff --git a/.space.kts b/.space.kts new file mode 100644 index 00000000..45b2ed53 --- /dev/null +++ b/.space.kts @@ -0,0 +1,4 @@ +job("Build") { + gradlew("openjdk:11", "build") +} + From b40c1d0025a010f9f5139706e3017d0c5da9cb44 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 23 Nov 2021 17:51:47 +0300 Subject: [PATCH 083/109] Update kotlin and DF --- build.gradle.kts | 4 ++-- demo/playground/src/jvmMain/kotlin/rootParser.kt | 1 - settings.gradle.kts | 2 +- .../space/kscience/visionforge/bootstrap/outputConfig.kt | 6 +++--- .../space/kscience/visionforge/bootstrap/threeControls.kt | 4 ++-- .../kotlin/space/kscience/visionforge/react/MetaViewer.kt | 2 +- .../space/kscience/visionforge/react/PropertyEditor.kt | 2 +- .../kscience/visionforge/react/ThreeCanvasComponent.kt | 2 +- .../kotlin/space/kscience/visionforge/react/VisionTree.kt | 2 +- .../kotlin/space/kscience/visionforge/react/valueChooser.kt | 4 ++-- .../ThreeViewWithControls.kt | 2 +- .../space.kscience.visionforge.ring/ringThreeControls.kt | 6 +++--- .../kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt | 1 + .../kotlin/space/kscience/visionforge/solid/Composite.kt | 2 +- 14 files changed, 20 insertions(+), 20 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 4ad95112..5c776dad 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,7 +4,7 @@ plugins { // kotlin("js") version "1.5.30" apply false } -val dataforgeVersion by extra("0.5.1") +val dataforgeVersion by extra("0.5.2-dev-2") val fxVersion by extra("11") allprojects { @@ -16,7 +16,7 @@ allprojects { } group = "space.kscience" - version = "0.2.0-dev-24" + version = "0.2.0-dev-25" } subprojects { diff --git a/demo/playground/src/jvmMain/kotlin/rootParser.kt b/demo/playground/src/jvmMain/kotlin/rootParser.kt index 80555bc5..afe8528f 100644 --- a/demo/playground/src/jvmMain/kotlin/rootParser.kt +++ b/demo/playground/src/jvmMain/kotlin/rootParser.kt @@ -40,7 +40,6 @@ fun main() { println(it) } - val solid = geo.toSolid() Paths.get("BM@N.vf.json").writeText(Solids.encodeToString(solid)) diff --git a/settings.gradle.kts b/settings.gradle.kts index a6f4db0d..4cdc6b82 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,6 +1,6 @@ pluginManagement { - val toolsVersion = "0.10.3" + val toolsVersion = "0.10.7" repositories { //mavenLocal() diff --git a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt index 7df93784..b20e2b0e 100644 --- a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt +++ b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt @@ -10,8 +10,8 @@ import org.w3c.dom.events.Event import org.w3c.files.Blob import org.w3c.files.BlobPropertyBag import react.FunctionComponent +import react.Props import react.RBuilder -import react.RProps import react.dom.attrs import react.dom.button import react.functionComponent @@ -42,7 +42,7 @@ public fun RBuilder.canvasControls(canvasOptions: Canvas3DOptions, vision: Visio } } -public external interface CanvasControlsProps : RProps { +public external interface CanvasControlsProps : Props { public var canvasOptions: Canvas3DOptions public var vision: Vision? } @@ -54,7 +54,7 @@ public val CanvasControls: FunctionComponent = functionComp border(1.px, BorderStyle.solid, Color.blue) padding(4.px) } - props.vision?.let{ vision -> + props.vision?.let { vision -> button { +"Export" attrs { diff --git a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/threeControls.kt b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/threeControls.kt index deacc025..deda16d7 100644 --- a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/threeControls.kt +++ b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/threeControls.kt @@ -3,8 +3,8 @@ package space.kscience.visionforge.bootstrap import kotlinx.css.* import kotlinx.css.properties.border import react.FunctionComponent +import react.PropsWithChildren import react.RBuilder -import react.RProps import react.dom.h2 import react.functionComponent import space.kscience.dataforge.names.Name @@ -16,7 +16,7 @@ import space.kscience.visionforge.solid.specifications.Canvas3DOptions import styled.css import styled.styledDiv -public external interface ThreeControlsProps : RProps { +public external interface ThreeControlsProps : PropsWithChildren { public var canvasOptions: Canvas3DOptions public var vision: Vision? public var selected: Name? diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MetaViewer.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MetaViewer.kt index ed51f566..7d41bde9 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MetaViewer.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MetaViewer.kt @@ -20,7 +20,7 @@ import styled.css import styled.styledDiv import styled.styledSpan -public external interface MetaViewerProps : RProps { +public external interface MetaViewerProps : Props { /** * Root meta */ diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt index ea643813..4264b77f 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt @@ -19,7 +19,7 @@ import styled.styledButton import styled.styledDiv import styled.styledSpan -public external interface PropertyEditorProps : RProps { +public external interface PropertyEditorProps : Props { /** * Root config object - always non-null diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt index b78ec7d9..319a867c 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt @@ -14,7 +14,7 @@ import space.kscience.visionforge.solid.three.ThreePlugin import styled.css import styled.styledDiv -public external interface ThreeCanvasProps : RProps { +public external interface ThreeCanvasProps : Props { public var context: Context public var options: Canvas3DOptions? public var solid: Solid? diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt index 5fa44bfd..539fa2ee 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt @@ -21,7 +21,7 @@ import styled.css import styled.styledDiv import styled.styledSpan -public external interface ObjectTreeProps : RProps { +public external interface ObjectTreeProps : Props { public var name: Name public var selected: Name? public var obj: Vision diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt index cd686498..1296d777 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt @@ -11,7 +11,7 @@ import org.w3c.dom.HTMLInputElement import org.w3c.dom.HTMLSelectElement import org.w3c.dom.events.Event import react.FunctionComponent -import react.RProps +import react.Props import react.dom.attrs import react.dom.option import react.functionComponent @@ -29,7 +29,7 @@ import styled.css import styled.styledInput import styled.styledSelect -public external interface ValueChooserProps : RProps { +public external interface ValueChooserProps : Props { public var descriptor: MetaDescriptor? public var meta: ObservableMutableMeta public var actual: Meta diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt index 03420cba..5dd44099 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt @@ -24,7 +24,7 @@ import space.kscience.visionforge.solid.specifications.Canvas3DOptions import styled.css import styled.styledDiv -public external interface ThreeCanvasWithControlsProps : RProps { +public external interface ThreeCanvasWithControlsProps : Props { public var context: Context public var builderOfSolid: Deferred public var selected: Name? diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt index 46543106..eed656e6 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt @@ -10,8 +10,8 @@ import org.w3c.dom.events.Event import org.w3c.files.Blob import org.w3c.files.BlobPropertyBag import react.FunctionComponent +import react.Props import react.RBuilder -import react.RProps import react.dom.attrs import react.dom.button import react.functionComponent @@ -47,7 +47,7 @@ internal fun RBuilder.canvasControls(options: Canvas3DOptions, vision: Vision?): } } -internal external interface CanvasControlsProps : RProps { +internal external interface CanvasControlsProps : Props { public var options: Canvas3DOptions public var vision: Vision? } @@ -85,7 +85,7 @@ internal val CanvasControls: FunctionComponent = functionCo } -public external interface ThreeControlsProps : RProps { +public external interface ThreeControlsProps : Props { public var canvasOptions: Canvas3DOptions public var vision: Vision? public var selected: Name? diff --git a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt index 2d3da074..d1b89c9e 100644 --- a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt +++ b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt @@ -339,6 +339,7 @@ private class GdmlLoader(val settings: GdmlLoaderOptions) { when (val vol: GdmlPlacement? = group.placement) { is GdmlPhysVolume -> addPhysicalVolume(root, vol) is GdmlDivisionVolume -> addDivisionVolume(root, vol) + else -> {} } } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt index ecbb4177..3c7773bc 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt @@ -65,7 +65,7 @@ public fun SolidGroup.smartComposite( val group = SolidGroup(builder) if (name == null && group.meta.isEmpty()) { //append directly to group if no properties are defined - group.children.forEach { (key, value) -> + group.children.forEach { (_, value) -> value.parent = null set(null, value) } From 6787ec85de471c343ce53f3cfc01748661c37ebe Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 24 Nov 2021 12:28:41 +0300 Subject: [PATCH 084/109] Update kotlin and DF --- build.gradle.kts | 5 ++++- .../space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt | 4 ++-- .../space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt | 5 ++--- demo/js-playground/src/main/kotlin/gravityDemo.kt | 4 ++-- demo/js-playground/src/main/kotlin/markupComponent.kt | 4 ++-- demo/js-playground/src/main/kotlin/plotlyComponent.kt | 2 +- .../jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt | 4 ++-- .../src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/sim/Pixel.kt | 2 +- .../kotlin/ru/mipt/npm/muon/monitor/sim/simulation.kt | 2 +- .../src/main/kotlin/space/kscience/visionforge/FXPlugin.kt | 4 ++-- .../space/kscience/visionforge/three/server/VisionServer.kt | 3 ++- 11 files changed, 21 insertions(+), 18 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 5c776dad..2be9327a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -39,5 +39,8 @@ apiValidation { //workaround for https://youtrack.jetbrains.com/issue/KT-48273 rootProject.plugins.withType(org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin::class.java) { - rootProject.the().versions.webpackDevServer.version = "4.0.0" + rootProject.the().versions.apply { + webpack.version = "5.64.3" + webpackDevServer.version = "4.5.0" + } } \ No newline at end of file diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt index ae8b8ac8..156fedb0 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt @@ -7,7 +7,7 @@ import kotlinx.css.* import org.w3c.files.File import org.w3c.files.FileReader import org.w3c.files.get -import react.RProps +import react.Props import react.dom.h2 import react.functionComponent import react.useMemo @@ -27,7 +27,7 @@ import space.kscience.visionforge.solid.Solids import styled.css import styled.styledDiv -external interface GDMLAppProps : RProps { +external interface GDMLAppProps : Props { var context: Context var vision: Solid? var selected: Name? diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt index dc659c7c..74246432 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt @@ -2,9 +2,8 @@ package space.kscience.visionforge.gdml.demo import kotlinx.browser.document import kotlinx.css.* -import react.child import react.dom.render -import space.kscience.dataforge.context.Global +import space.kscience.dataforge.context.Context import space.kscience.gdml.GdmlShowCase import space.kscience.visionforge.Application import space.kscience.visionforge.gdml.toVision @@ -16,7 +15,7 @@ import styled.injectGlobal private class GDMLDemoApp : Application { override fun start(state: Map) { - val context = Global.buildContext("gdml-demo"){ + val context = Context("gdml-demo"){ plugin(ThreePlugin) } diff --git a/demo/js-playground/src/main/kotlin/gravityDemo.kt b/demo/js-playground/src/main/kotlin/gravityDemo.kt index e6f2273a..b2788b23 100644 --- a/demo/js-playground/src/main/kotlin/gravityDemo.kt +++ b/demo/js-playground/src/main/kotlin/gravityDemo.kt @@ -2,7 +2,7 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import kotlinx.css.* -import react.RProps +import react.Props import react.functionComponent import space.kscience.dataforge.context.Context import space.kscience.plotly.layout @@ -16,7 +16,7 @@ import styled.css import styled.styledDiv import kotlin.math.sqrt -external interface DemoProps : RProps { +external interface DemoProps : Props { var context: Context } diff --git a/demo/js-playground/src/main/kotlin/markupComponent.kt b/demo/js-playground/src/main/kotlin/markupComponent.kt index 52696f8a..0cdb17d0 100644 --- a/demo/js-playground/src/main/kotlin/markupComponent.kt +++ b/demo/js-playground/src/main/kotlin/markupComponent.kt @@ -6,7 +6,7 @@ import org.intellij.markdown.flavours.commonmark.CommonMarkFlavourDescriptor import org.intellij.markdown.flavours.gfm.GFMFlavourDescriptor import org.w3c.dom.Element import org.w3c.dom.HTMLElement -import react.RProps +import react.Props import react.functionComponent import react.useEffect import react.useRef @@ -16,7 +16,7 @@ import space.kscience.visionforge.useProperty import styled.css import styled.styledDiv -external interface MarkupProps : RProps { +external interface MarkupProps : Props { var markup: VisionOfMarkup? } diff --git a/demo/js-playground/src/main/kotlin/plotlyComponent.kt b/demo/js-playground/src/main/kotlin/plotlyComponent.kt index fa73f298..ee896df2 100644 --- a/demo/js-playground/src/main/kotlin/plotlyComponent.kt +++ b/demo/js-playground/src/main/kotlin/plotlyComponent.kt @@ -9,7 +9,7 @@ import space.kscience.plotly.plot import styled.css import styled.styledDiv -external interface PlotlyProps : RProps { +external interface PlotlyProps : Props { var plot: Plot? } diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt index f4ea0206..30a79315 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt @@ -7,7 +7,7 @@ import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.launch import kotlinx.css.* import kotlinx.html.js.onClickFunction -import react.RProps +import react.Props import react.dom.attrs import react.dom.button import react.dom.p @@ -28,7 +28,7 @@ import styled.styledDiv import styled.styledSpan import kotlin.math.PI -external interface MMAppProps : RProps { +external interface MMAppProps : Props { var model: Model var context: Context var connection: HttpClient diff --git a/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/sim/Pixel.kt b/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/sim/Pixel.kt index 7cd54417..d62d3b0f 100644 --- a/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/sim/Pixel.kt +++ b/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/sim/Pixel.kt @@ -67,7 +67,7 @@ internal class SC1Aux(val sc: SC1, var efficiency: Double = 1.0) { UPPER_LAYER_Z -> 1 CENTRAL_LAYER_Z -> 2; LOWER_LAYER_Z -> 3; - else -> throw RuntimeException("Unknown layer"); + else -> error("Unknown layer"); } } diff --git a/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/sim/simulation.kt b/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/sim/simulation.kt index f8d45fd4..cee085bc 100644 --- a/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/sim/simulation.kt +++ b/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/sim/simulation.kt @@ -78,6 +78,6 @@ class Cos2TrackGenerator( return makeTrack(x, y, thetaCandidate, phi) } } - throw RuntimeException("Failed to generate theta from distribution") + error("Failed to generate theta from distribution") } } \ No newline at end of file diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/FXPlugin.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/FXPlugin.kt index d8210a13..c571059c 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/FXPlugin.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/FXPlugin.kt @@ -52,12 +52,12 @@ public class FXPlugin(meta: Meta = Meta.EMPTY) : AbstractPlugin(meta) { while (!FX.initialized.get()) { if (Thread.interrupted()) { - throw RuntimeException("Interrupted application start") + error("Interrupted application start") } } Platform.setImplicitExit(false) } else { - throw RuntimeException("FX Application not defined") + error("FX Application not defined") } } } diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt b/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt index 46cb2e66..b5693aa7 100644 --- a/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt +++ b/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt @@ -43,6 +43,7 @@ import java.awt.Desktop import java.net.URI import kotlin.collections.set import kotlin.time.Duration +import kotlin.time.Duration.Companion.milliseconds /** @@ -143,7 +144,7 @@ public class VisionServer internal constructor( try { withContext(visionManager.context.coroutineContext) { - vision.flowChanges(visionManager, Duration.milliseconds(updateInterval)).collect { update -> + vision.flowChanges(visionManager, updateInterval.milliseconds).collect { update -> val json = visionManager.jsonFormat.encodeToString( VisionChange.serializer(), update From a715c2660af2594d423e0701b08caf1787924699 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 24 Nov 2021 13:52:22 +0300 Subject: [PATCH 085/109] Apply fix after https://github.com/Kotlin/kotlinx.serialization/issues/1602 --- .../kotlin/space/kscience/visionforge/VisionBase.kt | 4 +--- .../space/kscience/visionforge/markup/VisionOfMarkup.kt | 4 ---- .../space/kscience/visionforge/plotly/VisionOfPlotly.kt | 3 --- .../kotlin/space/kscience/visionforge/solid/SolidBase.kt | 4 ---- .../kotlin/space/kscience/visionforge/solid/SolidGroup.kt | 4 ---- .../kotlin/space/kscience/visionforge/solid/SolidReference.kt | 3 --- 6 files changed, 1 insertion(+), 21 deletions(-) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt index dce9bbd5..e7865a24 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt @@ -29,11 +29,9 @@ internal data class MetaListener( @SerialName("vision") public open class VisionBase( @Transient override var parent: VisionGroup? = null, + protected var properties: MutableMeta? = null ) : Vision { - @Transient - protected open var properties: MutableMeta? = null - @Synchronized protected fun getOrCreateProperties(): MutableMeta { if (properties == null) { diff --git a/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt b/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt index a5ec3fa0..87682978 100644 --- a/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt +++ b/visionforge-markdown/src/commonMain/kotlin/space/kscience/visionforge/markup/VisionOfMarkup.kt @@ -5,7 +5,6 @@ import kotlinx.serialization.Serializable import kotlinx.serialization.modules.SerializersModule import kotlinx.serialization.modules.polymorphic import kotlinx.serialization.modules.subclass -import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.meta.string import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName @@ -18,9 +17,6 @@ public class VisionOfMarkup( public val format: String = COMMONMARK_FORMAT ) : VisionBase() { - //FIXME to be removed after https://github.com/Kotlin/kotlinx.serialization/issues/1602 fix - protected override var properties: MutableMeta? = null - //TODO add templates public var content: String? by meta.string(CONTENT_PROPERTY_KEY) diff --git a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt index 99df2e84..1b20b95f 100644 --- a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt +++ b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt @@ -2,7 +2,6 @@ package space.kscience.visionforge.plotly import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.misc.DFExperimental import space.kscience.plotly.Plot import space.kscience.plotly.Plotly @@ -12,8 +11,6 @@ import space.kscience.visionforge.html.VisionOutput @Serializable @SerialName("vision.plotly") public class VisionOfPlotly private constructor() : VisionBase() { - //FIXME to be removed after https://github.com/Kotlin/kotlinx.serialization/issues/1602 fix - override var properties: MutableMeta? = null public constructor(plot: Plot) : this() { properties = plot.meta diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidBase.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidBase.kt index 021079d3..70e2501e 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidBase.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidBase.kt @@ -2,15 +2,11 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.visionforge.VisionBase @Serializable @SerialName("solid") public open class SolidBase : VisionBase(), Solid { - //FIXME to be removed after https://github.com/Kotlin/kotlinx.serialization/issues/1602 fix - override var properties: MutableMeta? = null - override val descriptor: MetaDescriptor get() = Solid.descriptor } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt index 604aac01..b3e8ccd8 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt @@ -2,7 +2,6 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.NameToken @@ -32,9 +31,6 @@ public interface PrototypeHolder { @SerialName("group.solid") public class SolidGroup : VisionGroupBase(), Solid, PrototypeHolder { - //FIXME to be removed after https://github.com/Kotlin/kotlinx.serialization/issues/1602 fix - override var properties: MutableMeta? = null - override val children: Map get() = super.childrenInternal.filter { it.key != PROTOTYPES_TOKEN } private var prototypes: MutableVisionGroup? diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt index eeab05ff..04c54907 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt @@ -2,7 +2,6 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.meta.ObservableMutableMeta import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.get @@ -62,8 +61,6 @@ public class SolidReferenceGroup( public val refName: Name, ) : VisionBase(), SolidReference, VisionGroup, Solid { - override var properties: MutableMeta? = null - /** * Recursively search for defined template in the parent */ From 8d74bc55d1442e7e3898a3c6d1e5bbf717d030d0 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 24 Nov 2021 14:30:43 +0300 Subject: [PATCH 086/109] fix DF version --- build.gradle.kts | 2 +- .../jsMain/kotlin/space/kscience/visionforge/VisionClient.kt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 2be9327a..551ef7df 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,7 +4,7 @@ plugins { // kotlin("js") version "1.5.30" apply false } -val dataforgeVersion by extra("0.5.2-dev-2") +val dataforgeVersion by extra("0.5.2-dev-3") val fxVersion by extra("11") allprojects { diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt index 017c615d..7c118233 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt @@ -17,7 +17,7 @@ import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_ENDPOI import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_FETCH_ATTRIBUTE import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_NAME_ATTRIBUTE import kotlin.reflect.KClass -import kotlin.time.Duration +import kotlin.time.Duration.Companion.milliseconds public class VisionClient : AbstractPlugin() { override val tag: PluginTag get() = Companion.tag @@ -105,7 +105,7 @@ public class VisionClient : AbstractPlugin() { onopen = { feedbackJob = vision.flowChanges( visionManager, - Duration.Companion.milliseconds(300) + 300.milliseconds ).onEach { change -> send(visionManager.encodeToString(change)) }.launchIn(visionManager.context) From e7f0e1e4fcacf214f885d16d51389c4be7f73673 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 30 Nov 2021 21:27:08 +0300 Subject: [PATCH 087/109] Workarround serialization bug --- build.gradle.kts | 4 +-- .../main/kotlin/ru/mipt/npm/sat/satServer.kt | 4 +-- gradle.properties | 5 +++- gradle/wrapper/gradle-wrapper.properties | 2 +- .../space/kscience/visionforge/VisionBase.kt | 4 +-- .../kscience/visionforge/VisionGroupBase.kt | 25 +++++++++---------- .../kscience/visionforge/VisionManager.kt | 3 +++ .../kscience/visionforge/html/HtmlTagTest.kt | 3 +-- .../kscience/visionforge/VisionClient.kt | 2 ++ .../visionforge/plotly/VisionOfPlotly.kt | 1 + .../visionforge/three/server/VisionServer.kt | 3 ++- 11 files changed, 32 insertions(+), 24 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 551ef7df..62f608e4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,7 +4,7 @@ plugins { // kotlin("js") version "1.5.30" apply false } -val dataforgeVersion by extra("0.5.2-dev-3") +val dataforgeVersion by extra("0.5.2") val fxVersion by extra("11") allprojects { @@ -16,7 +16,7 @@ allprojects { } group = "space.kscience" - version = "0.2.0-dev-25" + version = "0.2.0" } subprojects { diff --git a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt index 8b286e07..3a360ce7 100644 --- a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt +++ b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt @@ -7,7 +7,7 @@ import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import kotlinx.html.div import kotlinx.html.h1 -import space.kscience.dataforge.context.Global +import space.kscience.dataforge.context.Context import space.kscience.dataforge.names.Name import space.kscience.visionforge.solid.* import space.kscience.visionforge.three.server.* @@ -15,7 +15,7 @@ import space.kscience.visionforge.visionManager import kotlin.random.Random fun main() { - val satContext = Global.buildContext ("sat") { + val satContext = Context("sat") { plugin(Solids) } diff --git a/gradle.properties b/gradle.properties index 0443442f..41982482 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,4 +4,7 @@ kotlin.mpp.stability.nowarn=true kotlin.jupyter.add.scanner=false org.gradle.jvmargs=-XX:MaxMetaspaceSize=1G -org.gradle.parallel=true \ No newline at end of file +org.gradle.parallel=true + +publishing.github=false +publishing.sonatype=false \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ffed3a25..e750102e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt index e7865a24..6e2e95d0 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt @@ -1,5 +1,6 @@ package space.kscience.visionforge +import kotlinx.serialization.EncodeDefault import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.Transient @@ -29,7 +30,7 @@ internal data class MetaListener( @SerialName("vision") public open class VisionBase( @Transient override var parent: VisionGroup? = null, - protected var properties: MutableMeta? = null + @EncodeDefault protected var properties: MutableMeta? = null, ) : Vision { @Synchronized @@ -131,7 +132,6 @@ public open class VisionBase( override val descriptor: MetaDescriptor? get() = null - override fun invalidateProperty(propertyName: Name) { if (propertyName == STYLE_KEY) { styles.mapNotNull { getStyle(it) }.asSequence() diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt index d4af712d..e8594df2 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt @@ -1,5 +1,6 @@ package space.kscience.visionforge +import kotlinx.serialization.EncodeDefault import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.Transient @@ -16,7 +17,7 @@ private class StructureChangeListener(val owner: Any?, val callback: VisionGroup @Serializable @SerialName("vision.group") public open class VisionGroupBase( - @SerialName("children") protected val childrenInternal: MutableMap = LinkedHashMap(), + @EncodeDefault @SerialName("children") protected val childrenInternal: MutableMap = LinkedHashMap(), ) : VisionBase(), MutableVisionGroup { /** @@ -102,21 +103,19 @@ public open class VisionGroupBase( /** * Recursively create a child group */ - private fun createGroups(name: Name): VisionGroupBase { - return when { - name.isEmpty() -> error("Should be unreachable") - name.length == 1 -> { - val token = name.tokens.first() - when (val current = children[token]) { - null -> createGroup().also { child -> - attachChild(token, child) - } - is VisionGroupBase -> current - else -> error("Can't create group with name $name because it exists and not a group") + private fun createGroups(name: Name): VisionGroupBase = when { + name.isEmpty() -> error("Should be unreachable") + name.length == 1 -> { + val token = name.tokens.first() + when (val current = children[token]) { + null -> createGroup().also { child -> + attachChild(token, child) } + is VisionGroupBase -> current + else -> error("Can't create group with name $name because it exists and not a group") } - else -> createGroups(name.tokens.first().asName()).createGroups(name.cutFirst()) } + else -> createGroups(name.tokens.first().asName()).createGroups(name.cutFirst()) } /** diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt index 3f9bfaa8..ff4c29e1 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt @@ -1,5 +1,6 @@ package space.kscience.visionforge +import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.PolymorphicSerializer import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonElement @@ -68,12 +69,14 @@ public class VisionManager(meta: Meta) : AbstractPlugin(meta) { } } + @OptIn(ExperimentalSerializationApi::class) public val defaultJson: Json = Json { serializersModule = defaultSerialModule prettyPrint = true useArrayPolymorphism = false encodeDefaults = false ignoreUnknownKeys = true + explicitNulls = false } internal val visionSerializer: PolymorphicSerializer = PolymorphicSerializer(Vision::class) diff --git a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt index 3572dd42..d6cd8dd1 100644 --- a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt +++ b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt @@ -37,8 +37,7 @@ fun FlowContent.renderVisionFragment( @DFExperimental class HtmlTagTest { - fun VisionOutput.base(block: VisionBase.() -> Unit) = - VisionBase().apply(block) + fun VisionOutput.base(block: VisionBase.() -> Unit) = VisionBase().apply(block) val fragment: HtmlVisionFragment = { div { diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt index 7c118233..63f9a882 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt @@ -18,6 +18,7 @@ import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_FETCH_ import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_NAME_ATTRIBUTE import kotlin.reflect.KClass import kotlin.time.Duration.Companion.milliseconds +import kotlin.time.ExperimentalTime public class VisionClient : AbstractPlugin() { override val tag: PluginTag get() = Companion.tag @@ -56,6 +57,7 @@ public class VisionClient : AbstractPlugin() { private fun Element.getFlag(attribute: String): Boolean = attributes[attribute]?.value != null + @OptIn(ExperimentalTime::class) private fun renderVision(name: String, element: Element, vision: Vision?, outputMeta: Meta) { if (vision != null) { val renderer = findRendererFor(vision) ?: error("Could nof find renderer for $vision") diff --git a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt index 1b20b95f..eaa94573 100644 --- a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt +++ b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt @@ -15,6 +15,7 @@ public class VisionOfPlotly private constructor() : VisionBase() { public constructor(plot: Plot) : this() { properties = plot.meta } + public val plot: Plot get() = Plot(meta) } diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt b/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt index b5693aa7..0018ab83 100644 --- a/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt +++ b/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt @@ -44,6 +44,7 @@ import java.net.URI import kotlin.collections.set import kotlin.time.Duration import kotlin.time.Duration.Companion.milliseconds +import kotlin.time.ExperimentalTime /** @@ -121,7 +122,7 @@ public class VisionServer internal constructor( /** * Server a map of visions without providing explicit html page for them */ - @OptIn(DFExperimental::class) + @OptIn(DFExperimental::class, ExperimentalTime::class) public fun serveVisions(route: Route, visions: Map): Unit = route { application.log.info("Serving visions $visions at $route") From 3caa22f8bf0bad62ea9d2b123e4f60a1b89eeaf1 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Mon, 6 Dec 2021 22:45:24 +0300 Subject: [PATCH 088/109] [WIP] Moving renderers to a common API --- .../visionforge-jupyter-base/build.gradle.kts | 25 ++++++ .../src/jvmMain/kotlin/JupyterPluginBase.kt | 84 +++++++++++++++++++ .../build.gradle.kts | 0 .../src/jsMain/kotlin/gdmlJupyter.kt | 0 .../src/jvmMain/kotlin/GdmlForJupyter.kt | 2 +- .../webpack.config.d/01.ring.js | 0 settings.gradle.kts | 16 +++- .../visionforge/html/HtmlVisionRenderer.kt | 44 +++++++--- .../visionforge/html/VisionTagConsumer.kt | 2 + .../kscience/visionforge/VisionClient.kt | 8 +- .../visionforge/three/server/VisionServer.kt | 67 +++++++-------- 11 files changed, 195 insertions(+), 53 deletions(-) create mode 100644 jupyter/visionforge-jupyter-base/build.gradle.kts create mode 100644 jupyter/visionforge-jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt rename jupyter/{visionforge-gdml-jupyter => visionforge-jupyter-gdml}/build.gradle.kts (100%) rename jupyter/{visionforge-gdml-jupyter => visionforge-jupyter-gdml}/src/jsMain/kotlin/gdmlJupyter.kt (100%) rename jupyter/{visionforge-gdml-jupyter => visionforge-jupyter-gdml}/src/jvmMain/kotlin/GdmlForJupyter.kt (98%) rename jupyter/{visionforge-gdml-jupyter => visionforge-jupyter-gdml}/webpack.config.d/01.ring.js (100%) diff --git a/jupyter/visionforge-jupyter-base/build.gradle.kts b/jupyter/visionforge-jupyter-base/build.gradle.kts new file mode 100644 index 00000000..3e5f671d --- /dev/null +++ b/jupyter/visionforge-jupyter-base/build.gradle.kts @@ -0,0 +1,25 @@ +plugins { + id("ru.mipt.npm.gradle.mpp") + id("org.jetbrains.kotlin.jupyter.api") +} + +description = "Common visionforge jupyter module" + +kotlin { + sourceSets { + commonMain{ + dependencies{ + api(projects.visionforge.visionforgeCore) + } + } + jvmMain { + dependencies { + implementation(project(":visionforge-server")) + } + } + } +} + +readme { + maturity = ru.mipt.npm.gradle.Maturity.EXPERIMENTAL +} \ No newline at end of file diff --git a/jupyter/visionforge-jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt b/jupyter/visionforge-jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt new file mode 100644 index 00000000..f912a88f --- /dev/null +++ b/jupyter/visionforge-jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt @@ -0,0 +1,84 @@ +package space.kscience.visionforge.jupyter + +import io.ktor.server.cio.CIO +import io.ktor.server.engine.ApplicationEngine +import io.ktor.server.engine.embeddedServer +import kotlinx.html.stream.createHTML +import org.jetbrains.kotlinx.jupyter.api.HTML +import org.jetbrains.kotlinx.jupyter.api.libraries.JupyterIntegration +import org.jetbrains.kotlinx.jupyter.api.libraries.resources +import space.kscience.dataforge.context.Context +import space.kscience.dataforge.context.ContextAware +import space.kscience.dataforge.meta.get +import space.kscience.dataforge.meta.int +import space.kscience.dataforge.meta.string +import space.kscience.dataforge.misc.DFExperimental +import space.kscience.visionforge.Vision +import space.kscience.visionforge.html.HtmlVisionFragment +import space.kscience.visionforge.html.Page +import space.kscience.visionforge.html.embedAndRenderVisionFragment +import space.kscience.visionforge.three.server.VisionServer +import space.kscience.visionforge.three.server.visionServer +import space.kscience.visionforge.visionManager + +private const val DEFAULT_VISIONFORGE_PORT = 88898 + +@DFExperimental +public abstract class JupyterPluginBase( + override val context: Context, +) : JupyterIntegration(), ContextAware { + + private var counter = 0 + + private fun produceHtmlVisionString(fragment: HtmlVisionFragment) = createHTML().apply { + embedAndRenderVisionFragment(context.visionManager, counter++, fragment = fragment) + }.finalize() + + private var engine: ApplicationEngine? = null + private var server: VisionServer? = null + + override fun Builder.onLoaded() { + + onLoaded { + val host = context.properties["visionforge.host"].string ?: "localhost" + val port = context.properties["visionforge.port"].int ?: DEFAULT_VISIONFORGE_PORT + engine = context.embeddedServer(CIO, port, host) { + server = visionServer(context) + }.start() + } + + onShutdown { + engine?.stop(1000, 1000) + engine = null + server = null + } + + resources { + js("three") { + classPath("js/gdml-jupyter.js") + } + } + + import( + "kotlinx.html.*", + "space.kscience.visionforge.html.Page", + "space.kscience.visionforge.html.page", + ) + + render { vision -> + val server = this@JupyterPluginBase.server + if (server == null) { + HTML(produceHtmlVisionString { vision(vision) }) + } else { + val route = "route.${counter++}" + HTML(server.createHtmlAndServe(route,route, emptyList()){ + vision(vision) + }) + } + } + + render { page -> + //HTML(page.render(createHTML()), true) + } + } +} diff --git a/jupyter/visionforge-gdml-jupyter/build.gradle.kts b/jupyter/visionforge-jupyter-gdml/build.gradle.kts similarity index 100% rename from jupyter/visionforge-gdml-jupyter/build.gradle.kts rename to jupyter/visionforge-jupyter-gdml/build.gradle.kts diff --git a/jupyter/visionforge-gdml-jupyter/src/jsMain/kotlin/gdmlJupyter.kt b/jupyter/visionforge-jupyter-gdml/src/jsMain/kotlin/gdmlJupyter.kt similarity index 100% rename from jupyter/visionforge-gdml-jupyter/src/jsMain/kotlin/gdmlJupyter.kt rename to jupyter/visionforge-jupyter-gdml/src/jsMain/kotlin/gdmlJupyter.kt diff --git a/jupyter/visionforge-gdml-jupyter/src/jvmMain/kotlin/GdmlForJupyter.kt b/jupyter/visionforge-jupyter-gdml/src/jvmMain/kotlin/GdmlForJupyter.kt similarity index 98% rename from jupyter/visionforge-gdml-jupyter/src/jvmMain/kotlin/GdmlForJupyter.kt rename to jupyter/visionforge-jupyter-gdml/src/jvmMain/kotlin/GdmlForJupyter.kt index ce32f012..2aa1873b 100644 --- a/jupyter/visionforge-gdml-jupyter/src/jvmMain/kotlin/GdmlForJupyter.kt +++ b/jupyter/visionforge-jupyter-gdml/src/jvmMain/kotlin/GdmlForJupyter.kt @@ -25,7 +25,7 @@ internal class GdmlForJupyter : JupyterIntegration() { private var counter = 0 private fun produceHtmlVisionString(fragment: HtmlVisionFragment) = createHTML().apply { - embedAndRenderVisionFragment(context.visionManager, counter++, fragment) + embedAndRenderVisionFragment(context.visionManager, counter++, fragment = fragment) }.finalize() override fun Builder.onLoaded() { diff --git a/jupyter/visionforge-gdml-jupyter/webpack.config.d/01.ring.js b/jupyter/visionforge-jupyter-gdml/webpack.config.d/01.ring.js similarity index 100% rename from jupyter/visionforge-gdml-jupyter/webpack.config.d/01.ring.js rename to jupyter/visionforge-jupyter-gdml/webpack.config.d/01.ring.js diff --git a/settings.gradle.kts b/settings.gradle.kts index 4cdc6b82..088b448f 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -22,6 +22,19 @@ rootProject.name = "visionforge" enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") enableFeaturePreview("VERSION_CATALOGS") +dependencyResolutionManagement { + repositories { + maven("https://repo.kotlin.link") + mavenCentral() + } + + versionCatalogs { + create("npmlibs") { + from("ru.mipt.npm:version-catalog:0.10.7") + } + } +} + include( // ":ui", ":ui:react", @@ -46,5 +59,6 @@ include( ":demo:jupyter-playground", ":demo:plotly-fx", ":demo:js-playground", - ":jupyter:visionforge-gdml-jupyter" + ":jupyter:visionforge-jupyter-base", + ":jupyter:visionforge-jupyter-gdml" ) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt index e45e4f08..7bfe5012 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt @@ -7,9 +7,11 @@ import space.kscience.dataforge.names.Name import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionManager - public fun TagConsumer<*>.embedVisionFragment( manager: VisionManager, + embedData: Boolean = true, + fetchData: String? = null, + fetchUpdates: String? = null, idPrefix: String? = null, fragment: HtmlVisionFragment, ): Map { @@ -17,11 +19,23 @@ public fun TagConsumer<*>.embedVisionFragment( val consumer = object : VisionTagConsumer(this@embedVisionFragment, manager, idPrefix) { override fun DIV.renderVision(name: Name, vision: Vision, outputMeta: Meta) { visionMap[name] = vision - script { - type = "text/json" - attributes["class"] = OUTPUT_DATA_CLASS - unsafe { - +"\n${manager.encodeToString(vision)}\n" + // Toggle update mode + + fetchUpdates?.let { + attributes[OUTPUT_CONNECT_ATTRIBUTE] = it + } + + fetchData?.let { + attributes[OUTPUT_FETCH_ATTRIBUTE] = it + } + + if (embedData) { + script { + type = "text/json" + attributes["class"] = OUTPUT_DATA_CLASS + unsafe { + +"\n${manager.encodeToString(vision)}\n" + } } } } @@ -32,19 +46,29 @@ public fun TagConsumer<*>.embedVisionFragment( public fun FlowContent.embedVisionFragment( manager: VisionManager, + embedData: Boolean = true, + fetchDataUrl: String? = null, + fetchUpdatesUrl: String? = null, idPrefix: String? = null, fragment: HtmlVisionFragment, -): Map = consumer.embedVisionFragment(manager, idPrefix, fragment) +): Map = consumer.embedVisionFragment(manager, embedData, fetchDataUrl, fetchUpdatesUrl, idPrefix, fragment) internal const val RENDER_FUNCTION_NAME = "renderAllVisionsById" -@DFExperimental -public fun TagConsumer<*>.embedAndRenderVisionFragment(manager: VisionManager, id: Any, fragment: HtmlVisionFragment) { +public fun TagConsumer<*>.embedAndRenderVisionFragment( + manager: VisionManager, + id: Any, + embedData: Boolean = true, + fetchData: String? = null, + fetchUpdates: String? = null, + idPrefix: String? = null, + fragment: HtmlVisionFragment, +) { div { div { this.id = id.toString() - embedVisionFragment(manager, fragment = fragment) + embedVisionFragment(manager, embedData, fetchData, fetchUpdates, idPrefix, fragment) } script { type = "text/javascript" diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt index 035b6a6e..27725721 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt @@ -126,6 +126,8 @@ public abstract class VisionTagConsumer( public const val OUTPUT_ENDPOINT_ATTRIBUTE: String = "data-output-endpoint" public const val DEFAULT_ENDPOINT: String = "." + public const val AUTO_DATA_ATTRIBUTE: String = "@auto" + public const val DEFAULT_VISION_NAME: String = "vision" } } \ No newline at end of file diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt index 63f9a882..60f7a627 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt @@ -18,7 +18,6 @@ import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_FETCH_ import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_NAME_ATTRIBUTE import kotlin.reflect.KClass import kotlin.time.Duration.Companion.milliseconds -import kotlin.time.ExperimentalTime public class VisionClient : AbstractPlugin() { override val tag: PluginTag get() = Companion.tag @@ -27,7 +26,7 @@ public class VisionClient : AbstractPlugin() { //private val visionMap = HashMap() /** - * Up-going tree traversal in search for endpoint attribute + * Up-going tree traversal in search for endpoint attribute. If element is null, return window URL */ private fun resolveEndpoint(element: Element?): String { if (element == null) return window.location.href @@ -57,14 +56,13 @@ public class VisionClient : AbstractPlugin() { private fun Element.getFlag(attribute: String): Boolean = attributes[attribute]?.value != null - @OptIn(ExperimentalTime::class) private fun renderVision(name: String, element: Element, vision: Vision?, outputMeta: Meta) { if (vision != null) { val renderer = findRendererFor(vision) ?: error("Could nof find renderer for $vision") renderer.render(element, vision, outputMeta) element.attributes[OUTPUT_CONNECT_ATTRIBUTE]?.let { attr -> - val wsUrl = if (attr.value.isBlank() || attr.value == "auto") { + val wsUrl = if (attr.value.isBlank() || attr.value == VisionTagConsumer.AUTO_DATA_ATTRIBUTE) { val endpoint = resolveEndpoint(element) logger.info { "Vision server is resolved to $endpoint" } URL(endpoint).apply { @@ -154,7 +152,7 @@ public class VisionClient : AbstractPlugin() { element.attributes[OUTPUT_FETCH_ATTRIBUTE] != null -> { val attr = element.attributes[OUTPUT_FETCH_ATTRIBUTE]!! - val fetchUrl = if (attr.value.isBlank() || attr.value == "auto") { + val fetchUrl = if (attr.value.isBlank() || attr.value == VisionTagConsumer.AUTO_DATA_ATTRIBUTE) { val endpoint = resolveEndpoint(element) logger.info { "Vision server is resolved to $endpoint" } URL(endpoint).apply { diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt b/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt index 0018ab83..61c3fd84 100644 --- a/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt +++ b/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt @@ -34,10 +34,7 @@ import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionChange import space.kscience.visionforge.VisionManager import space.kscience.visionforge.flowChanges -import space.kscience.visionforge.html.HtmlFragment -import space.kscience.visionforge.html.HtmlVisionFragment -import space.kscience.visionforge.html.VisionTagConsumer -import space.kscience.visionforge.html.fragment +import space.kscience.visionforge.html.* import space.kscience.visionforge.three.server.VisionServer.Companion.DEFAULT_PAGE import java.awt.Desktop import java.net.URI @@ -71,36 +68,12 @@ public class VisionServer internal constructor( globalHeaders.add(block) } - private fun HTML.buildPage( - visionFragment: HtmlVisionFragment, + private fun HTML.visionPage( title: String, headers: List, + visionFragment: HtmlVisionFragment, ): Map { - val visionMap = HashMap() - - val consumer = object : VisionTagConsumer(consumer, visionManager) { - override fun DIV.renderVision(name: Name, vision: Vision, outputMeta: Meta) { - visionMap[name] = vision - // Toggle update mode - if (dataConnect) { - attributes[OUTPUT_CONNECT_ATTRIBUTE] = "auto" - } - - if (dataFetch) { - attributes[OUTPUT_FETCH_ATTRIBUTE] = "auto" - } - - if (dataEmbed) { - script { - type = "text/json" - attributes["class"] = OUTPUT_DATA_CLASS - unsafe { - +"\n${visionManager.encodeToString(vision)}\n" - } - } - } - } - } + var visionMap: Map? = null head { meta { @@ -113,16 +86,22 @@ public class VisionServer internal constructor( } body { //Load the fragment and remember all loaded visions - visionFragment(consumer) + visionMap = embedVisionFragment( + manager = visionManager, + embedData = true, + fetchDataUrl = VisionTagConsumer.AUTO_DATA_ATTRIBUTE, + fetchUpdatesUrl = VisionTagConsumer.AUTO_DATA_ATTRIBUTE, + fragment = visionFragment + ) } - return visionMap + return visionMap!! } /** * Server a map of visions without providing explicit html page for them */ - @OptIn(DFExperimental::class, ExperimentalTime::class) + @OptIn(DFExperimental::class) public fun serveVisions(route: Route, visions: Map): Unit = route { application.log.info("Serving visions $visions at $route") @@ -175,6 +154,22 @@ public class VisionServer internal constructor( } } + /** + * Create a static html page and serve visions produced in the process + */ + @DFExperimental + public fun createHtmlAndServe(route: String, title: String, headers: List, visionFragment: HtmlVisionFragment): String{ + val htmlString = createHTML().apply { + html { + visionPage(title, headers, visionFragment).also { + serveVisions(route, it) + } + } + }.finalize() + + return htmlString + } + /** * Serv visions in a given [route] without providing a page template */ @@ -203,7 +198,7 @@ public class VisionServer internal constructor( val cachedHtml: String? = if (cacheFragments) { //Create and cache page html and map of visions createHTML(true).html { - visions.putAll(buildPage(visionFragment, title, headers)) + visions.putAll(visionPage(title, headers, visionFragment)) } } else { null @@ -219,7 +214,7 @@ public class VisionServer internal constructor( //re-create html and vision list on each call call.respondHtml { visions.clear() - visions.putAll(buildPage(visionFragment, title, headers)) + visions.putAll(visionPage(title, headers, visionFragment)) } } else { //Use cached html From b5fdc6c4fee7a39b84afbdabbdce1c96e7d8e91c Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 29 Dec 2021 13:17:57 +0300 Subject: [PATCH 089/109] Update to tools 0.10.9 --- demo/muon-monitor/build.gradle.kts | 12 +- gradle.properties | 4 +- settings.gradle.kts | 7 +- .../visionforge/react/MultiSelectChooser.kt | 43 ++-- .../visionforge/react/PropertyEditor.kt | 13 +- .../visionforge/react/RangeValueChooser.kt | 97 ++++---- .../visionforge/react/ThreeCanvasComponent.kt | 6 +- .../kscience/visionforge/react/VisionTree.kt | 6 +- .../visionforge/react/valueChooser.kt | 213 +++++++++--------- visionforge-core/build.gradle.kts | 4 +- .../visionforge/editor/ValueChooser.kt | 46 ++-- .../kscience/visionforge/solid/geometry.kt | 2 +- 12 files changed, 223 insertions(+), 230 deletions(-) diff --git a/demo/muon-monitor/build.gradle.kts b/demo/muon-monitor/build.gradle.kts index a7bf2709..0ef8f166 100644 --- a/demo/muon-monitor/build.gradle.kts +++ b/demo/muon-monitor/build.gradle.kts @@ -5,7 +5,7 @@ plugins { group = "ru.mipt.npm" -val ktorVersion: String = ru.mipt.npm.gradle.KScienceVersions.ktorVersion +val ktorVersion: String = npmlibs.versions.ktor.get() kscience { useCoroutines() @@ -45,17 +45,17 @@ kotlin { jvmMain { dependencies { implementation("org.apache.commons:commons-math3:3.6.1") - implementation("io.ktor:ktor-server-cio:$ktorVersion") - implementation("io.ktor:ktor-serialization:$ktorVersion") + implementation(npmlibs.ktor.server.cio) + implementation(npmlibs.ktor.serialization) } } jsMain { dependencies { implementation(project(":ui:ring")) - implementation("io.ktor:ktor-client-js:$ktorVersion") - implementation("io.ktor:ktor-client-serialization:$ktorVersion") + implementation(npmlibs.ktor.client.js) + implementation(npmlibs.ktor.client.serialization) implementation(project(":visionforge-threejs")) - implementation(devNpm("webpack-bundle-analyzer", "4.4.0")) + //implementation(devNpm("webpack-bundle-analyzer", "4.4.0")) } } } diff --git a/gradle.properties b/gradle.properties index 41982482..fbaacb05 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,4 +7,6 @@ org.gradle.jvmargs=-XX:MaxMetaspaceSize=1G org.gradle.parallel=true publishing.github=false -publishing.sonatype=false \ No newline at end of file +publishing.sonatype=false + +toolsVersion=0.10.9-kotlin-1.6.10 \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 088b448f..fb02e336 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,6 +1,6 @@ pluginManagement { - val toolsVersion = "0.10.7" + val toolsVersion: String by extra repositories { //mavenLocal() @@ -23,6 +23,9 @@ enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") enableFeaturePreview("VERSION_CATALOGS") dependencyResolutionManagement { + + val toolsVersion: String by extra + repositories { maven("https://repo.kotlin.link") mavenCentral() @@ -30,7 +33,7 @@ dependencyResolutionManagement { versionCatalogs { create("npmlibs") { - from("ru.mipt.npm:version-catalog:0.10.7") + from("ru.mipt.npm:version-catalog:$toolsVersion") } } } diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt index 45a98abd..f3c81a57 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt @@ -5,35 +5,34 @@ import org.w3c.dom.HTMLOptionElement import org.w3c.dom.HTMLSelectElement import org.w3c.dom.asList import org.w3c.dom.events.Event -import react.FunctionComponent +import react.FC import react.dom.attrs import react.dom.option import react.dom.select -import react.functionComponent +import react.fc import space.kscience.dataforge.meta.descriptors.allowedValues import space.kscience.dataforge.values.asValue import space.kscience.dataforge.values.string @JsExport -public val MultiSelectChooser: FunctionComponent = - functionComponent("MultiSelectChooser") { props -> - val onChange: (Event) -> Unit = { event: Event -> - val newSelected = (event.target as HTMLSelectElement).selectedOptions.asList() - .map { (it as HTMLOptionElement).value.asValue() } - props.meta.value = newSelected.asValue() +public val MultiSelectChooser: FC = fc("MultiSelectChooser") { props -> + val onChange: (Event) -> Unit = { event: Event -> + val newSelected = (event.target as HTMLSelectElement).selectedOptions.asList() + .map { (it as HTMLOptionElement).value.asValue() } + props.meta.value = newSelected.asValue() + } + + select { + attrs { + multiple = true + values = (props.actual.value?.list ?: emptyList()).mapTo(HashSet()) { it.string } + onChangeFunction = onChange + } + props.descriptor?.allowedValues?.forEach { optionValue -> + option { + +optionValue.string + } } - select { - attrs { - multiple = true - values = (props.actual.value?.list ?: emptyList()).mapTo(HashSet()) { it.string } - onChangeFunction = onChange - } - props.descriptor?.allowedValues?.forEach { optionValue -> - option { - +optionValue.string - } - } - - } - } \ No newline at end of file + } +} \ No newline at end of file diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt index 4264b77f..6c677e2e 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/PropertyEditor.kt @@ -47,10 +47,9 @@ public external interface PropertyEditorProps : Props { public var expanded: Boolean? } -private val PropertyEditorItem: FunctionComponent = - functionComponent("PropertyEditorItem") { props -> - propertyEditorItem(props) - } +private val PropertyEditorItem: FC = fc("PropertyEditorItem") { props -> + propertyEditorItem(props) +} private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { var expanded: Boolean by useState { props.expanded ?: true } @@ -129,7 +128,7 @@ private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { width = 160.px margin(1.px, 5.px) } - ValueChooser{ + ValueChooser { attrs { this.descriptor = descriptor this.meta = ownProperty @@ -193,7 +192,7 @@ private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { } @JsExport -public val PropertyEditor: FunctionComponent = functionComponent("PropertyEditor") { props -> +public val PropertyEditor: FC = fc("PropertyEditor") { props -> child(PropertyEditorItem) { attrs { this.key = "" @@ -211,7 +210,7 @@ public fun RBuilder.propertyEditor( allProperties: MetaProvider = ownProperties, descriptor: MetaDescriptor? = null, key: Any? = null, - expanded: Boolean? = null + expanded: Boolean? = null, ) { child(PropertyEditor) { attrs { diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt index bda76147..8ccedc01 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt @@ -6,9 +6,9 @@ import kotlinx.html.InputType import kotlinx.html.js.onChangeFunction import org.w3c.dom.HTMLInputElement import org.w3c.dom.events.Event -import react.FunctionComponent +import react.FC import react.dom.attrs -import react.functionComponent +import react.fc import react.useState import space.kscience.dataforge.meta.descriptors.ValueRequirement import space.kscience.dataforge.meta.double @@ -19,58 +19,57 @@ import styled.css import styled.styledInput @JsExport -public val RangeValueChooser: FunctionComponent = - functionComponent("RangeValueChooser") { props -> - var innerValue by useState(props.actual.double) - var rangeDisabled: Boolean by useState(props.meta.value == null) +public val RangeValueChooser: FC = fc("RangeValueChooser") { props -> + var innerValue by useState(props.actual.double) + var rangeDisabled: Boolean by useState(props.meta.value == null) - val handleDisable: (Event) -> Unit = { - val checkBoxValue = (it.target as HTMLInputElement).checked - rangeDisabled = !checkBoxValue - props.meta.value = if(!checkBoxValue) { - null - } else { - innerValue?.asValue() - } + val handleDisable: (Event) -> Unit = { + val checkBoxValue = (it.target as HTMLInputElement).checked + rangeDisabled = !checkBoxValue + props.meta.value = if (!checkBoxValue) { + null + } else { + innerValue?.asValue() } + } - val handleChange: (Event) -> Unit = { - val newValue = (it.target as HTMLInputElement).value - props.meta.value = newValue.toDoubleOrNull()?.asValue() - innerValue = newValue.toDoubleOrNull() - } + val handleChange: (Event) -> Unit = { + val newValue = (it.target as HTMLInputElement).value + props.meta.value = newValue.toDoubleOrNull()?.asValue() + innerValue = newValue.toDoubleOrNull() + } - flexRow { - if(props.descriptor?.valueRequirement != ValueRequirement.REQUIRED) { - styledInput(type = InputType.checkBox) { - attrs { - defaultChecked = rangeDisabled.not() - onChangeFunction = handleDisable - } - } - } - - styledInput(type = InputType.range) { - css{ - width = 100.pct - } + flexRow { + if (props.descriptor?.valueRequirement != ValueRequirement.REQUIRED) { + styledInput(type = InputType.checkBox) { attrs { - disabled = rangeDisabled - value = innerValue?.toString() ?: "" - onChangeFunction = handleChange - consumer.onTagEvent(this, "input", handleChange) - val minValue = props.descriptor?.attributes?.get("min").string - minValue?.let { - min = it - } - val maxValue = props.descriptor?.attributes?.get("max").string - maxValue?.let { - max = it - } - props.descriptor?.attributes?.get("step").string?.let { - step = it - } + defaultChecked = rangeDisabled.not() + onChangeFunction = handleDisable } } } - } \ No newline at end of file + + styledInput(type = InputType.range) { + css { + width = 100.pct + } + attrs { + disabled = rangeDisabled + value = innerValue?.toString() ?: "" + onChangeFunction = handleChange + consumer.onTagEvent(this, "input", handleChange) + val minValue = props.descriptor?.attributes?.get("min").string + minValue?.let { + min = it + } + val maxValue = props.descriptor?.attributes?.get("max").string + maxValue?.let { + max = it + } + props.descriptor?.attributes?.get("step").string?.let { + step = it + } + } + } + } +} \ No newline at end of file diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt index 319a867c..4683f579 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt @@ -21,13 +21,11 @@ public external interface ThreeCanvasProps : Props { public var selected: Name? } -public val ThreeCanvasComponent: FunctionComponent = functionComponent( - "ThreeCanvasComponent" -) { props -> +public val ThreeCanvasComponent: FC = fc("ThreeCanvasComponent") { props -> val elementRef = useRef(null) var canvas by useState(null) - val three: ThreePlugin = useMemo(props.context){ props.context.fetch(ThreePlugin) } + val three: ThreePlugin = useMemo(props.context) { props.context.fetch(ThreePlugin) } useEffect(props.solid, props.options, elementRef) { if (canvas == null) { diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt index 539fa2ee..54fc8ec4 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/VisionTree.kt @@ -28,7 +28,7 @@ public external interface ObjectTreeProps : Props { public var clickCallback: (Name) -> Unit } -private val TreeLabel = functionComponent { props -> +private val TreeLabel = fc { props -> val token = useMemo(props.name) { props.name.lastOrNull()?.toString() ?: "World" } styledSpan { css { @@ -107,14 +107,14 @@ private fun RBuilder.visionTree(props: ObjectTreeProps): Unit { } @JsExport -public val ObjectTree: FunctionComponent = functionComponent("ObjectTree") { props -> +public val ObjectTree: FC = fc("ObjectTree") { props -> visionTree(props) } public fun RBuilder.visionTree( vision: Vision, selected: Name? = null, - clickCallback: (Name) -> Unit = {} + clickCallback: (Name) -> Unit = {}, ) { child(ObjectTree) { attrs { diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt index 1296d777..03996c04 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/valueChooser.kt @@ -10,11 +10,11 @@ import kotlinx.html.js.onKeyDownFunction import org.w3c.dom.HTMLInputElement import org.w3c.dom.HTMLSelectElement import org.w3c.dom.events.Event -import react.FunctionComponent +import react.FC import react.Props import react.dom.attrs import react.dom.option -import react.functionComponent +import react.fc import react.useState import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.MetaDescriptor @@ -36,136 +36,131 @@ public external interface ValueChooserProps : Props { } @JsExport -public val StringValueChooser: FunctionComponent = - functionComponent("StringValueChooser") { props -> - var value by useState(props.actual.string ?: "") - val keyDown: (Event) -> Unit = { event -> - if (event.type == "keydown" && event.asDynamic().key == "Enter") { - value = (event.target as HTMLInputElement).value - props.meta.value = value.asValue() - } +public val StringValueChooser: FC = fc("StringValueChooser") { props -> + var value by useState(props.actual.string ?: "") + val keyDown: (Event) -> Unit = { event -> + if (event.type == "keydown" && event.asDynamic().key == "Enter") { + value = (event.target as HTMLInputElement).value + props.meta.value = value.asValue() } - val handleChange: (Event) -> Unit = { - value = (it.target as HTMLInputElement).value + } + val handleChange: (Event) -> Unit = { + value = (it.target as HTMLInputElement).value + } + styledInput(type = InputType.text) { + css { + width = 100.pct } - styledInput(type = InputType.text) { - css { - width = 100.pct - } - attrs { - this.value = value - onKeyDownFunction = keyDown - onChangeFunction = handleChange + attrs { + this.value = value + onKeyDownFunction = keyDown + onChangeFunction = handleChange + } + } +} + +@JsExport +public val BooleanValueChooser: FC = fc("BooleanValueChooser") { props -> + val handleChange: (Event) -> Unit = { + val newValue = (it.target as HTMLInputElement).checked + props.meta.value = newValue.asValue() + } + styledInput(type = InputType.checkBox) { + css { + width = 100.pct + } + attrs { + //this.attributes["indeterminate"] = (props.item == null).toString() + checked = props.actual.boolean ?: false + onChangeFunction = handleChange + } + } +} + +@JsExport +public val NumberValueChooser: FC = fc("NumberValueChooser") { props -> + var innerValue by useState(props.actual.string ?: "") + val keyDown: (Event) -> Unit = { event -> + if (event.type == "keydown" && event.asDynamic().key == "Enter") { + innerValue = (event.target as HTMLInputElement).value + val number = innerValue.toDoubleOrNull() + if (number == null) { + console.error("The input value $innerValue is not a number") + } else { + props.meta.value = number.asValue() } } } - -@JsExport -public val BooleanValueChooser: FunctionComponent = - functionComponent("BooleanValueChooser") { props -> - val handleChange: (Event) -> Unit = { - val newValue = (it.target as HTMLInputElement).checked - props.meta.value = newValue.asValue() + val handleChange: (Event) -> Unit = { + innerValue = (it.target as HTMLInputElement).value + } + styledInput(type = InputType.number) { + css { + width = 100.pct } - styledInput(type = InputType.checkBox) { - css { - width = 100.pct + attrs { + value = innerValue + onKeyDownFunction = keyDown + onChangeFunction = handleChange + props.descriptor?.attributes?.get("step").string?.let { + step = it } - attrs { - //this.attributes["indeterminate"] = (props.item == null).toString() - checked = props.actual.boolean ?: false - onChangeFunction = handleChange + props.descriptor?.attributes?.get("min").string?.let { + min = it + } + props.descriptor?.attributes?.get("max").string?.let { + max = it } } } +} @JsExport -public val NumberValueChooser: FunctionComponent = - functionComponent("NumberValueChooser") { props -> - var innerValue by useState(props.actual.string ?: "") - val keyDown: (Event) -> Unit = { event -> - if (event.type == "keydown" && event.asDynamic().key == "Enter") { - innerValue = (event.target as HTMLInputElement).value - val number = innerValue.toDoubleOrNull() - if (number == null) { - console.error("The input value $innerValue is not a number") - } else { - props.meta.value = number.asValue() - } +public val ComboValueChooser: FC = fc("ComboValueChooser") { props -> + var selected by useState(props.actual.string ?: "") + val handleChange: (Event) -> Unit = { + selected = (it.target as HTMLSelectElement).value + props.meta.value = selected.asValue() + } + styledSelect { + css { + width = 100.pct + } + props.descriptor?.allowedValues?.forEach { + option { + +it.string } } - val handleChange: (Event) -> Unit = { - innerValue = (it.target as HTMLInputElement).value - } - styledInput(type = InputType.number) { - css { - width = 100.pct - } - attrs { - value = innerValue - onKeyDownFunction = keyDown - onChangeFunction = handleChange - props.descriptor?.attributes?.get("step").string?.let { - step = it - } - props.descriptor?.attributes?.get("min").string?.let { - min = it - } - props.descriptor?.attributes?.get("max").string?.let { - max = it - } - } + attrs { + this.value = props.actual.string ?: "" + multiple = false + onChangeFunction = handleChange } } +} @JsExport -public val ComboValueChooser: FunctionComponent = - functionComponent("ComboValueChooser") { props -> - var selected by useState(props.actual.string ?: "") - val handleChange: (Event) -> Unit = { - selected = (it.target as HTMLSelectElement).value - props.meta.value = selected.asValue() +public val ColorValueChooser: FC = fc("ColorValueChooser") { props -> + val handleChange: (Event) -> Unit = { + props.meta.value = (it.target as HTMLInputElement).value.asValue() + } + styledInput(type = InputType.color) { + css { + width = 100.pct + margin(0.px) } - styledSelect { - css { - width = 100.pct - } - props.descriptor?.allowedValues?.forEach { - option { - +it.string - } - } - attrs { - this.value = props.actual.string ?: "" - multiple = false - onChangeFunction = handleChange - } + attrs { + this.value = props.actual.value?.let { value -> + if (value.type == ValueType.NUMBER) Colors.rgbToString(value.int) + else value.string + } ?: "#000000" + onChangeFunction = handleChange } } +} @JsExport -public val ColorValueChooser: FunctionComponent = - functionComponent("ColorValueChooser") { props -> - val handleChange: (Event) -> Unit = { - props.meta.value = (it.target as HTMLInputElement).value.asValue() - } - styledInput(type = InputType.color) { - css { - width = 100.pct - margin(0.px) - } - attrs { - this.value = props.actual.value?.let { value -> - if (value.type == ValueType.NUMBER) Colors.rgbToString(value.int) - else value.string - } ?: "#000000" - onChangeFunction = handleChange - } - } - } - -@JsExport -public val ValueChooser: FunctionComponent = functionComponent("ValueChooser") { props -> +public val ValueChooser: FC = fc("ValueChooser") { props -> val rawInput by useState(false) val descriptor = props.descriptor diff --git a/visionforge-core/build.gradle.kts b/visionforge-core/build.gradle.kts index 3af5c602..b411dee9 100644 --- a/visionforge-core/build.gradle.kts +++ b/visionforge-core/build.gradle.kts @@ -5,7 +5,9 @@ plugins { val dataforgeVersion: String by rootProject.extra kscience{ - useSerialization() + useSerialization{ + json() + } } kotlin { diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooser.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooser.kt index d4ce7bb5..f62513b0 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooser.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooser.kt @@ -71,35 +71,31 @@ public interface ValueChooser { public companion object { - private fun findWidgetByType(context: Context, type: String): Factory? { - return when (Name.parse(type)) { - TextValueChooser.name -> TextValueChooser - ColorValueChooser.name -> ColorValueChooser - ComboBoxValueChooser.name -> ComboBoxValueChooser - else -> null//context.provideByType(type)//Search for additional factories in the plugin - } + private fun findWidgetByType(context: Context, type: String): Factory? = when (Name.parse(type)) { + TextValueChooser.name -> TextValueChooser + ColorValueChooser.name -> ColorValueChooser + ComboBoxValueChooser.name -> ComboBoxValueChooser + else -> null//context.provideByType(type)//Search for additional factories in the plugin } - private fun build(context: Context, descriptor: MetaDescriptor?): ValueChooser { - return if (descriptor == null) { - TextValueChooser(); - } else { - val widgetType = descriptor.widgetType - val chooser: ValueChooser = when { - widgetType != null -> { - findWidgetByType( - context, - widgetType - )?.invoke( - descriptor.widget - ) ?: TextValueChooser() - } - !descriptor.allowedValues.isNullOrEmpty() -> ComboBoxValueChooser() - else -> TextValueChooser() + private fun build(context: Context, descriptor: MetaDescriptor?): ValueChooser = if (descriptor == null) { + TextValueChooser(); + } else { + val widgetType = descriptor.widgetType + val chooser: ValueChooser = when { + widgetType != null -> { + findWidgetByType( + context, + widgetType + )?.invoke( + descriptor.widget + ) ?: TextValueChooser() } - chooser.descriptor = descriptor - chooser + !descriptor.allowedValues.isNullOrEmpty() -> ComboBoxValueChooser() + else -> TextValueChooser() } + chooser.descriptor = descriptor + chooser } public fun build( diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt index ccff7dcd..f815a262 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt @@ -42,6 +42,7 @@ public interface Point3D { } } +@Suppress("SERIALIZER_TYPE_INCOMPATIBLE") @Serializable(Point3DSerializer::class) public interface MutablePoint3D : Point3D { override var x: Float @@ -56,7 +57,6 @@ internal object Point3DSerializer : KSerializer { override val descriptor: SerialDescriptor = Point3DImpl.serializer().descriptor - override fun deserialize(decoder: Decoder): MutablePoint3D = decoder.decodeSerializableValue(Point3DImpl.serializer()) override fun serialize(encoder: Encoder, value: Point3D) { From 104e8f8f6fee3bfadfeaa67e2de5dfb55bad6f63 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 29 Dec 2021 20:00:03 +0300 Subject: [PATCH 090/109] Remove Ktor client --- build.gradle.kts | 2 - .../mipt/npm/root/serialization/jsonToRoot.kt | 1 + .../visionforge/gdml/demo/GDMLAppComponent.kt | 4 +- .../src/main/kotlin/gravityDemo.kt | 4 +- .../src/main/kotlin/markupComponent.kt | 4 +- .../src/main/kotlin/plotlyComponent.kt | 2 +- demo/muon-monitor/build.gradle.kts | 2 - .../mipt/npm/muon/monitor/MMAppComponent.kt | 31 ++- .../ru/mipt/npm/muon/monitor/MMDemoApp.kt | 13 +- .../main/kotlin/ru/mipt/npm/sat/satServer.kt | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- .../visionforge/bootstrap/outputConfig.kt | 6 +- .../visionforge/bootstrap/tabComponent.kt | 4 +- .../visionforge/bootstrap/threeControls.kt | 6 +- .../kscience/visionforge/react/MetaViewer.kt | 4 +- .../ThreeViewWithControls.kt | 203 +++++++++--------- .../ringThreeControls.kt | 8 +- visionforge-core/build.gradle.kts | 2 +- visionforge-server/build.gradle.kts | 9 +- .../visionforge/three/server/VisionServer.kt | 57 ++++- 20 files changed, 199 insertions(+), 167 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 62f608e4..625efc2c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,7 +1,5 @@ plugins { id("ru.mipt.npm.gradle.project") -// kotlin("multiplatform") version "1.5.30" apply false -// kotlin("js") version "1.5.30" apply false } val dataforgeVersion by extra("0.5.2") diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/jsonToRoot.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/jsonToRoot.kt index 94079ccd..5d338394 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/jsonToRoot.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/serialization/jsonToRoot.kt @@ -46,6 +46,7 @@ private object RootDecoder { private val refCache: List, ) : KSerializer by tSerializer { + @Suppress("UNCHECKED_CAST") override fun deserialize(decoder: Decoder): T { val input = decoder as JsonDecoder val element = input.decodeJsonElement() diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt index 156fedb0..e5787050 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt @@ -9,7 +9,7 @@ import org.w3c.files.FileReader import org.w3c.files.get import react.Props import react.dom.h2 -import react.functionComponent +import react.fc import react.useMemo import react.useState import space.kscience.dataforge.context.Context @@ -34,7 +34,7 @@ external interface GDMLAppProps : Props { } @JsExport -val GDMLApp = functionComponent("GDMLApp") { props -> +val GDMLApp = fc("GDMLApp") { props -> val visionManager = useMemo(props.context) { props.context.fetch(Solids).visionManager } var deferredVision: Deferred by useState { CompletableDeferred(props.vision) diff --git a/demo/js-playground/src/main/kotlin/gravityDemo.kt b/demo/js-playground/src/main/kotlin/gravityDemo.kt index b2788b23..716cc2c3 100644 --- a/demo/js-playground/src/main/kotlin/gravityDemo.kt +++ b/demo/js-playground/src/main/kotlin/gravityDemo.kt @@ -3,7 +3,7 @@ import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import kotlinx.css.* import react.Props -import react.functionComponent +import react.fc import space.kscience.dataforge.context.Context import space.kscience.plotly.layout import space.kscience.plotly.models.Trace @@ -20,7 +20,7 @@ external interface DemoProps : Props { var context: Context } -val GravityDemo = functionComponent { props -> +val GravityDemo = fc { props -> val velocityTrace = Trace{ name = "velocity" } diff --git a/demo/js-playground/src/main/kotlin/markupComponent.kt b/demo/js-playground/src/main/kotlin/markupComponent.kt index 0cdb17d0..4bbe4b80 100644 --- a/demo/js-playground/src/main/kotlin/markupComponent.kt +++ b/demo/js-playground/src/main/kotlin/markupComponent.kt @@ -7,7 +7,7 @@ import org.intellij.markdown.flavours.gfm.GFMFlavourDescriptor import org.w3c.dom.Element import org.w3c.dom.HTMLElement import react.Props -import react.functionComponent +import react.fc import react.useEffect import react.useRef import space.kscience.visionforge.markup.VisionOfMarkup @@ -20,7 +20,7 @@ external interface MarkupProps : Props { var markup: VisionOfMarkup? } -val Markup = functionComponent("Markup") { props -> +val Markup = fc("Markup") { props -> val elementRef = useRef(null) useEffect(props.markup, elementRef) { diff --git a/demo/js-playground/src/main/kotlin/plotlyComponent.kt b/demo/js-playground/src/main/kotlin/plotlyComponent.kt index ee896df2..5a2c6a81 100644 --- a/demo/js-playground/src/main/kotlin/plotlyComponent.kt +++ b/demo/js-playground/src/main/kotlin/plotlyComponent.kt @@ -14,7 +14,7 @@ external interface PlotlyProps : Props { } -val Plotly = functionComponent("Plotly") { props -> +val Plotly = fc("Plotly") { props -> val elementRef = useRef(null) useEffect(props.plot, elementRef) { diff --git a/demo/muon-monitor/build.gradle.kts b/demo/muon-monitor/build.gradle.kts index 0ef8f166..d33cd455 100644 --- a/demo/muon-monitor/build.gradle.kts +++ b/demo/muon-monitor/build.gradle.kts @@ -52,8 +52,6 @@ kotlin { jsMain { dependencies { implementation(project(":ui:ring")) - implementation(npmlibs.ktor.client.js) - implementation(npmlibs.ktor.client.serialization) implementation(project(":visionforge-threejs")) //implementation(devNpm("webpack-bundle-analyzer", "4.4.0")) } diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt index 30a79315..879f6af7 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt @@ -1,17 +1,19 @@ package ru.mipt.npm.muon.monitor -import io.ktor.client.HttpClient -import io.ktor.client.request.get +import kotlinx.browser.window import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.DelicateCoroutinesApi +import kotlinx.coroutines.await import kotlinx.coroutines.launch import kotlinx.css.* import kotlinx.html.js.onClickFunction +import kotlinx.serialization.json.Json +import org.w3c.fetch.RequestInit import react.Props import react.dom.attrs import react.dom.button import react.dom.p -import react.functionComponent +import react.fc import react.useMemo import react.useState import space.kscience.dataforge.context.Context @@ -31,13 +33,12 @@ import kotlin.math.PI external interface MMAppProps : Props { var model: Model var context: Context - var connection: HttpClient var selected: Name? } @OptIn(DelicateCoroutinesApi::class) @JsExport -val MMApp = functionComponent("Muon monitor") { props -> +val MMApp = fc("Muon monitor") { props -> val mmOptions = useMemo { Canvas3DOptions { @@ -75,9 +76,21 @@ val MMApp = functionComponent("Muon monitor") { props -> attrs { onClickFunction = { context.launch { - val event = props.connection.get( - "http://localhost:8080/event" - ) +// val event = props.connection.get( +// "http://localhost:8080/event" +// ) + val event = window.fetch( + "http://localhost:8080/event", + RequestInit("GET") + ).then { response -> + if (response.ok) { + response.text() + } else { + error("Failed to get event") + } + }.then { body -> + Json.decodeFromString(Event.serializer(), body) + }.await() events = events + event props.model.displayEvent(event) } @@ -102,7 +115,7 @@ val MMApp = functionComponent("Muon monitor") { props -> } +" : " styledSpan { - css{ + css { color = Color.blue } +event.hits.toString() diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt index f777d383..6b611146 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt @@ -1,10 +1,6 @@ package ru.mipt.npm.muon.monitor -import io.ktor.client.HttpClient -import io.ktor.client.features.json.JsonFeature -import io.ktor.client.features.json.serializer.KotlinxSerializer import kotlinx.browser.document -import react.child import react.dom.render import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.fetch @@ -15,15 +11,9 @@ import space.kscience.visionforge.startApplication private class MMDemoApp : Application { - private val connection = HttpClient { - install(JsonFeature) { - serializer = KotlinxSerializer() - } - } - override fun start(state: Map) { - val context = Context("MM-demo"){ + val context = Context("MM-demo") { plugin(ThreePlugin) } val visionManager = context.fetch(VisionManager) @@ -35,7 +25,6 @@ private class MMDemoApp : Application { child(MMApp) { attrs { this.model = model - this.connection = this@MMDemoApp.connection this.context = context } } diff --git a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt index 3a360ce7..93f2ec7c 100644 --- a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt +++ b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt @@ -35,7 +35,7 @@ fun main() { } } - server.show() + server.openInBrowser() GlobalScope.launch { while (isActive) { diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e750102e..2e6e5897 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt index b20e2b0e..0d4e2dc7 100644 --- a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt +++ b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt @@ -9,12 +9,12 @@ import kotlinx.html.js.onClickFunction import org.w3c.dom.events.Event import org.w3c.files.Blob import org.w3c.files.BlobPropertyBag -import react.FunctionComponent +import react.FC import react.Props import react.RBuilder import react.dom.attrs import react.dom.button -import react.functionComponent +import react.fc import space.kscience.dataforge.meta.withDefault import space.kscience.visionforge.Vision import space.kscience.visionforge.encodeToString @@ -47,7 +47,7 @@ public external interface CanvasControlsProps : Props { public var vision: Vision? } -public val CanvasControls: FunctionComponent = functionComponent("CanvasControls") { props -> +public val CanvasControls: FC = fc("CanvasControls") { props -> flexColumn { flexRow { css { diff --git a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/tabComponent.kt b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/tabComponent.kt index fc58fed7..07bd9b55 100644 --- a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/tabComponent.kt +++ b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/tabComponent.kt @@ -18,7 +18,7 @@ public external interface TabProps : PropsWithChildren { } @JsExport -public val Tab: FunctionComponent = functionComponent { props -> +public val Tab: FC = fc { props -> props.children() } @@ -27,7 +27,7 @@ public external interface TabPaneProps : PropsWithChildren { } @JsExport -public val TabPane: FunctionComponent = functionComponent("TabPane") { props -> +public val TabPane: FC = fc("TabPane") { props -> var activeTab: String? by useState(props.activeTab) val children: Array = Children.map(props.children) { diff --git a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/threeControls.kt b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/threeControls.kt index deda16d7..e7602b0e 100644 --- a/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/threeControls.kt +++ b/ui/bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap/threeControls.kt @@ -2,11 +2,11 @@ package space.kscience.visionforge.bootstrap import kotlinx.css.* import kotlinx.css.properties.border -import react.FunctionComponent +import react.FC import react.PropsWithChildren import react.RBuilder import react.dom.h2 -import react.functionComponent +import react.fc import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.isEmpty import space.kscience.visionforge.Vision @@ -24,7 +24,7 @@ public external interface ThreeControlsProps : PropsWithChildren { } @JsExport -public val ThreeControls: FunctionComponent = functionComponent { props -> +public val ThreeControls: FC = fc { props -> tabPane(if (props.selected != null) "Properties" else null) { tab("Canvas") { card("Canvas configuration") { diff --git a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MetaViewer.kt b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MetaViewer.kt index 7d41bde9..651c9d31 100644 --- a/ui/react/src/main/kotlin/space/kscience/visionforge/react/MetaViewer.kt +++ b/ui/react/src/main/kotlin/space/kscience/visionforge/react/MetaViewer.kt @@ -42,7 +42,7 @@ public external interface MetaViewerProps : Props { public var descriptor: MetaDescriptor? } -private val MetaViewerItem: FunctionComponent = functionComponent("MetaViewerItem") { props -> +private val MetaViewerItem: FC = fc("MetaViewerItem") { props -> metaViewerItem(props) } @@ -127,7 +127,7 @@ private fun RBuilder.metaViewerItem(props: MetaViewerProps) { } @JsExport -public val MetaViewer: FunctionComponent = functionComponent("MetaViewer") { props -> +public val MetaViewer: FC = fc("MetaViewer") { props -> child(MetaViewerItem) { attrs { this.key = "" diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt index 5dd44099..e9cf62bf 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt @@ -76,110 +76,109 @@ public fun RBuilder.nameCrumbs(name: Name?, link: (Name) -> Unit): Unit = styled } @JsExport -public val ThreeCanvasWithControls: FunctionComponent = - functionComponent("ThreeViewWithControls") { props -> - var selected by useState { props.selected } - var solid: Solid? by useState(null) +public val ThreeCanvasWithControls: FC = fc("ThreeViewWithControls") { props -> + var selected by useState { props.selected } + var solid: Solid? by useState(null) - useEffect { - props.context.launch { - solid = props.builderOfSolid.await().also { - it?.root(props.context.visionManager) - } - } - } - - val onSelect: (Name?) -> Unit = { - selected = it - } - - val options = useMemo(props.options) { - (props.options?: Canvas3DOptions()).apply { - this.onSelect = onSelect - } - } - - val selectedVision: Vision? = useMemo(props.builderOfSolid, selected) { - selected?.let { - when { - it.isEmpty() -> solid - else -> (solid as? VisionGroup)?.get(it) - } - } - } - - - flexRow { - css { - height = 100.pct - width = 100.pct - flexWrap = FlexWrap.wrap - alignItems = Align.stretch - alignContent = Align.stretch - } - - flexColumn { - css { - height = 100.pct - minWidth = 600.px - flex(10.0, 1.0, FlexBasis("600px")) - position = Position.relative - } - - if (solid == null) { - LoaderScreen { - attrs { - message = "Loading Three vision" - } - } - } else { - child(ThreeCanvasComponent) { - attrs { - this.context = props.context - this.solid = solid - this.selected = selected - this.options = options - } - } - } - - selectedVision?.let { vision -> - styledDiv { - css { - position = Position.absolute - top = 5.px - right = 5.px - width = 450.px - } - Island { - IslandHeader { - attrs { - border = true - } - nameCrumbs(selected) { selected = it } - } - IslandContent { - propertyEditor( - ownProperties = vision.meta, - allProperties = vision.computeProperties(), - descriptor = vision.descriptor, - key = selected - ) - } - } - } - } - } - flexColumn { - css { - padding(4.px) - minWidth = 400.px - height = 100.pct - overflowY = Overflow.auto - flex(1.0, 10.0, FlexBasis("300px")) - } - ringThreeControls(options, solid, selected, onSelect, additionalTabs = props.additionalTabs) + useEffect { + props.context.launch { + solid = props.builderOfSolid.await().also { + it?.root(props.context.visionManager) } } } + val onSelect: (Name?) -> Unit = { + selected = it + } + + val options = useMemo(props.options) { + (props.options ?: Canvas3DOptions()).apply { + this.onSelect = onSelect + } + } + + val selectedVision: Vision? = useMemo(props.builderOfSolid, selected) { + selected?.let { + when { + it.isEmpty() -> solid + else -> (solid as? VisionGroup)?.get(it) + } + } + } + + + flexRow { + css { + height = 100.pct + width = 100.pct + flexWrap = FlexWrap.wrap + alignItems = Align.stretch + alignContent = Align.stretch + } + + flexColumn { + css { + height = 100.pct + minWidth = 600.px + flex(10.0, 1.0, FlexBasis("600px")) + position = Position.relative + } + + if (solid == null) { + LoaderScreen { + attrs { + message = "Loading Three vision" + } + } + } else { + child(ThreeCanvasComponent) { + attrs { + this.context = props.context + this.solid = solid + this.selected = selected + this.options = options + } + } + } + + selectedVision?.let { vision -> + styledDiv { + css { + position = Position.absolute + top = 5.px + right = 5.px + width = 450.px + } + Island { + IslandHeader { + attrs { + border = true + } + nameCrumbs(selected) { selected = it } + } + IslandContent { + propertyEditor( + ownProperties = vision.meta, + allProperties = vision.computeProperties(), + descriptor = vision.descriptor, + key = selected + ) + } + } + } + } + } + flexColumn { + css { + padding(4.px) + minWidth = 400.px + height = 100.pct + overflowY = Overflow.auto + flex(1.0, 10.0, FlexBasis("300px")) + } + ringThreeControls(options, solid, selected, onSelect, additionalTabs = props.additionalTabs) + } + } +} + diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt index eed656e6..68cc13b2 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt @@ -9,12 +9,12 @@ import kotlinx.html.js.onClickFunction import org.w3c.dom.events.Event import org.w3c.files.Blob import org.w3c.files.BlobPropertyBag -import react.FunctionComponent +import react.FC import react.Props import react.RBuilder import react.dom.attrs import react.dom.button -import react.functionComponent +import react.fc import ringui.Island import ringui.SmartTabs import ringui.Tab @@ -52,7 +52,7 @@ internal external interface CanvasControlsProps : Props { public var vision: Vision? } -internal val CanvasControls: FunctionComponent = functionComponent("CanvasControls") { props -> +internal val CanvasControls: FC = fc("CanvasControls") { props -> flexColumn { flexRow { css { @@ -94,7 +94,7 @@ public external interface ThreeControlsProps : Props { } @JsExport -public val ThreeControls: FunctionComponent = functionComponent { props -> +public val ThreeControls: FC = fc { props -> SmartTabs("Tree") { props.vision?.let { Tab("Tree") { diff --git a/visionforge-core/build.gradle.kts b/visionforge-core/build.gradle.kts index b411dee9..ecd14331 100644 --- a/visionforge-core/build.gradle.kts +++ b/visionforge-core/build.gradle.kts @@ -15,7 +15,7 @@ kotlin { commonMain { dependencies { api("space.kscience:dataforge-context:$dataforgeVersion") - api("org.jetbrains.kotlinx:kotlinx-html:${ru.mipt.npm.gradle.KScienceVersions.htmlVersion}") + api(npmlibs.kotlinx.html) api("org.jetbrains.kotlin-wrappers:kotlin-css") } } diff --git a/visionforge-server/build.gradle.kts b/visionforge-server/build.gradle.kts index 18fda1cf..ec77fa22 100644 --- a/visionforge-server/build.gradle.kts +++ b/visionforge-server/build.gradle.kts @@ -2,12 +2,9 @@ plugins { id("ru.mipt.npm.gradle.jvm") } -val ktorVersion = ru.mipt.npm.gradle.KScienceVersions.ktorVersion - dependencies { api(project(":visionforge-core")) - api("io.ktor:ktor-server-cio:$ktorVersion") - //api("io.ktor:ktor-server-netty:$ktorVersion") - api("io.ktor:ktor-html-builder:$ktorVersion") - api("io.ktor:ktor-websockets:$ktorVersion") + api(npmlibs.ktor.server.cio) + api(npmlibs.ktor.html.builder) + api(npmlibs.ktor.websockets) } \ No newline at end of file diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt b/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt index 61c3fd84..82b27952 100644 --- a/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt +++ b/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt @@ -38,10 +38,7 @@ import space.kscience.visionforge.html.* import space.kscience.visionforge.three.server.VisionServer.Companion.DEFAULT_PAGE import java.awt.Desktop import java.net.URI -import kotlin.collections.set -import kotlin.time.Duration import kotlin.time.Duration.Companion.milliseconds -import kotlin.time.ExperimentalTime /** @@ -53,10 +50,30 @@ public class VisionServer internal constructor( private val rootRoute: String, ) : Configurable, CoroutineScope by application { override val meta: ObservableMutableMeta = MutableMeta() + + /** + * Update minimal interval between updates in milliseconds (if there are no updates, push will not happen + */ public var updateInterval: Long by meta.long(300, key = UPDATE_INTERVAL_KEY) + + /** + * Cache page fragments. If false, pages will be reconstructed on each call. Default: `true` + */ public var cacheFragments: Boolean by meta.boolean(true) + + /** + * Embed the initial state of the vision inside its html tag. Default: `true` + */ public var dataEmbed: Boolean by meta.boolean(true, Name.parse("data.embed")) + + /** + * Fetch data on vision load. Overrides embedded data. Default: `false` + */ public var dataFetch: Boolean by meta.boolean(false, Name.parse("data.fetch")) + + /** + * Connect to server to get pushes. The address of the server is embedded in the tag. Default: `true` + */ public var dataConnect: Boolean by meta.boolean(true, Name.parse("data.connect")) /** @@ -64,6 +81,9 @@ public class VisionServer internal constructor( */ private val globalHeaders: ArrayList = ArrayList() + /** + * Add a header to all pages produced by this server + */ public fun header(block: TagConsumer<*>.() -> Unit) { globalHeaders.add(block) } @@ -73,7 +93,7 @@ public class VisionServer internal constructor( headers: List, visionFragment: HtmlVisionFragment, ): Map { - var visionMap: Map? = null + var visionMap: Map? = null head { meta { @@ -102,7 +122,7 @@ public class VisionServer internal constructor( * Server a map of visions without providing explicit html page for them */ @OptIn(DFExperimental::class) - public fun serveVisions(route: Route, visions: Map): Unit = route { + internal fun serveVisions(route: Route, visions: Map): Unit = route { application.log.info("Serving visions $visions at $route") //Update websocket @@ -158,8 +178,13 @@ public class VisionServer internal constructor( * Create a static html page and serve visions produced in the process */ @DFExperimental - public fun createHtmlAndServe(route: String, title: String, headers: List, visionFragment: HtmlVisionFragment): String{ - val htmlString = createHTML().apply { + public fun createHtmlAndServe( + route: String, + title: String, + headers: List, + visionFragment: HtmlVisionFragment, + ): String { + val htmlString = createHTML().apply { html { visionPage(title, headers, visionFragment).also { serveVisions(route, it) @@ -171,7 +196,7 @@ public class VisionServer internal constructor( } /** - * Serv visions in a given [route] without providing a page template + * Serve visions in a given [route] without providing a page template */ public fun serveVisions(route: String, visions: Map): Unit { application.routing { @@ -245,6 +270,9 @@ public inline fun VisionServer.useScript(src: String, crossinline block: SCRIPT. } } +/** + * Use css with given stylesheet link as a global header for all pages. + */ public inline fun VisionServer.useCss(href: String, crossinline block: LINK.() -> Unit = {}) { header { link { @@ -256,7 +284,7 @@ public inline fun VisionServer.useCss(href: String, crossinline block: LINK.() - } /** - * Attach plotly application to given server + * Attach VisionForge server application to given server */ public fun Application.visionServer(context: Context, route: String = DEFAULT_PAGE): VisionServer { if (featureOrNull(WebSockets) == null) { @@ -286,6 +314,9 @@ public fun Application.visionServer(context: Context, route: String = DEFAULT_PA return VisionServer(visionManager, this, route) } +/** + * Start a stand-alone VisionForge server at given host/port + */ public fun VisionManager.serve( host: String = "localhost", port: Int = 7777, @@ -294,10 +325,16 @@ public fun VisionManager.serve( visionServer(context).apply(block) }.start() -public fun ApplicationEngine.show() { +/** + * Connect to a given Ktor server using browser + */ +public fun ApplicationEngine.openInBrowser() { val connector = environment.connectors.first() val uri = URI("http", null, connector.host, connector.port, null, null, null) Desktop.getDesktop().browse(uri) } +/** + * Stop the server with default timeouts + */ public fun ApplicationEngine.close(): Unit = stop(1000, 5000) \ No newline at end of file From 6b8e166978af9b0cc1ec8e0d989bb7c5fb13be47 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 31 Dec 2021 13:59:27 +0300 Subject: [PATCH 091/109] Forms implemented --- .../visionforge/gdml/demo/GDMLAppComponent.kt | 4 +- demo/jupyter-playground/build.gradle.kts | 35 ------ .../kotlin/ru/mipt/npm/muon/monitor/Model.kt | 4 +- .../mipt/npm/muon/monitor/MMAppComponent.kt | 3 - demo/playground/build.gradle.kts | 28 +++-- .../kotlin/VisionForgePlayGroundForJupyter.kt | 37 +++---- .../src/jvmMain/kotlin/formServer.kt | 67 ++++++++++++ .../kotlin/{gdmCurve.kt => gdmlCurve.kt} | 2 +- .../src/jvmMain/kotlin/generateSchema.kt | 20 ++-- .../main/kotlin/ru/mipt/npm/sat/geometry.kt | 2 - .../src/jvmMain/kotlin/JupyterPluginBase.kt | 7 -- settings.gradle.kts | 1 - .../ThreeViewWithControls.kt | 2 +- .../space/kscience/visionforge/VisionBase.kt | 2 +- .../kscience/visionforge/VisionChange.kt | 36 ++++--- .../kscience/visionforge/VisionGroupBase.kt | 5 +- .../kscience/visionforge/VisionManager.kt | 8 ++ .../visionforge/html/VisionOfHtmlForm.kt | 26 +++++ .../visionforge/html/VisionOfHtmlInput.kt | 53 +++++++++ .../visionforge/html/VisionTagConsumer.kt | 6 +- .../visionforge/ElementVisionRenderer.kt | 74 +++++++++++++ .../kscience/visionforge/VisionClient.kt | 18 +++- .../kscience/visionforge/elementOutput.kt | 27 ----- .../kscience/visionforge/inputRenderers.kt | 101 ++++++++++++++++++ .../space/kscience/visionforge/FormTest.kt | 22 ++++ .../visionforge/three/server/VisionServer.kt | 2 +- .../visionforge/solid/VisionUpdateTest.kt | 4 +- 27 files changed, 445 insertions(+), 151 deletions(-) delete mode 100644 demo/jupyter-playground/build.gradle.kts rename demo/{jupyter-playground/src/main => playground/src/jvmMain}/kotlin/VisionForgePlayGroundForJupyter.kt (71%) create mode 100644 demo/playground/src/jvmMain/kotlin/formServer.kt rename demo/playground/src/jvmMain/kotlin/{gdmCurve.kt => gdmlCurve.kt} (99%) create mode 100644 visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt create mode 100644 visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlInput.kt create mode 100644 visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/ElementVisionRenderer.kt delete mode 100644 visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/elementOutput.kt create mode 100644 visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt create mode 100644 visionforge-core/src/jsTest/kotlin/space/kscience/visionforge/FormTest.kt diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt index e5787050..823297ec 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt @@ -21,7 +21,7 @@ import space.kscience.visionforge.gdml.markLayers import space.kscience.visionforge.gdml.toVision import space.kscience.visionforge.ring.ThreeCanvasWithControls import space.kscience.visionforge.ring.tab -import space.kscience.visionforge.root +import space.kscience.visionforge.setAsRoot import space.kscience.visionforge.solid.Solid import space.kscience.visionforge.solid.Solids import styled.css @@ -50,7 +50,7 @@ val GDMLApp = fc("GDMLApp") { props -> name.endsWith(".gdml") || name.endsWith(".xml") -> { val gdml = Gdml.decodeFromString(data) gdml.toVision().apply { - root(visionManager) + setAsRoot(visionManager) console.info("Marking layers for file $name") markLayers() } diff --git a/demo/jupyter-playground/build.gradle.kts b/demo/jupyter-playground/build.gradle.kts deleted file mode 100644 index 62f92348..00000000 --- a/demo/jupyter-playground/build.gradle.kts +++ /dev/null @@ -1,35 +0,0 @@ -plugins { - kotlin("jvm") - kotlin("jupyter.api") - id("com.github.johnrengelman.shadow") version "6.1.0" -} - -repositories { - jcenter() - mavenCentral() - maven("https://repo.kotlin.link") -} - -dependencies { - implementation(project(":demo:playground")) -} - -tasks.withType { - kotlinOptions { - jvmTarget = ru.mipt.npm.gradle.KScienceVersions.JVM_TARGET.toString() - } -} - -extensions.findByType()?.apply { - targetCompatibility = ru.mipt.npm.gradle.KScienceVersions.JVM_TARGET -} - -tasks.withType { - useJUnitPlatform() -} - -tasks.processJupyterApiResources { - libraryProducers = listOf("playground.VisionForgePlayGroundForJupyter") -} - -tasks.findByName("shadowJar")?.dependsOn("processJupyterApiResources") \ No newline at end of file diff --git a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt index 0c5e0af0..2dab49a2 100644 --- a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt +++ b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt @@ -5,7 +5,7 @@ import ru.mipt.npm.muon.monitor.Monitor.LOWER_LAYER_Z import ru.mipt.npm.muon.monitor.Monitor.UPPER_LAYER_Z import space.kscience.visionforge.VisionManager import space.kscience.visionforge.removeAll -import space.kscience.visionforge.root +import space.kscience.visionforge.setAsRoot import space.kscience.visionforge.setProperty import space.kscience.visionforge.solid.* import kotlin.math.PI @@ -37,7 +37,7 @@ class Model(val manager: VisionManager) { var tracks: SolidGroup val root: SolidGroup = SolidGroup().apply { - root(this@Model.manager) + setAsRoot(this@Model.manager) material { wireframe color("darkgreen") diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt index 879f6af7..558317cb 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt @@ -76,9 +76,6 @@ val MMApp = fc("Muon monitor") { props -> attrs { onClickFunction = { context.launch { -// val event = props.connection.get( -// "http://localhost:8080/event" -// ) val event = window.fetch( "http://localhost:8080/event", RequestInit("GET") diff --git a/demo/playground/build.gradle.kts b/demo/playground/build.gradle.kts index f06c209e..aa9e7c07 100644 --- a/demo/playground/build.gradle.kts +++ b/demo/playground/build.gradle.kts @@ -1,14 +1,13 @@ plugins { kotlin("multiplatform") + kotlin("jupyter.api") + id("com.github.johnrengelman.shadow") version "7.1.2" } -repositories{ - jcenter() - maven("https://kotlin.bintray.com/kotlinx") - maven("https://dl.bintray.com/kotlin/kotlin-eap") - maven("https://dl.bintray.com/mipt-npm/dataforge") - maven("https://dl.bintray.com/mipt-npm/kscience") - maven("https://dl.bintray.com/mipt-npm/dev") +repositories { + mavenCentral() + maven("https://jitpack.io") + maven("https://repo.kotlin.link") } kotlin { @@ -27,7 +26,8 @@ kotlin { binaries.executable() } - jvm{ + jvm { + withJava() compilations.all { kotlinOptions.jvmTarget = "11" } @@ -37,7 +37,7 @@ kotlin { } afterEvaluate { - val jsBrowserDistribution = tasks.getByName("jsBrowserDevelopmentExecutableDistribution") + val jsBrowserDistribution = tasks.getByName("jsBrowserDevelopmentExecutableDistribution") tasks.getByName("jvmProcessResources") { dependsOn(jsBrowserDistribution) @@ -59,14 +59,14 @@ kotlin { } } - val jsMain by getting{ + val jsMain by getting { dependencies { api(project(":ui:ring")) api(project(":visionforge-threejs")) } } - val jvmMain by getting{ + val jvmMain by getting { dependencies { api(project(":visionforge-server")) api("ch.qos.logback:logback-classic:1.2.3") @@ -75,3 +75,9 @@ kotlin { } } } + +tasks.withType { + libraryProducers = listOf("space.kscience.visionforge.examples.VisionForgePlayGroundForJupyter") +} + +tasks.findByName("shadowJar")?.dependsOn("processJupyterApiResources") \ No newline at end of file diff --git a/demo/jupyter-playground/src/main/kotlin/VisionForgePlayGroundForJupyter.kt b/demo/playground/src/jvmMain/kotlin/VisionForgePlayGroundForJupyter.kt similarity index 71% rename from demo/jupyter-playground/src/main/kotlin/VisionForgePlayGroundForJupyter.kt rename to demo/playground/src/jvmMain/kotlin/VisionForgePlayGroundForJupyter.kt index 5ada35ec..b820cf71 100644 --- a/demo/jupyter-playground/src/main/kotlin/VisionForgePlayGroundForJupyter.kt +++ b/demo/playground/src/jvmMain/kotlin/VisionForgePlayGroundForJupyter.kt @@ -1,12 +1,9 @@ -package playground +package space.kscience.visionforge.examples -import kotlinx.html.div -import kotlinx.html.id -import kotlinx.html.script import kotlinx.html.stream.createHTML -import kotlinx.html.unsafe import org.jetbrains.kotlinx.jupyter.api.HTML -import org.jetbrains.kotlinx.jupyter.api.libraries.* +import org.jetbrains.kotlinx.jupyter.api.libraries.JupyterIntegration +import org.jetbrains.kotlinx.jupyter.api.libraries.resources import space.kscience.dataforge.context.Context import space.kscience.dataforge.misc.DFExperimental import space.kscience.gdml.Gdml @@ -15,7 +12,7 @@ import space.kscience.visionforge.Vision import space.kscience.visionforge.gdml.toVision import space.kscience.visionforge.html.HtmlVisionFragment import space.kscience.visionforge.html.Page -import space.kscience.visionforge.html.embedVisionFragment +import space.kscience.visionforge.html.embedAndRenderVisionFragment import space.kscience.visionforge.plotly.PlotlyPlugin import space.kscience.visionforge.plotly.asVision import space.kscience.visionforge.solid.Solids @@ -29,27 +26,19 @@ public class VisionForgePlayGroundForJupyter : JupyterIntegration() { plugin(PlotlyPlugin) } - private val jsBundle = ResourceFallbacksBundle(listOf( - ResourceLocation("js/visionforge-playground.js", ResourcePathType.CLASSPATH_PATH)) - ) - private val jsResource = LibraryResource(name = "VisionForge", type = ResourceType.JS, bundles = listOf(jsBundle)) - private var counter = 0 - private fun produceHtmlVisionString(fragment: HtmlVisionFragment) = createHTML().div { - val id = "visionforge.vision[${counter++}]" - div { - this.id = id - embedVisionFragment(context.visionManager, fragment = fragment) - } - script { - type = "text/javascript" - unsafe { +"window.renderAllVisionsById(\"$id\");" } - } - } + private fun produceHtmlVisionString(fragment: HtmlVisionFragment) = createHTML().apply { + embedAndRenderVisionFragment(context.visionManager, counter++, fragment = fragment) + }.finalize() override fun Builder.onLoaded() { - resource(jsResource) + + resources { + js("VisionForge"){ + classPath("js/visionforge-playground.js") + } + } import( "space.kscience.gdml.*", diff --git a/demo/playground/src/jvmMain/kotlin/formServer.kt b/demo/playground/src/jvmMain/kotlin/formServer.kt new file mode 100644 index 00000000..bdc95017 --- /dev/null +++ b/demo/playground/src/jvmMain/kotlin/formServer.kt @@ -0,0 +1,67 @@ +package space.kscience.visionforge.examples + +import kotlinx.html.* +import space.kscience.dataforge.context.Global +import space.kscience.dataforge.context.fetch +import space.kscience.dataforge.names.asName +import space.kscience.visionforge.VisionManager +import space.kscience.visionforge.html.visionOfForm +import space.kscience.visionforge.onPropertyChange +import space.kscience.visionforge.three.server.close +import space.kscience.visionforge.three.server.openInBrowser +import space.kscience.visionforge.three.server.serve +import space.kscience.visionforge.three.server.useScript + +fun main() { + val visionManager = Global.fetch(VisionManager) + + val server = visionManager.serve { + useScript("js/visionforge-playground.js") + page { + val form = visionOfForm("form") { + label { + htmlFor = "fname" + +"First name:" + } + br() + input { + type = InputType.text + id = "fname" + name = "fname" + value = "John" + } + br() + label { + htmlFor = "lname" + +"Last name:" + } + br() + input { + type = InputType.text + id = "lname" + name = "lname" + value = "Doe" + } + br() + br() + input { + type = InputType.submit + value = "Submit" + } + } + + vision("form".asName(), form) + form.onPropertyChange { + println(this) + } + } + } + + server.openInBrowser() + + while (readln() != "exit") { + + } + + server.close() +} \ No newline at end of file diff --git a/demo/playground/src/jvmMain/kotlin/gdmCurve.kt b/demo/playground/src/jvmMain/kotlin/gdmlCurve.kt similarity index 99% rename from demo/playground/src/jvmMain/kotlin/gdmCurve.kt rename to demo/playground/src/jvmMain/kotlin/gdmlCurve.kt index cbdac68a..1a646d97 100644 --- a/demo/playground/src/jvmMain/kotlin/gdmCurve.kt +++ b/demo/playground/src/jvmMain/kotlin/gdmlCurve.kt @@ -226,7 +226,7 @@ fun main() { } } }.toVision { - configure { parent, solid, material -> + configure { _, solid, _ -> //disable visibility for the world box if(solid.name == "world"){ visible = false diff --git a/demo/playground/src/jvmMain/kotlin/generateSchema.kt b/demo/playground/src/jvmMain/kotlin/generateSchema.kt index 75c6f9cd..8331ac62 100644 --- a/demo/playground/src/jvmMain/kotlin/generateSchema.kt +++ b/demo/playground/src/jvmMain/kotlin/generateSchema.kt @@ -6,16 +6,18 @@ import kotlinx.serialization.json.Json import space.kscience.visionforge.solid.SolidGroup import space.kscience.visionforge.solid.Solids +private val json = Json { + serializersModule = Solids.serializersModuleForSolids + prettyPrintIndent = " " + prettyPrint = true + ignoreUnknownKeys = true + isLenient = true + coerceInputValues = true + encodeDefaults = true +} + @ExperimentalSerializationApi fun main() { - val schema = Json { - serializersModule = Solids.serializersModuleForSolids - prettyPrintIndent = " " - prettyPrint = true - ignoreUnknownKeys = true - isLenient = true - coerceInputValues = true - encodeDefaults = true - }.encodeToSchema(SolidGroup.serializer(), generateDefinitions = false) + val schema = json.encodeToSchema(SolidGroup.serializer(), generateDefinitions = false) println(schema) } \ No newline at end of file diff --git a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/geometry.kt b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/geometry.kt index 546c7b51..93650fb2 100644 --- a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/geometry.kt +++ b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/geometry.kt @@ -1,13 +1,11 @@ package ru.mipt.npm.sat import space.kscience.dataforge.meta.set -import space.kscience.dataforge.misc.DFExperimental import space.kscience.visionforge.solid.* import space.kscience.visionforge.style import space.kscience.visionforge.useStyle import kotlin.math.PI -@DFExperimental internal fun visionOfSatellite( layers: Int = 10, layerHeight: Number = 10, diff --git a/jupyter/visionforge-jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt b/jupyter/visionforge-jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt index f912a88f..e071ac45 100644 --- a/jupyter/visionforge-jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt +++ b/jupyter/visionforge-jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt @@ -6,7 +6,6 @@ import io.ktor.server.engine.embeddedServer import kotlinx.html.stream.createHTML import org.jetbrains.kotlinx.jupyter.api.HTML import org.jetbrains.kotlinx.jupyter.api.libraries.JupyterIntegration -import org.jetbrains.kotlinx.jupyter.api.libraries.resources import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.ContextAware import space.kscience.dataforge.meta.get @@ -53,12 +52,6 @@ public abstract class JupyterPluginBase( server = null } - resources { - js("three") { - classPath("js/gdml-jupyter.js") - } - } - import( "kotlinx.html.*", "space.kscience.visionforge.html.Page", diff --git a/settings.gradle.kts b/settings.gradle.kts index fb02e336..dc65b446 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -59,7 +59,6 @@ include( ":demo:muon-monitor", ":demo:sat-demo", ":demo:playground", - ":demo:jupyter-playground", ":demo:plotly-fx", ":demo:js-playground", ":jupyter:visionforge-jupyter-base", diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt index e9cf62bf..97c9a083 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt @@ -83,7 +83,7 @@ public val ThreeCanvasWithControls: FC = fc("Three useEffect { props.context.launch { solid = props.builderOfSolid.await().also { - it?.root(props.context.visionManager) + it?.setAsRoot(props.context.visionManager) } } } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt index 6e2e95d0..003fec79 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionBase.kt @@ -109,7 +109,7 @@ public open class VisionBase( override fun hashCode(): Int = Meta.hashCode(this) } - override val meta: ObservableMutableMeta get() = VisionProperties(Name.EMPTY) + final override val meta: ObservableMutableMeta get() = VisionProperties(Name.EMPTY) override fun getPropertyValue( name: Name, diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt index c4f18712..ad0d0d70 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt @@ -14,6 +14,17 @@ import space.kscience.dataforge.values.Null import kotlin.jvm.Synchronized import kotlin.time.Duration +/** + * Create a deep copy of given Vision without external connections. + */ +private fun Vision.deepCopy(): Vision { + //Assuming that unrooted visions are already isolated + val manager = this.manager ?: return this + //TODO replace by efficient deep copy + val json = manager.encodeToJsonElement(this) + return manager.decodeFromJson(json) +} + /** * An update for a [Vision] or a [VisionGroup] */ @@ -50,20 +61,14 @@ public class VisionChangeBuilder : VisionContainerBuilder { /** * Isolate collected changes by creating detached copies of given visions */ - public fun isolate(manager: VisionManager): VisionChange = VisionChange( + public fun deepCopy(): VisionChange = VisionChange( reset, - vision?.isolate(manager), + vision?.deepCopy(), if (propertyChange.isEmpty()) null else propertyChange.seal(), - if (children.isEmpty()) null else children.mapValues { it.value.isolate(manager) } + if (children.isEmpty()) null else children.mapValues { it.value.deepCopy() } ) } -private fun Vision.isolate(manager: VisionManager): Vision { - //TODO replace by efficient deep copy - val json = manager.encodeToJsonElement(this) - return manager.decodeFromJson(json) -} - /** * @param delete flag showing that this vision child should be removed * @param vision a new value for vision content @@ -78,8 +83,8 @@ public data class VisionChange( public val children: Map? = null, ) -public inline fun VisionChange(manager: VisionManager, block: VisionChangeBuilder.() -> Unit): VisionChange = - VisionChangeBuilder().apply(block).isolate(manager) +public inline fun VisionChange(block: VisionChangeBuilder.() -> Unit): VisionChange = + VisionChangeBuilder().apply(block).deepCopy() @OptIn(DFExperimental::class) @@ -115,9 +120,10 @@ private fun CoroutineScope.collectChange( } } -@DFExperimental +/** + * Generate a flow of changes of this vision and its children + */ public fun Vision.flowChanges( - manager: VisionManager, collectionDuration: Duration, ): Flow = flow { @@ -126,7 +132,7 @@ public fun Vision.flowChanges( collectChange(Name.EMPTY, this@flowChanges) { collector } //Send initial vision state - val initialChange = VisionChange(vision = isolate(manager)) + val initialChange = VisionChange(vision = deepCopy()) emit(initialChange) while (currentCoroutineContext().isActive) { @@ -135,7 +141,7 @@ public fun Vision.flowChanges( //Propagate updates only if something is changed if (!collector.isEmpty()) { //emit changes - emit(collector.isolate(manager)) + emit(collector.deepCopy()) //Reset the collector collector = VisionChangeBuilder() } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt index e8594df2..873b5996 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt @@ -160,8 +160,9 @@ public open class VisionGroupBase( internal class RootVisionGroup(override val manager: VisionManager) : VisionGroupBase() /** - * Designate this [VisionGroup] as a root group and assign a [VisionManager] as its parent + * Designate this [VisionGroup] as a root and assign a [VisionManager] as its parent */ -public fun Vision.root(manager: VisionManager) { +public fun Vision.setAsRoot(manager: VisionManager) { + if (parent != null) error("This Vision already has a parent. It could not be set as root") parent = RootVisionGroup(manager) } \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt index ff4c29e1..118fd47c 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt @@ -13,6 +13,10 @@ import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.toJson import space.kscience.dataforge.meta.toMeta import space.kscience.dataforge.names.Name +import space.kscience.visionforge.html.VisionOfCheckbox +import space.kscience.visionforge.html.VisionOfHtmlForm +import space.kscience.visionforge.html.VisionOfNumberField +import space.kscience.visionforge.html.VisionOfTextField import kotlin.reflect.KClass public class VisionManager(meta: Meta) : AbstractPlugin(meta) { @@ -66,6 +70,10 @@ public class VisionManager(meta: Meta) : AbstractPlugin(meta) { default { VisionBase.serializer() } subclass(VisionBase.serializer()) subclass(VisionGroupBase.serializer()) + subclass(VisionOfNumberField.serializer()) + subclass(VisionOfTextField.serializer()) + subclass(VisionOfCheckbox.serializer()) + subclass(VisionOfHtmlForm.serializer()) } } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt new file mode 100644 index 00000000..a3070e58 --- /dev/null +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt @@ -0,0 +1,26 @@ +package space.kscience.visionforge.html + +import kotlinx.html.FORM +import kotlinx.html.TagConsumer +import kotlinx.html.form +import kotlinx.html.id +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.node + +@Serializable +@SerialName("html.form") +public class VisionOfHtmlForm( + public val formId: String, +) : VisionOfHtmlInput() { + public var values: Meta? by meta.node() +} + +public inline fun TagConsumer.visionOfForm(id: String, crossinline builder: FORM.() -> Unit): VisionOfHtmlForm { + form { + this.id = id + builder() + } + return VisionOfHtmlForm(id) +} \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlInput.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlInput.kt new file mode 100644 index 00000000..084c5b6b --- /dev/null +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlInput.kt @@ -0,0 +1,53 @@ +package space.kscience.visionforge.html + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import space.kscience.dataforge.meta.boolean +import space.kscience.dataforge.meta.number +import space.kscience.dataforge.meta.string +import space.kscience.visionforge.VisionBase + +@Serializable +public abstract class VisionOfHtmlInput : VisionBase() { + public var disabled: Boolean by meta.boolean(false) +} + +@Serializable +@SerialName("html.text") +public class VisionOfTextField( + public val label: String? = null, + public val name: String? = null, +) : VisionOfHtmlInput() { + public var text: String? by meta.string() +} + +@Serializable +@SerialName("html.checkbox") +public class VisionOfCheckbox( + public val label: String? = null, + public val name: String? = null, +) : VisionOfHtmlInput() { + public var checked: Boolean? by meta.boolean() +} + +@Serializable +@SerialName("html.number") +public class VisionOfNumberField( + public val label: String? = null, + public val name: String? = null, +) : VisionOfHtmlInput() { + public var value: Number? by meta.number() +} + +@Serializable +@SerialName("html.range") +public class VisionOfRangeField( + public val min: Double, + public val max: Double, + public val step: Double = 1.0, + public val label: String? = null, + public val name: String? = null, +) : VisionOfHtmlInput() { + public var value: Number? by meta.number() +} + diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt index 27725721..c047222b 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt @@ -11,7 +11,7 @@ import space.kscience.dataforge.names.NameToken import space.kscience.dataforge.names.asName import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionManager -import space.kscience.visionforge.root +import space.kscience.visionforge.setAsRoot import kotlin.collections.set @DslMarker @@ -81,11 +81,11 @@ public abstract class VisionTagConsumer( @OptIn(DFExperimental::class) public inline fun TagConsumer.vision( name: Name, - visionProvider: VisionOutput.() -> Vision, + @OptIn(DFExperimental::class) visionProvider: VisionOutput.() -> Vision, ): T { val output = VisionOutput(manager) val vision = output.visionProvider() - vision.root(manager) + vision.setAsRoot(manager) return vision(name, vision, output.meta) } diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/ElementVisionRenderer.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/ElementVisionRenderer.kt new file mode 100644 index 00000000..bf9f00df --- /dev/null +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/ElementVisionRenderer.kt @@ -0,0 +1,74 @@ +package space.kscience.visionforge + +import kotlinx.dom.clear +import kotlinx.html.TagConsumer +import kotlinx.html.dom.append +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.InternalSerializationApi +import kotlinx.serialization.serializerOrNull +import org.w3c.dom.Element +import org.w3c.dom.HTMLElement +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.misc.Named +import space.kscience.dataforge.misc.Type +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.asName +import space.kscience.dataforge.names.parseAsName +import kotlin.reflect.KClass +import kotlin.reflect.cast + +/** + * A browser renderer for a [Vision]. + */ +@Type(ElementVisionRenderer.TYPE) +public interface ElementVisionRenderer : Named { + + /** + * Give a [vision] integer rating based on this renderer capabilities. [ZERO_RATING] or negative values means that this renderer + * can't process a vision. The value of [DEFAULT_RATING] used for default renderer. Specialized renderers could specify + * higher value in order to "steal" rendering job + */ + public fun rateVision(vision: Vision): Int + + /** + * Display the [vision] inside a given [element] replacing its current content. + * @param meta additional parameters for rendering container + */ + public fun render(element: Element, vision: Vision, meta: Meta = Meta.EMPTY) + + public companion object { + public const val TYPE: String = "elementVisionRenderer" + public const val ZERO_RATING: Int = 0 + public const val DEFAULT_RATING: Int = 10 + } +} + +/** + * A browser renderer for element of given type + */ +public class SingleTypeVisionRenderer( + public val kClass: KClass, + private val acceptRating: Int = ElementVisionRenderer.DEFAULT_RATING, + private val renderFunction: TagConsumer.(vision: T, meta: Meta) -> Unit, +) : ElementVisionRenderer { + + @OptIn(InternalSerializationApi::class, ExperimentalSerializationApi::class) + override val name: Name + get() = kClass.serializerOrNull()?.descriptor?.serialName?.parseAsName() + ?: kClass.toString().asName() + + override fun rateVision(vision: Vision): Int = + if (vision::class == kClass) acceptRating else ElementVisionRenderer.ZERO_RATING + + override fun render(element: Element, vision: Vision, meta: Meta) { + element.clear() + element.append { + renderFunction(kClass.cast(vision), meta) + } + } +} + +public inline fun ElementVisionRenderer( + acceptRating: Int = ElementVisionRenderer.DEFAULT_RATING, + noinline renderFunction: TagConsumer.(vision: T, meta: Meta) -> Unit, +): ElementVisionRenderer = SingleTypeVisionRenderer(T::class, acceptRating, renderFunction) diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt index 60f7a627..c236a19d 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt @@ -10,6 +10,9 @@ import org.w3c.dom.url.URL import space.kscience.dataforge.context.* import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.MetaSerializer +import space.kscience.dataforge.meta.get +import space.kscience.dataforge.meta.int +import space.kscience.dataforge.names.Name import space.kscience.visionforge.html.RENDER_FUNCTION_NAME import space.kscience.visionforge.html.VisionTagConsumer import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_CONNECT_ATTRIBUTE @@ -19,6 +22,9 @@ import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_NAME_A import kotlin.reflect.KClass import kotlin.time.Duration.Companion.milliseconds +/** + * A Kotlin-browser plugin that renders visions based on provided renderers and governs communication with the server. + */ public class VisionClient : AbstractPlugin() { override val tag: PluginTag get() = Companion.tag private val visionManager: VisionManager by require(VisionManager) @@ -102,10 +108,12 @@ public class VisionClient : AbstractPlugin() { //Backward change propagation var feedbackJob: Job? = null + //Feedback changes aggregation time in milliseconds + val feedbackAggregationTime = meta["aggregationTime"]?.int ?: 300 + onopen = { feedbackJob = vision.flowChanges( - visionManager, - 300.milliseconds + feedbackAggregationTime.milliseconds ).onEach { change -> send(visionManager.encodeToString(change)) }.launchIn(visionManager.context) @@ -180,6 +188,12 @@ public class VisionClient : AbstractPlugin() { } } + override fun content(target: String): Map = if (target == ElementVisionRenderer.TYPE) mapOf( + numberVisionRenderer.name to numberVisionRenderer, + textVisionRenderer.name to textVisionRenderer, + formVisionRenderer.name to formVisionRenderer + ) else super.content(target) + public companion object : PluginFactory { override fun invoke(meta: Meta, context: Context): VisionClient = VisionClient() diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/elementOutput.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/elementOutput.kt deleted file mode 100644 index f85fdabb..00000000 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/elementOutput.kt +++ /dev/null @@ -1,27 +0,0 @@ -package space.kscience.visionforge - -import org.w3c.dom.Element -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.misc.Type - -@Type(ElementVisionRenderer.TYPE) -public interface ElementVisionRenderer { - - /** - * Give a [vision] integer rating based on this renderer capabilities. [ZERO_RATING] or negative values means that this renderer - * can't process a vision. The value of [DEFAULT_RATING] used for default renderer. Specialized renderers could specify - * higher value in order to "steal" rendering job - */ - public fun rateVision(vision: Vision): Int - - /** - * Display the [vision] inside a given [element] replacing its current content - */ - public fun render(element: Element, vision: Vision, meta: Meta = Meta.EMPTY) - - public companion object { - public const val TYPE: String = "elementVisionRenderer" - public const val ZERO_RATING: Int = 0 - public const val DEFAULT_RATING: Int = 10 - } -} \ No newline at end of file diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt new file mode 100644 index 00000000..0d67a821 --- /dev/null +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt @@ -0,0 +1,101 @@ +package space.kscience.visionforge + +import kotlinx.browser.document +import kotlinx.html.InputType +import kotlinx.html.js.input +import kotlinx.html.js.label +import kotlinx.html.js.onChangeFunction +import org.w3c.dom.HTMLFormElement +import org.w3c.dom.HTMLInputElement +import org.w3c.dom.get +import org.w3c.xhr.FormData +import space.kscience.dataforge.meta.DynamicMeta +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.valueSequence +import space.kscience.visionforge.html.VisionOfHtmlForm +import space.kscience.visionforge.html.VisionOfNumberField +import space.kscience.visionforge.html.VisionOfTextField + +public val textVisionRenderer: ElementVisionRenderer = ElementVisionRenderer { vision, _ -> + val name = vision.name ?: "input[${vision.hashCode().toUInt()}]" + vision.label?.let { + label { + htmlFor = name + +it + } + } + input { + type = InputType.text + this.name = name + vision.useProperty(VisionOfTextField::text) { + value = it ?: "" + } + onChangeFunction = { + vision.text = value + } + } +} + +public val numberVisionRenderer: ElementVisionRenderer = ElementVisionRenderer { vision, _ -> + val name = vision.name ?: "input[${vision.hashCode().toUInt()}]" + vision.label?.let { + label { + htmlFor = name + +it + } + } + input { + type = InputType.text + this.name = name + vision.useProperty(VisionOfNumberField::value) { + value = it?.toDouble() ?: 0.0 + } + onChangeFunction = { + vision.value = value.toDoubleOrNull() + } + } +} + +internal fun FormData.toMeta(): Meta { + @Suppress("UNUSED_VARIABLE") val formData = this + //val res = js("Object.fromEntries(formData);") + val `object` = js("{}") + //language=JavaScript + js(""" + formData.forEach(function(value, key){ + // Reflect.has in favor of: object.hasOwnProperty(key) + if(!Reflect.has(object, key)){ + object[key] = value; + return; + } + if(!Array.isArray(object[key])){ + object[key] = [object[key]]; + } + object[key].push(value); + }); + """) + return DynamicMeta(`object`) +} + +public val formVisionRenderer: ElementVisionRenderer = ElementVisionRenderer { vision, _ -> + + val form = document.getElementById(vision.formId) as? HTMLFormElement + ?: error("An element with id = '${vision.formId} is not a form") + + console.info("Adding hooks to form '$form'") + + vision.useProperty(VisionOfHtmlForm::values) { values -> + val inputs = form.getElementsByTagName("input") + values?.valueSequence()?.forEach { (token, value) -> + (inputs[token.toString()] as? HTMLInputElement)?.value = value.toString() + } + } + + form.onsubmit = { event -> + event.preventDefault() + val formData = FormData(form).toMeta() + console.log(formData.toString()) + vision.values = formData + false + } +} \ No newline at end of file diff --git a/visionforge-core/src/jsTest/kotlin/space/kscience/visionforge/FormTest.kt b/visionforge-core/src/jsTest/kotlin/space/kscience/visionforge/FormTest.kt new file mode 100644 index 00000000..58bd2b09 --- /dev/null +++ b/visionforge-core/src/jsTest/kotlin/space/kscience/visionforge/FormTest.kt @@ -0,0 +1,22 @@ +package space.kscience.visionforge + +import org.w3c.xhr.FormData +import space.kscience.dataforge.meta.get +import space.kscience.dataforge.meta.int +import space.kscience.dataforge.meta.stringList +import kotlin.test.Test +import kotlin.test.assertEquals + +class FormTest { + @Test + fun testFormConversion() { + val fd = FormData() + fd.append("a", "22") + fd.append("b", "1") + fd.append("b", "2") + val meta = fd.toMeta() + assertEquals(22, meta["a"].int) + assertEquals(listOf("1","2"), meta["b"]?.stringList) + } + +} \ No newline at end of file diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt b/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt index 82b27952..5065c765 100644 --- a/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt +++ b/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt @@ -144,7 +144,7 @@ public class VisionServer internal constructor( try { withContext(visionManager.context.coroutineContext) { - vision.flowChanges(visionManager, updateInterval.milliseconds).collect { update -> + vision.flowChanges(updateInterval.milliseconds).collect { update -> val json = visionManager.jsonFormat.encodeToString( VisionChange.serializer(), update diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt index a08085d6..26b4b40d 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt @@ -20,7 +20,7 @@ class VisionUpdateTest { val targetVision = SolidGroup { box(200,200,200, name = "origin") } - val dif = VisionChange(visionManager){ + val dif = VisionChange{ group("top") { color(123) box(100,100,100) @@ -36,7 +36,7 @@ class VisionUpdateTest { @Test fun testVisionChangeSerialization(){ - val change = VisionChange(visionManager){ + val change = VisionChange{ group("top") { color(123) box(100,100,100) From 43285de33ccd5f049fed98c45d72f4c4619af3c7 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 2 Jan 2022 14:28:24 +0300 Subject: [PATCH 092/109] Update notebooks hierarchy --- demo/playground/build.gradle.kts | 30 ++-- .../kotlin/VisionForgePlayGroundForJupyter.kt | 53 ++----- .../src/jvmMain/kotlin/formServer.kt | 4 +- .../src/jvmMain/kotlin/serverExtensions.kt | 3 +- .../build.gradle.kts | 4 +- .../src/jvmMain/kotlin/JupyterPluginBase.kt | 62 ++++++++ .../kotlin/VisionForgeServerHandler.kt | 81 +++++++++++ .../src/jvmMain/kotlin/JupyterPluginBase.kt | 77 ---------- .../visionforge-jupyter-gdml/build.gradle.kts | 9 +- .../src/jvmMain/kotlin/GdmlForJupyter.kt | 37 +---- settings.gradle.kts | 2 +- ...{HtmlVisionFragment.kt => HtmlFragment.kt} | 8 +- .../visionforge/html/HtmlVisionRenderer.kt | 88 ++++++----- .../space/kscience/visionforge/html/Page.kt | 9 +- .../visionforge/html/VisionOfHtmlForm.kt | 30 +++- .../visionforge/html/VisionTagConsumer.kt | 2 +- .../kscience/visionforge/VisionClient.kt | 2 +- .../kscience/visionforge/inputRenderers.kt | 2 +- .../visionforge/three/server/VisionServer.kt | 137 +++++++++--------- .../solid/three/MeshThreeFactory.kt | 2 +- .../visionforge/solid/three/ThreeCanvas.kt | 2 +- .../three/server/serverExtensions.kt | 4 +- 22 files changed, 343 insertions(+), 305 deletions(-) rename jupyter/{visionforge-jupyter-base => jupyter-base}/build.gradle.kts (75%) create mode 100644 jupyter/jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt create mode 100644 jupyter/jupyter-base/src/jvmMain/kotlin/VisionForgeServerHandler.kt delete mode 100644 jupyter/visionforge-jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt rename visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/{HtmlVisionFragment.kt => HtmlFragment.kt} (64%) diff --git a/demo/playground/build.gradle.kts b/demo/playground/build.gradle.kts index aa9e7c07..9a845c50 100644 --- a/demo/playground/build.gradle.kts +++ b/demo/playground/build.gradle.kts @@ -29,7 +29,10 @@ kotlin { jvm { withJava() compilations.all { - kotlinOptions.jvmTarget = "11" + kotlinOptions{ + jvmTarget = "11" + freeCompilerArgs = freeCompilerArgs + "-Xjvm-default=all" + "-Xopt-in=kotlin.RequiresOptIn" + "-Xlambdas=indy" + } } testRuns["test"].executionTask.configure { useJUnitPlatform() @@ -51,33 +54,34 @@ kotlin { sourceSets { val commonMain by getting { dependencies { - api(project(":visionforge-solid")) - api(project(":visionforge-gdml")) - api(project(":visionforge-plotly")) - api(projects.visionforge.visionforgeMarkdown) - api(projects.visionforge.cernRootLoader) + implementation(projects.visionforgeSolid) + implementation(projects.visionforgeGdml) + implementation(projects.visionforgePlotly) + implementation(projects.visionforgeMarkdown) + implementation(projects.cernRootLoader) + implementation(projects.jupyter.jupyterBase) } } val jsMain by getting { dependencies { - api(project(":ui:ring")) - api(project(":visionforge-threejs")) + implementation(projects.ui.ring) + implementation(projects.visionforgeThreejs) } } val jvmMain by getting { dependencies { - api(project(":visionforge-server")) - api("ch.qos.logback:logback-classic:1.2.3") - api("com.github.Ricky12Awesome:json-schema-serialization:0.6.6") + implementation(projects.visionforgeServer) + implementation("ch.qos.logback:logback-classic:1.2.3") + implementation("com.github.Ricky12Awesome:json-schema-serialization:0.6.6") } } } } -tasks.withType { +val processJupyterApiResources by tasks.getting(org.jetbrains.kotlinx.jupyter.api.plugin.tasks.JupyterApiResourcesTask::class){ libraryProducers = listOf("space.kscience.visionforge.examples.VisionForgePlayGroundForJupyter") } -tasks.findByName("shadowJar")?.dependsOn("processJupyterApiResources") \ No newline at end of file +tasks.findByName("shadowJar")?.dependsOn(processJupyterApiResources) \ No newline at end of file diff --git a/demo/playground/src/jvmMain/kotlin/VisionForgePlayGroundForJupyter.kt b/demo/playground/src/jvmMain/kotlin/VisionForgePlayGroundForJupyter.kt index b820cf71..6cbe311d 100644 --- a/demo/playground/src/jvmMain/kotlin/VisionForgePlayGroundForJupyter.kt +++ b/demo/playground/src/jvmMain/kotlin/VisionForgePlayGroundForJupyter.kt @@ -1,41 +1,27 @@ package space.kscience.visionforge.examples -import kotlinx.html.stream.createHTML -import org.jetbrains.kotlinx.jupyter.api.HTML -import org.jetbrains.kotlinx.jupyter.api.libraries.JupyterIntegration import org.jetbrains.kotlinx.jupyter.api.libraries.resources import space.kscience.dataforge.context.Context import space.kscience.dataforge.misc.DFExperimental import space.kscience.gdml.Gdml import space.kscience.plotly.Plot -import space.kscience.visionforge.Vision import space.kscience.visionforge.gdml.toVision -import space.kscience.visionforge.html.HtmlVisionFragment -import space.kscience.visionforge.html.Page -import space.kscience.visionforge.html.embedAndRenderVisionFragment +import space.kscience.visionforge.jupyter.JupyterPluginBase import space.kscience.visionforge.plotly.PlotlyPlugin import space.kscience.visionforge.plotly.asVision import space.kscience.visionforge.solid.Solids -import space.kscience.visionforge.visionManager @DFExperimental -public class VisionForgePlayGroundForJupyter : JupyterIntegration() { - - private val context = Context("VisionForge") { +internal class VisionForgePlayGroundForJupyter : JupyterPluginBase( + Context("VisionForge") { plugin(Solids) plugin(PlotlyPlugin) } +) { - private var counter = 0 - - private fun produceHtmlVisionString(fragment: HtmlVisionFragment) = createHTML().apply { - embedAndRenderVisionFragment(context.visionManager, counter++, fragment = fragment) - }.finalize() - - override fun Builder.onLoaded() { - + override fun Builder.afterLoaded() { resources { - js("VisionForge"){ + js("VisionForge") { classPath("js/visionforge-playground.js") } } @@ -44,41 +30,20 @@ public class VisionForgePlayGroundForJupyter : JupyterIntegration() { "space.kscience.gdml.*", "space.kscience.plotly.*", "space.kscience.plotly.models.*", - "kotlinx.html.*", "space.kscience.visionforge.solid.*", - "space.kscience.visionforge.html.Page", - "space.kscience.visionforge.html.page" ) + render { gdmlModel -> - val fragment = HtmlVisionFragment { + handler.produceHtml { vision(gdmlModel.toVision()) } - HTML(produceHtmlVisionString(fragment)) - } - - render { vision -> - val fragment = HtmlVisionFragment { - vision(vision) - } - - HTML(produceHtmlVisionString(fragment)) } render { plot -> - val fragment = HtmlVisionFragment { + handler.produceHtml { vision(plot.asVision()) } - - HTML(produceHtmlVisionString(fragment)) - } - - render { fragment -> - HTML(createHTML().apply(fragment.visit).finalize()) - } - - render { page -> - HTML(page.render(createHTML()), true) } } diff --git a/demo/playground/src/jvmMain/kotlin/formServer.kt b/demo/playground/src/jvmMain/kotlin/formServer.kt index bdc95017..c5276554 100644 --- a/demo/playground/src/jvmMain/kotlin/formServer.kt +++ b/demo/playground/src/jvmMain/kotlin/formServer.kt @@ -5,7 +5,7 @@ import space.kscience.dataforge.context.Global import space.kscience.dataforge.context.fetch import space.kscience.dataforge.names.asName import space.kscience.visionforge.VisionManager -import space.kscience.visionforge.html.visionOfForm +import space.kscience.visionforge.html.formFragment import space.kscience.visionforge.onPropertyChange import space.kscience.visionforge.three.server.close import space.kscience.visionforge.three.server.openInBrowser @@ -18,7 +18,7 @@ fun main() { val server = visionManager.serve { useScript("js/visionforge-playground.js") page { - val form = visionOfForm("form") { + val form = formFragment("form") { label { htmlFor = "fname" +"First name:" diff --git a/demo/playground/src/jvmMain/kotlin/serverExtensions.kt b/demo/playground/src/jvmMain/kotlin/serverExtensions.kt index e4111afc..6d9ff46c 100644 --- a/demo/playground/src/jvmMain/kotlin/serverExtensions.kt +++ b/demo/playground/src/jvmMain/kotlin/serverExtensions.kt @@ -9,6 +9,7 @@ import space.kscience.visionforge.html.scriptHeader import space.kscience.visionforge.makeFile import space.kscience.visionforge.three.server.VisionServer import space.kscience.visionforge.three.server.useScript +import space.kscience.visionforge.visionManager import java.awt.Desktop import java.nio.file.Path @@ -25,7 +26,7 @@ public fun Context.makeVisionFile( show: Boolean = true, content: VisionTagConsumer<*>.() -> Unit ): Unit { - val actualPath = page(title, content = content).makeFile(path) { actualPath -> + val actualPath = visionManager.page(title, content = content).makeFile(path) { actualPath -> mapOf("playground" to scriptHeader("js/visionforge-playground.js", resourceLocation, actualPath)) } if (show) Desktop.getDesktop().browse(actualPath.toFile().toURI()) diff --git a/jupyter/visionforge-jupyter-base/build.gradle.kts b/jupyter/jupyter-base/build.gradle.kts similarity index 75% rename from jupyter/visionforge-jupyter-base/build.gradle.kts rename to jupyter/jupyter-base/build.gradle.kts index 3e5f671d..0b406250 100644 --- a/jupyter/visionforge-jupyter-base/build.gradle.kts +++ b/jupyter/jupyter-base/build.gradle.kts @@ -9,12 +9,12 @@ kotlin { sourceSets { commonMain{ dependencies{ - api(projects.visionforge.visionforgeCore) + api(projects.visionforgeCore) } } jvmMain { dependencies { - implementation(project(":visionforge-server")) + api(projects.visionforgeServer) } } } diff --git a/jupyter/jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt b/jupyter/jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt new file mode 100644 index 00000000..b0422516 --- /dev/null +++ b/jupyter/jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt @@ -0,0 +1,62 @@ +package space.kscience.visionforge.jupyter + +import kotlinx.html.stream.createHTML +import org.jetbrains.kotlinx.jupyter.api.HTML +import org.jetbrains.kotlinx.jupyter.api.declare +import org.jetbrains.kotlinx.jupyter.api.libraries.JupyterIntegration +import space.kscience.dataforge.context.Context +import space.kscience.dataforge.context.ContextAware +import space.kscience.dataforge.misc.DFExperimental +import space.kscience.visionforge.Vision +import space.kscience.visionforge.html.HtmlFormFragment +import space.kscience.visionforge.html.HtmlVisionFragment +import space.kscience.visionforge.html.Page +import space.kscience.visionforge.html.fragment + +@DFExperimental +public abstract class JupyterPluginBase(final override val context: Context) : JupyterIntegration(), ContextAware { + + protected val handler: VisionForgeServerHandler = VisionForgeServerHandler(context) + + protected abstract fun Builder.afterLoaded() + + final override fun Builder.onLoaded() { + + onLoaded { + declare("visionForge" to handler) + } + + onShutdown { + handler.stopServer() + } + + import( + "kotlinx.html.*", + "space.kscience.visionforge.html.*" + ) + + + render { fragment -> + handler.produceHtml(fragment = fragment) + } + + render { vision -> + handler.produceHtml { + vision(vision) + } + + } + + render { page -> + HTML(page.render(createHTML()), true) + } + + render { fragment -> + handler.produceHtml { + fragment(fragment.formBody) + vision(fragment.vision) + } + } + afterLoaded() + } +} diff --git a/jupyter/jupyter-base/src/jvmMain/kotlin/VisionForgeServerHandler.kt b/jupyter/jupyter-base/src/jvmMain/kotlin/VisionForgeServerHandler.kt new file mode 100644 index 00000000..a01bdc43 --- /dev/null +++ b/jupyter/jupyter-base/src/jvmMain/kotlin/VisionForgeServerHandler.kt @@ -0,0 +1,81 @@ +package space.kscience.visionforge.jupyter + +import io.ktor.server.engine.ApplicationEngine +import kotlinx.html.FORM +import kotlinx.html.p +import kotlinx.html.stream.createHTML +import kotlinx.html.style +import org.jetbrains.kotlinx.jupyter.api.HTML +import org.jetbrains.kotlinx.jupyter.api.MimeTypedResult +import space.kscience.dataforge.context.Context +import space.kscience.dataforge.context.ContextAware +import space.kscience.dataforge.context.info +import space.kscience.dataforge.context.logger +import space.kscience.dataforge.meta.get +import space.kscience.dataforge.meta.int +import space.kscience.dataforge.meta.string +import space.kscience.visionforge.html.HtmlFormFragment +import space.kscience.visionforge.html.HtmlFragment +import space.kscience.visionforge.html.HtmlVisionFragment +import space.kscience.visionforge.html.visionFragment +import space.kscience.visionforge.three.server.VisionServer +import space.kscience.visionforge.three.server.serve +import space.kscience.visionforge.visionManager + +public class VisionForgeServerHandler(override val context: Context) : ContextAware { + private var counter = 0 + + private var engine: ApplicationEngine? = null + private var server: VisionServer? = null + + public var isolateFragments: Boolean = false + + public fun legacyMode() { + isolateFragments = true + } + + public fun startServer( + host: String = context.properties["visionforge.host"].string ?: "localhost", + port: Int = context.properties["visionforge.port"].int ?: VisionServer.DEFAULT_PORT, + configuration: VisionServer.() -> Unit = {}, + ): HtmlFragment { + engine?.stop(1000, 2000) + engine = context.visionManager.serve(host, port) { + configuration() + server = this + }.start() + return { + if(server!= null){ + p { + style = "color: red;" + +"Stopping current VisionForge server" + } + } + p { + style = "color: blue;" + +"Starting VisionForge server on http://$host:$port" + } + } + } + + public fun stopServer() { + engine?.apply { + logger.info { "Stopping VisionForge server" } + }?.stop(1000, 2000) + } + + private fun produceHtmlString( + fragment: HtmlVisionFragment, + ): String = server?.serveVisionsFromFragment("content[${counter++}]", fragment) + ?: createHTML().apply { + visionFragment(context.visionManager, fragment = fragment) + }.finalize() + + public fun produceHtml(isolated: Boolean? = null, fragment: HtmlVisionFragment): MimeTypedResult = + HTML(produceHtmlString(fragment), isolated ?: isolateFragments) + + public fun fragment(body: HtmlVisionFragment): MimeTypedResult = produceHtml(fragment = body) + public fun page(body: HtmlVisionFragment): MimeTypedResult = produceHtml(true, body) + + public fun form(builder: FORM.() -> Unit): HtmlFormFragment = HtmlFormFragment("form[${counter++}]", builder = builder) +} \ No newline at end of file diff --git a/jupyter/visionforge-jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt b/jupyter/visionforge-jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt deleted file mode 100644 index e071ac45..00000000 --- a/jupyter/visionforge-jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt +++ /dev/null @@ -1,77 +0,0 @@ -package space.kscience.visionforge.jupyter - -import io.ktor.server.cio.CIO -import io.ktor.server.engine.ApplicationEngine -import io.ktor.server.engine.embeddedServer -import kotlinx.html.stream.createHTML -import org.jetbrains.kotlinx.jupyter.api.HTML -import org.jetbrains.kotlinx.jupyter.api.libraries.JupyterIntegration -import space.kscience.dataforge.context.Context -import space.kscience.dataforge.context.ContextAware -import space.kscience.dataforge.meta.get -import space.kscience.dataforge.meta.int -import space.kscience.dataforge.meta.string -import space.kscience.dataforge.misc.DFExperimental -import space.kscience.visionforge.Vision -import space.kscience.visionforge.html.HtmlVisionFragment -import space.kscience.visionforge.html.Page -import space.kscience.visionforge.html.embedAndRenderVisionFragment -import space.kscience.visionforge.three.server.VisionServer -import space.kscience.visionforge.three.server.visionServer -import space.kscience.visionforge.visionManager - -private const val DEFAULT_VISIONFORGE_PORT = 88898 - -@DFExperimental -public abstract class JupyterPluginBase( - override val context: Context, -) : JupyterIntegration(), ContextAware { - - private var counter = 0 - - private fun produceHtmlVisionString(fragment: HtmlVisionFragment) = createHTML().apply { - embedAndRenderVisionFragment(context.visionManager, counter++, fragment = fragment) - }.finalize() - - private var engine: ApplicationEngine? = null - private var server: VisionServer? = null - - override fun Builder.onLoaded() { - - onLoaded { - val host = context.properties["visionforge.host"].string ?: "localhost" - val port = context.properties["visionforge.port"].int ?: DEFAULT_VISIONFORGE_PORT - engine = context.embeddedServer(CIO, port, host) { - server = visionServer(context) - }.start() - } - - onShutdown { - engine?.stop(1000, 1000) - engine = null - server = null - } - - import( - "kotlinx.html.*", - "space.kscience.visionforge.html.Page", - "space.kscience.visionforge.html.page", - ) - - render { vision -> - val server = this@JupyterPluginBase.server - if (server == null) { - HTML(produceHtmlVisionString { vision(vision) }) - } else { - val route = "route.${counter++}" - HTML(server.createHtmlAndServe(route,route, emptyList()){ - vision(vision) - }) - } - } - - render { page -> - //HTML(page.render(createHTML()), true) - } - } -} diff --git a/jupyter/visionforge-jupyter-gdml/build.gradle.kts b/jupyter/visionforge-jupyter-gdml/build.gradle.kts index c2c77516..afb08473 100644 --- a/jupyter/visionforge-jupyter-gdml/build.gradle.kts +++ b/jupyter/visionforge-jupyter-gdml/build.gradle.kts @@ -32,18 +32,19 @@ kotlin { sourceSets { commonMain { dependencies { - api(project(":visionforge-solid")) + implementation(projects.visionforgeSolid) + implementation(projects.jupyter.jupyterBase) } } jvmMain { dependencies { - implementation(project(":visionforge-gdml")) + implementation(projects.visionforgeGdml) } } jsMain { dependencies { - api(project(":visionforge-threejs")) - implementation(project(":ui:ring")) + implementation(projects.visionforgeThreejs) + implementation(projects.ui.ring) } } diff --git a/jupyter/visionforge-jupyter-gdml/src/jvmMain/kotlin/GdmlForJupyter.kt b/jupyter/visionforge-jupyter-gdml/src/jvmMain/kotlin/GdmlForJupyter.kt index 2aa1873b..9dc95d6d 100644 --- a/jupyter/visionforge-jupyter-gdml/src/jvmMain/kotlin/GdmlForJupyter.kt +++ b/jupyter/visionforge-jupyter-gdml/src/jvmMain/kotlin/GdmlForJupyter.kt @@ -1,34 +1,21 @@ package space.kscience.visionforge.gdml.jupyter -import kotlinx.html.stream.createHTML -import org.jetbrains.kotlinx.jupyter.api.HTML -import org.jetbrains.kotlinx.jupyter.api.libraries.JupyterIntegration import org.jetbrains.kotlinx.jupyter.api.libraries.resources import space.kscience.dataforge.context.Context import space.kscience.dataforge.misc.DFExperimental import space.kscience.gdml.Gdml -import space.kscience.visionforge.Vision import space.kscience.visionforge.gdml.toVision -import space.kscience.visionforge.html.HtmlVisionFragment -import space.kscience.visionforge.html.Page -import space.kscience.visionforge.html.embedAndRenderVisionFragment +import space.kscience.visionforge.jupyter.JupyterPluginBase import space.kscience.visionforge.solid.Solids -import space.kscience.visionforge.visionManager @DFExperimental -internal class GdmlForJupyter : JupyterIntegration() { - - private val context = Context("GDML") { +internal class GdmlForJupyter : JupyterPluginBase( + Context("GDML") { plugin(Solids) } +) { - private var counter = 0 - - private fun produceHtmlVisionString(fragment: HtmlVisionFragment) = createHTML().apply { - embedAndRenderVisionFragment(context.visionManager, counter++, fragment = fragment) - }.finalize() - - override fun Builder.onLoaded() { + override fun Builder.afterLoaded() { resources { js("three") { @@ -38,23 +25,11 @@ internal class GdmlForJupyter : JupyterIntegration() { import( "space.kscience.gdml.*", - "kotlinx.html.*", - "space.kscience.visionforge.solid.*", - "space.kscience.visionforge.html.Page", - "space.kscience.visionforge.html.page", "space.kscience.visionforge.gdml.jupyter.*" ) - render { vision -> - HTML(produceHtmlVisionString { vision(vision) }) - } - render { gdmlModel -> - HTML(produceHtmlVisionString { vision(gdmlModel.toVision()) }) - } - - render { page -> - HTML(page.render(createHTML()), true) + handler.produceHtml { vision(gdmlModel.toVision()) } } } } diff --git a/settings.gradle.kts b/settings.gradle.kts index dc65b446..6d3e5961 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -61,6 +61,6 @@ include( ":demo:playground", ":demo:plotly-fx", ":demo:js-playground", - ":jupyter:visionforge-jupyter-base", + ":jupyter:jupyter-base", ":jupyter:visionforge-jupyter-gdml" ) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionFragment.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlFragment.kt similarity index 64% rename from visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionFragment.kt rename to visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlFragment.kt index 9be18263..343a29ce 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionFragment.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlFragment.kt @@ -3,7 +3,6 @@ package space.kscience.visionforge.html import kotlinx.html.FlowContent import kotlinx.html.TagConsumer import kotlinx.html.stream.createHTML -import space.kscience.dataforge.misc.DFExperimental public typealias HtmlFragment = TagConsumer<*>.() -> Unit @@ -15,9 +14,4 @@ public fun TagConsumer<*>.fragment(fragment: HtmlFragment) { public fun FlowContent.fragment(fragment: HtmlFragment) { fragment(consumer) -} - -public typealias HtmlVisionFragment = VisionTagConsumer<*>.() -> Unit - -@DFExperimental -public fun HtmlVisionFragment(content: VisionTagConsumer<*>.() -> Unit): HtmlVisionFragment = content \ No newline at end of file +} \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt index 7bfe5012..6ec98684 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt @@ -6,26 +6,47 @@ import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionManager +import kotlin.random.Random +import kotlin.random.nextUInt -public fun TagConsumer<*>.embedVisionFragment( +public typealias HtmlVisionFragment = VisionTagConsumer<*>.() -> Unit + +@DFExperimental +public fun HtmlVisionFragment(content: VisionTagConsumer<*>.() -> Unit): HtmlVisionFragment = content + + +internal const val RENDER_FUNCTION_NAME = "renderAllVisionsById" + + +/** + * Render a fragment in the given consumer and return a map of extracted visions + * @param manager a VisionManager used for serialization + * @param embedData embed Vision initial state in the HTML + * @param fetchDataUrl fetch data after first render from given url + * @param fetchUpdatesUrl receive push updates from the server at given url + * @param idPrefix a prefix to be used before vision ids + * @param renderScript if true add rendering script after the fragment + */ +public fun TagConsumer<*>.visionFragment( manager: VisionManager, embedData: Boolean = true, - fetchData: String? = null, - fetchUpdates: String? = null, + fetchDataUrl: String? = null, + fetchUpdatesUrl: String? = null, idPrefix: String? = null, + renderScript: Boolean = true, fragment: HtmlVisionFragment, ): Map { val visionMap = HashMap() - val consumer = object : VisionTagConsumer(this@embedVisionFragment, manager, idPrefix) { + val consumer = object : VisionTagConsumer(this@visionFragment, manager, idPrefix) { override fun DIV.renderVision(name: Name, vision: Vision, outputMeta: Meta) { visionMap[name] = vision // Toggle update mode - fetchUpdates?.let { + fetchUpdatesUrl?.let { attributes[OUTPUT_CONNECT_ATTRIBUTE] = it } - fetchData?.let { + fetchDataUrl?.let { attributes[OUTPUT_FETCH_ATTRIBUTE] = it } @@ -40,39 +61,36 @@ public fun TagConsumer<*>.embedVisionFragment( } } } - fragment(consumer) - return visionMap -} - -public fun FlowContent.embedVisionFragment( - manager: VisionManager, - embedData: Boolean = true, - fetchDataUrl: String? = null, - fetchUpdatesUrl: String? = null, - idPrefix: String? = null, - fragment: HtmlVisionFragment, -): Map = consumer.embedVisionFragment(manager, embedData, fetchDataUrl, fetchUpdatesUrl, idPrefix, fragment) - - -internal const val RENDER_FUNCTION_NAME = "renderAllVisionsById" - -public fun TagConsumer<*>.embedAndRenderVisionFragment( - manager: VisionManager, - id: Any, - embedData: Boolean = true, - fetchData: String? = null, - fetchUpdates: String? = null, - idPrefix: String? = null, - fragment: HtmlVisionFragment, -) { - div { + if (renderScript) { + val id = "fragment[${fragment.hashCode()}/${Random.nextUInt()}]" div { - this.id = id.toString() - embedVisionFragment(manager, embedData, fetchData, fetchUpdates, idPrefix, fragment) + this.id = id + fragment(consumer) } script { type = "text/javascript" unsafe { +"window.${RENDER_FUNCTION_NAME}(\"$id\");" } } + } else { + fragment(consumer) } -} \ No newline at end of file + return visionMap +} + +public fun FlowContent.visionFragment( + manager: VisionManager, + embedData: Boolean = true, + fetchDataUrl: String? = null, + fetchUpdatesUrl: String? = null, + idPrefix: String? = null, + renderSctipt: Boolean = true, + fragment: HtmlVisionFragment, +): Map = consumer.visionFragment( + manager, + embedData, + fetchDataUrl, + fetchUpdatesUrl, + idPrefix, + renderSctipt, + fragment +) \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/Page.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/Page.kt index 6e807e92..96cae1ce 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/Page.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/Page.kt @@ -1,12 +1,11 @@ package space.kscience.visionforge.html import kotlinx.html.* -import space.kscience.dataforge.context.Context import space.kscience.dataforge.misc.DFExperimental -import space.kscience.visionforge.visionManager +import space.kscience.visionforge.VisionManager public data class Page( - public val context: Context, + public val visionManager: VisionManager, public val title: String, public val headers: Map, public val content: HtmlVisionFragment, @@ -22,14 +21,14 @@ public data class Page( title(this@Page.title) } body { - embedVisionFragment(context.visionManager, fragment = content) + visionFragment(visionManager, fragment = content) } }.finalize() } @DFExperimental -public fun Context.page( +public fun VisionManager.page( title: String = "VisionForge page", vararg headers: Pair, content: HtmlVisionFragment, diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt index a3070e58..0ef6f54e 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt @@ -7,6 +7,7 @@ import kotlinx.html.id import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.node @Serializable @@ -17,10 +18,29 @@ public class VisionOfHtmlForm( public var values: Meta? by meta.node() } -public inline fun TagConsumer.visionOfForm(id: String, crossinline builder: FORM.() -> Unit): VisionOfHtmlForm { - form { - this.id = id - builder() +public class HtmlFormFragment internal constructor( + public val vision: VisionOfHtmlForm, + public val formBody: HtmlFragment, +){ + public val values: Meta? get() = vision.values + public operator fun get(valueName: String): Meta? = values?.get(valueName) +} + +public fun HtmlFormFragment(id: String? = null, builder: FORM.() -> Unit): HtmlFormFragment { + val realId = id ?: "form[${builder.hashCode().toUInt()}]" + return HtmlFormFragment(VisionOfHtmlForm(realId)) { + form { + this.id = realId + builder() + } } - return VisionOfHtmlForm(id) +} + +public fun TagConsumer.formFragment( + id: String? = null, + builder: FORM.() -> Unit, +): VisionOfHtmlForm { + val formFragment = HtmlFormFragment(id, builder) + fragment(formFragment.formBody) + return formFragment.vision } \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt index c047222b..c9bd6857 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt @@ -42,7 +42,7 @@ public abstract class VisionTagConsumer( private val idPrefix: String? = null, ) : TagConsumer by root { - public open fun resolveId(name: Name): String = (idPrefix ?: "output:") + name.toString() + public open fun resolveId(name: Name): String = (idPrefix ?: "output") + "[$name]" /** * Render a vision inside the output fragment diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt index c236a19d..2bd6dc84 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt @@ -164,7 +164,7 @@ public class VisionClient : AbstractPlugin() { val endpoint = resolveEndpoint(element) logger.info { "Vision server is resolved to $endpoint" } URL(endpoint).apply { - pathname += "/vision" + pathname += "/data" } } else { URL(attr.value) diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt index 0d67a821..c6d87b19 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt @@ -94,7 +94,7 @@ public val formVisionRenderer: ElementVisionRenderer = ElementVisionRenderer event.preventDefault() val formData = FormData(form).toMeta() - console.log(formData.toString()) + //console.log(formData.toString()) vision.values = formData false } diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt b/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt index 5065c765..b5b78ba0 100644 --- a/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt +++ b/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt @@ -4,12 +4,10 @@ import io.ktor.application.* import io.ktor.features.CORS import io.ktor.features.CallLogging import io.ktor.html.respondHtml -import io.ktor.http.ContentType -import io.ktor.http.HttpStatusCode +import io.ktor.http.* import io.ktor.http.cio.websocket.Frame import io.ktor.http.content.resources import io.ktor.http.content.static -import io.ktor.http.withCharset import io.ktor.response.respond import io.ktor.response.respondText import io.ktor.routing.* @@ -25,8 +23,6 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import kotlinx.html.* import kotlinx.html.stream.createHTML -import space.kscience.dataforge.context.Context -import space.kscience.dataforge.context.fetch import space.kscience.dataforge.meta.* import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name @@ -34,7 +30,10 @@ import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionChange import space.kscience.visionforge.VisionManager import space.kscience.visionforge.flowChanges -import space.kscience.visionforge.html.* +import space.kscience.visionforge.html.HtmlFragment +import space.kscience.visionforge.html.HtmlVisionFragment +import space.kscience.visionforge.html.fragment +import space.kscience.visionforge.html.visionFragment import space.kscience.visionforge.three.server.VisionServer.Companion.DEFAULT_PAGE import java.awt.Desktop import java.net.URI @@ -43,12 +42,13 @@ import kotlin.time.Duration.Companion.milliseconds /** * A ktor plugin container with given [routing] + * @param serverUrl a server url including root route */ public class VisionServer internal constructor( private val visionManager: VisionManager, - private val application: Application, - private val rootRoute: String, -) : Configurable, CoroutineScope by application { + private val serverUrl: Url, + private val root: Route, +) : Configurable, CoroutineScope by root.application { override val meta: ObservableMutableMeta = MutableMeta() /** @@ -74,7 +74,7 @@ public class VisionServer internal constructor( /** * Connect to server to get pushes. The address of the server is embedded in the tag. Default: `true` */ - public var dataConnect: Boolean by meta.boolean(true, Name.parse("data.connect")) + public var dataUpdate: Boolean by meta.boolean(true, Name.parse("data.update")) /** * a list of headers that should be applied to all pages @@ -90,6 +90,7 @@ public class VisionServer internal constructor( private fun HTML.visionPage( title: String, + pagePath: String, headers: List, visionFragment: HtmlVisionFragment, ): Map { @@ -106,11 +107,10 @@ public class VisionServer internal constructor( } body { //Load the fragment and remember all loaded visions - visionMap = embedVisionFragment( + visionMap = visionFragment( manager = visionManager, embedData = true, - fetchDataUrl = VisionTagConsumer.AUTO_DATA_ATTRIBUTE, - fetchUpdatesUrl = VisionTagConsumer.AUTO_DATA_ATTRIBUTE, + fetchUpdatesUrl = "$serverUrl$pagePath/ws", fragment = visionFragment ) } @@ -122,7 +122,7 @@ public class VisionServer internal constructor( * Server a map of visions without providing explicit html page for them */ @OptIn(DFExperimental::class) - internal fun serveVisions(route: Route, visions: Map): Unit = route { + private fun serveVisions(route: Route, visions: Map): Unit = route { application.log.info("Serving visions $visions at $route") //Update websocket @@ -157,7 +157,7 @@ public class VisionServer internal constructor( } } //Plots in their json representation - get("vision") { + get("data") { val name: String = call.request.queryParameters["name"] ?: error("Vision name is not defined in parameters") @@ -174,47 +174,40 @@ public class VisionServer internal constructor( } } - /** - * Create a static html page and serve visions produced in the process - */ - @DFExperimental - public fun createHtmlAndServe( - route: String, - title: String, - headers: List, - visionFragment: HtmlVisionFragment, - ): String { - val htmlString = createHTML().apply { - html { - visionPage(title, headers, visionFragment).also { - serveVisions(route, it) - } - } - }.finalize() - - return htmlString - } /** * Serve visions in a given [route] without providing a page template */ public fun serveVisions(route: String, visions: Map): Unit { - application.routing { - route(rootRoute) { - route(route) { - serveVisions(this, visions) - } - } + root.route(route) { + serveVisions(this, visions) } } /** - * Serve a page, potentially containing any number of visions at a given [route] with given [headers]. + * Compile a fragment to string and serve visions from it + */ + public fun serveVisionsFromFragment( + route: String, + fragment: HtmlVisionFragment, + ): String = createHTML().apply { + val visions = visionFragment( + visionManager, + embedData = true, + fetchUpdatesUrl = "$serverUrl$route/ws", + renderScript = true, + fragment = fragment + ) + serveVisions(route, visions) + }.finalize() + + /** + * Serve a page, potentially containing any number of visions at a given [pagePath] with given [headers]. * */ public fun page( - route: String = DEFAULT_PAGE, - title: String = "VisionForge server page '$route'", + pagePath: String = DEFAULT_PAGE, + title: String = "VisionForge server page '$pagePath'", headers: List = emptyList(), visionFragment: HtmlVisionFragment, ) { @@ -223,35 +216,34 @@ public class VisionServer internal constructor( val cachedHtml: String? = if (cacheFragments) { //Create and cache page html and map of visions createHTML(true).html { - visions.putAll(visionPage(title, headers, visionFragment)) + visions.putAll(visionPage(title, pagePath, headers, visionFragment)) } } else { null } - application.routing { - route(rootRoute) { - route(route) { - serveVisions(this, visions) - //filled pages - get { - if (cachedHtml == null) { - //re-create html and vision list on each call - call.respondHtml { - visions.clear() - visions.putAll(visionPage(title, headers, visionFragment)) - } - } else { - //Use cached html - call.respondText(cachedHtml, ContentType.Text.Html.withCharset(Charsets.UTF_8)) - } + root.route(pagePath) { + serveVisions(this, visions) + //filled pages + get { + if (cachedHtml == null) { + //re-create html and vision list on each call + call.respondHtml { + visions.clear() + visions.putAll(visionPage(title, pagePath, headers, visionFragment)) } + } else { + //Use cached html + call.respondText(cachedHtml, ContentType.Text.Html.withCharset(Charsets.UTF_8)) } } } + + } public companion object { + public const val DEFAULT_PORT: Int = 7777 public const val DEFAULT_PAGE: String = "/" public val UPDATE_INTERVAL_KEY: Name = Name.parse("update.interval") } @@ -286,7 +278,11 @@ public inline fun VisionServer.useCss(href: String, crossinline block: LINK.() - /** * Attach VisionForge server application to given server */ -public fun Application.visionServer(context: Context, route: String = DEFAULT_PAGE): VisionServer { +public fun Application.visionServer( + visionManager: VisionManager, + webServerUrl: Url, + path: String = DEFAULT_PAGE, +): VisionServer { if (featureOrNull(WebSockets) == null) { install(WebSockets) } @@ -301,17 +297,15 @@ public fun Application.visionServer(context: Context, route: String = DEFAULT_PA install(CallLogging) } - val visionManager = context.fetch(VisionManager) + val serverRoute = (featureOrNull(Routing) ?: install(Routing)).createRouteFromPath(path) - routing { - route(route) { - static { - resources() - } + serverRoute { + static { + resources() } } - return VisionServer(visionManager, this, route) + return VisionServer(visionManager, webServerUrl.copy(encodedPath = path), serverRoute) } /** @@ -319,10 +313,11 @@ public fun Application.visionServer(context: Context, route: String = DEFAULT_PA */ public fun VisionManager.serve( host: String = "localhost", - port: Int = 7777, + port: Int = VisionServer.DEFAULT_PORT, block: VisionServer.() -> Unit, ): ApplicationEngine = context.embeddedServer(CIO, port, host) { - visionServer(context).apply(block) + val url = URLBuilder(host = host, port = port).build() + visionServer(this@serve, url).apply(block) }.start() /** diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt index 8b1428ec..1d5fd3d9 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/MeshThreeFactory.kt @@ -47,7 +47,7 @@ public abstract class MeshThreeFactory( obj.onPropertyChange { name -> when { name.startsWith(Solid.GEOMETRY_KEY) -> { - val oldGeometry = mesh.geometry as BufferGeometry + val oldGeometry = mesh.geometry val newGeometry = buildGeometry(obj) oldGeometry.attributes = newGeometry.attributes //mesh.applyWireFrame(obj) diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt index d715a20f..ef9944e0 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt @@ -53,7 +53,7 @@ public class ThreeCanvas( private val mousePosition: Vector2 = Vector2() private val scene: Scene = Scene().apply { - options.useProperty(Canvas3DOptions::axes, this) { axesConfig -> + options.useProperty(Canvas3DOptions::axes, this) { getObjectByName(AXES_NAME)?.let { remove(it) } val axesObject = AxesHelper(axes.size.toInt()).apply { visible = axes.visible } axesObject.name = AXES_NAME diff --git a/visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/server/serverExtensions.kt b/visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/server/serverExtensions.kt index 94034547..d6656c46 100644 --- a/visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/server/serverExtensions.kt +++ b/visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/server/serverExtensions.kt @@ -1,7 +1,7 @@ package space.kscience.visionforge.three.server -import space.kscience.dataforge.context.Context import space.kscience.dataforge.misc.DFExperimental +import space.kscience.visionforge.VisionManager import space.kscience.visionforge.html.HtmlVisionFragment import space.kscience.visionforge.html.ResourceLocation import space.kscience.visionforge.html.page @@ -16,7 +16,7 @@ public fun VisionServer.useThreeJs(): Unit { } @DFExperimental -public fun Context.makeThreeJsFile( +public fun VisionManager.makeThreeJsFile( content: HtmlVisionFragment, path: Path? = null, title: String = "VisionForge page", From bf5d47fd0e934a82e6e21b9dc1b74819ad453f8d Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 2 Jan 2022 19:43:31 +0300 Subject: [PATCH 093/109] remove production build from intermediate libraries --- demo/playground/build.gradle.kts | 28 +++++++++++++-------------- visionforge-gdml/build.gradle.kts | 7 +++++-- visionforge-markdown/build.gradle.kts | 22 +-------------------- visionforge-plotly/build.gradle.kts | 15 +------------- visionforge-threejs/build.gradle.kts | 6 ++++++ 5 files changed, 26 insertions(+), 52 deletions(-) diff --git a/demo/playground/build.gradle.kts b/demo/playground/build.gradle.kts index 9a845c50..8bad3769 100644 --- a/demo/playground/build.gradle.kts +++ b/demo/playground/build.gradle.kts @@ -29,9 +29,10 @@ kotlin { jvm { withJava() compilations.all { - kotlinOptions{ + kotlinOptions { jvmTarget = "11" - freeCompilerArgs = freeCompilerArgs + "-Xjvm-default=all" + "-Xopt-in=kotlin.RequiresOptIn" + "-Xlambdas=indy" + freeCompilerArgs = + freeCompilerArgs + "-Xjvm-default=all" + "-Xopt-in=kotlin.RequiresOptIn" + "-Xlambdas=indy" } } testRuns["test"].executionTask.configure { @@ -39,18 +40,6 @@ kotlin { } } - afterEvaluate { - val jsBrowserDistribution = tasks.getByName("jsBrowserDevelopmentExecutableDistribution") - - tasks.getByName("jvmProcessResources") { - dependsOn(jsBrowserDistribution) - afterEvaluate { - from(jsBrowserDistribution) - } - } - } - - sourceSets { val commonMain by getting { dependencies { @@ -80,7 +69,16 @@ kotlin { } } -val processJupyterApiResources by tasks.getting(org.jetbrains.kotlinx.jupyter.api.plugin.tasks.JupyterApiResourcesTask::class){ +val jsBrowserDistribution = tasks.getByName("jsBrowserDistribution") + +tasks.getByName("jvmProcessResources") { + dependsOn(jsBrowserDistribution) + from(jsBrowserDistribution) { + exclude("**/*.js.map") + } +} + +val processJupyterApiResources by tasks.getting(org.jetbrains.kotlinx.jupyter.api.plugin.tasks.JupyterApiResourcesTask::class) { libraryProducers = listOf("space.kscience.visionforge.examples.VisionForgePlayGroundForJupyter") } diff --git a/visionforge-gdml/build.gradle.kts b/visionforge-gdml/build.gradle.kts index 7ad37466..98a474ec 100644 --- a/visionforge-gdml/build.gradle.kts +++ b/visionforge-gdml/build.gradle.kts @@ -3,10 +3,13 @@ plugins { } kotlin { + js{ + binaries.library() + } sourceSets { - val commonMain by getting { + commonMain{ dependencies { - api(project(":visionforge-solid")) + api(projects.visionforgeSolid) api("space.kscience:gdml:0.4.0") } } diff --git a/visionforge-markdown/build.gradle.kts b/visionforge-markdown/build.gradle.kts index 210e4ee8..1a8e4efd 100644 --- a/visionforge-markdown/build.gradle.kts +++ b/visionforge-markdown/build.gradle.kts @@ -10,27 +10,7 @@ kscience { kotlin { js { - //binaries.library() - binaries.executable() - browser { - webpackTask { - outputFileName = "js/visionforge-markdown.js" - } - } - } - - jvm { - val processResourcesTaskName = - compilations[org.jetbrains.kotlin.gradle.plugin.KotlinCompilation.MAIN_COMPILATION_NAME] - .processResourcesTaskName - } - - - val jsBrowserDistribution by tasks.getting - - tasks.getByName("jvmProcessResources") { - dependsOn(jsBrowserDistribution) - from(jsBrowserDistribution) + binaries.library() } sourceSets { diff --git a/visionforge-plotly/build.gradle.kts b/visionforge-plotly/build.gradle.kts index b0b5a9c2..caeb4e52 100644 --- a/visionforge-plotly/build.gradle.kts +++ b/visionforge-plotly/build.gradle.kts @@ -10,20 +10,7 @@ kscience { kotlin { js { - //binaries.library() - binaries.executable() - browser { - webpackTask { - this.outputFileName = "js/visionforge-three.js" - } - } - } - - val jsBrowserDistribution by tasks.getting - - tasks.getByName("jvmProcessResources") { - dependsOn(jsBrowserDistribution) - from(jsBrowserDistribution) + binaries.library() } sourceSets { diff --git a/visionforge-threejs/build.gradle.kts b/visionforge-threejs/build.gradle.kts index 37b8772f..5ae86f41 100644 --- a/visionforge-threejs/build.gradle.kts +++ b/visionforge-threejs/build.gradle.kts @@ -2,6 +2,12 @@ plugins { id("ru.mipt.npm.gradle.js") } +kotlin{ + js{ + binaries.library() + } +} + dependencies { api(project(":visionforge-solid")) implementation(npm("three", "0.130.1")) From 59e939a17573ed8dbc1f92f48c38994f474032e2 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 2 Jan 2022 22:02:55 +0300 Subject: [PATCH 094/109] Minor logging update --- .../src/jvmMain/kotlin/JupyterPluginBase.kt | 23 +++++++---- ...erHandler.kt => VisionForgeForNotebook.kt} | 38 +++++++++++-------- visionforge-gdml/build.gradle.kts | 8 +--- 3 files changed, 40 insertions(+), 29 deletions(-) rename jupyter/jupyter-base/src/jvmMain/kotlin/{VisionForgeServerHandler.kt => VisionForgeForNotebook.kt} (78%) diff --git a/jupyter/jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt b/jupyter/jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt index b0422516..4eb4c9f7 100644 --- a/jupyter/jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt +++ b/jupyter/jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt @@ -1,6 +1,8 @@ package space.kscience.visionforge.jupyter +import kotlinx.html.p import kotlinx.html.stream.createHTML +import kotlinx.html.style import org.jetbrains.kotlinx.jupyter.api.HTML import org.jetbrains.kotlinx.jupyter.api.declare import org.jetbrains.kotlinx.jupyter.api.libraries.JupyterIntegration @@ -8,22 +10,19 @@ import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.ContextAware import space.kscience.dataforge.misc.DFExperimental import space.kscience.visionforge.Vision -import space.kscience.visionforge.html.HtmlFormFragment -import space.kscience.visionforge.html.HtmlVisionFragment -import space.kscience.visionforge.html.Page -import space.kscience.visionforge.html.fragment +import space.kscience.visionforge.html.* @DFExperimental public abstract class JupyterPluginBase(final override val context: Context) : JupyterIntegration(), ContextAware { - protected val handler: VisionForgeServerHandler = VisionForgeServerHandler(context) + protected val handler: VisionForgeForNotebook = VisionForgeForNotebook(context) protected abstract fun Builder.afterLoaded() final override fun Builder.onLoaded() { onLoaded { - declare("visionForge" to handler) + declare("VisionForge" to handler, "vf" to handler) } onShutdown { @@ -35,6 +34,9 @@ public abstract class JupyterPluginBase(final override val context: Context) : J "space.kscience.visionforge.html.*" ) + render { fragment -> + handler.produceHtml(fragment = fragment) + } render { fragment -> handler.produceHtml(fragment = fragment) @@ -53,10 +55,17 @@ public abstract class JupyterPluginBase(final override val context: Context) : J render { fragment -> handler.produceHtml { + if (!handler.isServerRunning()) { + p { + style = "color: red;" + +"The server is not running. Forms are not interactive. Start server with `VisionForge.startServer()." + } + } fragment(fragment.formBody) vision(fragment.vision) } } + afterLoaded() } -} +} \ No newline at end of file diff --git a/jupyter/jupyter-base/src/jvmMain/kotlin/VisionForgeServerHandler.kt b/jupyter/jupyter-base/src/jvmMain/kotlin/VisionForgeForNotebook.kt similarity index 78% rename from jupyter/jupyter-base/src/jvmMain/kotlin/VisionForgeServerHandler.kt rename to jupyter/jupyter-base/src/jvmMain/kotlin/VisionForgeForNotebook.kt index a01bdc43..8b17bc82 100644 --- a/jupyter/jupyter-base/src/jvmMain/kotlin/VisionForgeServerHandler.kt +++ b/jupyter/jupyter-base/src/jvmMain/kotlin/VisionForgeForNotebook.kt @@ -2,6 +2,7 @@ package space.kscience.visionforge.jupyter import io.ktor.server.engine.ApplicationEngine import kotlinx.html.FORM +import kotlinx.html.TagConsumer import kotlinx.html.p import kotlinx.html.stream.createHTML import kotlinx.html.style @@ -15,14 +16,16 @@ import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.int import space.kscience.dataforge.meta.string import space.kscience.visionforge.html.HtmlFormFragment -import space.kscience.visionforge.html.HtmlFragment import space.kscience.visionforge.html.HtmlVisionFragment import space.kscience.visionforge.html.visionFragment import space.kscience.visionforge.three.server.VisionServer import space.kscience.visionforge.three.server.serve import space.kscience.visionforge.visionManager -public class VisionForgeServerHandler(override val context: Context) : ContextAware { +/** + * A handler class that includes a server and common utilities + */ +public class VisionForgeForNotebook(override val context: Context) : ContextAware { private var counter = 0 private var engine: ApplicationEngine? = null @@ -34,27 +37,31 @@ public class VisionForgeServerHandler(override val context: Context) : ContextAw isolateFragments = true } + public fun isServerRunning(): Boolean = server != null + + public fun html(block: TagConsumer<*>.() -> Unit): MimeTypedResult = HTML(createHTML().apply(block).finalize()) + public fun startServer( host: String = context.properties["visionforge.host"].string ?: "localhost", port: Int = context.properties["visionforge.port"].int ?: VisionServer.DEFAULT_PORT, configuration: VisionServer.() -> Unit = {}, - ): HtmlFragment { + ): MimeTypedResult = html { + if (server != null) { + p { + style = "color: red;" + +"Stopping current VisionForge server" + } + } + engine?.stop(1000, 2000) engine = context.visionManager.serve(host, port) { configuration() server = this }.start() - return { - if(server!= null){ - p { - style = "color: red;" - +"Stopping current VisionForge server" - } - } - p { - style = "color: blue;" - +"Starting VisionForge server on http://$host:$port" - } + + p { + style = "color: blue;" + +"Starting VisionForge server on http://$host:$port" } } @@ -77,5 +84,6 @@ public class VisionForgeServerHandler(override val context: Context) : ContextAw public fun fragment(body: HtmlVisionFragment): MimeTypedResult = produceHtml(fragment = body) public fun page(body: HtmlVisionFragment): MimeTypedResult = produceHtml(true, body) - public fun form(builder: FORM.() -> Unit): HtmlFormFragment = HtmlFormFragment("form[${counter++}]", builder = builder) + public fun form(builder: FORM.() -> Unit): HtmlFormFragment = + HtmlFormFragment("form[${counter++}]", builder = builder) } \ No newline at end of file diff --git a/visionforge-gdml/build.gradle.kts b/visionforge-gdml/build.gradle.kts index 98a474ec..bfe711c8 100644 --- a/visionforge-gdml/build.gradle.kts +++ b/visionforge-gdml/build.gradle.kts @@ -14,10 +14,4 @@ kotlin { } } } -} - -//tasks{ -// val jsBrowserWebpack by getting(KotlinWebpack::class) { -// sourceMaps = false -// } -//} \ No newline at end of file +} \ No newline at end of file From 6d5c00f88b4d3077c987c9ad3bd833a2fd98f1fe Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 7 Jan 2022 12:29:43 +0300 Subject: [PATCH 095/109] Tables + demo --- README.md | 71 +- build.gradle.kts | 17 +- demo/gdml/build.gradle.kts | 2 + demo/playground/build.gradle.kts | 7 +- .../src/jsMain/kotlin/playgroundMain.kt | 2 + .../src/jsMain/resources/css/common.css | 40 - .../src/jsMain/resources/index.html | 16 - .../src/jvmMain/kotlin/allThingsDemo.kt | 181 ++ .../src/jvmMain/kotlin/markdownDemo.kt | 91 - .../src/jvmMain/kotlin/serverExtensions.kt | 7 +- demo/playground/src/jvmMain/kotlin/tables.kt | 28 + demo/playground/webpack.config.d/01.ring.js | 21 +- demo/playground/webpack.config.d/02.bundle.js | 10 + docs/templates/ARTIFACT-TEMPLATE.md | 26 + docs/templates/README-TEMPLATE.md | 138 + jupyter/{jupyter-base => }/build.gradle.kts | 0 .../src/jvmMain/kotlin/JupyterPluginBase.kt | 0 .../jvmMain/kotlin/VisionForgeForNotebook.kt | 0 .../visionforge-jupyter-gdml/build.gradle.kts | 2 +- settings.gradle.kts | 16 +- .../ThreeViewWithControls.kt | 6 +- visionforge-core/build.gradle.kts | 16 +- .../kscience/visionforge/VisionGroupBase.kt | 2 +- .../visionforge/html/VisionTagConsumer.kt | 6 + .../kscience/visionforge/VisionClient.kt | 16 +- visionforge-fx/build.gradle.kts | 4 + .../kscience/visionforge/plotly/plotlyJs.kt | 12 +- .../visionforge/plotly/plotlyHeaders.kt | 22 - .../kscience/visionforge/plotly/plotlyJvm.kt | 2 +- visionforge-solid/build.gradle.kts | 8 +- visionforge-tables/build.gradle.kts | 40 + .../visionforge/tables/TableVisionPlugin.kt | 30 + .../visionforge/tables/VisionOfTable.kt | 113 + .../visionforge/tables/VisionOfTableTest.kt | 32 + .../visionforge/tables/TableVisionJsPlugin.kt | 96 + .../src/jsMain/kotlin/tabulator/Tabulator.kt | 2347 +++++++++++++++++ .../jsMain/kotlin/tabulator/typealiases.kt | 45 + .../solid/three/ThreeLabelFactory.kt | 3 +- 38 files changed, 3208 insertions(+), 267 deletions(-) delete mode 100644 demo/playground/src/jsMain/resources/css/common.css delete mode 100644 demo/playground/src/jsMain/resources/index.html create mode 100644 demo/playground/src/jvmMain/kotlin/allThingsDemo.kt delete mode 100644 demo/playground/src/jvmMain/kotlin/markdownDemo.kt create mode 100644 demo/playground/src/jvmMain/kotlin/tables.kt create mode 100644 demo/playground/webpack.config.d/02.bundle.js create mode 100644 docs/templates/ARTIFACT-TEMPLATE.md create mode 100644 docs/templates/README-TEMPLATE.md rename jupyter/{jupyter-base => }/build.gradle.kts (100%) rename jupyter/{jupyter-base => }/src/jvmMain/kotlin/JupyterPluginBase.kt (100%) rename jupyter/{jupyter-base => }/src/jvmMain/kotlin/VisionForgeForNotebook.kt (100%) delete mode 100644 visionforge-plotly/src/jvmMain/kotlin/space/kscience/visionforge/plotly/plotlyHeaders.kt create mode 100644 visionforge-tables/build.gradle.kts create mode 100644 visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/TableVisionPlugin.kt create mode 100644 visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt create mode 100644 visionforge-tables/src/commonTest/kotlin/space/kscience/visionforge/tables/VisionOfTableTest.kt create mode 100644 visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt create mode 100644 visionforge-tables/src/jsMain/kotlin/tabulator/Tabulator.kt create mode 100644 visionforge-tables/src/jsMain/kotlin/tabulator/typealiases.kt diff --git a/README.md b/README.md index 032b7ee4..6a77447e 100644 --- a/README.md +++ b/README.md @@ -14,30 +14,22 @@ * [Features](#features) * [About DataForge](#about-dataforge) * [Modules contained in this repository](#modules-contained-in-this-repository) - * [visionforge-core](#visionforge-core) - * [visionforge-fx](#visionforge-fx) - * [visionforge-gdml](#visionforge-gdml) - * [visionforge-markdown](#visionforge-markdown) - * [visionforge-plotly](#visionforge-plotly) - * [visionforge-server](#visionforge-server) - * [visionforge-solid](#visionforge-solid) - * [visionforge-threejs](#visionforge-threejs) -* [Visualization for External Systems](#visualization-for-external-systems) +* [Visualization for External Systems](#visualization-for-external-systems) * [Demonstrations](#demonstrations) - * [Simple Example - Solid Showcase](#simple-example---solid-showcase) - * [Full-Stack Application Example - Muon Monitor](#full-stack-application-example---muon-monitor-visualization) - * [GDML Example](#gdml-example) + * [Simple Example - Solid Showcase](#simple-example---solid-showcase) + * [Full-Stack Application Example - Muon Monitor](#full-stack-application-example---muon-monitor-visualization) + * [GDML Example](#gdml-example) ## Introduction -This repository contains a [DataForge](#about-dataforge)\-based framework -used for visualization in various scientific applications. +This repository contains a [DataForge](#about-dataforge)\-based framework +used for visualization in various scientific applications. -The main framework's use case for now is 3D visualization for particle physics experiments. +The main framework's use case for now is 3D visualization for particle physics experiments. Other applications including 2D plots are planned for the future. -The project is developed as a [Kotlin multiplatform](https://kotlinlang.org/docs/reference/multiplatform.html) +The project is developed as a [Kotlin multiplatform](https://kotlinlang.org/docs/reference/multiplatform.html) application, currently targeting browser JavaScript and JVM. ## Requirements @@ -62,39 +54,14 @@ Platform uses some of the concepts and modules of DataForge, including: `Meta`, `Provider`, and some others. To learn more about DataForge, please consult the following URLs: - * [Kotlin multiplatform implementation of DataForge](https://github.com/mipt-npm/dataforge-core) - * [DataForge documentation](http://npm.mipt.ru/dataforge/) - * [Original implementation of DataForge](https://bitbucket.org/Altavir/dataforge/src/default/) +* [Kotlin multiplatform implementation of DataForge](https://github.com/mipt-npm/dataforge-core) +* [DataForge documentation](http://npm.mipt.ru/dataforge/) +* [Original implementation of DataForge](https://bitbucket.org/Altavir/dataforge/src/default/) ## Modules contained in this repository -### visionforge-core - -Contains a general hierarchy of classes and interfaces useful for visualization. -This module is not specific to 3D-visualization. - -The `visionforge-core` module also includes configuration editors for JS (in `jsMain`) and JVM (in `jvmMain`). - -**Class diagram:** - -![](docs/images/class-diag-core.png) - -### visionforge-fx - -### visionforge-gdml - -GDML bindings for 3D visualization (to be moved to gdml project). - -### visionforge-markdown - -### visionforge-plotly - -### visionforge-server - -### visionforge-solid - -Includes common classes and serializers for 3D visualization, as well as Three.js and JavaFX implementations. +$modules **Class diagram:** @@ -103,26 +70,26 @@ Includes common classes and serializers for 3D visualization, as well as Three.j ##### Prototypes One of the important features of the framework is support for 3D object prototypes (sometimes -also referred to as templates). The idea is that prototype geometry can be rendered once and reused +also referred to as templates). The idea is that prototype geometry can be rendered once and reused for multiple objects. This helps to significantly decrease memory usage. -The `prototypes` property tree is defined in `SolidGroup` class via `PrototypeHolder` interface, and +The `prototypes` property tree is defined in `SolidGroup` class via `PrototypeHolder` interface, and `SolidReference` class helps to reuse a template object. ##### Styles -`VisionGroup` has a `styleSheet` property that can optionally define styles at the Group's +`VisionGroup` has a `styleSheet` property that can optionally define styles at the Group's level. Styles are applied to child (descendant) objects using `Vision.styles: List` property. ### visionforge-threejs -## Visualization for External Systems +## Visualization for External Systems The `visionforge` framework can be used to visualize geometry and events from external, non-Kotlin based systems, such as ROOT. This will require a plugin to convert data model of the external system to that of `visionforge`. Performing such integration is a work currently in progress. - + ## Demonstrations @@ -144,7 +111,7 @@ Some shapes will also periodically change their color and visibility. ### Full-Stack Application Example - Muon Monitor Visualization -A full-stack application example, showing the +A full-stack application example, showing the [Muon Monitor](http://npm.mipt.ru/en/projects/physics#mounMonitor) experiment set-up. [More details](demo/muon-monitor/README.md) @@ -156,7 +123,7 @@ A full-stack application example, showing the ### GDML Example -Visualization example for geometry defined as GDML file. +Visualization example for geometry defined as GDML file. [More details](demo/gdml/README.md) diff --git a/build.gradle.kts b/build.gradle.kts index 625efc2c..a81d1656 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,26 +1,23 @@ plugins { id("ru.mipt.npm.gradle.project") + id("org.jetbrains.kotlinx.kover") version "0.5.0-RC" } val dataforgeVersion by extra("0.5.2") val fxVersion by extra("11") -allprojects { +subprojects { + if (name.startsWith("visionforge")) apply() + repositories { - mavenLocal() - mavenCentral() maven("https://repo.kotlin.link") + mavenCentral() maven("https://maven.jzy3d.org/releases") } group = "space.kscience" - version = "0.2.0" -} + version = "0.2.0-dev-99" -subprojects { - if (name.startsWith("visionforge")) { - plugins.apply("maven-publish") - } } ksciencePublish { @@ -30,10 +27,10 @@ ksciencePublish { } apiValidation { - validationDisabled = true ignoredPackages.add("info.laht.threekt") } +readme.readmeTemplate = file("docs/templates/README-TEMPLATE.md") //workaround for https://youtrack.jetbrains.com/issue/KT-48273 rootProject.plugins.withType(org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin::class.java) { diff --git a/demo/gdml/build.gradle.kts b/demo/gdml/build.gradle.kts index ead65970..a6c3fb0a 100644 --- a/demo/gdml/build.gradle.kts +++ b/demo/gdml/build.gradle.kts @@ -16,6 +16,7 @@ kotlin { jvm { withJava() } + js { useCommonJs() browser { @@ -24,6 +25,7 @@ kotlin { } } } + sourceSets { commonMain { dependencies { diff --git a/demo/playground/build.gradle.kts b/demo/playground/build.gradle.kts index 8bad3769..61f4e033 100644 --- a/demo/playground/build.gradle.kts +++ b/demo/playground/build.gradle.kts @@ -47,8 +47,9 @@ kotlin { implementation(projects.visionforgeGdml) implementation(projects.visionforgePlotly) implementation(projects.visionforgeMarkdown) + implementation(projects.visionforgeTables) implementation(projects.cernRootLoader) - implementation(projects.jupyter.jupyterBase) + implementation(projects.jupyter) } } @@ -56,6 +57,7 @@ kotlin { dependencies { implementation(projects.ui.ring) implementation(projects.visionforgeThreejs) + compileOnly(npm("webpack-bundle-analyzer","4.5.0")) } } @@ -66,6 +68,9 @@ kotlin { implementation("com.github.Ricky12Awesome:json-schema-serialization:0.6.6") } } + all { + languageSettings.optIn("space.kscience.dataforge.misc.DFExperimental") + } } } diff --git a/demo/playground/src/jsMain/kotlin/playgroundMain.kt b/demo/playground/src/jsMain/kotlin/playgroundMain.kt index 0ea9abe5..3ad34867 100644 --- a/demo/playground/src/jsMain/kotlin/playgroundMain.kt +++ b/demo/playground/src/jsMain/kotlin/playgroundMain.kt @@ -3,10 +3,12 @@ import space.kscience.visionforge.markup.MarkupPlugin import space.kscience.visionforge.plotly.PlotlyPlugin import space.kscience.visionforge.ring.ThreeWithControlsPlugin import space.kscience.visionforge.runVisionClient +import space.kscience.visionforge.tables.TableVisionJsPlugin @DFExperimental fun main() = runVisionClient { plugin(ThreeWithControlsPlugin) plugin(PlotlyPlugin) plugin(MarkupPlugin) + plugin(TableVisionJsPlugin) } \ No newline at end of file diff --git a/demo/playground/src/jsMain/resources/css/common.css b/demo/playground/src/jsMain/resources/css/common.css deleted file mode 100644 index 316c4f0e..00000000 --- a/demo/playground/src/jsMain/resources/css/common.css +++ /dev/null @@ -1,40 +0,0 @@ -/* Remove default bullets */ -ul, .tree { - list-style-type: none; -} - -/* Style the caret/arrow */ -.tree-caret { - cursor: pointer; - user-select: none; /* Prevent text selection */ -} - -/* Create the caret/arrow with a unicode, and style it */ -.tree-caret::before { - content: "\25B6"; - color: black; - display: inline-block; - margin-right: 6px; -} - -/* Rotate the caret/arrow icon when clicked on (using JavaScript) */ -.tree-caret-down::before { - transform: rotate(90deg); -} - -ul, .tree { - list-style-type: none; -} - -i, .tree-caret{ - display: inline-block; - margin-right: 6px; -} - -.rotate { - transform: rotate(90deg); -} - -.tree-label-inactive { - color: gray; -} diff --git a/demo/playground/src/jsMain/resources/index.html b/demo/playground/src/jsMain/resources/index.html deleted file mode 100644 index 1917c33d..00000000 --- a/demo/playground/src/jsMain/resources/index.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - Playground - - - - - -
-

Playground

-
-
- - \ No newline at end of file diff --git a/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt b/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt new file mode 100644 index 00000000..0ff49d40 --- /dev/null +++ b/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt @@ -0,0 +1,181 @@ +package space.kscience.visionforge.examples + +import kotlinx.html.h1 +import kotlinx.html.h2 +import space.kscience.dataforge.context.Context +import space.kscience.dataforge.values.ValueType +import space.kscience.plotly.layout +import space.kscience.plotly.models.ScatterMode +import space.kscience.plotly.models.TextPosition +import space.kscience.plotly.scatter +import space.kscience.tables.ColumnHeader +import space.kscience.visionforge.html.ResourceLocation +import space.kscience.visionforge.markup.markdown +import space.kscience.visionforge.plotly.PlotlyPlugin +import space.kscience.visionforge.plotly.plotly +import space.kscience.visionforge.solid.* +import space.kscience.visionforge.tables.TableVisionPlugin +import space.kscience.visionforge.tables.columnTable +import java.nio.file.Paths + +fun main() { + val context = Context { + plugin(Solids) + plugin(PlotlyPlugin) + plugin(TableVisionPlugin) + } + + context.makeVisionFile( + Paths.get("VisionForgeDemo.html"), + resourceLocation = ResourceLocation.EMBED + ) { + markdown { + //language=markdown + """ + # VisionForge + + This is a demo for current VisionForge features. This text is written in [MarkDown](https://github.com/JetBrains/markdown) + """.trimIndent() + } + + h2 { +"3D visualization with Three-js" } + vision("3D") { + solid { + box(100, 100, 100, name = "aBox") + } + } + + h2 { +"Interactive plots with Plotly" } + vision("plot") { + plotly { + scatter { + x(1, 2, 3, 4) + y(10, 15, 13, 17) + mode = ScatterMode.markers + name = "Team A" + text("A-1", "A-2", "A-3", "A-4", "A-5") + textposition = TextPosition.`top center` + textfont { + family = "Raleway, sans-serif" + } + marker { size = 12 } + } + + scatter { + x(2, 3, 4, 5) + y(10, 15, 13, 17) + mode = ScatterMode.lines + name = "Team B" + text("B-a", "B-b", "B-c", "B-d", "B-e") + textposition = TextPosition.`bottom center` + textfont { + family = "Times New Roman" + } + marker { size = 12 } + } + + layout { + title = "Data Labels Hover" + xaxis { + range(0.75..5.25) + } + legend { + y = 0.5 + font { + family = "Arial, sans-serif" + size = 20 + color("grey") + } + } + } + } + } + h2 { +"Interactive tables with Tabulator" } + vision("table") { + val x by ColumnHeader.value(ValueType.NUMBER) + val y by ColumnHeader.value(ValueType.NUMBER) + columnTable( + x to listOf(2, 3, 4, 5), + y to listOf(10, 15, 13, 17) + ) + } + markdown { + //language=markdown + """ + ## The code for everything above + ```kotlin + markdown { + //language=markdown + ""${'"'} + # VisionForge + + This is a demo for current VisionForge features. This text is written in [MarkDown](https://github.com/JetBrains/markdown) + ""${'"'}.trimIndent() + } + + h2 { +"3D visualization with Three-js" } + vision("3D") { + solid { + box(100, 100, 100, name = "aBox") + } + } + + h2 { +"Interactive plots with Plotly" } + vision("plot") { + plotly { + scatter { + x(1, 2, 3, 4) + y(10, 15, 13, 17) + mode = ScatterMode.markers + name = "Team A" + text("A-1", "A-2", "A-3", "A-4", "A-5") + textposition = TextPosition.`top center` + textfont { + family = "Raleway, sans-serif" + } + marker { size = 12 } + } + + scatter { + x(2, 3, 4, 5) + y(10, 15, 13, 17) + mode = ScatterMode.lines + name = "Team B" + text("B-a", "B-b", "B-c", "B-d", "B-e") + textposition = TextPosition.`bottom center` + textfont { + family = "Times New Roman" + } + marker { size = 12 } + } + + layout { + title = "Data Labels Hover" + xaxis { + range(0.75..5.25) + } + legend { + y = 0.5 + font { + family = "Arial, sans-serif" + size = 20 + color("grey") + } + } + } + } + } + h2 { +"Interactive tables with Tabulator" } + vision("table") { + val x by ColumnHeader.value(ValueType.NUMBER) + val y by ColumnHeader.value(ValueType.NUMBER) + columnTable( + x to listOf(2, 3, 4, 5), + y to listOf(10, 15, 13, 17) + ) + } + ``` + """.trimIndent() + } + } +} \ No newline at end of file diff --git a/demo/playground/src/jvmMain/kotlin/markdownDemo.kt b/demo/playground/src/jvmMain/kotlin/markdownDemo.kt deleted file mode 100644 index cb4b7cf0..00000000 --- a/demo/playground/src/jvmMain/kotlin/markdownDemo.kt +++ /dev/null @@ -1,91 +0,0 @@ -package space.kscience.visionforge.examples - -import kotlinx.html.div -import kotlinx.html.h1 -import space.kscience.dataforge.context.Context -import space.kscience.plotly.layout -import space.kscience.plotly.models.ScatterMode -import space.kscience.plotly.models.TextPosition -import space.kscience.plotly.scatter -import space.kscience.visionforge.html.ResourceLocation -import space.kscience.visionforge.markup.markdown -import space.kscience.visionforge.plotly.PlotlyPlugin -import space.kscience.visionforge.plotly.plotly -import space.kscience.visionforge.solid.* - -fun main() { - val context = Context { - plugin(Solids) - plugin(PlotlyPlugin) - } - - context.makeVisionFile(resourceLocation = ResourceLocation.SYSTEM) { - markdown { - //language=markdown - """ - # Section - - **TBD** - - ## Subsection - """.trimIndent() - } - - div { - h1 { +"Canvas" } - vision("canvas") { - solid { - box(100, 100, 100) - material { - emissiveColor("red") - } - } - } - } - - vision("plot") { - plotly { - scatter { - x(1, 2, 3, 4) - y(10, 15, 13, 17) - mode = ScatterMode.markers - name = "Team A" - text("A-1", "A-2", "A-3", "A-4", "A-5") - textposition = TextPosition.`top center` - textfont { - family = "Raleway, sans-serif" - } - marker { size = 12 } - } - - scatter { - x(2, 3, 4, 5) - y(10, 15, 13, 17) - mode = ScatterMode.lines - name = "Team B" - text("B-a", "B-b", "B-c", "B-d", "B-e") - textposition = TextPosition.`bottom center` - textfont { - family = "Times New Roman" - } - marker { size = 12 } - } - - layout { - title = "Data Labels Hover" - xaxis { - range(0.75..5.25) - } - legend { - y = 0.5 - font { - family = "Arial, sans-serif" - size = 20 - color("grey") - } - } - } - } - } - } -} \ No newline at end of file diff --git a/demo/playground/src/jvmMain/kotlin/serverExtensions.kt b/demo/playground/src/jvmMain/kotlin/serverExtensions.kt index 6d9ff46c..b8bb633a 100644 --- a/demo/playground/src/jvmMain/kotlin/serverExtensions.kt +++ b/demo/playground/src/jvmMain/kotlin/serverExtensions.kt @@ -24,10 +24,13 @@ public fun Context.makeVisionFile( title: String = "VisionForge page", resourceLocation: ResourceLocation = ResourceLocation.SYSTEM, show: Boolean = true, - content: VisionTagConsumer<*>.() -> Unit + content: VisionTagConsumer<*>.() -> Unit, ): Unit { val actualPath = visionManager.page(title, content = content).makeFile(path) { actualPath -> - mapOf("playground" to scriptHeader("js/visionforge-playground.js", resourceLocation, actualPath)) + mapOf( + "playground" to scriptHeader("js/visionforge-playground.js", resourceLocation, actualPath), + //"tables" to tabulatorCssHader + ) } if (show) Desktop.getDesktop().browse(actualPath.toFile().toURI()) } diff --git a/demo/playground/src/jvmMain/kotlin/tables.kt b/demo/playground/src/jvmMain/kotlin/tables.kt new file mode 100644 index 00000000..c386ffda --- /dev/null +++ b/demo/playground/src/jvmMain/kotlin/tables.kt @@ -0,0 +1,28 @@ +package space.kscience.visionforge.examples + +import space.kscience.dataforge.context.Context +import space.kscience.dataforge.values.ValueType +import space.kscience.tables.ColumnHeader +import space.kscience.tables.valueRow +import space.kscience.visionforge.html.ResourceLocation +import space.kscience.visionforge.tables.TableVisionPlugin +import space.kscience.visionforge.tables.table +import kotlin.math.pow + +fun main() { + val context = Context { + plugin(TableVisionPlugin) + } + val x by ColumnHeader.value(ValueType.NUMBER) + val y by ColumnHeader.value(ValueType.NUMBER) + + context.makeVisionFile(resourceLocation = ResourceLocation.SYSTEM) { + vision { + table(x, y) { + repeat(100) { + valueRow(x to it, y to it.toDouble().pow(2)) + } + } + } + } +} \ No newline at end of file diff --git a/demo/playground/webpack.config.d/01.ring.js b/demo/playground/webpack.config.d/01.ring.js index 41da041c..fbde1b41 100644 --- a/demo/playground/webpack.config.d/01.ring.js +++ b/demo/playground/webpack.config.d/01.ring.js @@ -1,3 +1,22 @@ const ringConfig = require('@jetbrains/ring-ui/webpack.config').config; -config.module.rules.push(...ringConfig.module.rules) \ No newline at end of file +config.module.rules.push(...ringConfig.module.rules) + +config.module.rules.push( + { + test: /\.css$/, + exclude: [ + 'D:\\Work\\Projects\\visionforge\\build\\js\\node_modules\\@jetbrains\\ring-ui' + ], + use: [ + { + loader: 'style-loader', + options: {} + }, + { + loader: 'css-loader', + options: {} + } + ] + } +) \ No newline at end of file diff --git a/demo/playground/webpack.config.d/02.bundle.js b/demo/playground/webpack.config.d/02.bundle.js new file mode 100644 index 00000000..947253ca --- /dev/null +++ b/demo/playground/webpack.config.d/02.bundle.js @@ -0,0 +1,10 @@ +const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; + +module.exports = { + plugins: [ + new BundleAnalyzerPlugin({ + analyzerMode: "static", + reportFilename: "bundle-report.html" + }) + ] +} \ No newline at end of file diff --git a/docs/templates/ARTIFACT-TEMPLATE.md b/docs/templates/ARTIFACT-TEMPLATE.md new file mode 100644 index 00000000..91e09096 --- /dev/null +++ b/docs/templates/ARTIFACT-TEMPLATE.md @@ -0,0 +1,26 @@ +## Artifact: + +The Maven coordinates of this project are `${group}:${name}:${version}`. + +**Gradle Groovy:** +```gradle +repositories { + maven { url 'https://repo.kotlin.link' } + mavenCentral() +} + +dependencies { + implementation '${group}:${name}:${version}' +} +``` +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("${group}:${name}:${version}") +} +``` \ No newline at end of file diff --git a/docs/templates/README-TEMPLATE.md b/docs/templates/README-TEMPLATE.md new file mode 100644 index 00000000..775c2b12 --- /dev/null +++ b/docs/templates/README-TEMPLATE.md @@ -0,0 +1,138 @@ +[![JetBrains Research](https://jb.gg/badges/research.svg)](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub) +[![DOI](https://zenodo.org/badge/174502624.svg)](https://zenodo.org/badge/latestdoi/174502624) + +![Gradle build](https://github.com/mipt-npm/visionforge/workflows/Gradle%20build/badge.svg) + +[![Slack](https://img.shields.io/badge/slack-channel-green?logo=slack)](https://kotlinlang.slack.com/archives/CEXV2QWNM) + +# DataForge Visualization Platform + +## Table of Contents + +* [Introduction](#introduction) +* [Requirements](#requirements) +* [Features](#features) +* [About DataForge](#about-dataforge) +* [Modules contained in this repository](#modules-contained-in-this-repository) +* [Visualization for External Systems](#visualization-for-external-systems) +* [Demonstrations](#demonstrations) + * [Simple Example - Solid Showcase](#simple-example---solid-showcase) + * [Full-Stack Application Example - Muon Monitor](#full-stack-application-example---muon-monitor-visualization) + * [GDML Example](#gdml-example) + + +## Introduction + +This repository contains a [DataForge](#about-dataforge)\-based framework +used for visualization in various scientific applications. + +The main framework's use case for now is 3D visualization for particle physics experiments. +Other applications including 2D plots are planned for the future. + +The project is developed as a [Kotlin multiplatform](https://kotlinlang.org/docs/reference/multiplatform.html) +application, currently targeting browser JavaScript and JVM. + +## Requirements + +JVM backend requires JDK 11 or later + +## Features + +The main framework's features for now include: +- 3D visualization of complex experimental set-ups +- Event display such as particle tracks, etc. +- Scales up to few hundred thousands of elements +- Camera move, rotate, zoom-in and zoom-out +- Scene graph as an object tree with property editor +- Settings export and import +- Multiple platform support + +## About DataForge + +DataForge is a software framework for automated scientific data processing. DataForge Visualization +Platform uses some of the concepts and modules of DataForge, including: `Meta`, `Configuration`, `Context`, +`Provider`, and some others. + +To learn more about DataForge, please consult the following URLs: +* [Kotlin multiplatform implementation of DataForge](https://github.com/mipt-npm/dataforge-core) +* [DataForge documentation](http://npm.mipt.ru/dataforge/) +* [Original implementation of DataForge](https://bitbucket.org/Altavir/dataforge/src/default/) + + +## Modules contained in this repository + +$modules + +**Class diagram:** + +![](docs/images/class-diag-solid.png) + +##### Prototypes + +One of the important features of the framework is support for 3D object prototypes (sometimes +also referred to as templates). The idea is that prototype geometry can be rendered once and reused +for multiple objects. This helps to significantly decrease memory usage. + +The `prototypes` property tree is defined in `SolidGroup` class via `PrototypeHolder` interface, and +`SolidReference` class helps to reuse a template object. + +##### Styles + +`VisionGroup` has a `styleSheet` property that can optionally define styles at the Group's +level. Styles are applied to child (descendant) objects using `Vision.styles: List` property. + +### visionforge-threejs + +## Visualization for External Systems + +The `visionforge` framework can be used to visualize geometry and events from external, +non-Kotlin based systems, such as ROOT. This will require a plugin to convert data model +of the external system to that of `visionforge`. Performing such integration is a work +currently in progress. + + +## Demonstrations + +The `demo` module contains several example projects (demonstrations) of using the `visionforge` framework. +They are briefly described in this section, for more details please consult the corresponding per-project +README file. + +### Simple Example - Solid Showcase + +Contains a simple demonstration with a grid including a few shapes that you can rotate, move camera, and so on. +Some shapes will also periodically change their color and visibility. + +[More details](demo/solid-showcase/README.md) + +**Example view:** + +![](docs/images/solid-showcase.png) + + +### Full-Stack Application Example - Muon Monitor Visualization + +A full-stack application example, showing the +[Muon Monitor](http://npm.mipt.ru/en/projects/physics#mounMonitor) experiment set-up. + +[More details](demo/muon-monitor/README.md) + +**Example view:** + +![](docs/images/muon-monitor.png) + + +### GDML Example + +Visualization example for geometry defined as GDML file. + +[More details](demo/gdml/README.md) + +##### Example view: + +![](docs/images/gdml-demo.png) + + +## Thanks and references +The original three.js bindings were made by [Lars Ivar Hatledal](https://github.com/markaren), but the project is discontinued right now. + +All other libraries are explicitly shown as dependencies. We would like to express specific thanks to JetBrains Kotlin-JS team for consulting us during the work. diff --git a/jupyter/jupyter-base/build.gradle.kts b/jupyter/build.gradle.kts similarity index 100% rename from jupyter/jupyter-base/build.gradle.kts rename to jupyter/build.gradle.kts diff --git a/jupyter/jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt b/jupyter/src/jvmMain/kotlin/JupyterPluginBase.kt similarity index 100% rename from jupyter/jupyter-base/src/jvmMain/kotlin/JupyterPluginBase.kt rename to jupyter/src/jvmMain/kotlin/JupyterPluginBase.kt diff --git a/jupyter/jupyter-base/src/jvmMain/kotlin/VisionForgeForNotebook.kt b/jupyter/src/jvmMain/kotlin/VisionForgeForNotebook.kt similarity index 100% rename from jupyter/jupyter-base/src/jvmMain/kotlin/VisionForgeForNotebook.kt rename to jupyter/src/jvmMain/kotlin/VisionForgeForNotebook.kt diff --git a/jupyter/visionforge-jupyter-gdml/build.gradle.kts b/jupyter/visionforge-jupyter-gdml/build.gradle.kts index afb08473..4a575602 100644 --- a/jupyter/visionforge-jupyter-gdml/build.gradle.kts +++ b/jupyter/visionforge-jupyter-gdml/build.gradle.kts @@ -33,7 +33,7 @@ kotlin { commonMain { dependencies { implementation(projects.visionforgeSolid) - implementation(projects.jupyter.jupyterBase) + implementation(projects.jupyter) } } jvmMain { diff --git a/settings.gradle.kts b/settings.gradle.kts index 6d3e5961..3ae9f6f9 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,9 +1,14 @@ +rootProject.name = "visionforge" + +enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") +enableFeaturePreview("VERSION_CATALOGS") + pluginManagement { val toolsVersion: String by extra repositories { - //mavenLocal() + mavenLocal() maven("https://repo.kotlin.link") mavenCentral() gradlePluginPortal() @@ -17,16 +22,12 @@ pluginManagement { } } -rootProject.name = "visionforge" - -enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") -enableFeaturePreview("VERSION_CATALOGS") - dependencyResolutionManagement { val toolsVersion: String by extra repositories { + mavenLocal() maven("https://repo.kotlin.link") mavenCentral() } @@ -53,6 +54,7 @@ include( ":cern-root-loader", ":visionforge-server", ":visionforge-plotly", + ":visionforge-tables", ":visionforge-markdown", ":demo:solid-showcase", ":demo:gdml", @@ -61,6 +63,6 @@ include( ":demo:playground", ":demo:plotly-fx", ":demo:js-playground", - ":jupyter:jupyter-base", + ":jupyter", ":jupyter:visionforge-jupyter-gdml" ) diff --git a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt index 97c9a083..5cdcf5c0 100644 --- a/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt +++ b/ui/ring/src/main/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt @@ -82,8 +82,10 @@ public val ThreeCanvasWithControls: FC = fc("Three useEffect { props.context.launch { - solid = props.builderOfSolid.await().also { - it?.setAsRoot(props.context.visionManager) + solid = props.builderOfSolid.await() + //ensure that the solid is properly rooted + if(solid?.parent == null){ + solid?.setAsRoot(props.context.visionManager) } } } diff --git a/visionforge-core/build.gradle.kts b/visionforge-core/build.gradle.kts index ecd14331..227c80dc 100644 --- a/visionforge-core/build.gradle.kts +++ b/visionforge-core/build.gradle.kts @@ -4,12 +4,6 @@ plugins { val dataforgeVersion: String by rootProject.extra -kscience{ - useSerialization{ - json() - } -} - kotlin { sourceSets { commonMain { @@ -25,4 +19,14 @@ kotlin { } } } +} + +kscience{ + useSerialization{ + json() + } +} + +readme{ + maturity = ru.mipt.npm.gradle.Maturity.DEVELOPMENT } \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt index 873b5996..7c2af29e 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroupBase.kt @@ -163,6 +163,6 @@ internal class RootVisionGroup(override val manager: VisionManager) : VisionGrou * Designate this [VisionGroup] as a root and assign a [VisionManager] as its parent */ public fun Vision.setAsRoot(manager: VisionManager) { - if (parent != null) error("This Vision already has a parent. It could not be set as root") + if (parent != null) error("Vision $this already has a parent. It could not be set as root") parent = RootVisionGroup(manager) } \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt index c9bd6857..7a17f0f5 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt @@ -78,6 +78,10 @@ public abstract class VisionTagConsumer( } } + /** + * Insert a vision in this HTML. + * TODO replace by multi-receiver + */ @OptIn(DFExperimental::class) public inline fun TagConsumer.vision( name: Name, @@ -122,6 +126,8 @@ public abstract class VisionTagConsumer( public const val OUTPUT_FETCH_ATTRIBUTE: String = "data-output-fetch" public const val OUTPUT_CONNECT_ATTRIBUTE: String = "data-output-connect" + public const val OUTPUT_RENDERED: String = "data-output-rendered" + public const val OUTPUT_NAME_ATTRIBUTE: String = "data-output-name" public const val OUTPUT_ENDPOINT_ATTRIBUTE: String = "data-output-endpoint" public const val DEFAULT_ENDPOINT: String = "." diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt index 2bd6dc84..c437a5d6 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/VisionClient.kt @@ -19,6 +19,7 @@ import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_CONNEC import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_ENDPOINT_ATTRIBUTE import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_FETCH_ATTRIBUTE import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_NAME_ATTRIBUTE +import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_RENDERED import kotlin.reflect.KClass import kotlin.time.Duration.Companion.milliseconds @@ -64,7 +65,8 @@ public class VisionClient : AbstractPlugin() { private fun renderVision(name: String, element: Element, vision: Vision?, outputMeta: Meta) { if (vision != null) { - val renderer = findRendererFor(vision) ?: error("Could nof find renderer for $vision") + val renderer = findRendererFor(vision) + ?: error("Could not find renderer for ${visionManager.encodeToString(vision)}") renderer.render(element, vision, outputMeta) element.attributes[OUTPUT_CONNECT_ATTRIBUTE]?.let { attr -> @@ -138,10 +140,15 @@ public class VisionClient : AbstractPlugin() { * Fetch from server and render a vision, described in a given with [VisionTagConsumer.OUTPUT_CLASS] class. */ public fun renderVisionIn(element: Element) { - val name = resolveName(element) ?: error("The element is not a vision output") - logger.info { "Found DF output with name $name" } if (!element.classList.contains(VisionTagConsumer.OUTPUT_CLASS)) error("The element $element is not an output element") + val name = resolveName(element) ?: error("The element is not a vision output") + if (element.attributes[OUTPUT_RENDERED]?.value == "true") { + logger.info { "VF output in element $element is already rendered" } + return + } else { + logger.info { "Rendering VF output with name $name" } + } val outputMeta = element.getEmbeddedData(VisionTagConsumer.OUTPUT_META_CLASS)?.let { VisionManager.defaultJson.decodeFromString(MetaSerializer, it) @@ -186,6 +193,7 @@ public class VisionClient : AbstractPlugin() { } else -> error("No embedded vision data / fetch url for $name") } + element.setAttribute(OUTPUT_RENDERED, "true") } override fun content(target: String): Map = if (target == ElementVisionRenderer.TYPE) mapOf( @@ -254,5 +262,5 @@ public fun runVisionClient(contextBuilder: ContextBuilder.() -> Unit) { val visionClient = context.fetch(VisionClient) window.asDynamic()[RENDER_FUNCTION_NAME] = visionClient::renderAllVisionsById - visionClient.renderAllVisions() + //visionClient.renderAllVisions() } \ No newline at end of file diff --git a/visionforge-fx/build.gradle.kts b/visionforge-fx/build.gradle.kts index 7b522fc4..26fa13c8 100644 --- a/visionforge-fx/build.gradle.kts +++ b/visionforge-fx/build.gradle.kts @@ -19,4 +19,8 @@ dependencies { implementation("eu.mihosoft.vrl.jcsg:jcsg:0.5.7") { exclude(module = "slf4j-simple") } +} + +readme{ + maturity = ru.mipt.npm.gradle.Maturity.PROTOTYPE } \ No newline at end of file diff --git a/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt b/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt index e0cea767..7406986b 100644 --- a/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt +++ b/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt @@ -31,20 +31,16 @@ public actual class PlotlyPlugin : VisionPlugin(), ElementVisionRenderer { override fun render(element: Element, vision: Vision, meta: Meta) { val plot = (vision as? VisionOfPlotly)?.plot ?: error("VisionOfPlotly expected but ${vision::class} found") val config = PlotlyConfig.read(meta) -// println(plot.meta) -// println(plot.data[0].toMeta()) element.plot(plot, config) } - override fun content(target: String): Map { - return when (target) { - ElementVisionRenderer.TYPE -> mapOf("plotly".asName() to this) - else -> super.content(target) - } + override fun content(target: String): Map = when (target) { + ElementVisionRenderer.TYPE -> mapOf("plotly".asName() to this) + else -> super.content(target) } public actual companion object : PluginFactory { - override val tag: PluginTag = PluginTag("vision.plotly", PluginTag.DATAFORGE_GROUP) + override val tag: PluginTag = PluginTag("vision.plotly.js", PluginTag.DATAFORGE_GROUP) override val type: KClass = PlotlyPlugin::class override fun invoke(meta: Meta, context: Context): PlotlyPlugin = PlotlyPlugin() } diff --git a/visionforge-plotly/src/jvmMain/kotlin/space/kscience/visionforge/plotly/plotlyHeaders.kt b/visionforge-plotly/src/jvmMain/kotlin/space/kscience/visionforge/plotly/plotlyHeaders.kt deleted file mode 100644 index 8c986125..00000000 --- a/visionforge-plotly/src/jvmMain/kotlin/space/kscience/visionforge/plotly/plotlyHeaders.kt +++ /dev/null @@ -1,22 +0,0 @@ -package space.kscience.visionforge.plotly - -//internal val plotlyScriptLocation = "js/visionforge-three.js" -// -///** -// * A header that stores/embeds plotly bundle and registers plotly renderer in the frontend -// */ -//@OptIn(DFExperimental::class) -//public fun plotlyHeader(location: ResourceLocation, filePath: Path? = null): HtmlFragment = { -// scriptHeader( -// plotlyScriptLocation, -// resourceLocation = location, -// htmlPath = filePath -// ).invoke(this) -// script { -// type = "text/javascript" -// unsafe { -// //language=JavaScript -// +"space.kscience.visionforge.plotly.loadPlotly()" -// } -// } -//} diff --git a/visionforge-plotly/src/jvmMain/kotlin/space/kscience/visionforge/plotly/plotlyJvm.kt b/visionforge-plotly/src/jvmMain/kotlin/space/kscience/visionforge/plotly/plotlyJvm.kt index 21522664..ad7be4f3 100644 --- a/visionforge-plotly/src/jvmMain/kotlin/space/kscience/visionforge/plotly/plotlyJvm.kt +++ b/visionforge-plotly/src/jvmMain/kotlin/space/kscience/visionforge/plotly/plotlyJvm.kt @@ -9,7 +9,7 @@ import space.kscience.dataforge.meta.Meta import space.kscience.visionforge.VisionPlugin import kotlin.reflect.KClass -public actual class PlotlyPlugin : VisionPlugin(), Plugin { +public actual class PlotlyPlugin : VisionPlugin() { override val tag: PluginTag get() = Companion.tag diff --git a/visionforge-solid/build.gradle.kts b/visionforge-solid/build.gradle.kts index 8b0b1dc2..e00830d5 100644 --- a/visionforge-solid/build.gradle.kts +++ b/visionforge-solid/build.gradle.kts @@ -3,7 +3,9 @@ plugins { } kscience{ - useSerialization() + useSerialization{ + json() + } } kotlin { @@ -14,4 +16,8 @@ kotlin { } } } +} + +readme{ + maturity = ru.mipt.npm.gradle.Maturity.DEVELOPMENT } \ No newline at end of file diff --git a/visionforge-tables/build.gradle.kts b/visionforge-tables/build.gradle.kts new file mode 100644 index 00000000..55c367c5 --- /dev/null +++ b/visionforge-tables/build.gradle.kts @@ -0,0 +1,40 @@ +plugins { + id("ru.mipt.npm.gradle.mpp") +} + +val tablesVersion = "0.1.4" + +kscience { + useSerialization() +} + +kotlin { + js { + useCommonJs() + binaries.library() + browser{ + commonWebpackConfig{ + cssSupport.enabled = true + } + } + } + + sourceSets { + commonMain { + dependencies { + api(project(":visionforge-core")) + api("space.kscience:tables-kt:${tablesVersion}") + } + } + jsMain { + dependencies { + implementation(npm("tabulator-tables", "5.0.1")) + implementation(npm("@types/tabulator-tables", "5.0.1")) + } + } + } +} + +readme{ + maturity = ru.mipt.npm.gradle.Maturity.PROTOTYPE +} \ No newline at end of file diff --git a/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/TableVisionPlugin.kt b/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/TableVisionPlugin.kt new file mode 100644 index 00000000..6e632147 --- /dev/null +++ b/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/TableVisionPlugin.kt @@ -0,0 +1,30 @@ +package space.kscience.visionforge.tables + +import kotlinx.serialization.modules.SerializersModule +import kotlinx.serialization.modules.polymorphic +import kotlinx.serialization.modules.subclass +import space.kscience.dataforge.context.Context +import space.kscience.dataforge.context.PluginFactory +import space.kscience.dataforge.context.PluginTag +import space.kscience.dataforge.meta.Meta +import space.kscience.visionforge.Vision +import space.kscience.visionforge.VisionManager +import space.kscience.visionforge.VisionPlugin +import kotlin.reflect.KClass + +public class TableVisionPlugin : VisionPlugin() { + override val tag: PluginTag get() = Companion.tag + + override val visionSerializersModule: SerializersModule + get() = SerializersModule { + polymorphic(Vision::class) { + subclass(VisionOfTable.serializer()) + } + } + + public companion object : PluginFactory { + override val tag: PluginTag = PluginTag("vision.table", PluginTag.DATAFORGE_GROUP) + override val type: KClass = TableVisionPlugin::class + override fun invoke(meta: Meta, context: Context): TableVisionPlugin = TableVisionPlugin() + } +} \ No newline at end of file diff --git a/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt b/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt new file mode 100644 index 00000000..a3147236 --- /dev/null +++ b/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt @@ -0,0 +1,113 @@ +package space.kscience.visionforge.tables + +import kotlinx.serialization.KSerializer +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import space.kscience.dataforge.meta.* +import space.kscience.dataforge.misc.DFExperimental +import space.kscience.dataforge.values.Null +import space.kscience.dataforge.values.Value +import space.kscience.dataforge.values.asValue +import space.kscience.tables.* +import space.kscience.visionforge.VisionBase +import space.kscience.visionforge.html.VisionOutput +import kotlin.jvm.JvmName +import kotlin.reflect.typeOf + +internal object ColumnHeaderSerializer : KSerializer> { + + override val descriptor: SerialDescriptor get() = MetaSerializer.descriptor + + override fun deserialize(decoder: Decoder): ColumnHeader { + val meta = decoder.decodeSerializableValue(MetaSerializer) + return SimpleColumnHeader(meta["name"].string!!, typeOf(), meta["meta"] ?: Meta.EMPTY) + } + + override fun serialize(encoder: Encoder, value: ColumnHeader) { + val meta = Meta { + "name" put value.name + "meta" put value.meta + } + encoder.encodeSerializableValue(MetaSerializer, meta) + } +} + +public val ColumnHeader.properties: ValueColumnScheme get() = ValueColumnScheme.read(meta) + +@Serializable +@SerialName("vision.table") +public class VisionOfTable( + override val headers: List<@Serializable(ColumnHeaderSerializer::class) ColumnHeader>, +) : VisionBase(), Rows { + + public var data: List + get() = meta.getIndexed("rows").entries.sortedBy { it.key?.toInt() }.map { it.value } + set(value) { + meta["rows"] = value + } + + public val rows: List get() = data.map(::MetaRow) + + override fun rowSequence(): Sequence> = rows.asSequence() +} + +/** + * Convert a table to a serializable vision + */ +@Suppress("UNCHECKED_CAST") +public fun Table.toVision( + converter: (T?) -> Value, +): VisionOfTable = VisionOfTable(headers as TableHeader).also { vision -> + vision.data = rows.map { row -> + if (row is MetaRow) { + row.meta + } else { + Meta { + headers.forEach { + it.name put converter(row[it.name]) + } + } + } + } +} + +@JvmName("valueTableToVision") +public fun Table.toVision(): VisionOfTable = toVision { it ?: Null } + +@JvmName("stringTableToVision") +public fun Table.toVision(): VisionOfTable = toVision { (it ?: "").asValue() } + +@JvmName("numberTableToVision") +public fun Table.toVision(): VisionOfTable = toVision { (it ?: Double.NaN).asValue() } + +@DFExperimental +public inline fun VisionOutput.table( + vararg headers: ColumnHeader, + block: MutableRowTable.() -> Unit, +): VisionOfTable = RowTable(*headers, block = block).toVision() + +@DFExperimental +public inline fun VisionOutput.columnTable( + columnSize: UInt, + block: MutableColumnTable.() -> Unit, +): VisionOfTable = ColumnTable(columnSize, block).toVision() + +@DFExperimental +public fun VisionOutput.columnTable( + vararg dataAndHeaders: Pair, List>, +): VisionOfTable { + val columns = dataAndHeaders.map { (header, data) -> + ListColumn(header, data.map { Value.of(it) }) + } + return ColumnTable(columns).toVision() +} + +//public val tabulatorCssHader: HtmlFragment = { +// link { +// href = "https://unpkg.com/tabulator-tables@5.0.10/dist/css/tabulator.min.css" +// rel = "stylesheet" +// } +//} \ No newline at end of file diff --git a/visionforge-tables/src/commonTest/kotlin/space/kscience/visionforge/tables/VisionOfTableTest.kt b/visionforge-tables/src/commonTest/kotlin/space/kscience/visionforge/tables/VisionOfTableTest.kt new file mode 100644 index 00000000..5796d8e2 --- /dev/null +++ b/visionforge-tables/src/commonTest/kotlin/space/kscience/visionforge/tables/VisionOfTableTest.kt @@ -0,0 +1,32 @@ +package space.kscience.visionforge.tables + +import space.kscience.dataforge.values.Value +import space.kscience.dataforge.values.asValue +import space.kscience.dataforge.values.double +import space.kscience.dataforge.values.int +import space.kscience.tables.ColumnHeader +import space.kscience.tables.ColumnTable +import space.kscience.tables.get +import kotlin.math.pow +import kotlin.test.Test +import kotlin.test.assertEquals + +internal class VisionOfTableTest { + @Test + fun tableSerialization() { + val x by ColumnHeader.typed() + val y by ColumnHeader.typed() + + val table = ColumnTable(100U) { + x.fill { it.asValue() } + y.values = x.values.map { it?.double?.pow(2)?.asValue() } + } + + val vision = table.toVision() + //println(Json.encodeToString(VisionOfTable.serializer(), table.toVision())) + + val rows = vision.rowSequence().toList() + + assertEquals(50, rows[50][x]?.int) + } +} \ No newline at end of file diff --git a/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt b/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt new file mode 100644 index 00000000..42525847 --- /dev/null +++ b/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt @@ -0,0 +1,96 @@ +package space.kscience.visionforge.tables + +import kotlinext.js.jso +import org.w3c.dom.Element +import org.w3c.dom.HTMLElement +import space.kscience.dataforge.context.AbstractPlugin +import space.kscience.dataforge.context.Context +import space.kscience.dataforge.context.PluginFactory +import space.kscience.dataforge.context.PluginTag +import space.kscience.dataforge.meta.DynamicMeta +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.toDynamic +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.asName +import space.kscience.visionforge.ElementVisionRenderer +import space.kscience.visionforge.Vision +import space.kscience.visionforge.VisionClient +import tabulator.Tabulator +import tabulator.TabulatorFull +import kotlin.reflect.KClass + +public class TableVisionJsPlugin : AbstractPlugin(), ElementVisionRenderer { + public val visionClient: VisionClient by require(VisionClient) + public val tablesBase: TableVisionPlugin by require(TableVisionPlugin) + + override val tag: PluginTag get() = Companion.tag + + override fun attach(context: Context) { + super.attach(context) + kotlinext.js.require("tabulator-tables/dist/css/tabulator.min.css") + kotlinext.js.require("tabulator-tables/src/js/modules/ResizeColumns/ResizeColumns.js") + } + + override fun rateVision(vision: Vision): Int = when (vision) { + is VisionOfTable -> ElementVisionRenderer.DEFAULT_RATING + else -> ElementVisionRenderer.ZERO_RATING + } + + override fun render(element: Element, vision: Vision, meta: Meta) { + val table: VisionOfTable = (vision as? VisionOfTable) + ?: error("VisionOfTable expected but ${vision::class} found") + + val tableOptions = jso { + columns = table.headers.map { header -> + jso { + field = header.name + title = header.properties.title ?: header.name + resizable = true + } + }.toTypedArray() + + columns = Array(table.headers.size + 1){ + if(it==0){ + jso { + field = "@index" + title = "#" + resizable = false + } + } else { + val header = table.headers[it-1] + jso { + field = header.name + title = header.properties.title ?: header.name + resizable = true + } + } + } + + + data = table.rows.mapIndexed { index, row-> + val d = row.meta.toDynamic() + d["@index"] = index + d + }.toTypedArray() + + //layout = "fitColumns" + + pagination = true + paginationSize = 10 + paginationSizeSelector = arrayOf(10, 25, 50, 100) + } + + TabulatorFull(element as HTMLElement, tableOptions) + } + + override fun content(target: String): Map = when (target) { + ElementVisionRenderer.TYPE -> mapOf("table".asName() to this) + else -> super.content(target) + } + + public companion object : PluginFactory { + override val tag: PluginTag = PluginTag("vision.table.js", PluginTag.DATAFORGE_GROUP) + override val type: KClass = TableVisionJsPlugin::class + override fun invoke(meta: Meta, context: Context): TableVisionJsPlugin = TableVisionJsPlugin() + } +} \ No newline at end of file diff --git a/visionforge-tables/src/jsMain/kotlin/tabulator/Tabulator.kt b/visionforge-tables/src/jsMain/kotlin/tabulator/Tabulator.kt new file mode 100644 index 00000000..f6efd32a --- /dev/null +++ b/visionforge-tables/src/jsMain/kotlin/tabulator/Tabulator.kt @@ -0,0 +1,2347 @@ +@file:Suppress("INTERFACE_WITH_SUPERCLASS", + "OVERRIDING_FINAL_MEMBER", + "RETURN_TYPE_MISMATCH_ON_OVERRIDE", + "CONFLICTING_OVERLOADS", + "NO_EXPLICIT_VISIBILITY_IN_API_MODE_WARNING") + +@file:JsModule("tabulator-tables") + +package tabulator + +import org.w3c.dom.Element +import org.w3c.dom.HTMLElement +import org.w3c.dom.events.MouseEvent +import org.w3c.dom.events.UIEvent +import tabulator.Tabulator.* +import kotlin.js.Promise + +external interface EventCallBackMethods { + var validationFailed: (cell: CellComponent, value: Any, validators: Array) -> Unit + var scrollHorizontal: (left: Number) -> Unit + var scrollVertical: (top: Number) -> Unit + var rowAdded: (row: RowComponent) -> Unit + var rowDeleted: (row: RowComponent) -> Unit + var rowMoved: (row: RowComponent) -> Unit + var rowUpdated: (row: RowComponent) -> Unit + var rowSelectionChanged: () -> Unit + var rowSelected: (row: RowComponent) -> Unit + var rowDeselected: (row: RowComponent) -> Unit + var rowResized: (row: RowComponent) -> Unit + var rowClick: (event: UIEvent, row: RowComponent) -> Unit + var rowDblClick: (event: UIEvent, row: RowComponent) -> Unit + var rowContext: (event: UIEvent, row: RowComponent) -> Unit + var rowTap: (event: UIEvent, row: RowComponent) -> Unit + var rowDblTap: (event: UIEvent, row: RowComponent) -> Unit + var rowTapHold: (event: UIEvent, row: RowComponent) -> Unit + var rowMouseEnter: (event: UIEvent, row: RowComponent) -> Unit + var rowMouseLeave: (event: UIEvent, row: RowComponent) -> Unit + var rowMouseOver: (event: UIEvent, row: RowComponent) -> Unit + var rowMouseOut: (event: UIEvent, row: RowComponent) -> Unit + var rowMouseMove: (event: UIEvent, row: RowComponent) -> Unit + var htmlImporting: () -> Unit + var htmlImported: () -> Unit + var ajaxError: () -> Unit + var clipboardCopied: (clipboard: String) -> Unit + var clipboardPasted: (clipboard: String, rowData: Array, rows: Array) -> Unit + var clipboardPasteError: (clipboard: String) -> Unit + var downloadComplete: () -> Unit + var dataTreeRowExpanded: (row: RowComponent, level: Number) -> Unit + var dataTreeRowCollapsed: (row: RowComponent, level: Number) -> Unit + var pageLoaded: (pageNo: Number) -> Unit + var headerClick: (event: UIEvent, column: ColumnComponent) -> Unit + var headerDblClick: (event: UIEvent, column: ColumnComponent) -> Unit + var headerContext: (event: UIEvent, column: ColumnComponent) -> Unit + var headerTap: (event: UIEvent, column: ColumnComponent) -> Unit + var headerDblTap: (event: UIEvent, column: ColumnComponent) -> Unit + var headerTapHold: (event: UIEvent, column: ColumnComponent) -> Unit + var groupClick: (event: UIEvent, group: GroupComponent) -> Unit + var groupDblClick: (event: UIEvent, group: GroupComponent) -> Unit + var groupContext: (event: UIEvent, group: GroupComponent) -> Unit + var groupTap: (event: UIEvent, group: GroupComponent) -> Unit + var groupDblTap: (event: UIEvent, group: GroupComponent) -> Unit + var groupTapHold: (event: UIEvent, group: GroupComponent) -> Unit + var tableBuilding: () -> Unit + var tableBuilt: () -> Unit + var dataLoading: (data: Array) -> Unit + var dataLoaded: (data: Array) -> Unit + var dataChanged: (data: Array) -> Unit + var dataFiltering: (filters: Array) -> Unit + var dataFiltered: (filters: Array, rows: Array) -> Unit + var dataSorting: (sorters: Sorter) -> Unit + var dataSorted: (sorters: Sorter, rows: Array) -> Unit + var movableRowsSendingStart: (toTables: Array) -> Unit + var movableRowsSent: (fromRow: RowComponent, toRow: RowComponent, toTable: Tabulator) -> Unit + var movableRowsSentFailed: (fromRow: RowComponent, toRow: RowComponent, toTable: Tabulator) -> Unit + var movableRowsSendingStop: (toTables: Array) -> Unit + var movableRowsReceivingStart: (fromRow: RowComponent, fromTable: Tabulator) -> Unit + var movableRowsReceived: (fromRow: RowComponent, toRow: RowComponent, fromTable: Tabulator) -> Unit + var movableRowsReceivedFailed: (fromRow: RowComponent, toRow: RowComponent, fromTable: Tabulator) -> Unit + var movableRowsReceivingStop: (fromTable: Tabulator) -> Unit + var movableRowsElementDrop: (event: UIEvent, element: Element, row: RowComponent) -> Unit + var dataGrouping: () -> Unit + var dataGrouped: (groups: Array) -> Unit + var groupVisibilityChanged: (group: GroupComponent, visible: Boolean) -> Unit + var localized: (locale: String, lang: Any) -> Unit + var renderStarted: () -> Unit + var renderComplete: () -> Unit + var columnMoved: (column: ColumnComponent, columns: Array) -> Unit + var columnResized: (column: ColumnComponent) -> Unit + var columnTitleChanged: (column: ColumnComponent) -> Unit + var columnVisibilityChanged: (column: ColumnComponent, visible: Boolean) -> Unit + var historyUndo: (action: String /* "cellEdit" | "rowAdd" | "rowDelete" | "rowMoved" */, component: Any, data: Array) -> Unit + var historyRedo: (action: String /* "cellEdit" | "rowAdd" | "rowDelete" | "rowMoved" */, component: Any, data: Array) -> Unit + var cellEditing: (cell: CellComponent) -> Unit + var cellEdited: (cell: CellComponent) -> Unit + var cellEditCancelled: (cell: CellComponent) -> Unit + var cellClick: (event: UIEvent, cell: CellComponent) -> Unit + var cellDblClick: (event: UIEvent, cell: CellComponent) -> Unit + var cellContext: (event: UIEvent, cell: CellComponent) -> Unit + var cellTap: (event: UIEvent, cell: CellComponent) -> Unit + var cellDblTap: (event: UIEvent, cell: CellComponent) -> Unit + var cellTapHold: (event: UIEvent, cell: CellComponent) -> Unit + var cellMouseEnter: (event: UIEvent, cell: CellComponent) -> Unit + var cellMouseLeave: (event: UIEvent, cell: CellComponent) -> Unit + var cellMouseOver: (event: UIEvent, cell: CellComponent) -> Unit + var cellMouseOut: (event: UIEvent, cell: CellComponent) -> Unit + var cellMouseMove: (event: UIEvent, cell: CellComponent) -> Unit + var dataLoadError: (error: Error) -> Unit + var dataProcessing: () -> Unit + var dataProcessed: () -> Unit +} + +external open class Tabulator { + constructor(selector: String, options: Options = definedExternally) + constructor(selector: String) + constructor(selector: HTMLElement, options: Options = definedExternally) + constructor(selector: HTMLElement) + + open var columnManager: Any + open var rowManager: Any + open var footerManager: Any + open var browser: String + open var browserSlow: Boolean + open var modules: Any + open var options: Options + open var element: HTMLElement + open var download: (downloadType: dynamic /* "csv" | "json" | "xlsx" | "pdf" | "html" | (columns: Array, data: Any, options: Any, setFileContents: Any) -> Any */, fileName: String, params: DownloadOptions, filter: String /* "visible" | "active" | "selected" | "all" */) -> Unit + open var downloadToTab: (downloadType: String /* "csv" | "json" | "xlsx" | "pdf" | "html" */, fileName: String, params: DownloadOptions) -> Unit + open var copyToClipboard: (rowRangeLookup: String /* "visible" | "active" | "selected" | "all" */) -> Unit + open var undo: () -> Boolean + open var getHistoryUndoSize: () -> dynamic + open var redo: () -> Boolean + open var getHistoryRedoSize: () -> dynamic + open var getEditedCells: () -> Array + open var clearCellEdited: (clear: dynamic /* Tabulator.CellComponent | Array */) -> Unit + open var destroy: () -> Unit + open var setDataFromLocalFile: (extensions: String) -> Unit + open var setData: (data: Any, params: Any, config: Any) -> Promise + open var clearData: () -> Unit + open var getData: (activeOnly: String /* "visible" | "active" | "selected" | "all" */) -> Array + open var getDataCount: (activeOnly: String /* "visible" | "active" | "selected" | "all" */) -> Number + open var searchRows: (field: String, type: String /* "=" | "!=" | "like" | "<" | ">" | "<=" | ">=" | "in" | "regex" | "starts" | "ends" */, value: Any) -> Array + open var searchData: (field: String, type: String /* "=" | "!=" | "like" | "<" | ">" | "<=" | ">=" | "in" | "regex" | "starts" | "ends" */, value: Any) -> Array + open var getHtml: (rowRangeLookup: String /* "visible" | "active" | "selected" | "all" */, style: Boolean, config: AddditionalExportOptions) -> Any + open var print: (rowRangeLookup: String /* "visible" | "active" | "selected" | "all" */, style: Boolean, config: AddditionalExportOptions) -> Any + open var getAjaxUrl: () -> String + open var replaceData: (data: dynamic /* Array | String */, params: Any, config: Any) -> Promise + open var updateData: (data: Array) -> Promise + open var addData: (data: Array, addToTop: Boolean, positionTarget: dynamic /* RowComponent | HTMLElement | String | Number | Array | Array */) -> Promise + open var updateOrAddData: (data: Array) -> Promise> + open var getRow: (row: dynamic /* RowComponent | HTMLElement | String | Number | Array | Array */) -> RowComponent + open var getRowFromPosition: (position: Number, activeOnly: Boolean) -> RowComponent + open var deleteRow: (index: dynamic /* RowComponent | HTMLElement | String | Number | Array | Array | Array | Array */> */) -> Unit + open var addRow: (data: Any, addToTop: Boolean, positionTarget: dynamic /* RowComponent | HTMLElement | String | Number | Array | Array */) -> Promise + open var updateOrAddRow: (row: dynamic /* RowComponent | HTMLElement | String | Number | Array | Array */, data: Any) -> Promise + open var updateRow: (row: dynamic /* RowComponent | HTMLElement | String | Number | Array | Array */, data: Any) -> Boolean + open var scrollToRow: (row: dynamic /* RowComponent | HTMLElement | String | Number | Array | Array */, position: String /* "top" | "center" | "bottom" | "nearest" */, ifVisible: Boolean) -> Promise + open var moveRow: (fromRow: dynamic /* RowComponent | HTMLElement | String | Number | Array | Array */, toRow: dynamic /* RowComponent | HTMLElement | String | Number | Array | Array */, placeAboveTarget: Boolean) -> Unit + open var getRows: (activeOnly: String /* "visible" | "active" | "selected" | "all" */) -> Array + open var getRowPosition: (row: dynamic /* RowComponent | HTMLElement | String | Number | Array | Array */, activeOnly: Boolean) -> Number + open var setColumns: (definitions: Array) -> Unit + open var getColumns: (includeColumnGroups: Boolean) -> Array + open var getColumn: (column: dynamic /* ColumnComponent | ColumnDefinition | HTMLElement | String */) -> ColumnComponent + open var getColumnDefinitions: () -> Array + open var getColumnLayout: () -> Array + open var setColumnLayout: (layout: ColumnLayout) -> Unit + open var showColumn: (column: dynamic /* ColumnComponent | ColumnDefinition | HTMLElement | String */) -> Unit + open var hideColumn: (column: dynamic /* ColumnComponent | ColumnDefinition | HTMLElement | String */) -> Unit + open var toggleColumn: (column: dynamic /* ColumnComponent | ColumnDefinition | HTMLElement | String */) -> Unit + open var addColumn: (definition: ColumnDefinition, insertRightOfTarget: Boolean, positionTarget: dynamic /* ColumnComponent | ColumnDefinition | HTMLElement | String */) -> Promise + open var deleteColumn: (column: dynamic /* ColumnComponent | ColumnDefinition | HTMLElement | String */) -> Promise + open var moveColumn: (fromColumn: dynamic /* ColumnComponent | ColumnDefinition | HTMLElement | String */, toColumn: dynamic /* ColumnComponent | ColumnDefinition | HTMLElement | String */, after: Boolean) -> Unit + open var scrollToColumn: (column: dynamic /* ColumnComponent | ColumnDefinition | HTMLElement | String */, position: String /* "left" | "center" | "middle" | "right" */, ifVisible: Boolean) -> Promise + open var updateColumnDefinition: (column: dynamic /* ColumnComponent | ColumnDefinition | HTMLElement | String */, definition: ColumnDefinition) -> Promise + open var setLocale: (locale: dynamic /* String | Boolean */) -> Unit + open var getLocale: () -> String + open var getLang: (locale: String) -> Any + open var redraw: (force: Boolean) -> Unit + open var blockRedraw: () -> Unit + open var restoreRedraw: () -> Unit + open var setHeight: (height: dynamic /* Number | String */) -> Unit + open var setSort: (sortList: dynamic /* String | Array */, dir: String /* "asc" | "desc" */) -> Unit + open var getSorters: () -> Array + open var clearSort: () -> Unit + open var setFilter: (p1: dynamic /* String | Array | Array | (data: Any, filterParams: Any) -> Boolean */, p2: dynamic /* "=" | "!=" | "like" | "<" | ">" | "<=" | ">=" | "in" | "regex" | "starts" | "ends" | Any */, value: Any, filterParams: FilterParams) -> Unit + open var addFilter: FilterFunction + open var getFilters: (includeHeaderFilters: Boolean) -> Array + open var setHeaderFilterValue: (column: dynamic /* ColumnComponent | ColumnDefinition | HTMLElement | String */, value: String) -> Unit + open var setHeaderFilterFocus: (column: dynamic /* ColumnComponent | ColumnDefinition | HTMLElement | String */) -> Unit + open var getHeaderFilters: () -> Array + open var getHeaderFilterValue: (column: dynamic /* ColumnComponent | ColumnDefinition | HTMLElement | String */) -> String + open var removeFilter: FilterFunction + open var clearFilter: (includeHeaderFilters: Boolean) -> Unit + open var clearHeaderFilter: () -> Unit + open var selectRow: (lookup: dynamic /* Array | Array */> | "visible" | "active" | "selected" | "all" | Boolean */) -> Unit + open var deselectRow: (row: dynamic /* RowComponent | HTMLElement | String | Number | Array | Array */) -> Unit + open var toggleSelectRow: (row: dynamic /* RowComponent | HTMLElement | String | Number | Array | Array */) -> Unit + open var getSelectedRows: () -> Array + open var getSelectedData: () -> Array + open var setMaxPage: (max: Number) -> Unit + open var setPage: (page: dynamic /* Number | "first" | "prev" | "next" | "last" */) -> Promise + open var setPageToRow: (row: dynamic /* RowComponent | HTMLElement | String | Number | Array | Array */) -> Promise + open var setPageSize: (size: Number) -> Unit + open var getPageSize: () -> Number + open var previousPage: () -> Promise + open var nextPage: () -> Promise + open var getPage: () -> dynamic + open var getPageMax: () -> dynamic + open var setGroupBy: (groups: dynamic /* String | Array | (data: Any) -> Any */) -> Unit + open var setGroupStartOpen: (values: dynamic /* Boolean | (value: Any, count: Number, data: Any, group: Tabulator.GroupComponent) -> Boolean */) -> Unit + open var setGroupHeader: (values: dynamic /* (value: Any, count: Number, data: Any, group: Tabulator.GroupComponent) -> String | Array<(value: Any, count: Number, data: Any) -> String> */) -> Unit + open var getGroups: () -> Array + open var getGroupedData: (activeOnly: Boolean) -> Any + open var getCalcResults: () -> Any + open var recalc: () -> Unit + open var navigatePrev: () -> Unit + open var navigateNext: () -> Unit + open var navigateLeft: () -> Unit + open var navigateRight: () -> Unit + open var navigateUp: () -> Unit + open var navigateDown: () -> Unit + open var getInvalidCells: () -> Array + open var clearCellValidation: (clearType: dynamic /* Tabulator.CellComponent | Array */) -> Unit + open var validate: () -> dynamic + open var setGroupValues: (data: GroupValuesArg) -> Unit + open var refreshFilters: () -> Unit + open var clearHistory: () -> Unit + + // open var on: (event: K, callback: Any) -> Unit + // open var off: (event: K, callback: Any) -> Unit + interface Options : OptionsGeneral, OptionsMenu, OptionsHistory, OptionsLocale, OptionsDownload, OptionsColumns, + OptionsRows, OptionsData, OptionsSorting, OptionsFiltering, OptionsRowGrouping, OptionsPagination, + OptionsPersistentConfiguration, OptionsClipboard, OptionsDataTree, OptionsCells, OptionsDebug, OptionsHTML + + interface OptionsDebug { + var invalidOptionWarning: Boolean? + get() = definedExternally + set(value) = definedExternally + var debugInvalidOptions: Boolean? + get() = definedExternally + set(value) = definedExternally + } + + interface OptionsCells : CellCallbacks { + var validationFailed: ((cell: CellComponent, value: Any, validators: dynamic /* Array | Array */) -> Unit)? + get() = definedExternally + set(value) = definedExternally + } + + interface OptionsDataTree { + var dataTree: Boolean? + get() = definedExternally + set(value) = definedExternally + var dataTreeElementColumn: dynamic /* Boolean? | String? */ + get() = definedExternally + set(value) = definedExternally + var dataTreeBranchElement: dynamic /* Boolean? | String? */ + get() = definedExternally + set(value) = definedExternally + var dataTreeChildIndent: Number? + get() = definedExternally + set(value) = definedExternally + var dataTreeChildField: String? + get() = definedExternally + set(value) = definedExternally + var dataTreeCollapseElement: dynamic /* String? | HTMLElement? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var dataTreeExpandElement: dynamic /* String? | HTMLElement? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var dataTreeStartExpanded: dynamic /* Boolean? | Array? | ((row: RowComponent, level: Number) -> Boolean)? */ + get() = definedExternally + set(value) = definedExternally + var dataTreeSelectPropagate: Boolean? + get() = definedExternally + set(value) = definedExternally + var dataTreeFilter: Boolean? + get() = definedExternally + set(value) = definedExternally + var dataTreeSort: Boolean? + get() = definedExternally + set(value) = definedExternally + } + + interface OptionsClipboard { + var clipboard: dynamic /* Boolean? | "copy" | "paste" */ + get() = definedExternally + set(value) = definedExternally + var clipboardCopyRowRange: String? /* "visible" | "active" | "selected" | "all" */ + get() = definedExternally + set(value) = definedExternally + var clipboardCopyFormatter: dynamic /* "table" | ((type: String /* "plain" | "html" */, output: String) -> String)? */ + get() = definedExternally + set(value) = definedExternally + var clipboardCopyHeader: Boolean? + get() = definedExternally + set(value) = definedExternally + var clipboardPasteParser: dynamic /* String? | ((clipboard: Any) -> Array)? */ + get() = definedExternally + set(value) = definedExternally + var clipboardPasteAction: String? /* "insert" | "update" | "replace" */ + get() = definedExternally + set(value) = definedExternally + var clipboardCopyStyled: Boolean? + get() = definedExternally + set(value) = definedExternally + var clipboardCopyConfig: dynamic /* AddditionalExportOptions? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var clipboardCopied: (() -> Unit)? + get() = definedExternally + set(value) = definedExternally + var clipboardPasted: (() -> Unit)? + get() = definedExternally + set(value) = definedExternally + var clipboardPasteError: (() -> Unit)? + get() = definedExternally + set(value) = definedExternally + var groupHeaderClipboard: dynamic /* ((value: Any, count: Number, data: Any, group: GroupComponent) -> String)? | Array<(value: Any, count: Number, data: Any) -> String>? */ + get() = definedExternally + set(value) = definedExternally + var groupHeaderHtmlOutput: dynamic /* ((value: Any, count: Number, data: Any, group: GroupComponent) -> String)? | Array<(value: Any, count: Number, data: Any) -> String>? */ + get() = definedExternally + set(value) = definedExternally + } + + interface OptionsPersistentConfiguration { + var persistenceID: String? + get() = definedExternally + set(value) = definedExternally + var persistenceMode: dynamic /* "local" | "cookie" | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var persistentLayout: Boolean? + get() = definedExternally + set(value) = definedExternally + var persistentSort: Boolean? + get() = definedExternally + set(value) = definedExternally + var persistentFilter: Boolean? + get() = definedExternally + set(value) = definedExternally + var persistence: dynamic /* Boolean? | PersistenceOptions? */ + get() = definedExternally + set(value) = definedExternally + var persistenceWriterFunc: ((id: String, type: String? /* "sort" | "filter" | "group" | "page" | "columns" */, data: Any) -> Any)? + get() = definedExternally + set(value) = definedExternally + var persistenceReaderFunc: ((id: String, type: String? /* "sort" | "filter" | "group" | "page" | "columns" */) -> Any)? + get() = definedExternally + set(value) = definedExternally + } + + interface PersistenceOptions { + var sort: Boolean? + get() = definedExternally + set(value) = definedExternally + var filter: Boolean? + get() = definedExternally + set(value) = definedExternally + var group: dynamic /* Boolean? | PersistenceGroupOptions? */ + get() = definedExternally + set(value) = definedExternally + var page: dynamic /* Boolean? | PersistencePageOptions? */ + get() = definedExternally + set(value) = definedExternally + var columns: dynamic /* Boolean? | Array? */ + get() = definedExternally + set(value) = definedExternally + } + + interface PersistenceGroupOptions { + var groupBy: Boolean? + get() = definedExternally + set(value) = definedExternally + var groupStartOpen: Boolean? + get() = definedExternally + set(value) = definedExternally + var groupHeader: Boolean? + get() = definedExternally + set(value) = definedExternally + } + + interface PersistencePageOptions { + var size: Boolean? + get() = definedExternally + set(value) = definedExternally + var page: Boolean? + get() = definedExternally + set(value) = definedExternally + } + + interface OptionsPagination { + var pagination: Boolean? + get() = definedExternally + set(value) = definedExternally + var paginationMode: String? /* "remote" | "local" */ + get() = definedExternally + set(value) = definedExternally + var paginationSize: Number? + get() = definedExternally + set(value) = definedExternally + var paginationSizeSelector: dynamic /* Boolean? | Array? | Array? */ + get() = definedExternally + set(value) = definedExternally + var paginationElement: dynamic /* HTMLElement? | String? */ + get() = definedExternally + set(value) = definedExternally + var dataReceiveParams: Record? + get() = definedExternally + set(value) = definedExternally + var dataSendParams: Record? + get() = definedExternally + set(value) = definedExternally + var paginationAddRow: String? /* "table" | "page" */ + get() = definedExternally + set(value) = definedExternally + var paginationButtonCount: Number? + get() = definedExternally + set(value) = definedExternally + var paginationInitialPage: Number? + get() = definedExternally + set(value) = definedExternally + } + + interface OptionsRowGrouping { + var groupBy: dynamic /* String? | Array? | ((data: Any) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var groupValues: GroupValuesArg? + get() = definedExternally + set(value) = definedExternally + var groupHeader: dynamic /* ((value: Any, count: Number, data: Any, group: GroupComponent) -> String)? | Array<(value: Any, count: Number, data: Any) -> String>? */ + get() = definedExternally + set(value) = definedExternally + var groupHeaderPrint: dynamic /* ((value: Any, count: Number, data: Any, group: GroupComponent) -> String)? | Array<(value: Any, count: Number, data: Any) -> String>? */ + get() = definedExternally + set(value) = definedExternally + var groupStartOpen: dynamic /* Boolean? | ((value: Any, count: Number, data: Any, group: GroupComponent) -> Boolean)? */ + get() = definedExternally + set(value) = definedExternally + var groupToggleElement: dynamic /* "arrow" | "header" | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var groupClosedShowCalcs: Boolean? + get() = definedExternally + set(value) = definedExternally + var dataGrouping: (() -> Unit)? + get() = definedExternally + set(value) = definedExternally + var dataGrouped: (() -> Unit)? + get() = definedExternally + set(value) = definedExternally + var groupVisibilityChanged: ((group: GroupComponent, visible: Boolean) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var groupClick: GroupEventCallback? + get() = definedExternally + set(value) = definedExternally + var groupDblClick: GroupEventCallback? + get() = definedExternally + set(value) = definedExternally + var groupContext: GroupEventCallback? + get() = definedExternally + set(value) = definedExternally + var groupTap: GroupEventCallback? + get() = definedExternally + set(value) = definedExternally + var groupDblTap: GroupEventCallback? + get() = definedExternally + set(value) = definedExternally + var groupTapHold: GroupEventCallback? + get() = definedExternally + set(value) = definedExternally + var groupUpdateOnCellEdit: Boolean? + get() = definedExternally + set(value) = definedExternally + } + + interface Filter { + var field: String + var type: String /* "=" | "!=" | "like" | "<" | ">" | "<=" | ">=" | "in" | "regex" | "starts" | "ends" */ + var value: Any + } + + interface FilterParams { + var separator: String? + get() = definedExternally + set(value) = definedExternally + var matchAll: Boolean? + get() = definedExternally + set(value) = definedExternally + } + + interface OptionsFiltering { + var initialFilter: Array? + get() = definedExternally + set(value) = definedExternally + var initialHeaderFilter: Array>? + get() = definedExternally + set(value) = definedExternally + var dataFiltering: ((filters: Array) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var dataFiltered: ((filters: Array, rows: Array) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var headerFilterLiveFilterDelay: Number? + get() = definedExternally + set(value) = definedExternally + } + + interface OptionsSorting { + var initialSort: Array? + get() = definedExternally + set(value) = definedExternally + var sortOrderReverse: Boolean? + get() = definedExternally + set(value) = definedExternally + } + + interface Sorter { + var column: String + var dir: String /* "asc" | "desc" */ + } + + interface SorterFromTable { + var column: ColumnComponent + var field: String + var dir: String /* "asc" | "desc" */ + } + + interface OptionsData { + var index: dynamic /* Number? | String? */ + get() = definedExternally + set(value) = definedExternally + var data: Array? + get() = definedExternally + set(value) = definedExternally + var ajaxURL: String? + get() = definedExternally + set(value) = definedExternally + var ajaxParams: Any? + get() = definedExternally + set(value) = definedExternally + var ajaxConfig: dynamic /* "GET" | "POST" | AjaxConfig? */ + get() = definedExternally + set(value) = definedExternally + var ajaxContentType: dynamic /* "form" | "json" | AjaxContentType? */ + get() = definedExternally + set(value) = definedExternally + var ajaxURLGenerator: ((url: String, config: Any, params: Any) -> String)? + get() = definedExternally + set(value) = definedExternally + var ajaxRequestFunc: ((url: String, config: Any, params: Any) -> Promise)? + get() = definedExternally + set(value) = definedExternally + var ajaxFiltering: Boolean? + get() = definedExternally + set(value) = definedExternally + var ajaxSorting: Boolean? + get() = definedExternally + set(value) = definedExternally + var progressiveLoad: String? /* "load" | "scroll" */ + get() = definedExternally + set(value) = definedExternally + var progressiveLoadDelay: Number? + get() = definedExternally + set(value) = definedExternally + var progressiveLoadScrollMargin: Number? + get() = definedExternally + set(value) = definedExternally + var ajaxLoader: dynamic /* Boolean? | (() -> Boolean)? */ + get() = definedExternally + set(value) = definedExternally + var ajaxLoaderLoading: String? + get() = definedExternally + set(value) = definedExternally + var ajaxLoaderError: String? + get() = definedExternally + set(value) = definedExternally + var ajaxRequesting: ((url: String, params: Any) -> Boolean)? + get() = definedExternally + set(value) = definedExternally + var ajaxResponse: ((url: String, params: Any, response: Any) -> Any)? + get() = definedExternally + set(value) = definedExternally + var ajaxError: ((xhr: Any, textStatus: Any, errorThrown: Any) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var dataLoader: Boolean? + get() = definedExternally + set(value) = definedExternally + var dataLoaderLoading: String? + get() = definedExternally + set(value) = definedExternally + var dataLoaderError: String? + get() = definedExternally + set(value) = definedExternally + var sortMode: String? /* "remote" | "local" */ + get() = definedExternally + set(value) = definedExternally + var filterMode: String? /* "remote" | "local" */ + get() = definedExternally + set(value) = definedExternally + } + + interface AjaxContentType { + var headers: JSONRecord + var body: (url: String, config: Any, params: Any) -> Any + } + + interface AjaxConfig { + var method: String? /* "GET" | "POST" */ + get() = definedExternally + set(value) = definedExternally + var headers: JSONRecord? + get() = definedExternally + set(value) = definedExternally + var mode: String? + get() = definedExternally + set(value) = definedExternally + var credentials: String? + get() = definedExternally + set(value) = definedExternally + } + + interface OptionsRows { + var rowFormatter: ((row: RowComponent) -> Any)? + get() = definedExternally + set(value) = definedExternally + var rowFormatterPrint: dynamic /* Boolean? | ((row: RowComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var rowFormatterHtmlOutput: dynamic /* Boolean? | ((row: RowComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var rowFormatterClipboard: dynamic /* Boolean? | ((row: RowComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var addRowPos: String? /* "bottom" | "top" */ + get() = definedExternally + set(value) = definedExternally + var selectable: dynamic /* Boolean? | Number? | "highlight" */ + get() = definedExternally + set(value) = definedExternally + var selectableRangeMode: String? /* "click" */ + get() = definedExternally + set(value) = definedExternally + var selectableRollingSelection: Boolean? + get() = definedExternally + set(value) = definedExternally + var selectablePersistence: Boolean? + get() = definedExternally + set(value) = definedExternally + var selectableCheck: ((row: RowComponent) -> Boolean)? + get() = definedExternally + set(value) = definedExternally + var movableRows: Boolean? + get() = definedExternally + set(value) = definedExternally + var movableRowsConnectedTables: dynamic /* String? | Array? | HTMLElement? | Array? */ + get() = definedExternally + set(value) = definedExternally + var movableRowsSender: dynamic /* Boolean? | "delete" | ((fromRow: RowComponent, toRow: RowComponent, toTable: Tabulator) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var movableRowsReceiver: dynamic /* "insert" | "add" | "update" | "replace" | ((fromRow: RowComponent, toRow: RowComponent, fromTable: Tabulator) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var movableRowsConnectedElements: dynamic /* String? | HTMLElement? */ + get() = definedExternally + set(value) = definedExternally + var movableRowsElementDrop: ((e: MouseEvent, element: HTMLElement, row: RowComponent) -> Any)? + get() = definedExternally + set(value) = definedExternally + var resizableRows: Boolean? + get() = definedExternally + set(value) = definedExternally + var scrollToRowPosition: String? /* "top" | "center" | "bottom" | "nearest" */ + get() = definedExternally + set(value) = definedExternally + var scrollToRowIfVisible: Boolean? + get() = definedExternally + set(value) = definedExternally + var dataTreeRowExpanded: ((row: RowComponent, level: Number) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var dataTreeRowCollapsed: ((row: RowComponent, level: Number) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var movableRowsSendingStart: ((toTables: Array) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var movableRowsSent: ((fromRow: RowComponent, toRow: RowComponent, toTable: Tabulator) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var movableRowsSentFailed: ((fromRow: RowComponent, toRow: RowComponent, toTable: Tabulator) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var movableRowsSendingStop: ((toTables: Array) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var movableRowsReceivingStart: ((fromRow: RowComponent, toTable: Tabulator) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var movableRowsReceived: ((fromRow: RowComponent, toRow: RowComponent, fromTable: Tabulator) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var movableRowsReceivedFailed: ((fromRow: RowComponent, toRow: RowComponent, fromTable: Tabulator) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var movableRowsReceivingStop: ((fromTable: Tabulator) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var rowClick: RowEventCallback? + get() = definedExternally + set(value) = definedExternally + var rowDblClick: RowEventCallback? + get() = definedExternally + set(value) = definedExternally + var rowContext: RowEventCallback? + get() = definedExternally + set(value) = definedExternally + var rowTap: RowEventCallback? + get() = definedExternally + set(value) = definedExternally + var rowDblTap: RowEventCallback? + get() = definedExternally + set(value) = definedExternally + var rowTapHold: RowEventCallback? + get() = definedExternally + set(value) = definedExternally + var rowMouseEnter: RowEventCallback? + get() = definedExternally + set(value) = definedExternally + var rowMouseLeave: RowEventCallback? + get() = definedExternally + set(value) = definedExternally + var rowMouseOver: RowEventCallback? + get() = definedExternally + set(value) = definedExternally + var rowMouseOut: RowEventCallback? + get() = definedExternally + set(value) = definedExternally + var rowMouseMove: RowEventCallback? + get() = definedExternally + set(value) = definedExternally + var rowAdded: RowChangedCallback? + get() = definedExternally + set(value) = definedExternally + var rowUpdated: RowChangedCallback? + get() = definedExternally + set(value) = definedExternally + var rowDeleted: RowChangedCallback? + get() = definedExternally + set(value) = definedExternally + var rowMoved: RowChangedCallback? + get() = definedExternally + set(value) = definedExternally + var rowResized: RowChangedCallback? + get() = definedExternally + set(value) = definedExternally + var rowSelectionChanged: ((data: Array, rows: Array) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var rowSelected: RowChangedCallback? + get() = definedExternally + set(value) = definedExternally + var rowDeselected: RowChangedCallback? + get() = definedExternally + set(value) = definedExternally + var tabEndNewRow: dynamic /* Boolean? | JSONRecord? | ((row: RowComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + } + + interface OptionsColumns { + var columns: Array? + get() = definedExternally + set(value) = definedExternally + var autoColumns: Boolean? + get() = definedExternally + set(value) = definedExternally + var autoColumnsDefinitions: dynamic /* ((columnDefinitions: Array) -> Array)? | Array? | Record? */ + get() = definedExternally + set(value) = definedExternally + var layout: String? /* "fitData" | "fitColumns" | "fitDataFill" | "fitDataStretch" | "fitDataTable" */ + get() = definedExternally + set(value) = definedExternally + var layoutColumnsOnNewData: Boolean? + get() = definedExternally + set(value) = definedExternally + var responsiveLayout: dynamic /* Boolean? | "hide" | "collapse" */ + get() = definedExternally + set(value) = definedExternally + var responsiveLayoutCollapseStartOpen: Boolean? + get() = definedExternally + set(value) = definedExternally + var responsiveLayoutCollapseUseFormatters: Boolean? + get() = definedExternally + set(value) = definedExternally + var responsiveLayoutCollapseFormatter: ((data: Array) -> Any)? + get() = definedExternally + set(value) = definedExternally + var movableColumns: Boolean? + get() = definedExternally + set(value) = definedExternally + var columnHeaderVertAlign: String? /* "top" | "middle" | "bottom" */ + get() = definedExternally + set(value) = definedExternally + var scrollToColumnPosition: String? /* "left" | "center" | "middle" | "right" */ + get() = definedExternally + set(value) = definedExternally + var scrollToColumnIfVisible: Boolean? + get() = definedExternally + set(value) = definedExternally + var columnCalcs: dynamic /* Boolean? | "both" | "table" | "group" */ + get() = definedExternally + set(value) = definedExternally + var nestedFieldSeparator: dynamic /* String? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var columnHeaderSortMulti: Boolean? + get() = definedExternally + set(value) = definedExternally + var columnMoved: ((column: ColumnComponent, columns: Array) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var columnResized: ((column: ColumnComponent) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var columnVisibilityChanged: ((column: ColumnComponent, visible: Boolean) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var columnTitleChanged: ((column: ColumnComponent) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var headerVisible: Boolean? + get() = definedExternally + set(value) = definedExternally + var print: Boolean? + get() = definedExternally + set(value) = definedExternally + var headerSort: Boolean? + get() = definedExternally + set(value) = definedExternally + var headerSortElement: String? + get() = definedExternally + set(value) = definedExternally + var columnDefaults: ColumnDefinition? + get() = definedExternally + set(value) = definedExternally + } + + interface OptionsCell { + var cellClick: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellDblClick: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellContext: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellTap: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellDblTap: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellTapHold: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellMouseEnter: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellMouseLeave: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellMouseOver: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellMouseOut: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellMouseMove: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellEditing: CellEditEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellEdited: CellEditEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellEditCancelled: CellEditEventCallback? + get() = definedExternally + set(value) = definedExternally + } + + interface OptionsGeneral { + var height: dynamic /* String? | Number? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var maxHeight: dynamic /* String? | Number? */ + get() = definedExternally + set(value) = definedExternally + var minHeight: dynamic /* String? | Number? */ + get() = definedExternally + set(value) = definedExternally + var renderVertical: dynamic /* "virtual" | "basic" | Renderer? */ + get() = definedExternally + set(value) = definedExternally + var renderHorizontal: dynamic /* "virtual" | "basic" | Renderer? */ + get() = definedExternally + set(value) = definedExternally + var renderVerticalBuffer: dynamic /* Boolean? | Number? */ + get() = definedExternally + set(value) = definedExternally + var placeholder: dynamic /* String? | HTMLElement? */ + get() = definedExternally + set(value) = definedExternally + var footerElement: dynamic /* String? | HTMLElement? */ + get() = definedExternally + set(value) = definedExternally + var tooltipGenerationMode: String? /* "load" | "hover" */ + get() = definedExternally + set(value) = definedExternally + var keybindings: dynamic /* Boolean? | KeyBinding? */ + get() = definedExternally + set(value) = definedExternally + var reactiveData: Boolean? + get() = definedExternally + set(value) = definedExternally + var autoResize: Boolean? + get() = definedExternally + set(value) = definedExternally + var tableBuilding: (() -> Unit)? + get() = definedExternally + set(value) = definedExternally + var tableBuilt: (() -> Unit)? + get() = definedExternally + set(value) = definedExternally + var renderStarted: (() -> Unit)? + get() = definedExternally + set(value) = definedExternally + var renderComplete: (() -> Unit)? + get() = definedExternally + set(value) = definedExternally + var htmlImporting: EmptyCallback? + get() = definedExternally + set(value) = definedExternally + var htmlImported: EmptyCallback? + get() = definedExternally + set(value) = definedExternally + var dataChanged: ((data: Any) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var pageLoaded: ((pageno: Number) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var dataSorting: ((sorters: Array) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var dataSorted: ((sorters: Array, rows: Array) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var invalidOptionWarnings: Boolean? + get() = definedExternally + set(value) = definedExternally + var scrollVertical: ((top: Any) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var scrollHorizontal: ((left: Any) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var validationMode: String? /* "blocking" | "highlight" | "manual" */ + get() = definedExternally + set(value) = definedExternally + var textDirection: String? /* "auto" | "ltr" | "rtl" */ + get() = definedExternally + set(value) = definedExternally + } + + interface OptionsMenu { + var rowContextMenu: dynamic /* Array | MenuSeparator */>? | ((component: RowComponent, e: MouseEvent) -> dynamic)? */ + get() = definedExternally + set(value) = definedExternally + var rowClickMenu: dynamic /* Array | MenuSeparator */>? | ((component: RowComponent, e: MouseEvent) -> dynamic)? */ + get() = definedExternally + set(value) = definedExternally + var groupClickMenu: dynamic /* Array | MenuSeparator */>? | ((component: GroupComponent, e: MouseEvent) -> dynamic)? */ + get() = definedExternally + set(value) = definedExternally + var groupContextMenu: Array>? + get() = definedExternally + set(value) = definedExternally + } + + interface MenuObject { + var label: dynamic /* String | HTMLElement | (component: T) -> dynamic */ + get() = definedExternally + set(value) = definedExternally + var action: ((e: Any, component: T) -> Any)? + get() = definedExternally + set(value) = definedExternally + var disabled: dynamic /* Boolean? | ((component: T) -> Boolean)? */ + get() = definedExternally + set(value) = definedExternally + var menu: Array>? + get() = definedExternally + set(value) = definedExternally + } + + interface MenuSeparator { + var separator: Boolean? + get() = definedExternally + set(value) = definedExternally + } + + interface DownloadOptions : DownloadCSV, DownloadXLXS, DownloadPDF, DownloadHTML { + override var documentProcessing: ((input: Any) -> Any)? + get() = definedExternally + set(value) = definedExternally + } + + interface DownloadCSV { + var delimiter: String? + get() = definedExternally + set(value) = definedExternally + var bom: Boolean? + get() = definedExternally + set(value) = definedExternally + } + + interface DownloadHTML { + var style: Boolean? + get() = definedExternally + set(value) = definedExternally + } + + interface DownloadXLXS { + var sheetName: String? + get() = definedExternally + set(value) = definedExternally + var documentProcessing: ((input: Any) -> Any)? + get() = definedExternally + set(value) = definedExternally + } + + interface DownloadPDF { + var orientation: String? /* "portrait" | "landscape" */ + get() = definedExternally + set(value) = definedExternally + var title: String? + get() = definedExternally + set(value) = definedExternally + var rowGroupStyles: Any? + get() = definedExternally + set(value) = definedExternally + var rowCalcStyles: Any? + get() = definedExternally + set(value) = definedExternally + var jsPDF: Any? + get() = definedExternally + set(value) = definedExternally + var autoTable: dynamic /* Any? | ((doc: Any) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var documentProcessing: ((doc: Any) -> Any)? + get() = definedExternally + set(value) = definedExternally + } + + interface OptionsDownload { + var downloadReady: ((fileContents: Any, blob: Any) -> Any)? + get() = definedExternally + set(value) = definedExternally + var downloadComplete: (() -> Unit)? + get() = definedExternally + set(value) = definedExternally + var downloadConfig: AddditionalExportOptions? + get() = definedExternally + set(value) = definedExternally + var downloadRowRange: String? /* "visible" | "active" | "selected" | "all" */ + get() = definedExternally + set(value) = definedExternally + } + + interface OptionsHTML { + var htmlOutputConfig: AddditionalExportOptions? + get() = definedExternally + set(value) = definedExternally + var printAsHtml: Boolean? + get() = definedExternally + set(value) = definedExternally + var printConfig: AddditionalExportOptions? + get() = definedExternally + set(value) = definedExternally + var printStyled: Boolean? + get() = definedExternally + set(value) = definedExternally + var printRowRange: dynamic /* "visible" | "active" | "selected" | "all" | (() -> Array)? */ + get() = definedExternally + set(value) = definedExternally + var printHeader: dynamic /* String? | HTMLElement? | (() -> dynamic)? */ + get() = definedExternally + set(value) = definedExternally + var printFooter: dynamic /* String? | HTMLElement? | (() -> dynamic)? */ + get() = definedExternally + set(value) = definedExternally + var printFormatter: ((tableHolderElement: Any, tableElement: Any) -> Any)? + get() = definedExternally + set(value) = definedExternally + var groupHeaderDownload: dynamic /* ((value: Any, count: Number, data: Any, group: GroupComponent) -> String)? | Array<(value: Any, count: Number, data: Any) -> String>? */ + get() = definedExternally + set(value) = definedExternally + } + + interface AddditionalExportOptions { + var columnHeaders: Boolean? + get() = definedExternally + set(value) = definedExternally + var columnGroups: Boolean? + get() = definedExternally + set(value) = definedExternally + var rowGroups: Boolean? + get() = definedExternally + set(value) = definedExternally + var columnCalcs: Boolean? + get() = definedExternally + set(value) = definedExternally + var dataTree: Boolean? + get() = definedExternally + set(value) = definedExternally + var formatCells: Boolean? + get() = definedExternally + set(value) = definedExternally + } + + interface OptionsLocale { + var locale: dynamic /* Boolean? | String? */ + get() = definedExternally + set(value) = definedExternally + var langs: Any? + get() = definedExternally + set(value) = definedExternally + var localized: ((locale: String, lang: Any) -> Unit)? + get() = definedExternally + set(value) = definedExternally + } + + interface OptionsHistory { + var history: Boolean? + get() = definedExternally + set(value) = definedExternally + var historyUndo: ((action: String? /* "cellEdit" | "rowAdd" | "rowDelete" | "rowMoved" */, component: dynamic /* CellComponent | RowComponent */, data: Any) -> Unit)? + get() = definedExternally + set(value) = definedExternally + var historyRedo: ((action: String? /* "cellEdit" | "rowAdd" | "rowDelete" | "rowMoved" */, component: dynamic /* CellComponent | RowComponent */, data: Any) -> Unit)? + get() = definedExternally + set(value) = definedExternally + } + + interface ColumnLayout { + var title: String + var field: String? + get() = definedExternally + set(value) = definedExternally + var visible: Boolean? + get() = definedExternally + set(value) = definedExternally + var width: dynamic /* Number? | String? */ + get() = definedExternally + set(value) = definedExternally + } + + interface ColumnLayoutPartial { + var title: String? + get() = definedExternally + set(value) = definedExternally + var field: String? + get() = definedExternally + set(value) = definedExternally + var visible: Boolean? + get() = definedExternally + set(value) = definedExternally + var width: dynamic /* Number? | String? */ + get() = definedExternally + set(value) = definedExternally + } + + interface ColumnDefinition : ColumnLayout, CellCallbacks { + var hozAlign: String? /* "left" | "center" | "right" */ + get() = definedExternally + set(value) = definedExternally + var headerHozAlign: String? /* "left" | "center" | "right" */ + get() = definedExternally + set(value) = definedExternally + var vertAlign: String? /* "top" | "middle" | "bottom" */ + get() = definedExternally + set(value) = definedExternally + var minWidth: Number? + get() = definedExternally + set(value) = definedExternally + var widthGrow: Number? + get() = definedExternally + set(value) = definedExternally + var widthShrink: Number? + get() = definedExternally + set(value) = definedExternally + var resizable: dynamic /* Boolean? | "header" | "cell" */ + get() = definedExternally + set(value) = definedExternally + var frozen: Boolean? + get() = definedExternally + set(value) = definedExternally + var responsive: Number? + get() = definedExternally + set(value) = definedExternally + var tooltip: dynamic /* String? | Boolean? | ((cell: CellComponent) -> String)? */ + get() = definedExternally + set(value) = definedExternally + var cssClass: String? + get() = definedExternally + set(value) = definedExternally + var rowHandle: Boolean? + get() = definedExternally + set(value) = definedExternally + var hideInHtml: Boolean? + get() = definedExternally + set(value) = definedExternally + var sorter: dynamic /* "string" | "number" | "alphanum" | "boolean" | "exists" | "date" | "time" | "datetime" | "array" | ((a: Any, b: Any, aRow: RowComponent, bRow: RowComponent, column: ColumnComponent, dir: String /* "asc" | "desc" */, sorterParams: Any) -> Number)? */ + get() = definedExternally + set(value) = definedExternally + var sorterParams: dynamic /* ColumnDefinitionSorterParams? | ColumnSorterParamLookupFunction? */ + get() = definedExternally + set(value) = definedExternally + var formatter: dynamic /* "plaintext" | "textarea" | "html" | "money" | "image" | "datetime" | "datetimediff" | "link" | "tickCross" | "color" | "star" | "traffic" | "progress" | "lookup" | "buttonTick" | "buttonCross" | "rownum" | "handle" | "rowSelection" | "responsiveCollapse" | ((cell: CellComponent, formatterParams: Any, onRendered: EmptyCallback) -> dynamic)? */ + get() = definedExternally + set(value) = definedExternally + var formatterParams: dynamic /* MoneyParams? | ImageParams? | LinkParams? | DateTimeParams? | DateTimeDifferenceParams? | TickCrossParams? | TrafficParams? | ProgressBarParams? | StarRatingParams? | RowSelectionParams? | JSONRecord? | ((cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var variableHeight: Boolean? + get() = definedExternally + set(value) = definedExternally + var editable: dynamic /* Boolean? | ((cell: CellComponent) -> Boolean)? */ + get() = definedExternally + set(value) = definedExternally + var editor: dynamic /* Boolean? | "input" | "textarea" | "number" | "range" | "tickCross" | "star" | "select" | "autocomplete" | ((cell: CellComponent, onRendered: EmptyCallback, success: ValueBooleanCallback, cancel: ValueVoidCallback, editorParams: Any) -> dynamic)? */ + get() = definedExternally + set(value) = definedExternally + var editorParams: dynamic /* NumberParams? | CheckboxParams? | SelectParams? | AutoCompleteParams? | InputParams? | TextAreaParams? | ((cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var validator: dynamic /* "required" | "unique" | "integer" | "float" | "numeric" | "string" | Array? | Validator? | Array? | String? */ + get() = definedExternally + set(value) = definedExternally + var mutator: CustomMutator? + get() = definedExternally + set(value) = definedExternally + var mutatorParams: dynamic /* Any? | ((value: Any, data: Any, type: String /* "data" | "edit" */, cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var mutatorData: CustomMutator? + get() = definedExternally + set(value) = definedExternally + var mutatorDataParams: dynamic /* Any? | ((value: Any, data: Any, type: String /* "data" | "edit" */, cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var mutatorEdit: CustomMutator? + get() = definedExternally + set(value) = definedExternally + var mutatorEditParams: dynamic /* Any? | ((value: Any, data: Any, type: String /* "data" | "edit" */, cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var mutatorClipboard: CustomMutator? + get() = definedExternally + set(value) = definedExternally + var mutatorClipboardParams: dynamic /* Any? | ((value: Any, data: Any, type: String /* "data" | "edit" */, cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var accessor: CustomAccessor? + get() = definedExternally + set(value) = definedExternally + var accessorParams: dynamic /* Any? | ((value: Any, data: Any, type: String /* "data" | "download" | "clipboard" */, column: ColumnComponent, row: RowComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var accessorDownload: CustomAccessor? + get() = definedExternally + set(value) = definedExternally + var accessorDownloadParams: dynamic /* Any? | ((value: Any, data: Any, type: String /* "data" | "download" | "clipboard" */, column: ColumnComponent, row: RowComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var accessorClipboard: CustomAccessor? + get() = definedExternally + set(value) = definedExternally + var accessorClipboardParams: dynamic /* Any? | ((value: Any, data: Any, type: String /* "data" | "download" | "clipboard" */, column: ColumnComponent, row: RowComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var download: Boolean? + get() = definedExternally + set(value) = definedExternally + var titleDownload: String? + get() = definedExternally + set(value) = definedExternally + var topCalc: dynamic /* "avg" | "max" | "min" | "sum" | "concat" | "count" | ((values: Array, data: Array, calcParams: Any) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var topCalcParams: ColumnCalcParams? + get() = definedExternally + set(value) = definedExternally + var topCalcFormatter: dynamic /* "plaintext" | "textarea" | "html" | "money" | "image" | "datetime" | "datetimediff" | "link" | "tickCross" | "color" | "star" | "traffic" | "progress" | "lookup" | "buttonTick" | "buttonCross" | "rownum" | "handle" | "rowSelection" | "responsiveCollapse" | ((cell: CellComponent, formatterParams: Any, onRendered: EmptyCallback) -> dynamic)? */ + get() = definedExternally + set(value) = definedExternally + var topCalcFormatterParams: dynamic /* MoneyParams? | ImageParams? | LinkParams? | DateTimeParams? | DateTimeDifferenceParams? | TickCrossParams? | TrafficParams? | ProgressBarParams? | StarRatingParams? | RowSelectionParams? | JSONRecord? | ((cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var bottomCalc: dynamic /* "avg" | "max" | "min" | "sum" | "concat" | "count" | ((values: Array, data: Array, calcParams: Any) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var bottomCalcParams: ColumnCalcParams? + get() = definedExternally + set(value) = definedExternally + var bottomCalcFormatter: dynamic /* "plaintext" | "textarea" | "html" | "money" | "image" | "datetime" | "datetimediff" | "link" | "tickCross" | "color" | "star" | "traffic" | "progress" | "lookup" | "buttonTick" | "buttonCross" | "rownum" | "handle" | "rowSelection" | "responsiveCollapse" | ((cell: CellComponent, formatterParams: Any, onRendered: EmptyCallback) -> dynamic)? */ + get() = definedExternally + set(value) = definedExternally + var bottomCalcFormatterParams: dynamic /* MoneyParams? | ImageParams? | LinkParams? | DateTimeParams? | DateTimeDifferenceParams? | TickCrossParams? | TrafficParams? | ProgressBarParams? | StarRatingParams? | RowSelectionParams? | JSONRecord? | ((cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var headerSort: Boolean? + get() = definedExternally + set(value) = definedExternally + var headerSortStartingDir: String? /* "asc" | "desc" */ + get() = definedExternally + set(value) = definedExternally + var headerSortTristate: Boolean? + get() = definedExternally + set(value) = definedExternally + var headerClick: ColumnEventCallback? + get() = definedExternally + set(value) = definedExternally + var headerDblClick: ColumnEventCallback? + get() = definedExternally + set(value) = definedExternally + var headerContext: ColumnEventCallback? + get() = definedExternally + set(value) = definedExternally + var headerTap: ColumnEventCallback? + get() = definedExternally + set(value) = definedExternally + var headerDblTap: ColumnEventCallback? + get() = definedExternally + set(value) = definedExternally + var headerTapHold: ColumnEventCallback? + get() = definedExternally + set(value) = definedExternally + var headerTooltip: dynamic /* Boolean? | String? | ((column: ColumnComponent) -> String)? */ + get() = definedExternally + set(value) = definedExternally + var headerVertical: dynamic /* Boolean? | "flip" */ + get() = definedExternally + set(value) = definedExternally + var editableTitle: Boolean? + get() = definedExternally + set(value) = definedExternally + var titleFormatter: dynamic /* "plaintext" | "textarea" | "html" | "money" | "image" | "datetime" | "datetimediff" | "link" | "tickCross" | "color" | "star" | "traffic" | "progress" | "lookup" | "buttonTick" | "buttonCross" | "rownum" | "handle" | "rowSelection" | "responsiveCollapse" | ((cell: CellComponent, formatterParams: Any, onRendered: EmptyCallback) -> dynamic)? */ + get() = definedExternally + set(value) = definedExternally + var titleFormatterParams: dynamic /* MoneyParams? | ImageParams? | LinkParams? | DateTimeParams? | DateTimeDifferenceParams? | TickCrossParams? | TrafficParams? | ProgressBarParams? | StarRatingParams? | RowSelectionParams? | JSONRecord? | ((cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var headerFilter: dynamic /* Boolean? | "input" | "textarea" | "number" | "range" | "tickCross" | "star" | "select" | "autocomplete" | ((cell: CellComponent, onRendered: EmptyCallback, success: ValueBooleanCallback, cancel: ValueVoidCallback, editorParams: Any) -> dynamic)? */ + get() = definedExternally + set(value) = definedExternally + var headerFilterParams: dynamic /* NumberParams? | CheckboxParams? | SelectParams? | AutoCompleteParams? | InputParams? | TextAreaParams? | ((cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var headerFilterPlaceholder: String? + get() = definedExternally + set(value) = definedExternally + var headerFilterEmptyCheck: ValueBooleanCallback? + get() = definedExternally + set(value) = definedExternally + var headerFilterFunc: dynamic /* "=" | "!=" | "like" | "<" | ">" | "<=" | ">=" | "in" | "regex" | "starts" | "ends" | ((headerValue: Any, rowValue: Any, rowdata: Any, filterparams: Any) -> Boolean)? */ + get() = definedExternally + set(value) = definedExternally + var headerFilterFuncParams: Any? + get() = definedExternally + set(value) = definedExternally + var headerFilterLiveFilter: Boolean? + get() = definedExternally + set(value) = definedExternally + var htmlOutput: Boolean? + get() = definedExternally + set(value) = definedExternally + var clipboard: Boolean? + get() = definedExternally + set(value) = definedExternally + var columns: Array? + get() = definedExternally + set(value) = definedExternally + var headerMenu: Array | MenuSeparator */>? + get() = definedExternally + set(value) = definedExternally + var headerContextMenu: Array | MenuSeparator */>? + get() = definedExternally + set(value) = definedExternally + var contextMenu: Array | MenuSeparator */>? + get() = definedExternally + set(value) = definedExternally + var clickMenu: Array | MenuSeparator */>? + get() = definedExternally + set(value) = definedExternally + var formatterClipboard: dynamic /* "plaintext" | "textarea" | "html" | "money" | "image" | "datetime" | "datetimediff" | "link" | "tickCross" | "color" | "star" | "traffic" | "progress" | "lookup" | "buttonTick" | "buttonCross" | "rownum" | "handle" | "rowSelection" | "responsiveCollapse" | ((cell: CellComponent, formatterParams: Any, onRendered: EmptyCallback) -> dynamic)? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var formatterClipboardParams: dynamic /* MoneyParams? | ImageParams? | LinkParams? | DateTimeParams? | DateTimeDifferenceParams? | TickCrossParams? | TrafficParams? | ProgressBarParams? | StarRatingParams? | RowSelectionParams? | JSONRecord? | ((cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var formatterPrint: dynamic /* "plaintext" | "textarea" | "html" | "money" | "image" | "datetime" | "datetimediff" | "link" | "tickCross" | "color" | "star" | "traffic" | "progress" | "lookup" | "buttonTick" | "buttonCross" | "rownum" | "handle" | "rowSelection" | "responsiveCollapse" | ((cell: CellComponent, formatterParams: Any, onRendered: EmptyCallback) -> dynamic)? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var formatterPrintParams: dynamic /* MoneyParams? | ImageParams? | LinkParams? | DateTimeParams? | DateTimeDifferenceParams? | TickCrossParams? | TrafficParams? | ProgressBarParams? | StarRatingParams? | RowSelectionParams? | JSONRecord? | ((cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var accessorPrint: CustomAccessor? + get() = definedExternally + set(value) = definedExternally + var accessorPrintParams: dynamic /* Any? | ((value: Any, data: Any, type: String /* "data" | "download" | "clipboard" */, column: ColumnComponent, row: RowComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var accessorHtmlOutput: CustomAccessor? + get() = definedExternally + set(value) = definedExternally + var accessorHtmlOutputParams: dynamic /* Any? | ((value: Any, data: Any, type: String /* "data" | "download" | "clipboard" */, column: ColumnComponent, row: RowComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var formatterHtmlOutput: dynamic /* "plaintext" | "textarea" | "html" | "money" | "image" | "datetime" | "datetimediff" | "link" | "tickCross" | "color" | "star" | "traffic" | "progress" | "lookup" | "buttonTick" | "buttonCross" | "rownum" | "handle" | "rowSelection" | "responsiveCollapse" | ((cell: CellComponent, formatterParams: Any, onRendered: EmptyCallback) -> dynamic)? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var formatterHtmlOutputParams: dynamic /* MoneyParams? | ImageParams? | LinkParams? | DateTimeParams? | DateTimeDifferenceParams? | TickCrossParams? | TrafficParams? | ProgressBarParams? | StarRatingParams? | RowSelectionParams? | JSONRecord? | ((cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var titleClipboard: String? + get() = definedExternally + set(value) = definedExternally + var titleHtmlOutput: String? + get() = definedExternally + set(value) = definedExternally + var titlePrint: String? + get() = definedExternally + set(value) = definedExternally + var maxWidth: dynamic /* Number? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + } + + interface ColumnDefinitionPartial : ColumnLayoutPartial, CellCallbacksPartial { + var hozAlign: String? /* "left" | "center" | "right" */ + get() = definedExternally + set(value) = definedExternally + var headerHozAlign: String? /* "left" | "center" | "right" */ + get() = definedExternally + set(value) = definedExternally + var vertAlign: String? /* "top" | "middle" | "bottom" */ + get() = definedExternally + set(value) = definedExternally + var minWidth: Number? + get() = definedExternally + set(value) = definedExternally + var widthGrow: Number? + get() = definedExternally + set(value) = definedExternally + var widthShrink: Number? + get() = definedExternally + set(value) = definedExternally + var resizable: dynamic /* Boolean? | "header" | "cell" */ + get() = definedExternally + set(value) = definedExternally + var frozen: Boolean? + get() = definedExternally + set(value) = definedExternally + var responsive: Number? + get() = definedExternally + set(value) = definedExternally + var tooltip: dynamic /* String? | Boolean? | ((cell: CellComponent) -> String)? */ + get() = definedExternally + set(value) = definedExternally + var cssClass: String? + get() = definedExternally + set(value) = definedExternally + var rowHandle: Boolean? + get() = definedExternally + set(value) = definedExternally + var hideInHtml: Boolean? + get() = definedExternally + set(value) = definedExternally + var sorter: dynamic /* "string" | "number" | "alphanum" | "boolean" | "exists" | "date" | "time" | "datetime" | "array" | ((a: Any, b: Any, aRow: RowComponent, bRow: RowComponent, column: ColumnComponent, dir: String /* "asc" | "desc" */, sorterParams: Any) -> Number)? */ + get() = definedExternally + set(value) = definedExternally + var sorterParams: dynamic /* ColumnDefinitionSorterParams? | ColumnSorterParamLookupFunction? */ + get() = definedExternally + set(value) = definedExternally + var formatter: dynamic /* "plaintext" | "textarea" | "html" | "money" | "image" | "datetime" | "datetimediff" | "link" | "tickCross" | "color" | "star" | "traffic" | "progress" | "lookup" | "buttonTick" | "buttonCross" | "rownum" | "handle" | "rowSelection" | "responsiveCollapse" | ((cell: CellComponent, formatterParams: Any, onRendered: EmptyCallback) -> dynamic)? */ + get() = definedExternally + set(value) = definedExternally + var formatterParams: dynamic /* MoneyParams? | ImageParams? | LinkParams? | DateTimeParams? | DateTimeDifferenceParams? | TickCrossParams? | TrafficParams? | ProgressBarParams? | StarRatingParams? | RowSelectionParams? | JSONRecord? | ((cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var variableHeight: Boolean? + get() = definedExternally + set(value) = definedExternally + var editable: dynamic /* Boolean? | ((cell: CellComponent) -> Boolean)? */ + get() = definedExternally + set(value) = definedExternally + var editor: dynamic /* Boolean? | "input" | "textarea" | "number" | "range" | "tickCross" | "star" | "select" | "autocomplete" | ((cell: CellComponent, onRendered: EmptyCallback, success: ValueBooleanCallback, cancel: ValueVoidCallback, editorParams: Any) -> dynamic)? */ + get() = definedExternally + set(value) = definedExternally + var editorParams: dynamic /* NumberParams? | CheckboxParams? | SelectParams? | AutoCompleteParams? | InputParams? | TextAreaParams? | ((cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var validator: dynamic /* "required" | "unique" | "integer" | "float" | "numeric" | "string" | Array? | Validator? | Array? | String? */ + get() = definedExternally + set(value) = definedExternally + var mutator: CustomMutator? + get() = definedExternally + set(value) = definedExternally + var mutatorParams: dynamic /* Any? | ((value: Any, data: Any, type: String /* "data" | "edit" */, cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var mutatorData: CustomMutator? + get() = definedExternally + set(value) = definedExternally + var mutatorDataParams: dynamic /* Any? | ((value: Any, data: Any, type: String /* "data" | "edit" */, cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var mutatorEdit: CustomMutator? + get() = definedExternally + set(value) = definedExternally + var mutatorEditParams: dynamic /* Any? | ((value: Any, data: Any, type: String /* "data" | "edit" */, cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var mutatorClipboard: CustomMutator? + get() = definedExternally + set(value) = definedExternally + var mutatorClipboardParams: dynamic /* Any? | ((value: Any, data: Any, type: String /* "data" | "edit" */, cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var accessor: CustomAccessor? + get() = definedExternally + set(value) = definedExternally + var accessorParams: dynamic /* Any? | ((value: Any, data: Any, type: String /* "data" | "download" | "clipboard" */, column: ColumnComponent, row: RowComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var accessorDownload: CustomAccessor? + get() = definedExternally + set(value) = definedExternally + var accessorDownloadParams: dynamic /* Any? | ((value: Any, data: Any, type: String /* "data" | "download" | "clipboard" */, column: ColumnComponent, row: RowComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var accessorClipboard: CustomAccessor? + get() = definedExternally + set(value) = definedExternally + var accessorClipboardParams: dynamic /* Any? | ((value: Any, data: Any, type: String /* "data" | "download" | "clipboard" */, column: ColumnComponent, row: RowComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var download: Boolean? + get() = definedExternally + set(value) = definedExternally + var titleDownload: String? + get() = definedExternally + set(value) = definedExternally + var topCalc: dynamic /* "avg" | "max" | "min" | "sum" | "concat" | "count" | ((values: Array, data: Array, calcParams: Any) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var topCalcParams: ColumnCalcParams? + get() = definedExternally + set(value) = definedExternally + var topCalcFormatter: dynamic /* "plaintext" | "textarea" | "html" | "money" | "image" | "datetime" | "datetimediff" | "link" | "tickCross" | "color" | "star" | "traffic" | "progress" | "lookup" | "buttonTick" | "buttonCross" | "rownum" | "handle" | "rowSelection" | "responsiveCollapse" | ((cell: CellComponent, formatterParams: Any, onRendered: EmptyCallback) -> dynamic)? */ + get() = definedExternally + set(value) = definedExternally + var topCalcFormatterParams: dynamic /* MoneyParams? | ImageParams? | LinkParams? | DateTimeParams? | DateTimeDifferenceParams? | TickCrossParams? | TrafficParams? | ProgressBarParams? | StarRatingParams? | RowSelectionParams? | JSONRecord? | ((cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var bottomCalc: dynamic /* "avg" | "max" | "min" | "sum" | "concat" | "count" | ((values: Array, data: Array, calcParams: Any) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var bottomCalcParams: ColumnCalcParams? + get() = definedExternally + set(value) = definedExternally + var bottomCalcFormatter: dynamic /* "plaintext" | "textarea" | "html" | "money" | "image" | "datetime" | "datetimediff" | "link" | "tickCross" | "color" | "star" | "traffic" | "progress" | "lookup" | "buttonTick" | "buttonCross" | "rownum" | "handle" | "rowSelection" | "responsiveCollapse" | ((cell: CellComponent, formatterParams: Any, onRendered: EmptyCallback) -> dynamic)? */ + get() = definedExternally + set(value) = definedExternally + var bottomCalcFormatterParams: dynamic /* MoneyParams? | ImageParams? | LinkParams? | DateTimeParams? | DateTimeDifferenceParams? | TickCrossParams? | TrafficParams? | ProgressBarParams? | StarRatingParams? | RowSelectionParams? | JSONRecord? | ((cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var headerSort: Boolean? + get() = definedExternally + set(value) = definedExternally + var headerSortStartingDir: String? /* "asc" | "desc" */ + get() = definedExternally + set(value) = definedExternally + var headerSortTristate: Boolean? + get() = definedExternally + set(value) = definedExternally + var headerClick: ColumnEventCallback? + get() = definedExternally + set(value) = definedExternally + var headerDblClick: ColumnEventCallback? + get() = definedExternally + set(value) = definedExternally + var headerContext: ColumnEventCallback? + get() = definedExternally + set(value) = definedExternally + var headerTap: ColumnEventCallback? + get() = definedExternally + set(value) = definedExternally + var headerDblTap: ColumnEventCallback? + get() = definedExternally + set(value) = definedExternally + var headerTapHold: ColumnEventCallback? + get() = definedExternally + set(value) = definedExternally + var headerTooltip: dynamic /* Boolean? | String? | ((column: ColumnComponent) -> String)? */ + get() = definedExternally + set(value) = definedExternally + var headerVertical: dynamic /* Boolean? | "flip" */ + get() = definedExternally + set(value) = definedExternally + var editableTitle: Boolean? + get() = definedExternally + set(value) = definedExternally + var titleFormatter: dynamic /* "plaintext" | "textarea" | "html" | "money" | "image" | "datetime" | "datetimediff" | "link" | "tickCross" | "color" | "star" | "traffic" | "progress" | "lookup" | "buttonTick" | "buttonCross" | "rownum" | "handle" | "rowSelection" | "responsiveCollapse" | ((cell: CellComponent, formatterParams: Any, onRendered: EmptyCallback) -> dynamic)? */ + get() = definedExternally + set(value) = definedExternally + var titleFormatterParams: dynamic /* MoneyParams? | ImageParams? | LinkParams? | DateTimeParams? | DateTimeDifferenceParams? | TickCrossParams? | TrafficParams? | ProgressBarParams? | StarRatingParams? | RowSelectionParams? | JSONRecord? | ((cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var headerFilter: dynamic /* Boolean? | "input" | "textarea" | "number" | "range" | "tickCross" | "star" | "select" | "autocomplete" | ((cell: CellComponent, onRendered: EmptyCallback, success: ValueBooleanCallback, cancel: ValueVoidCallback, editorParams: Any) -> dynamic)? */ + get() = definedExternally + set(value) = definedExternally + var headerFilterParams: dynamic /* NumberParams? | CheckboxParams? | SelectParams? | AutoCompleteParams? | InputParams? | TextAreaParams? | ((cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var headerFilterPlaceholder: String? + get() = definedExternally + set(value) = definedExternally + var headerFilterEmptyCheck: ValueBooleanCallback? + get() = definedExternally + set(value) = definedExternally + var headerFilterFunc: dynamic /* "=" | "!=" | "like" | "<" | ">" | "<=" | ">=" | "in" | "regex" | "starts" | "ends" | ((headerValue: Any, rowValue: Any, rowdata: Any, filterparams: Any) -> Boolean)? */ + get() = definedExternally + set(value) = definedExternally + var headerFilterFuncParams: Any? + get() = definedExternally + set(value) = definedExternally + var headerFilterLiveFilter: Boolean? + get() = definedExternally + set(value) = definedExternally + var htmlOutput: Boolean? + get() = definedExternally + set(value) = definedExternally + var clipboard: Boolean? + get() = definedExternally + set(value) = definedExternally + var columns: Array? + get() = definedExternally + set(value) = definedExternally + var headerMenu: Array | MenuSeparator */>? + get() = definedExternally + set(value) = definedExternally + var headerContextMenu: Array | MenuSeparator */>? + get() = definedExternally + set(value) = definedExternally + var contextMenu: Array | MenuSeparator */>? + get() = definedExternally + set(value) = definedExternally + var clickMenu: Array | MenuSeparator */>? + get() = definedExternally + set(value) = definedExternally + var formatterClipboard: dynamic /* "plaintext" | "textarea" | "html" | "money" | "image" | "datetime" | "datetimediff" | "link" | "tickCross" | "color" | "star" | "traffic" | "progress" | "lookup" | "buttonTick" | "buttonCross" | "rownum" | "handle" | "rowSelection" | "responsiveCollapse" | ((cell: CellComponent, formatterParams: Any, onRendered: EmptyCallback) -> dynamic)? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var formatterClipboardParams: dynamic /* MoneyParams? | ImageParams? | LinkParams? | DateTimeParams? | DateTimeDifferenceParams? | TickCrossParams? | TrafficParams? | ProgressBarParams? | StarRatingParams? | RowSelectionParams? | JSONRecord? | ((cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var formatterPrint: dynamic /* "plaintext" | "textarea" | "html" | "money" | "image" | "datetime" | "datetimediff" | "link" | "tickCross" | "color" | "star" | "traffic" | "progress" | "lookup" | "buttonTick" | "buttonCross" | "rownum" | "handle" | "rowSelection" | "responsiveCollapse" | ((cell: CellComponent, formatterParams: Any, onRendered: EmptyCallback) -> dynamic)? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var formatterPrintParams: dynamic /* MoneyParams? | ImageParams? | LinkParams? | DateTimeParams? | DateTimeDifferenceParams? | TickCrossParams? | TrafficParams? | ProgressBarParams? | StarRatingParams? | RowSelectionParams? | JSONRecord? | ((cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var accessorPrint: CustomAccessor? + get() = definedExternally + set(value) = definedExternally + var accessorPrintParams: dynamic /* Any? | ((value: Any, data: Any, type: String /* "data" | "download" | "clipboard" */, column: ColumnComponent, row: RowComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var accessorHtmlOutput: CustomAccessor? + get() = definedExternally + set(value) = definedExternally + var accessorHtmlOutputParams: dynamic /* Any? | ((value: Any, data: Any, type: String /* "data" | "download" | "clipboard" */, column: ColumnComponent, row: RowComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var formatterHtmlOutput: dynamic /* "plaintext" | "textarea" | "html" | "money" | "image" | "datetime" | "datetimediff" | "link" | "tickCross" | "color" | "star" | "traffic" | "progress" | "lookup" | "buttonTick" | "buttonCross" | "rownum" | "handle" | "rowSelection" | "responsiveCollapse" | ((cell: CellComponent, formatterParams: Any, onRendered: EmptyCallback) -> dynamic)? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var formatterHtmlOutputParams: dynamic /* MoneyParams? | ImageParams? | LinkParams? | DateTimeParams? | DateTimeDifferenceParams? | TickCrossParams? | TrafficParams? | ProgressBarParams? | StarRatingParams? | RowSelectionParams? | JSONRecord? | ((cell: CellComponent) -> Any)? */ + get() = definedExternally + set(value) = definedExternally + var titleClipboard: String? + get() = definedExternally + set(value) = definedExternally + var titleHtmlOutput: String? + get() = definedExternally + set(value) = definedExternally + var titlePrint: String? + get() = definedExternally + set(value) = definedExternally + var maxWidth: dynamic /* Number? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + } + + interface CellCallbacks { + var cellClick: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellDblClick: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellContext: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellTap: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellDblTap: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellTapHold: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellMouseEnter: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellMouseLeave: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellMouseOver: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellMouseOut: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellMouseMove: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellEditing: CellEditEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellEdited: CellEditEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellEditCancelled: CellEditEventCallback? + get() = definedExternally + set(value) = definedExternally + } + + interface CellCallbacksPartial { + var cellClick: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellDblClick: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellContext: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellTap: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellDblTap: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellTapHold: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellMouseEnter: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellMouseLeave: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellMouseOver: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellMouseOut: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellMouseMove: CellEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellEditing: CellEditEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellEdited: CellEditEventCallback? + get() = definedExternally + set(value) = definedExternally + var cellEditCancelled: CellEditEventCallback? + get() = definedExternally + set(value) = definedExternally + } + + interface ColumnDefinitionSorterParams { + var format: String? + get() = definedExternally + set(value) = definedExternally + var locale: dynamic /* String? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var alignEmptyValues: String? /* "top" | "bottom" */ + get() = definedExternally + set(value) = definedExternally + var type: String? /* "length" | "sum" | "max" | "min" | "avg" */ + get() = definedExternally + set(value) = definedExternally + } + + interface MoneyParams { + var decimal: String? + get() = definedExternally + set(value) = definedExternally + var thousand: String? + get() = definedExternally + set(value) = definedExternally + var symbol: String? + get() = definedExternally + set(value) = definedExternally + var symbolAfter: Boolean? + get() = definedExternally + set(value) = definedExternally + var precision: dynamic /* Boolean? | Number? */ + get() = definedExternally + set(value) = definedExternally + } + + interface ImageParams { + var height: String? + get() = definedExternally + set(value) = definedExternally + var width: String? + get() = definedExternally + set(value) = definedExternally + var urlPrefix: String? + get() = definedExternally + set(value) = definedExternally + var urlSuffix: String? + get() = definedExternally + set(value) = definedExternally + } + + interface LinkParams { + var labelField: String? + get() = definedExternally + set(value) = definedExternally + var label: dynamic /* String? | ((cell: CellComponent) -> String)? */ + get() = definedExternally + set(value) = definedExternally + var urlPrefix: String? + get() = definedExternally + set(value) = definedExternally + var urlField: String? + get() = definedExternally + set(value) = definedExternally + var url: dynamic /* String? | ((cell: CellComponent) -> String)? */ + get() = definedExternally + set(value) = definedExternally + var target: String? + get() = definedExternally + set(value) = definedExternally + var download: Boolean? + get() = definedExternally + set(value) = definedExternally + } + + interface DateTimeParams { + var inputFormat: String? + get() = definedExternally + set(value) = definedExternally + var outputFormat: String? + get() = definedExternally + set(value) = definedExternally + var invalidPlaceholder: dynamic /* Boolean? | String? | Number? | ValueStringCallback? */ + get() = definedExternally + set(value) = definedExternally + var timezone: String? + get() = definedExternally + set(value) = definedExternally + } + + interface DateTimeDifferenceParams : DateTimeParams { + var date: Any? + get() = definedExternally + set(value) = definedExternally + var humanize: Boolean? + get() = definedExternally + set(value) = definedExternally + var unit: String? /* "years" | "months" | "weeks" | "days" | "hours" | "minutes" | "seconds" */ + get() = definedExternally + set(value) = definedExternally + var suffix: Boolean? + get() = definedExternally + set(value) = definedExternally + } + + interface TickCrossParams { + var allowEmpty: Boolean? + get() = definedExternally + set(value) = definedExternally + var allowTruthy: Boolean? + get() = definedExternally + set(value) = definedExternally + var tickElement: dynamic /* Boolean? | String? */ + get() = definedExternally + set(value) = definedExternally + var crossElement: dynamic /* Boolean? | String? */ + get() = definedExternally + set(value) = definedExternally + } + + interface TrafficParams { + var min: Number? + get() = definedExternally + set(value) = definedExternally + var max: Number? + get() = definedExternally + set(value) = definedExternally + var color: dynamic /* String? | Array? | ValueStringCallback? */ + get() = definedExternally + set(value) = definedExternally + } + + interface ProgressBarParams : TrafficParams { + var legend: dynamic /* String? | Boolean? | ValueStringCallback? */ + get() = definedExternally + set(value) = definedExternally + var legendColor: dynamic /* String? | Array? | ValueStringCallback? */ + get() = definedExternally + set(value) = definedExternally + var legendAlign: String? /* "center" | "left" | "right" | "justify" */ + get() = definedExternally + set(value) = definedExternally + } + + interface StarRatingParams { + var stars: Number? + get() = definedExternally + set(value) = definedExternally + } + + interface RowSelectionParams { + var rowRange: String? /* "visible" | "active" | "selected" | "all" */ + get() = definedExternally + set(value) = definedExternally + } + + interface SharedEditorParams { + var elementAttributes: JSONRecord? + get() = definedExternally + set(value) = definedExternally + var mask: String? + get() = definedExternally + set(value) = definedExternally + var maskAutoFill: Boolean? + get() = definedExternally + set(value) = definedExternally + var maskLetterChar: String? + get() = definedExternally + set(value) = definedExternally + var maskNumberChar: String? + get() = definedExternally + set(value) = definedExternally + var maskWildcardChar: String? + get() = definedExternally + set(value) = definedExternally + } + + interface NumberParams : SharedEditorParams { + var min: Number? + get() = definedExternally + set(value) = definedExternally + var max: Number? + get() = definedExternally + set(value) = definedExternally + var step: Number? + get() = definedExternally + set(value) = definedExternally + var verticalNavigation: String? /* "editor" | "table" */ + get() = definedExternally + set(value) = definedExternally + } + + interface InputParams : SharedEditorParams { + var search: Boolean? + get() = definedExternally + set(value) = definedExternally + } + + interface TextAreaParams : SharedEditorParams { + var verticalNavigation: String? /* "editor" | "table" | "hybrid" */ + get() = definedExternally + set(value) = definedExternally + } + + interface CheckboxParams : SharedEditorParams { + var tristate: Boolean? + get() = definedExternally + set(value) = definedExternally + var indeterminateValue: String? + get() = definedExternally + set(value) = definedExternally + } + + interface SharedSelectAutoCompleteEditorParams { + var defaultValue: String? + get() = definedExternally + set(value) = definedExternally + var sortValuesList: String? /* "asc" | "desc" */ + get() = definedExternally + set(value) = definedExternally + } + + interface SelectParams : SharedEditorParams, SharedSelectAutoCompleteEditorParams { + var values: dynamic /* Boolean | Array | JSONRecord | Array | String */ + get() = definedExternally + set(value) = definedExternally + var listItemFormatter: ((value: String, text: String) -> String)? + get() = definedExternally + set(value) = definedExternally + var verticalNavigation: String? /* "editor" | "table" | "hybrid" */ + get() = definedExternally + set(value) = definedExternally + var multiselect: dynamic /* Boolean? | Number? */ + get() = definedExternally + set(value) = definedExternally + } + + interface SelectParamsGroup { + var label: String + var value: dynamic /* String? | Number? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var options: Array? + get() = definedExternally + set(value) = definedExternally + var elementAttributes: Any? + get() = definedExternally + set(value) = definedExternally + } + + interface SelectLabelValue { + var label: String + var value: dynamic /* String | Number | Boolean */ + get() = definedExternally + set(value) = definedExternally + } + + interface AutoCompleteParams : SharedEditorParams, SharedSelectAutoCompleteEditorParams { + var values: dynamic /* Boolean | Array | JSONRecord | String | Array */ + get() = definedExternally + set(value) = definedExternally + var listItemFormatter: ((value: String, text: String) -> String)? + get() = definedExternally + set(value) = definedExternally + var searchFunc: ((term: String, values: Array) -> dynamic)? + get() = definedExternally + set(value) = definedExternally + var allowEmpty: Boolean? + get() = definedExternally + set(value) = definedExternally + var freetext: Boolean? + get() = definedExternally + set(value) = definedExternally + var showListOnEmpty: Boolean? + get() = definedExternally + set(value) = definedExternally + var verticalNavigation: String? /* "editor" | "table" | "hybrid" */ + get() = definedExternally + set(value) = definedExternally + var searchingPlaceholder: dynamic /* String? | HTMLElement? */ + get() = definedExternally + set(value) = definedExternally + var emptyPlaceholder: dynamic /* String? | HTMLElement? */ + get() = definedExternally + set(value) = definedExternally + } + + interface Validator { + var type: dynamic /* "required" | "unique" | "integer" | "float" | "numeric" | "string" | (cell: CellComponent, value: Any, parameters: Any) -> Boolean */ + get() = definedExternally + set(value) = definedExternally + var parameters: Any? + get() = definedExternally + set(value) = definedExternally + } + + interface KeyBinding { + var navPrev: dynamic /* String? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var navNext: dynamic /* String? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var navLeft: dynamic /* String? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var navRight: dynamic /* String? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var navUp: dynamic /* String? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var navDown: dynamic /* String? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var undo: dynamic /* String? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var redo: dynamic /* String? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var scrollPageUp: dynamic /* String? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var scrollPageDown: dynamic /* String? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var scrollToStart: dynamic /* String? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var scrollToEnd: dynamic /* String? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + var copyToClipboard: dynamic /* String? | Boolean? */ + get() = definedExternally + set(value) = definedExternally + } + + interface CalculationComponent { + var getData: () -> Any + var getElement: () -> HTMLElement + var getTable: () -> Tabulator + var getCells: () -> Array + var getCell: (column: dynamic /* ColumnComponent | HTMLElement | String */) -> CellComponent + } + + interface RowComponent : CalculationComponent { + var getNextRow: () -> dynamic + var getPrevRow: () -> dynamic + var getIndex: () -> Any + var getPosition: (filteredPosition: Boolean) -> Number + var getGroup: () -> GroupComponent + var delete: () -> Promise + var scrollTo: () -> Promise + var pageTo: () -> Promise + var move: (lookup: dynamic /* RowComponent | HTMLElement | Number */, belowTarget: Boolean) -> Unit + var update: (data: Any) -> Promise + var select: () -> Unit + var deselect: () -> Unit + var toggleSelect: () -> Unit + var isSelected: () -> Boolean + var normalizeHeight: () -> Unit + var reformat: () -> Unit + var freeze: () -> Unit + var unfreeze: () -> Unit + var treeExpand: () -> Unit + var treeCollapse: () -> Unit + var treeToggle: () -> Unit + var getTreeParent: () -> dynamic + var getTreeChildren: () -> Array + var addTreeChild: (rowData: Any, position: Boolean, existingRow: RowComponent) -> Unit + var validate: () -> dynamic + var isFrozen: () -> Boolean + } + + interface GroupComponent { + var getElement: () -> HTMLElement + var getTable: () -> Tabulator + var getKey: () -> Any + var getField: () -> String + var getRows: () -> Array + var getSubGroups: () -> Array + var getParentGroup: () -> dynamic + var isVisible: () -> Boolean + var show: () -> Unit + var hide: () -> Unit + var toggle: () -> Unit + } + + interface ColumnComponent { + var getElement: () -> HTMLElement + var getTable: () -> Tabulator + var getDefinition: () -> ColumnDefinition + var getField: () -> String + var getCells: () -> Array + var getNextColumn: () -> dynamic + var getPrevColumn: () -> dynamic + var move: (toColumn: dynamic /* ColumnComponent | ColumnDefinition | HTMLElement | String */, after: Boolean) -> Unit + var isVisible: () -> Boolean + var show: () -> Unit + var hide: () -> Unit + var toggle: () -> Unit + var delete: () -> Promise + var scrollTo: () -> Promise + var getSubColumns: () -> Array + var getParentColumn: () -> dynamic + var headerFilterFocus: () -> Unit + var setHeaderFilterValue: (value: Any) -> Unit + var reloadHeaderFilter: () -> Unit + var getHeaderFilterValue: () -> Any + var updateDefinition: (definition: ColumnDefinition) -> Promise + var getWidth: () -> Number + var setWidth: (width: dynamic /* Number | Boolean */) -> Unit + var validate: () -> dynamic + } + + interface CellComponent { + var getValue: () -> Any + var getOldValue: () -> Any + var restoreOldValue: () -> Any + var getInitialValue: () -> Any + var restoreInitialValue: () -> Any + var getElement: () -> HTMLElement + var getTable: () -> Tabulator + var getRow: () -> RowComponent + var getColumn: () -> ColumnComponent + var getData: () -> Any + var getField: () -> String + var setValue: (value: Any, mutate: Boolean) -> Unit + var checkHeight: () -> Unit + var edit: (ignoreEditable: Boolean) -> Unit + var cancelEdit: () -> Unit + var navigatePrev: () -> Boolean + var navigateNext: () -> Boolean + var navigateLeft: () -> Boolean + var navigateRight: () -> Boolean + var navigateUp: () -> Unit + var navigateDown: () -> Unit + var isEdited: () -> Boolean + var clearEdited: () -> Unit + var isValid: () -> Boolean + var clearValidation: () -> Unit + var validate: () -> Boolean + } + + companion object { + var defaultOptions: Options + var extendModule: (name: String, property: String, values: Any) -> Unit + var findTable: (query: String) -> Array + var registerModule: (module: Module) -> Unit + var bindModules: (__0: Any) -> Unit + } +} + +external open class Module(table: Tabulator) { + companion object { + var moduleName: String + } +} + +external open class AccessorModule + +external open class AjaxModule + +external open class ClipboardModule + +external open class ColumnCalcsModule + +external open class DataTreeModule + +external open class DownloadModule + +external open class EditModule + +external open class ExportModule + +external open class FilterModule + +external open class FormatModule + +external open class FrozenColumnsModule + +external open class FrozenRowsModule + +external open class GroupRowsModule + +external open class HistoryModule + +external open class HtmlTableImportModule + +external open class InteractionModule + +external open class KeybindingsModule + +external open class MenuModule + +external open class MoveColumnsModule + +external open class MoveRowsModule + +external open class MutatorModule + +external open class PageModule + +external open class PersistenceModule + +external open class PrintModule + +external open class PseudoRow + +external open class ReactiveDataModule + +external open class Renderer + +external open class ResizeColumnsModule + +external open class ResizeRowsModule + +external open class ResizeTableModule + +external open class ResponsiveLayoutModule + +external open class SelectRowModule + +external open class SortModule + +external open class TabulatorFull : Tabulator { + constructor(selector: String, options: Options = definedExternally) + constructor(selector: String) + constructor(selector: HTMLElement, options: Options = definedExternally) + constructor(selector: HTMLElement) +} + +external open class ValidateModule \ No newline at end of file diff --git a/visionforge-tables/src/jsMain/kotlin/tabulator/typealiases.kt b/visionforge-tables/src/jsMain/kotlin/tabulator/typealiases.kt new file mode 100644 index 00000000..28dced17 --- /dev/null +++ b/visionforge-tables/src/jsMain/kotlin/tabulator/typealiases.kt @@ -0,0 +1,45 @@ +@file:Suppress("NO_EXPLICIT_VISIBILITY_IN_API_MODE_WARNING") + +package tabulator + +import org.w3c.dom.events.UIEvent + +@Suppress("UNUSED_TYPEALIAS_PARAMETER") +internal typealias Pick = Any + +@Suppress("UNUSED_TYPEALIAS_PARAMETER") +internal typealias Record = Any + +internal typealias FilterFunction = (field: String, type: String /* "=" | "!=" | "like" | "<" | ">" | "<=" | ">=" | "in" | "regex" | "starts" | "ends" */, value: Any, filterParams: Tabulator.FilterParams) -> Unit + +internal typealias GroupValuesArg = Array> + +internal typealias CustomMutator = (value: Any, data: Any, type: String /* "data" | "edit" */, mutatorParams: Any, cell: Tabulator.CellComponent) -> Any + +internal typealias CustomAccessor = (value: Any, data: Any, type: String /* "data" | "download" | "clipboard" */, AccessorParams: Any, column: Tabulator.ColumnComponent, row: Tabulator.RowComponent) -> Any + +internal typealias ColumnCalcParams = (values: Any, data: Any) -> Any + +internal typealias ValueStringCallback = (value: Any) -> String + +internal typealias ValueBooleanCallback = (value: Any) -> Boolean + +internal typealias ValueVoidCallback = (value: Any) -> Unit + +internal typealias EmptyCallback = (callback: () -> Unit) -> Unit + +internal typealias CellEventCallback = (e: UIEvent, cell: Tabulator.CellComponent) -> Unit + +internal typealias CellEditEventCallback = (cell: Tabulator.CellComponent) -> Unit + +internal typealias ColumnEventCallback = (e: UIEvent, column: Tabulator.ColumnComponent) -> Unit + +internal typealias RowEventCallback = (e: UIEvent, row: Tabulator.RowComponent) -> Unit + +internal typealias RowChangedCallback = (row: Tabulator.RowComponent) -> Unit + +internal typealias GroupEventCallback = (e: UIEvent, group: Tabulator.GroupComponent) -> Unit + +internal typealias JSONRecord = Record + +internal typealias ColumnSorterParamLookupFunction = (column: Tabulator.ColumnComponent, dir: String /* "asc" | "desc" */) -> Any \ No newline at end of file diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt index 34ee5ed1..02586120 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt @@ -5,6 +5,7 @@ import info.laht.threekt.core.Object3D import info.laht.threekt.geometries.TextBufferGeometry import info.laht.threekt.objects.Mesh import kotlinext.js.jsObject +import kotlinext.js.jso import space.kscience.dataforge.context.logger import space.kscience.dataforge.context.warn import space.kscience.visionforge.onPropertyChange @@ -18,7 +19,7 @@ public object ThreeLabelFactory : ThreeFactory { override val type: KClass get() = SolidLabel::class override fun invoke(three: ThreePlugin, obj: SolidLabel): Object3D { - val textGeo = TextBufferGeometry(obj.text, jsObject { + val textGeo = TextBufferGeometry(obj.text, jso { font = obj.fontFamily size = 20 height = 1 From faeefe857260dd84ef4e3fedd9f1454cbcf84b07 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 7 Jan 2022 16:56:33 +0300 Subject: [PATCH 096/109] Fix build version --- build.gradle.kts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index a81d1656..c167a23f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,6 +6,11 @@ plugins { val dataforgeVersion by extra("0.5.2") val fxVersion by extra("11") +allprojects{ + group = "space.kscience" + version = "0.2.0-dev-99" +} + subprojects { if (name.startsWith("visionforge")) apply() @@ -14,10 +19,6 @@ subprojects { mavenCentral() maven("https://maven.jzy3d.org/releases") } - - group = "space.kscience" - version = "0.2.0-dev-99" - } ksciencePublish { From e70ef813de55e4fbd98abec733752ed522f6e5f7 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 7 Jan 2022 19:12:59 +0300 Subject: [PATCH 097/109] Update build.yml --- .github/workflows/build.yml | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 412460ae..c4663660 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,16 +7,15 @@ on: jobs: build: - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 timeout-minutes: 40 steps: - uses: actions/checkout@v2 - - uses: DeLaGuardo/setup-graalvm@4.0 + - name: Set up JDK 11 + uses: actions/setup-java@v2.5.0 with: - graalvm: 21.2.0 - java: java11 - arch: amd64 - - uses: actions/cache@v2 + java-version: 11 + - uses: actions/cache@v2.1.7 with: path: | ~/.gradle/caches @@ -24,10 +23,4 @@ jobs: key: ${{ runner.os }}-gradle-${{ hashFiles('*.gradle.kts') }} restore-keys: | ${{ runner.os }}-gradle- - - uses: actions/cache@v2 - with: - path: ~/.konan - key: ${{ runner.os }}-gradle-${{ hashFiles('*.gradle.kts') }} - restore-keys: | - ${{ runner.os }}-gradle- - run: ./gradlew build --build-cache --no-daemon --stacktrace From 6260117c681d0977bade90721a37d036cd3806e3 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 7 Jan 2022 19:26:16 +0300 Subject: [PATCH 098/109] Update build.yml --- .github/workflows/build.yml | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c4663660..be3f335b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,12 +15,8 @@ jobs: uses: actions/setup-java@v2.5.0 with: java-version: 11 - - uses: actions/cache@v2.1.7 + distribution: jdk + - name: execute build + uses: gradle/gradle-build-action@v2 with: - path: | - ~/.gradle/caches - ~/.gradle/wrapper - key: ${{ runner.os }}-gradle-${{ hashFiles('*.gradle.kts') }} - restore-keys: | - ${{ runner.os }}-gradle- - - run: ./gradlew build --build-cache --no-daemon --stacktrace + arguments: build From d278427f662853af438b21a6043172a0e72db1e9 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 7 Jan 2022 19:34:55 +0300 Subject: [PATCH 099/109] Update build.yml --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index be3f335b..66ef7f0c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,7 +15,7 @@ jobs: uses: actions/setup-java@v2.5.0 with: java-version: 11 - distribution: jdk + distribution: liberica - name: execute build uses: gradle/gradle-build-action@v2 with: From cebef9472a305f935759ef3e4d38846ac7e4436f Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 7 Jan 2022 19:47:21 +0300 Subject: [PATCH 100/109] Update build.yml --- .github/workflows/build.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 66ef7f0c..cbf40304 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -16,6 +16,9 @@ jobs: with: java-version: 11 distribution: liberica + - uses: actions/setup-node@v2.5.1 + with: + node-version: '16' - name: execute build uses: gradle/gradle-build-action@v2 with: From 30fa35bef5a1f0ef48358c67991c7835e3eebb72 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 7 Jan 2022 20:01:52 +0300 Subject: [PATCH 101/109] Add lock file --- build.gradle.kts | 10 +- kotlin-js-store/yarn.lock | 9201 +++++++++++++++++++++++++++++++++++++ 2 files changed, 9202 insertions(+), 9 deletions(-) create mode 100644 kotlin-js-store/yarn.lock diff --git a/build.gradle.kts b/build.gradle.kts index c167a23f..664171c9 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -31,12 +31,4 @@ apiValidation { ignoredPackages.add("info.laht.threekt") } -readme.readmeTemplate = file("docs/templates/README-TEMPLATE.md") - -//workaround for https://youtrack.jetbrains.com/issue/KT-48273 -rootProject.plugins.withType(org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin::class.java) { - rootProject.the().versions.apply { - webpack.version = "5.64.3" - webpackDevServer.version = "4.5.0" - } -} \ No newline at end of file +readme.readmeTemplate = file("docs/templates/README-TEMPLATE.md") \ No newline at end of file diff --git a/kotlin-js-store/yarn.lock b/kotlin-js-store/yarn.lock new file mode 100644 index 00000000..df058368 --- /dev/null +++ b/kotlin-js-store/yarn.lock @@ -0,0 +1,9201 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"3d-view@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/3d-view/-/3d-view-2.0.1.tgz#2e174571c48215736b376bb66938a3513dad2179" + integrity sha512-YSLRHXNpSziaaiK2R0pI5+JKguoJVbtWmIv9YyBFtl0+q42kQwJB/JUulbFR/1zYFm58ifjKQ6kVdgZ6tyKtCA== + dependencies: + matrix-camera-controller "^2.1.1" + orbit-camera-controller "^4.0.0" + turntable-camera-controller "^3.0.0" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.0.tgz#0dfc80309beec8411e65e706461c408b0bb9b431" + integrity sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA== + dependencies: + "@babel/highlight" "^7.16.0" + +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.0", "@babel/compat-data@^7.16.4": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.4.tgz#081d6bbc336ec5c2435c6346b2ae1fb98b5ac68e" + integrity sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q== + +"@babel/core@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.0.tgz#c4ff44046f5fe310525cc9eb4ef5147f0c5374d4" + integrity sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ== + dependencies: + "@babel/code-frame" "^7.16.0" + "@babel/generator" "^7.16.0" + "@babel/helper-compilation-targets" "^7.16.0" + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helpers" "^7.16.0" + "@babel/parser" "^7.16.0" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + source-map "^0.5.0" + +"@babel/generator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.0.tgz#d40f3d1d5075e62d3500bccb67f3daa8a95265b2" + integrity sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew== + dependencies: + "@babel/types" "^7.16.0" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz#9a1f0ebcda53d9a2d00108c4ceace6a5d5f1f08d" + integrity sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.0.tgz#f1a686b92da794020c26582eb852e9accd0d7882" + integrity sha512-9KuleLT0e77wFUku6TUkqZzCEymBdtuQQ27MhEKzf9UOOJu3cYj98kyaDAzxpC7lV6DGiZFuC8XqDsq8/Kl6aQ== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.0", "@babel/helper-compilation-targets@^7.16.3": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz#5b480cd13f68363df6ec4dc8ac8e2da11363cbf0" + integrity sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA== + dependencies: + "@babel/compat-data" "^7.16.0" + "@babel/helper-validator-option" "^7.14.5" + browserslist "^4.17.5" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz#090d4d166b342a03a9fec37ef4fd5aeb9c7c6a4b" + integrity sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-member-expression-to-functions" "^7.16.0" + "@babel/helper-optimise-call-expression" "^7.16.0" + "@babel/helper-replace-supers" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + +"@babel/helper-create-regexp-features-plugin@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.0.tgz#06b2348ce37fccc4f5e18dcd8d75053f2a7c44ff" + integrity sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + regexpu-core "^4.7.1" + +"@babel/helper-define-polyfill-provider@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz#c5b10cf4b324ff840140bb07e05b8564af2ae971" + integrity sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-explode-assignable-expression@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz#753017337a15f46f9c09f674cff10cee9b9d7778" + integrity sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-function-name@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz#b7dd0797d00bbfee4f07e9c4ea5b0e30c8bb1481" + integrity sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog== + dependencies: + "@babel/helper-get-function-arity" "^7.16.0" + "@babel/template" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-get-function-arity@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz#0088c7486b29a9cb5d948b1a1de46db66e089cfa" + integrity sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-hoist-variables@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz#4c9023c2f1def7e28ff46fc1dbcd36a39beaa81a" + integrity sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-member-expression-to-functions@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz#29287040efd197c77636ef75188e81da8bccd5a4" + integrity sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz#90538e60b672ecf1b448f5f4f5433d37e79a3ec3" + integrity sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-module-transforms@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz#1c82a8dd4cb34577502ebd2909699b194c3e9bb5" + integrity sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA== + dependencies: + "@babel/helper-module-imports" "^7.16.0" + "@babel/helper-replace-supers" "^7.16.0" + "@babel/helper-simple-access" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + "@babel/helper-validator-identifier" "^7.15.7" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-optimise-call-expression@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz#cecdb145d70c54096b1564f8e9f10cd7d193b338" + integrity sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" + integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== + +"@babel/helper-remap-async-to-generator@^7.16.0", "@babel/helper-remap-async-to-generator@^7.16.4": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.4.tgz#5d7902f61349ff6b963e07f06a389ce139fbfe6e" + integrity sha512-vGERmmhR+s7eH5Y/cp8PCVzj4XEjerq8jooMfxFdA5xVtAk9Sh4AQsrWgiErUEBjtGrBtOFKDUcWQFW4/dFwMA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-wrap-function" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-replace-supers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz#73055e8d3cf9bcba8ddb55cad93fedc860f68f17" + integrity sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.16.0" + "@babel/helper-optimise-call-expression" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-simple-access@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz#21d6a27620e383e37534cf6c10bba019a6f90517" + integrity sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" + integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-split-export-declaration@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz#29672f43663e936df370aaeb22beddb3baec7438" + integrity sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-validator-identifier@^7.15.7": + version "7.15.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" + integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== + +"@babel/helper-validator-option@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" + integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== + +"@babel/helper-wrap-function@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.0.tgz#b3cf318afce774dfe75b86767cd6d68f3482e57c" + integrity sha512-VVMGzYY3vkWgCJML+qVLvGIam902mJW0FvT7Avj1zEe0Gn7D93aWdLblYARTxEw+6DhZmtzhBM2zv0ekE5zg1g== + dependencies: + "@babel/helper-function-name" "^7.16.0" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helpers@^7.16.0": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.3.tgz#27fc64f40b996e7074dc73128c3e5c3e7f55c43c" + integrity sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w== + dependencies: + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.3" + "@babel/types" "^7.16.0" + +"@babel/highlight@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.0.tgz#6ceb32b2ca4b8f5f361fb7fd821e3fddf4a1725a" + integrity sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g== + dependencies: + "@babel/helper-validator-identifier" "^7.15.7" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.16.0", "@babel/parser@^7.16.3": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.4.tgz#d5f92f57cf2c74ffe9b37981c0e72fee7311372e" + integrity sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.2": + version "7.16.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.2.tgz#2977fca9b212db153c195674e57cfab807733183" + integrity sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz#358972eaab006f5eb0826183b0c93cbcaf13e1e2" + integrity sha512-4tcFwwicpWTrpl9qjf7UsoosaArgImF85AxqCRZlgc3IQDvkUHjJpruXAL58Wmj+T6fypWTC/BakfEkwIL/pwA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.16.0" + +"@babel/plugin-proposal-async-generator-functions@^7.16.4": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.4.tgz#e606eb6015fec6fa5978c940f315eae4e300b081" + integrity sha512-/CUekqaAaZCQHleSK/9HajvcD/zdnJiKRiuUFq8ITE+0HsPzquf53cpFiqAwl/UfmJbR6n5uGPQSPdrmKOvHHg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.16.4" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz#c029618267ddebc7280fa286e0f8ca2a278a2d1a" + integrity sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-proposal-class-static-block@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.0.tgz#5296942c564d8144c83eea347d0aa8a0b89170e7" + integrity sha512-mAy3sdcY9sKAkf3lQbDiv3olOfiLqI51c9DR9b19uMoR2Z6r5pmGl7dfNFqEvqOyqbf1ta4lknK4gc5PJn3mfA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-proposal-dynamic-import@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.0.tgz#783eca61d50526202f9b296095453977e88659f1" + integrity sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-proposal-export-namespace-from@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.0.tgz#9c01dee40b9d6b847b656aaf4a3976a71740f222" + integrity sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.0.tgz#cae35a95ed1d2a7fa29c4dc41540b84a72e9ab25" + integrity sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-proposal-logical-assignment-operators@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.0.tgz#a711b8ceb3ffddd3ef88d3a49e86dbd3cc7db3fd" + integrity sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.0.tgz#44e1cce08fe2427482cf446a91bb451528ed0596" + integrity sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.0.tgz#5d418e4fbbf8b9b7d03125d3a52730433a373734" + integrity sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.0.tgz#5fb32f6d924d6e6712810362a60e12a2609872e6" + integrity sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg== + dependencies: + "@babel/compat-data" "^7.16.0" + "@babel/helper-compilation-targets" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.16.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.0.tgz#5910085811ab4c28b00d6ebffa4ab0274d1e5f16" + integrity sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.0.tgz#56dbc3970825683608e9efb55ea82c2a2d6c8dc0" + integrity sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.0.tgz#b4dafb9c717e4301c5776b30d080d6383c89aff6" + integrity sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-proposal-private-property-in-object@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.0.tgz#69e935b2c5c79d2488112d886f0c4e2790fee76f" + integrity sha512-3jQUr/HBbMVZmi72LpjQwlZ55i1queL8KcDTQEkAHihttJnAPrcvG9ZNXIfsd2ugpizZo595egYV6xy+pv4Ofw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-create-class-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.16.0", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.0.tgz#890482dfc5ea378e42e19a71e709728cabf18612" + integrity sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.0.tgz#f9624394317365a9a88c82358d3f8471154698f1" + integrity sha512-8zv2+xiPHwly31RK4RmnEYY5zziuF3O7W2kIDW+07ewWDh6Oi0dRq8kwvulRkFgt6DB97RlKs5c1y068iPlCUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.0.tgz#2feeb13d9334cc582ea9111d3506f773174179bb" + integrity sha512-Xv6mEXqVdaqCBfJFyeab0fH2DnUoMsDmhamxsSi4j8nLd4Vtw213WMJr55xxqipC/YVWyPY3K0blJncPYji+dQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-arrow-functions@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.0.tgz#951706f8b449c834ed07bd474c0924c944b95a8e" + integrity sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-async-to-generator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz#df12637f9630ddfa0ef9d7a11bc414d629d38604" + integrity sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw== + dependencies: + "@babel/helper-module-imports" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.16.0" + +"@babel/plugin-transform-block-scoped-functions@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.0.tgz#c618763233ad02847805abcac4c345ce9de7145d" + integrity sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-block-scoping@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.0.tgz#bcf433fb482fe8c3d3b4e8a66b1c4a8e77d37c16" + integrity sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-classes@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.0.tgz#54cf5ff0b2242c6573d753cd4bfc7077a8b282f5" + integrity sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-optimise-call-expression" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.0.tgz#e0c385507d21e1b0b076d66bed6d5231b85110b7" + integrity sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-destructuring@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.0.tgz#ad3d7e74584ad5ea4eadb1e6642146c590dee33c" + integrity sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-dotall-regex@^7.16.0", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.0.tgz#50bab00c1084b6162d0a58a818031cf57798e06f" + integrity sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-duplicate-keys@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.0.tgz#8bc2e21813e3e89e5e5bf3b60aa5fc458575a176" + integrity sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-exponentiation-operator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.0.tgz#a180cd2881e3533cef9d3901e48dad0fbeff4be4" + integrity sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-for-of@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.0.tgz#f7abaced155260e2461359bbc7c7248aca5e6bd2" + integrity sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-function-name@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.0.tgz#02e3699c284c6262236599f751065c5d5f1f400e" + integrity sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg== + dependencies: + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-literals@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.0.tgz#79711e670ffceb31bd298229d50f3621f7980cac" + integrity sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-member-expression-literals@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.0.tgz#5251b4cce01eaf8314403d21aedb269d79f5e64b" + integrity sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-modules-amd@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.0.tgz#09abd41e18dcf4fd479c598c1cef7bd39eb1337e" + integrity sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw== + dependencies: + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.0.tgz#add58e638c8ddc4875bd9a9ecb5c594613f6c922" + integrity sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ== + dependencies: + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-simple-access" "^7.16.0" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.0.tgz#a92cf240afeb605f4ca16670453024425e421ea4" + integrity sha512-yuGBaHS3lF1m/5R+6fjIke64ii5luRUg97N2wr+z1sF0V+sNSXPxXDdEEL/iYLszsN5VKxVB1IPfEqhzVpiqvg== + dependencies: + "@babel/helper-hoist-variables" "^7.16.0" + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-identifier" "^7.15.7" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.0.tgz#195f26c2ad6d6a391b70880effce18ce625e06a7" + integrity sha512-nx4f6no57himWiHhxDM5pjwhae5vLpTK2zCnDH8+wNLJy0TVER/LJRHl2bkt6w9Aad2sPD5iNNoUpY3X9sTGDg== + dependencies: + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.0.tgz#d3db61cc5d5b97986559967cd5ea83e5c32096ca" + integrity sha512-LogN88uO+7EhxWc8WZuQ8vxdSyVGxhkh8WTC3tzlT8LccMuQdA81e9SGV6zY7kY2LjDhhDOFdQVxdGwPyBCnvg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.0" + +"@babel/plugin-transform-new-target@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.0.tgz#af823ab576f752215a49937779a41ca65825ab35" + integrity sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-object-super@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.0.tgz#fb20d5806dc6491a06296ac14ea8e8d6fedda72b" + integrity sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.16.0" + +"@babel/plugin-transform-parameters@^7.16.0", "@babel/plugin-transform-parameters@^7.16.3": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.3.tgz#fa9e4c874ee5223f891ee6fa8d737f4766d31d15" + integrity sha512-3MaDpJrOXT1MZ/WCmkOFo7EtmVVC8H4EUZVrHvFOsmwkk4lOjQj8rzv8JKUZV4YoQKeoIgk07GO+acPU9IMu/w== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.0.tgz#a95c552189a96a00059f6776dc4e00e3690c78d1" + integrity sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-react-display-name@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.0.tgz#9a0ad8aa8e8790883a7bd2736f66229a58125676" + integrity sha512-FJFdJAqaCpndL+pIf0aeD/qlQwT7QXOvR6Cc8JPvNhKJBi2zc/DPc4g05Y3fbD/0iWAMQFGij4+Xw+4L/BMpTg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-react-jsx-development@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.0.tgz#1cb52874678d23ab11d0d16488d54730807303ef" + integrity sha512-qq65iSqBRq0Hr3wq57YG2AmW0H6wgTnIzpffTphrUWUgLCOK+zf1f7G0vuOiXrp7dU1qq+fQBoqZ3wCDAkhFzw== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.16.0" + +"@babel/plugin-transform-react-jsx@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.0.tgz#55b797d4960c3de04e07ad1c0476e2bc6a4889f1" + integrity sha512-rqDgIbukZ44pqq7NIRPGPGNklshPkvlmvqjdx3OZcGPk4zGIenYkxDTvl3LsSL8gqcc3ZzGmXPE6hR/u/voNOw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-module-imports" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-jsx" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/plugin-transform-react-pure-annotations@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.0.tgz#23db6ddf558d8abde41b8ad9d59f48ad5532ccab" + integrity sha512-NC/Bj2MG+t8Ef5Pdpo34Ay74X4Rt804h5y81PwOpfPtmAK3i6CizmQqwyBQzIepz1Yt8wNr2Z2L7Lu3qBMfZMA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-regenerator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.0.tgz#eaee422c84b0232d03aea7db99c97deeaf6125a4" + integrity sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.0.tgz#fff4b9dcb19e12619394bda172d14f2d04c0379c" + integrity sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-runtime@^7.14.3": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.4.tgz#f9ba3c7034d429c581e1bd41b4952f3db3c2c7e8" + integrity sha512-pru6+yHANMTukMtEZGC4fs7XPwg35v8sj5CIEmE+gEkFljFiVJxEWxx/7ZDkTK+iZRYo1bFXBtfIN95+K3cJ5A== + dependencies: + "@babel/helper-module-imports" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.4.0" + babel-plugin-polyfill-regenerator "^0.3.0" + semver "^6.3.0" + +"@babel/plugin-transform-shorthand-properties@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.0.tgz#090372e3141f7cc324ed70b3daf5379df2fa384d" + integrity sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-spread@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.0.tgz#d21ca099bbd53ab307a8621e019a7bd0f40cdcfb" + integrity sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + +"@babel/plugin-transform-sticky-regex@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.0.tgz#c35ea31a02d86be485f6aa510184b677a91738fd" + integrity sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-strict-mode@^7.12.13": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-strict-mode/-/plugin-transform-strict-mode-7.16.0.tgz#2be5ad4f087c188cfed6f01e327a9ccd4dc0c488" + integrity sha512-lcLX2TEX4EI5fRQDV7dIWNJdLnyhVE7K5oHZkKpo/lnOP+7LdkrV9v/enjBxts+xLn56TGf6zbyB2rvYl1zbYQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-template-literals@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.0.tgz#a8eced3a8e7b8e2d40ec4ec4548a45912630d302" + integrity sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-typeof-symbol@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.0.tgz#8b19a244c6f8c9d668dca6a6f754ad6ead1128f2" + integrity sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-typescript@^7.16.0": + version "7.16.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.1.tgz#cc0670b2822b0338355bc1b3d2246a42b8166409" + integrity sha512-NO4XoryBng06jjw/qWEU2LhcLJr1tWkhpMam/H4eas/CDKMX/b2/Ylb6EI256Y7+FVPCawwSM1rrJNOpDiz+Lg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-typescript" "^7.16.0" + +"@babel/plugin-transform-unicode-escapes@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.0.tgz#1a354064b4c45663a32334f46fa0cf6100b5b1f3" + integrity sha512-VFi4dhgJM7Bpk8lRc5CMaRGlKZ29W9C3geZjt9beuzSUrlJxsNwX7ReLwaL6WEvsOf2EQkyIJEPtF8EXjB/g2A== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-unicode-regex@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.0.tgz#293b80950177c8c85aede87cef280259fb995402" + integrity sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/preset-env@^7.14.4": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.4.tgz#4f6ec33b2a3fe72d6bfdcdf3859500232563a2e3" + integrity sha512-v0QtNd81v/xKj4gNKeuAerQ/azeNn/G1B1qMLeXOcV8+4TWlD2j3NV1u8q29SDFBXx/NBq5kyEAO+0mpRgacjA== + dependencies: + "@babel/compat-data" "^7.16.4" + "@babel/helper-compilation-targets" "^7.16.3" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.2" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.0" + "@babel/plugin-proposal-async-generator-functions" "^7.16.4" + "@babel/plugin-proposal-class-properties" "^7.16.0" + "@babel/plugin-proposal-class-static-block" "^7.16.0" + "@babel/plugin-proposal-dynamic-import" "^7.16.0" + "@babel/plugin-proposal-export-namespace-from" "^7.16.0" + "@babel/plugin-proposal-json-strings" "^7.16.0" + "@babel/plugin-proposal-logical-assignment-operators" "^7.16.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.0" + "@babel/plugin-proposal-numeric-separator" "^7.16.0" + "@babel/plugin-proposal-object-rest-spread" "^7.16.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.16.0" + "@babel/plugin-proposal-private-methods" "^7.16.0" + "@babel/plugin-proposal-private-property-in-object" "^7.16.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.16.0" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.16.0" + "@babel/plugin-transform-async-to-generator" "^7.16.0" + "@babel/plugin-transform-block-scoped-functions" "^7.16.0" + "@babel/plugin-transform-block-scoping" "^7.16.0" + "@babel/plugin-transform-classes" "^7.16.0" + "@babel/plugin-transform-computed-properties" "^7.16.0" + "@babel/plugin-transform-destructuring" "^7.16.0" + "@babel/plugin-transform-dotall-regex" "^7.16.0" + "@babel/plugin-transform-duplicate-keys" "^7.16.0" + "@babel/plugin-transform-exponentiation-operator" "^7.16.0" + "@babel/plugin-transform-for-of" "^7.16.0" + "@babel/plugin-transform-function-name" "^7.16.0" + "@babel/plugin-transform-literals" "^7.16.0" + "@babel/plugin-transform-member-expression-literals" "^7.16.0" + "@babel/plugin-transform-modules-amd" "^7.16.0" + "@babel/plugin-transform-modules-commonjs" "^7.16.0" + "@babel/plugin-transform-modules-systemjs" "^7.16.0" + "@babel/plugin-transform-modules-umd" "^7.16.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.0" + "@babel/plugin-transform-new-target" "^7.16.0" + "@babel/plugin-transform-object-super" "^7.16.0" + "@babel/plugin-transform-parameters" "^7.16.3" + "@babel/plugin-transform-property-literals" "^7.16.0" + "@babel/plugin-transform-regenerator" "^7.16.0" + "@babel/plugin-transform-reserved-words" "^7.16.0" + "@babel/plugin-transform-shorthand-properties" "^7.16.0" + "@babel/plugin-transform-spread" "^7.16.0" + "@babel/plugin-transform-sticky-regex" "^7.16.0" + "@babel/plugin-transform-template-literals" "^7.16.0" + "@babel/plugin-transform-typeof-symbol" "^7.16.0" + "@babel/plugin-transform-unicode-escapes" "^7.16.0" + "@babel/plugin-transform-unicode-regex" "^7.16.0" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.16.0" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.4.0" + babel-plugin-polyfill-regenerator "^0.3.0" + core-js-compat "^3.19.1" + semver "^6.3.0" + +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@^7.13.13": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.16.0.tgz#f71d3e8dff5218478011df037fad52660ee6d82a" + integrity sha512-d31IFW2bLRB28uL1WoElyro8RH5l6531XfxMtCeCmp6RVAF1uTfxxUA0LH1tXl+psZdwfmIbwoG4U5VwgbhtLw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-transform-react-display-name" "^7.16.0" + "@babel/plugin-transform-react-jsx" "^7.16.0" + "@babel/plugin-transform-react-jsx-development" "^7.16.0" + "@babel/plugin-transform-react-pure-annotations" "^7.16.0" + +"@babel/preset-typescript@^7.14.5": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.16.0.tgz#b0b4f105b855fb3d631ec036cdc9d1ffd1fa5eac" + integrity sha512-txegdrZYgO9DlPbv+9QOVpMnKbOtezsLHWsnsRF4AjbSIsVaujrq1qg8HK0mxQpWv0jnejt0yEoW1uWpvbrDTg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-transform-typescript" "^7.16.0" + +"@babel/runtime@^7.12.5", "@babel/runtime@^7.14.0", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.3.tgz#b86f0db02a04187a3c17caa77de69840165d42d5" + integrity sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.0.tgz#d16a35ebf4cd74e202083356fab21dd89363ddd6" + integrity sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A== + dependencies: + "@babel/code-frame" "^7.16.0" + "@babel/parser" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.0", "@babel/traverse@^7.16.3", "@babel/traverse@^7.4.5": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.3.tgz#f63e8a938cc1b780f66d9ed3c54f532ca2d14787" + integrity sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag== + dependencies: + "@babel/code-frame" "^7.16.0" + "@babel/generator" "^7.16.0" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-hoist-variables" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + "@babel/parser" "^7.16.3" + "@babel/types" "^7.16.0" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.16.0", "@babel/types@^7.2.0", "@babel/types@^7.4.4": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.0.tgz#db3b313804f96aadd0b776c4823e127ad67289ba" + integrity sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg== + dependencies: + "@babel/helper-validator-identifier" "^7.15.7" + to-fast-properties "^2.0.0" + +"@choojs/findup@^0.2.0": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@choojs/findup/-/findup-0.2.1.tgz#ac13c59ae7be6e1da64de0779a0a7f03d75615a3" + integrity sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw== + dependencies: + commander "^2.15.1" + +"@csstools/convert-colors@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-2.0.0.tgz#6dd323583b40cfe05aaaca30debbb30f26742bbf" + integrity sha512-P7BVvddsP2Wl5v3drJ3ArzpdfXMqoZ/oHOV/yFiGFb3JQr9Z9UXZ9tnHAKJsO89lfprR1F9ExW3Yij21EjEBIA== + +"@discoveryjs/json-ext@^0.5.0": + version "0.5.5" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.5.tgz#9283c9ce5b289a3c4f61c12757469e59377f81f3" + integrity sha512-6nFkfkmSeV/rqSaS4oWHgmpnYw194f6hmWF5is6b0J1naJZoiD0NTc9AiUwPHvWsowkjuHErCZT1wa0jg+BLIA== + +"@emotion/is-prop-valid@^0.8.8": + version "0.8.8" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a" + integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== + dependencies: + "@emotion/memoize" "0.7.4" + +"@emotion/memoize@0.7.4": + version "0.7.4" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" + integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== + +"@emotion/stylis@^0.8.4": + version "0.8.5" + resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04" + integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== + +"@emotion/unitless@^0.7.4": + version "0.7.5" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" + integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== + +"@jetbrains/angular-elastic@^2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@jetbrains/angular-elastic/-/angular-elastic-2.5.1.tgz#ddfffdd3941eaf839fd29069fc8faf7536329988" + integrity sha512-/XU38+J5c3vKKoiwGmqze0UaKt7mnrR0mQJg1WxuZFBSTf6e1co8rN8bgxik0jAX5s8yXUMWhPhmrIYKaR140Q== + dependencies: + angular ">=1.0.6" + +"@jetbrains/babel-preset-jetbrains@^2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@jetbrains/babel-preset-jetbrains/-/babel-preset-jetbrains-2.3.2.tgz#b62fab630080c5e78513e2cdbe85d4940f4e3164" + integrity sha512-hC8HpdxftzMc2OwwzKIsBzq/8paGT/+IcH7TZfy0RWusq0K1wWnjRQMH5o9J0RkdARlDnOxDxEHYA9fE6DFKLw== + dependencies: + "@babel/plugin-transform-runtime" "^7.14.3" + "@babel/plugin-transform-strict-mode" "^7.12.13" + "@babel/preset-env" "^7.14.4" + "@babel/preset-react" "^7.13.13" + "@babel/preset-typescript" "^7.14.5" + "@babel/runtime" "^7.14.0" + babel-plugin-angularjs-annotate "^0.10.0" + +"@jetbrains/icons@^3.18.0": + version "3.18.0" + resolved "https://registry.yarnpkg.com/@jetbrains/icons/-/icons-3.18.0.tgz#96d3ff8f9029b9f196a9a936cd2c6797aa2c17f2" + integrity sha512-aaKe4KVwjbnnbXEdWCVWMNwHrE1WCdwpVZYt468NXHukPX8KfnE8pGGuUcyEC/j4lXm+V8N24yGZ3GGMfq/wFA== + +"@jetbrains/logos@^1.4.27": + version "1.4.27" + resolved "https://registry.yarnpkg.com/@jetbrains/logos/-/logos-1.4.27.tgz#4412ed2abaf74756e44bb84643431fc270ec3031" + integrity sha512-1+S4mjh7Z9HliTlgJeemr+my4mD6HeEY0GH/qc8FKsY7jprFPsbJnfgiVdrhRFMtx7Rb4AKRjiM4CIqqweF+zA== + +"@jetbrains/postcss-require-hover@^0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@jetbrains/postcss-require-hover/-/postcss-require-hover-0.1.2.tgz#927f24fa7cb27e3a3ed2c4eca716e5a206577e18" + integrity sha512-U094mXSp0KOfqZLTlkPLz4vHdIZYm1gJFRFJP7nMrGA1OI4Nigwl0TUwFt/7YDNAff57Eo9Zttu9Ln5QoXguAw== + dependencies: + postcss "^6.0.1" + +"@jetbrains/ring-ui@^4.1.5": + version "4.1.6" + resolved "https://registry.yarnpkg.com/@jetbrains/ring-ui/-/ring-ui-4.1.6.tgz#bb1d95a169dc5b8b0915258d772fbbd99ad739bf" + integrity sha512-/HFw77+gzN6YxsaGG5Wga4ZOwfs65GfailwCoY4Xdm05OqWHKIJmzTr0+Tc0w12Lg9Km7ymxrRIOQKcXOdjSFQ== + dependencies: + "@babel/core" "^7.16.0" + "@jetbrains/angular-elastic" "^2.5.1" + "@jetbrains/babel-preset-jetbrains" "^2.3.2" + "@jetbrains/icons" "^3.18.0" + "@jetbrains/logos" "^1.4.27" + "@jetbrains/postcss-require-hover" "^0.1.2" + "@ungap/url-search-params" "^0.2.2" + babel-loader "^8.2.3" + babel-plugin-transform-define "^2.0.1" + browserslist "^4.16.6" + change-case "^4.1.1" + classnames "^2.3.1" + combokeys "^3.0.1" + compile-code-loader "^1.0.0" + conic-gradient "^1.0.0" + css-loader "^6.5.1" + date-fns "^2.27.0" + deep-equal "^2.0.4" + element-resize-detector "^1.2.3" + es6-error "^4.1.1" + eslint-plugin-react-hooks "^4.3.0" + extricate-loader "^3.0.0" + fastdom "^1.0.10" + file-loader "^6.2.0" + focus-trap "^6.7.1" + focus-visible "^5.2.0" + highlight.js "^10.7.2" + html-loader "^3.0.1" + interpolate-loader "^2.0.1" + just-debounce-it "^3.0.1" + memoize-one "^6.0.0" + postcss "^8.4.4" + postcss-calc "^8.0.0" + postcss-flexbugs-fixes "^5.0.2" + postcss-font-family-system-ui "^5.0.0" + postcss-loader "^6.2.1" + postcss-modules-values-replace "^3.4.0" + postcss-preset-env "^7.0.1" + prop-types "^15.7.2" + react-markdown "^5.0.3" + react-movable "^3.0.2" + react-virtualized "^9.22.3" + react-waypoint "^10.1.0" + remark-breaks "^3.0.2" + remark-gfm "^1.0.0" + scrollbar-width "^3.1.1" + simply-uuid "^1.0.1" + sniffr "^1.2.0" + style-inject "^0.3.0" + style-loader "~3.3.1" + url-loader "^4.1.1" + util-deprecate "^1.0.2" + +"@mapbox/geojson-rewind@^0.5.0": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@mapbox/geojson-rewind/-/geojson-rewind-0.5.1.tgz#adbe16dc683eb40e90934c51a5e28c7bbf44f4e1" + integrity sha512-eL7fMmfTBKjrb+VFHXCGv9Ot0zc3C0U+CwXo1IrP+EPwDczLoXv34Tgq3y+2mPSFNVUXgU42ILWJTC7145KPTA== + dependencies: + get-stream "^6.0.1" + minimist "^1.2.5" + +"@mapbox/geojson-types@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz#9aecf642cb00eab1080a57c4f949a65b4a5846d6" + integrity sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw== + +"@mapbox/jsonlint-lines-primitives@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz#ce56e539f83552b58d10d672ea4d6fc9adc7b234" + integrity sha1-zlblOfg1UrWNENZy6k1vya3HsjQ= + +"@mapbox/mapbox-gl-supported@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.5.0.tgz#f60b6a55a5d8e5ee908347d2ce4250b15103dc8e" + integrity sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg== + +"@mapbox/point-geometry@0.1.0", "@mapbox/point-geometry@^0.1.0", "@mapbox/point-geometry@~0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz#8a83f9335c7860effa2eeeca254332aa0aeed8f2" + integrity sha1-ioP5M1x4YO/6Lu7KJUMyqgru2PI= + +"@mapbox/tiny-sdf@^1.1.1": + version "1.2.5" + resolved "https://registry.yarnpkg.com/@mapbox/tiny-sdf/-/tiny-sdf-1.2.5.tgz#424c620a96442b20402552be70a7f62a8407cc59" + integrity sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw== + +"@mapbox/unitbezier@^0.0.0": + version "0.0.0" + resolved "https://registry.yarnpkg.com/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz#15651bd553a67b8581fb398810c98ad86a34524e" + integrity sha1-FWUb1VOme4WB+zmIEMmK2Go0Uk4= + +"@mapbox/vector-tile@^1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz#d3a74c90402d06e89ec66de49ec817ff53409666" + integrity sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw== + dependencies: + "@mapbox/point-geometry" "~0.1.0" + +"@mapbox/whoots-js@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz#497c67a1cef50d1a2459ba60f315e448d2ad87fe" + integrity sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@plotly/d3-sankey-circular@0.33.1": + version "0.33.1" + resolved "https://registry.yarnpkg.com/@plotly/d3-sankey-circular/-/d3-sankey-circular-0.33.1.tgz#15d1e0337e0e4b1135bdf0e2195c88adacace1a7" + integrity sha512-FgBV1HEvCr3DV7RHhDsPXyryknucxtfnLwPtCKKxdolKyTFYoLX/ibEfX39iFYIL7DYbVeRtP43dbFcrHNE+KQ== + dependencies: + d3-array "^1.2.1" + d3-collection "^1.0.4" + d3-shape "^1.2.0" + elementary-circuits-directed-graph "^1.0.4" + +"@plotly/d3-sankey@0.7.2": + version "0.7.2" + resolved "https://registry.yarnpkg.com/@plotly/d3-sankey/-/d3-sankey-0.7.2.tgz#ddd5290d3b02c60037ced018a162644a2ccef33b" + integrity sha512-2jdVos1N3mMp3QW0k2q1ph7Gd6j5PY1YihBrwpkFnKqO+cqtZq3AdEYUeSGXMeLsBDQYiqTVcihYfk8vr5tqhw== + dependencies: + d3-array "1" + d3-collection "1" + d3-shape "^1.2.0" + +"@plotly/point-cluster@^3.1.9": + version "3.1.9" + resolved "https://registry.yarnpkg.com/@plotly/point-cluster/-/point-cluster-3.1.9.tgz#8ffec77fbf5041bf15401079e4fdf298220291c1" + integrity sha512-MwaI6g9scKf68Orpr1pHZ597pYx9uP8UEFXLPbsCmuw3a84obwz6pnMXGc90VhgDNeNiLEdlmuK7CPo+5PIxXw== + dependencies: + array-bounds "^1.0.1" + binary-search-bounds "^2.0.4" + clamp "^1.0.1" + defined "^1.0.0" + dtype "^2.0.0" + flatten-vertex-data "^1.0.2" + is-obj "^1.0.1" + math-log2 "^1.0.1" + parse-rect "^1.2.0" + pick-by-alias "^1.2.0" + +"@polka/url@^1.0.0-next.20": + version "1.0.0-next.21" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" + integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== + +"@turf/area@^6.0.1": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@turf/area/-/area-6.5.0.tgz#1d0d7aee01d8a4a3d4c91663ed35cc615f36ad56" + integrity sha512-xCZdiuojokLbQ+29qR6qoMD89hv+JAgWjLrwSEWL+3JV8IXKeNFl6XkEJz9HGkVpnXvQKJoRz4/liT+8ZZ5Jyg== + dependencies: + "@turf/helpers" "^6.5.0" + "@turf/meta" "^6.5.0" + +"@turf/bbox@^6.0.1": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@turf/bbox/-/bbox-6.5.0.tgz#bec30a744019eae420dac9ea46fb75caa44d8dc5" + integrity sha512-RBbLaao5hXTYyyg577iuMtDB8ehxMlUqHEJiMs8jT1GHkFhr6sYre3lmLsPeYEi/ZKj5TP5tt7fkzNdJ4GIVyw== + dependencies: + "@turf/helpers" "^6.5.0" + "@turf/meta" "^6.5.0" + +"@turf/centroid@^6.0.2": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@turf/centroid/-/centroid-6.5.0.tgz#ecaa365412e5a4d595bb448e7dcdacfb49eb0009" + integrity sha512-MwE1oq5E3isewPprEClbfU5pXljIK/GUOMbn22UM3IFPDJX0KeoyLNwghszkdmFp/qMGL/M13MMWvU+GNLXP/A== + dependencies: + "@turf/helpers" "^6.5.0" + "@turf/meta" "^6.5.0" + +"@turf/helpers@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@turf/helpers/-/helpers-6.5.0.tgz#f79af094bd6b8ce7ed2bd3e089a8493ee6cae82e" + integrity sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw== + +"@turf/meta@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@turf/meta/-/meta-6.5.0.tgz#b725c3653c9f432133eaa04d3421f7e51e0418ca" + integrity sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA== + dependencies: + "@turf/helpers" "^6.5.0" + +"@types/component-emitter@^1.2.10": + version "1.2.11" + resolved "https://registry.yarnpkg.com/@types/component-emitter/-/component-emitter-1.2.11.tgz#50d47d42b347253817a39709fef03ce66a108506" + integrity sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ== + +"@types/cookie@^0.4.0": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" + integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== + +"@types/cors@^2.8.8": + version "2.8.12" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080" + integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== + +"@types/eslint-scope@^3.7.0": + version "3.7.1" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.1.tgz#8dc390a7b4f9dd9f1284629efce982e41612116e" + integrity sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.2.0" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.2.0.tgz#afd0519223c29c347087542cbaee2fedc0873b16" + integrity sha512-74hbvsnc+7TEDa1z5YLSe4/q8hGYB3USNvCuzHUJrjPV6hXaq8IXcngCrHkuvFt0+8rFz7xYXrHgNayIX0UZvQ== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^0.0.50": + version "0.0.50" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" + integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== + +"@types/http-proxy@^1.17.5": + version "1.17.7" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.7.tgz#30ea85cc2c868368352a37f0d0d3581e24834c6f" + integrity sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w== + dependencies: + "@types/node" "*" + +"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== + +"@types/mdast@^3.0.0", "@types/mdast@^3.0.3": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af" + integrity sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA== + dependencies: + "@types/unist" "*" + +"@types/node@*", "@types/node@>=10.0.0": + version "16.11.11" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.11.tgz#6ea7342dfb379ea1210835bada87b3c512120234" + integrity sha512-KB0sixD67CeecHC33MYn+eYARkqTheIRNuu97y2XMjR7Wu3XibO1vaY6VBV6O/a89SPI81cEUIYT87UqUWlZNw== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/retry@^0.12.0": + version "0.12.1" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.1.tgz#d8f1c0d0dc23afad6dc16a9e993a0865774b4065" + integrity sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g== + +"@types/tabulator-tables@5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@types/tabulator-tables/-/tabulator-tables-5.0.1.tgz#824fef3bef01c38a3bd934016a25e52e1043bf35" + integrity sha512-ieidxy+/bzMCPZsDeSw56DN9ipQ0K4Ts3ZUxPy4yCVExcAsezL4u2UYHBA+BxQ8l7QmEaERT/ctmBqjkRUhh+w== + +"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" + integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== + +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + +"@ungap/url-search-params@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@ungap/url-search-params/-/url-search-params-0.2.2.tgz#2de3bdec21476a9b70ef11fd7b794752f9afa04c" + integrity sha512-qQsguKXZVKdCixOHX9jqnX/K/1HekPDpGKyEcXHT+zR6EjGA7S4boSuelL4uuPv6YfhN0n8c4UxW+v/Z3gM2iw== + +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + +"@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== + +"@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + +"@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== + +"@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + +"@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" + +"@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + +"@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webpack-cli/configtest@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.1.0.tgz#8342bef0badfb7dfd3b576f2574ab80c725be043" + integrity sha512-ttOkEkoalEHa7RaFYpM0ErK1xc4twg3Am9hfHhL7MVqlHebnkYd2wuI/ZqTDj0cVzZho6PdinY0phFZV3O0Mzg== + +"@webpack-cli/info@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.4.0.tgz#b9179c3227ab09cbbb149aa733475fcf99430223" + integrity sha512-F6b+Man0rwE4n0409FyAJHStYA5OIZERxmnUfLVwv0mc0V1wLad3V7jqRlMkgKBeAq07jUvglacNaa6g9lOpuw== + dependencies: + envinfo "^7.7.3" + +"@webpack-cli/serve@^1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.6.0.tgz#2c275aa05c895eccebbfc34cfb223c6e8bd591a2" + integrity sha512-ZkVeqEmRpBV2GHvjjUZqEai2PpUbuq8Bqd//vEYsp63J8WyexI8ppCqVS3Zs0QADf6aWuPdU+0XsPI647PVlQA== + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +a-big-triangle@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/a-big-triangle/-/a-big-triangle-1.0.3.tgz#eefd30b02a8f525e8b1f72bb6bb1b0c16751c794" + integrity sha1-7v0wsCqPUl6LH3K7a7GwwWdRx5Q= + dependencies: + gl-buffer "^2.1.1" + gl-vao "^1.2.0" + weak-map "^1.0.5" + +abab@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" + integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== + +abs-svg-path@^0.1.1, abs-svg-path@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/abs-svg-path/-/abs-svg-path-0.1.1.tgz#df601c8e8d2ba10d4a76d625e236a9a39c2723bf" + integrity sha1-32Acjo0roQ1KdtYl4japo5wnI78= + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn-dynamic-import@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" + integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== + +acorn-import-assertions@^1.7.6: + version "1.8.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" + integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== + +acorn-jsx@^5.0.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^8.0.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^6.1.1: + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== + +acorn@^7.1.1: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.0.4: + version "8.7.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" + integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== + +acorn@^8.4.1: + version "8.6.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.6.0.tgz#e3692ba0eb1a0c83eaa4f37f5fa7368dd7142895" + integrity sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw== + +add-line-numbers@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/add-line-numbers/-/add-line-numbers-1.0.1.tgz#48dbbdea47dbd234deafeac6c93cea6f70b4b7e3" + integrity sha1-SNu96kfb0jTer+rGyTzqb3C0t+M= + dependencies: + pad-left "^1.0.2" + +affine-hull@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/affine-hull/-/affine-hull-1.0.0.tgz#763ff1d38d063ceb7e272f17ee4d7bbcaf905c5d" + integrity sha1-dj/x040GPOt+Jy8X7k17vK+QXF0= + dependencies: + robust-orientation "^1.1.3" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.0, ajv@^8.8.0: + version "8.8.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.8.2.tgz#01b4fef2007a28bf75f0b7fc009f62679de4abbb" + integrity sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +almost-equal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/almost-equal/-/almost-equal-1.1.0.tgz#f851c631138757994276aa2efbe8dfa3066cccdd" + integrity sha1-+FHGMROHV5lCdqou++jfowZszN0= + +alpha-complex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/alpha-complex/-/alpha-complex-1.0.0.tgz#90865870d6b0542ae73c0c131d4ef989669b72d2" + integrity sha1-kIZYcNawVCrnPAwTHU75iWabctI= + dependencies: + circumradius "^1.0.0" + delaunay-triangulate "^1.1.6" + +alpha-shape@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/alpha-shape/-/alpha-shape-1.0.0.tgz#c83109923ecfda667d2163fe4f26fe24726f64a9" + integrity sha1-yDEJkj7P2mZ9IWP+Tyb+JHJvZKk= + dependencies: + alpha-complex "^1.0.0" + simplicial-complex-boundary "^1.0.0" + +angular@>=1.0.6: + version "1.8.2" + resolved "https://registry.yarnpkg.com/angular/-/angular-1.8.2.tgz#5983bbb5a9fa63e213cb7749199e0d352de3a2f1" + integrity sha512-IauMOej2xEe7/7Ennahkbb5qd/HFADiNuLSESz9Q27inmi32zB0lnAsFeLEWcox3Gd1F6YhNd1CP7/9IukJ0Gw== + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +array-bounds@^1.0.0, array-bounds@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-bounds/-/array-bounds-1.0.1.tgz#da11356b4e18e075a4f0c86e1f179a67b7d7ea31" + integrity sha512-8wdW3ZGk6UjMPJx/glyEt0sLzzwAE1bhToPsO1W2pbpR2gULyxe3BjSiuJFheP50T/GgODVPz2fuMUmIywt8cQ== + +array-find-index@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-flatten@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-normalize@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/array-normalize/-/array-normalize-1.1.4.tgz#d75cec57383358af38efdf6a78071aa36ae4174c" + integrity sha512-fCp0wKFLjvSPmCn4F5Tiw4M3lpMZoHlCjfcs7nNzuj3vqQQ1/a8cgB9DXcpDSn18c+coLnaW7rqfcYCvKbyJXg== + dependencies: + array-bounds "^1.0.0" + +array-range@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-range/-/array-range-1.0.1.tgz#f56e46591843611c6a56f77ef02eda7c50089bfc" + integrity sha1-9W5GWRhDYRxqVvd+8C7afFAIm/w= + +array-rearrange@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/array-rearrange/-/array-rearrange-2.2.2.tgz#fa1a2acf8d02e88dd0c9602aa0e06a79158b2283" + integrity sha512-UfobP5N12Qm4Qu4fwLDIi2v6+wZsSf6snYSxAMeKhrh37YGnNWZPRmVEKc/2wfms53TLQnzfpG8wCx2Y/6NG1w== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +async@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" + +atob-lite@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/atob-lite/-/atob-lite-1.0.0.tgz#b88dca6006922b962094f7556826bab31c4a296b" + integrity sha1-uI3KYAaSK5YglPdVaCa6sxxKKWs= + +atob-lite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/atob-lite/-/atob-lite-2.0.0.tgz#0fef5ad46f1bd7a8502c65727f0367d5ee43d696" + integrity sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY= + +autoprefixer@^10.4.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.0.tgz#c3577eb32a1079a440ec253e404eaf1eb21388c8" + integrity sha512-7FdJ1ONtwzV1G43GDD0kpVMn/qbiNqyOPMFTX5nRffI+7vgWoFEc6DcXOxHJxrWNDXrZh18eDsZjvZGUljSRGA== + dependencies: + browserslist "^4.17.5" + caniuse-lite "^1.0.30001272" + fraction.js "^4.1.1" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.1.0" + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +babel-loader@^8.2.3: + version "8.2.3" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.3.tgz#8986b40f1a64cacfcb4b8429320085ef68b1342d" + integrity sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw== + dependencies: + find-cache-dir "^3.3.1" + loader-utils "^1.4.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" + +babel-plugin-angularjs-annotate@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/babel-plugin-angularjs-annotate/-/babel-plugin-angularjs-annotate-0.10.0.tgz#4213b3aaae494a087aad0b8237c5d0716d22ca76" + integrity sha512-NPE7FOAxcLPCUR/kNkrhHIjoScR3RyIlRH3yRn79j8EZWtpILVnCOdA9yKfsOmRh6BHnLHKl8ZAThc+YDd/QwQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/types" "^7.2.0" + simple-is "~0.2.0" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-polyfill-corejs2@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz#407082d0d355ba565af24126fb6cb8e9115251fd" + integrity sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA== + dependencies: + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.3.0" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz#0b571f4cf3d67f911512f5c04842a7b8e8263087" + integrity sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.0" + core-js-compat "^3.18.0" + +babel-plugin-polyfill-regenerator@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz#9ebbcd7186e1a33e21c5e20cae4e7983949533be" + integrity sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.0" + +"babel-plugin-styled-components@>= 1.12.0": + version "2.0.2" + resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.2.tgz#0fac11402dc9db73698b55847ab1dc73f5197c54" + integrity sha512-7eG5NE8rChnNTDxa6LQfynwgHTVOYYaHJbUYSlOhk8QBXIQiMBKq4gyfHBBKPrxUcVBXVJL61ihduCpCQbuNbw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-module-imports" "^7.16.0" + babel-plugin-syntax-jsx "^6.18.0" + lodash "^4.17.11" + +babel-plugin-syntax-jsx@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" + integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= + +babel-plugin-transform-define@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-define/-/babel-plugin-transform-define-2.0.1.tgz#6a34fd6ea89989feb75721ee4cce817ec779be7f" + integrity sha512-7lDR1nFGSJHmhq/ScQtp9LTDmNE2yKPoLtwfiu+WQZnj84XL/J/5AZWZXwYcOwbDtUPhtg+y0yxTiP/oGDU6Kw== + dependencies: + lodash "^4.17.11" + traverse "0.6.6" + +bail@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" + integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== + +bail@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" + integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +barycentric@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/barycentric/-/barycentric-1.0.1.tgz#f1562bb891b26f4fec463a82eeda3657800ec688" + integrity sha1-8VYruJGyb0/sRjqC7to2V4AOxog= + dependencies: + robust-linear-solve "^1.0.0" + +base64-arraybuffer@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz#9818c79e059b1355f97e0428a017c838e90ba812" + integrity sha1-mBjHngWbE1X5fgQooBfIOOkLqBI= + +base64id@2.0.0, base64id@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" + integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== + +batch-processor@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/batch-processor/-/batch-processor-1.0.0.tgz#75c95c32b748e0850d10c2b168f6bdbe9891ace8" + integrity sha1-dclcMrdI4IUNEMKxaPa9vpiRrOg= + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + +big-rat@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/big-rat/-/big-rat-1.0.4.tgz#768d093bb57930dd18ed575c7fca27dc5391adea" + integrity sha1-do0JO7V5MN0Y7Vdcf8on3FORreo= + dependencies: + bit-twiddle "^1.0.2" + bn.js "^4.11.6" + double-bits "^1.1.1" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +binary-search-bounds@^2.0.0, binary-search-bounds@^2.0.3, binary-search-bounds@^2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/binary-search-bounds/-/binary-search-bounds-2.0.5.tgz#125e5bd399882f71e6660d4bf1186384e989fba7" + integrity sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA== + +bit-twiddle@^1.0.0, bit-twiddle@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bit-twiddle/-/bit-twiddle-1.0.2.tgz#0c6c1fabe2b23d17173d9a61b7b7093eb9e1769e" + integrity sha1-DGwfq+KyPRcXPZpht7cJPrnhdp4= + +bit-twiddle@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/bit-twiddle/-/bit-twiddle-0.0.2.tgz#c2eaebb952a3b94acc140497e1cdcd2f1a33f58e" + integrity sha1-wurruVKjuUrMFASX4c3NLxoz9Y4= + +bitmap-sdf@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/bitmap-sdf/-/bitmap-sdf-1.0.3.tgz#c99913e5729357a6fd350de34158180c013880b2" + integrity sha512-ojYySSvWTx21cbgntR942zgEgqj38wHctN64vr4vYRFf3GKVmI23YlA94meWGkFslidwLwGCsMy2laJ3g/94Sg== + dependencies: + clamp "^1.0.1" + +bl@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/bl/-/bl-2.2.1.tgz#8c11a7b730655c5d56898cdc871224f40fd901d5" + integrity sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g== + dependencies: + readable-stream "^2.3.5" + safe-buffer "^5.1.1" + +bn.js@^4.11.6: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +body-parser@1.19.0, body-parser@^1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + +bootstrap@4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.6.0.tgz#97b9f29ac98f98dfa43bf7468262d84392552fd7" + integrity sha512-Io55IuQY3kydzHtbGvQya3H+KorS/M9rSNyfCGCg9WZ4pyT/lCxIlpJgG1GXW/PswzC84Tr2fBYi+7+jFVQQBw== + +boundary-cells@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/boundary-cells/-/boundary-cells-2.0.2.tgz#ed28c5a2eb36500413e5714f8eec862ad8ffec14" + integrity sha512-/S48oUFYEgZMNvdqC87iYRbLBAPHYijPRNrNpm/sS8u7ijIViKm/hrV3YD4sx/W68AsG5zLMyBEditVHApHU5w== + +box-intersect@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/box-intersect/-/box-intersect-1.0.2.tgz#4693ad63e828868d0654b114e09364d6281f3fbd" + integrity sha512-yJeMwlmFPG1gIa7Rs/cGXeI6iOj6Qz5MG5PE61xLKpElUGzmJ4abm+qsLpzxKJFpsSDq742BQEocr8dI2t8Nxw== + dependencies: + bit-twiddle "^1.0.2" + typedarray-pool "^1.1.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.1, braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.17.5, browserslist@^4.18.1: + version "4.18.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.18.1.tgz#60d3920f25b6860eb917c6c7b185576f4d8b017f" + integrity sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ== + dependencies: + caniuse-lite "^1.0.30001280" + electron-to-chromium "^1.3.896" + escalade "^3.1.1" + node-releases "^2.0.1" + picocolors "^1.0.0" + +buble@^0.19.3: + version "0.19.8" + resolved "https://registry.yarnpkg.com/buble/-/buble-0.19.8.tgz#d642f0081afab66dccd897d7b6360d94030b9d3d" + integrity sha512-IoGZzrUTY5fKXVkgGHw3QeXFMUNBFv+9l8a4QJKG1JhG3nCMHTdEX1DCOg8568E2Q9qvAQIiSokv6Jsgx8p2cA== + dependencies: + acorn "^6.1.1" + acorn-dynamic-import "^4.0.0" + acorn-jsx "^5.0.1" + chalk "^2.4.2" + magic-string "^0.25.3" + minimist "^1.2.0" + os-homedir "^2.0.0" + regexpu-core "^4.5.4" + +bubleify@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/bubleify/-/bubleify-1.2.1.tgz#c11fa33fa59d5b9b747d4e486f43889084257f37" + integrity sha512-vp3NHmaQVoKaKWvi15FTMinPNjfp+47+/kFJ9ifezdMF/CBLArCxDVUh+FQE3qRxCRj1qyjJqilTBHHqlM8MaQ== + dependencies: + buble "^0.19.3" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +camelcase@^6.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.1.tgz#250fd350cfd555d0d2160b1d51510eaf8326e86e" + integrity sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA== + +camelize@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" + integrity sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs= + +caniuse-lite@^1.0.30000655, caniuse-lite@^1.0.30001272, caniuse-lite@^1.0.30001280: + version "1.0.30001283" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001283.tgz#8573685bdae4d733ef18f78d44ba0ca5fe9e896b" + integrity sha512-9RoKo841j1GQFSJz/nCXOj0sD7tHBtlowjYlrqIUS812x9/emfBLBt6IyMz1zIaYc/eRL8Cs6HPUVi2Hzq4sIg== + +canvas-fit@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/canvas-fit/-/canvas-fit-1.5.0.tgz#ae13be66ade42f5be0e487e345fce30a5e5b5e5f" + integrity sha1-rhO+Zq3kL1vg5IfjRfzjCl5bXl8= + dependencies: + element-size "^1.1.1" + +capital-case@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/capital-case/-/capital-case-1.0.4.tgz#9d130292353c9249f6b00fa5852bee38a717e669" + integrity sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + upper-case-first "^2.0.2" + +ccount@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" + integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== + +cdt2d@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cdt2d/-/cdt2d-1.0.0.tgz#4f212434bcd67bdb3d68b8fef4acdc2c54415141" + integrity sha1-TyEkNLzWe9s9aLj+9KzcLFRBUUE= + dependencies: + binary-search-bounds "^2.0.3" + robust-in-sphere "^1.1.3" + robust-orientation "^1.1.3" + +cell-orientation@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cell-orientation/-/cell-orientation-1.0.1.tgz#b504ad96a66ad286d9edd985a2253d03b80d2850" + integrity sha1-tQStlqZq0obZ7dmFoiU9A7gNKFA= + +chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +change-case@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/change-case/-/change-case-4.1.2.tgz#fedfc5f136045e2398c0410ee441f95704641e12" + integrity sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A== + dependencies: + camel-case "^4.1.2" + capital-case "^1.0.4" + constant-case "^3.0.4" + dot-case "^3.0.4" + header-case "^2.0.4" + no-case "^3.0.4" + param-case "^3.0.4" + pascal-case "^3.1.2" + path-case "^3.0.4" + sentence-case "^3.0.4" + snake-case "^3.0.4" + tslib "^2.0.3" + +character-entities-legacy@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" + integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== + +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" + integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== + +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" + integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== + +chokidar@3.5.2, chokidar@^3.5.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" + integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +circumcenter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/circumcenter/-/circumcenter-1.0.0.tgz#20d7aa13b17fbac52f52da4f54c6ac8b906ee529" + integrity sha1-INeqE7F/usUvUtpPVMasi5Bu5Sk= + dependencies: + dup "^1.0.0" + robust-linear-solve "^1.0.0" + +circumradius@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/circumradius/-/circumradius-1.0.0.tgz#706c447e3e55cd1ed3d11bd133e37c252cc305b5" + integrity sha1-cGxEfj5VzR7T0RvRM+N8JSzDBbU= + dependencies: + circumcenter "^1.0.0" + +clamp@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/clamp/-/clamp-1.0.1.tgz#66a0e64011816e37196828fdc8c8c147312c8634" + integrity sha1-ZqDmQBGBbjcZaCj9yMjBRzEshjQ= + +classnames@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" + integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== + +clean-css@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.2.2.tgz#d3a7c6ee2511011e051719838bdcf8314dc4548d" + integrity sha512-/eR8ru5zyxKzpBLv9YZvMXgTSSQn7AdkMItMYynsFgGwTveCRVam9IUPFloE85B4vAIj05IuKmmEoV7/AQjT0w== + dependencies: + source-map "~0.6.0" + +clean-pslg@^1.1.0, clean-pslg@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/clean-pslg/-/clean-pslg-1.1.2.tgz#bd35c7460b7e8ab5a9f761a5ed51796aa3c86c11" + integrity sha1-vTXHRgt+irWp92Gl7VF5aqPIbBE= + dependencies: + big-rat "^1.0.3" + box-intersect "^1.0.1" + nextafter "^1.0.0" + rat-vec "^1.1.1" + robust-segment-intersect "^1.0.1" + union-find "^1.0.2" + uniq "^1.0.1" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clsx@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" + integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== + +color-alpha@^1.0.4: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-alpha/-/color-alpha-1.1.3.tgz#71250189e9f02bba8261a94d5e7d5f5606d1749a" + integrity sha512-krPYBO1RSO5LH4AGb/b6z70O1Ip2o0F0+0cVFN5FN99jfQtZFT08rQyg+9oOBNJYAn3SRwJIFC8jUEOKz7PisA== + dependencies: + color-parse "^1.4.1" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-id@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/color-id/-/color-id-1.1.0.tgz#5e9159b99a73ac98f74820cb98a15fde3d7e034c" + integrity sha512-2iRtAn6dC/6/G7bBIo0uupVrIne1NsQJvJxZOBCzQOfk7jRq97feaDZ3RdzuHakRXXnHGNwglto3pqtRx1sX0g== + dependencies: + clamp "^1.0.1" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@^1.0.0, color-name@^1.1.4, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-normalize@^1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/color-normalize/-/color-normalize-1.5.2.tgz#d6c8beb02966849548f91a6ac0274c6f19924509" + integrity sha512-yYMIoyFJmUoKbCK6sBShljBWfkt8DXVfaZJn9/zvRJkF9eQJDbZhcYC6LdOVy40p4tfVwYYb9cXl8oqpu7pzBw== + dependencies: + color-rgba "^2.2.0" + dtype "^2.0.0" + +color-parse@^1.4.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/color-parse/-/color-parse-1.4.2.tgz#78651f5d34df1a57f997643d86f7f87268ad4eb5" + integrity sha512-RI7s49/8yqDj3fECFZjUI1Yi0z/Gq1py43oNJivAIIDSyJiOZLfYCRQEgn8HEVAj++PcRe8AnL2XF0fRJ3BTnA== + dependencies: + color-name "^1.0.0" + +color-rgba@^2.1.1, color-rgba@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/color-rgba/-/color-rgba-2.3.0.tgz#d5eb481d7933d2542d1f222ea10ad40d159e9d35" + integrity sha512-z/5fMOY8/IzrBHPBk+n3ATNSM/1atXcHCRPTGPLlzYJ4fn7CRD46zzt3lkLtQ44cL8UIUU4JBXDVrhWj1khiwg== + dependencies: + color-parse "^1.4.1" + color-space "^1.14.6" + +color-space@^1.14.6: + version "1.16.0" + resolved "https://registry.yarnpkg.com/color-space/-/color-space-1.16.0.tgz#611781bca41cd8582a1466fd9e28a7d3d89772a2" + integrity sha512-A6WMiFzunQ8KEPFmj02OnnoUnqhmSaHaZ/0LVFcPTdlvm8+3aMJ5x1HRHy3bDHPkovkf4sS0f4wsVvwk71fKkg== + dependencies: + hsluv "^0.0.3" + mumath "^3.3.4" + +colorette@^2.0.10, colorette@^2.0.14: + version "2.0.16" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" + integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== + +colormap@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/colormap/-/colormap-2.3.2.tgz#4422c1178ce563806e265b96782737be85815abf" + integrity sha512-jDOjaoEEmA9AgA11B/jCSAvYE95r3wRoAyTf3LEHGiUVlNHJaL1mRkf5AyLSpQBVGfTEPwGEqCIzL+kgr2WgNA== + dependencies: + lerp "^1.0.3" + +colors@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +combokeys@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/combokeys/-/combokeys-3.0.1.tgz#fc8ca5c3f5f2d2b03a458544cb88b14ab5f53f86" + integrity sha512-5nAfaLZ3oO3kA+/xdoL7t197UJTz2WWidyH3BBeU6hqHtvyFERICd0y3DQFrQkJFTKBrtUDck/xCLLoFpnjaCw== + +commander@2, commander@^2.15.1, commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^7.0.0, commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +compare-angle@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/compare-angle/-/compare-angle-1.0.1.tgz#a4eb63416ea3c747fc6bd6c8b63668b4de4fa129" + integrity sha1-pOtjQW6jx0f8a9bItjZotN5PoSk= + dependencies: + robust-orientation "^1.0.2" + robust-product "^1.0.0" + robust-sum "^1.0.0" + signum "^0.0.0" + two-sum "^1.0.0" + +compare-cell@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/compare-cell/-/compare-cell-1.0.0.tgz#a9eb708f6e0e41aef7aa566b130f1968dc9e1aaa" + integrity sha1-qetwj24OQa73qlZrEw8ZaNyeGqo= + +compare-oriented-cell@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/compare-oriented-cell/-/compare-oriented-cell-1.0.1.tgz#6a149feef9dfc4f8fc62358e51dd42effbbdc39e" + integrity sha1-ahSf7vnfxPj8YjWOUd1C7/u9w54= + dependencies: + cell-orientation "^1.0.1" + compare-cell "^1.0.0" + +compile-code-loader@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/compile-code-loader/-/compile-code-loader-1.0.0.tgz#492002e69e0ce91dff42bec420bbaf575f4c9c4a" + integrity sha512-MFE1K+xC3f28urqFQ/7LGAzl/MZXzrFz5n3Tp83n6DwiucAVPkbB+z18D7Z0BqvmcuFiYy6hgm9sGrF/mbyZUw== + dependencies: + loader-utils "^2.0.0" + +component-emitter@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +compute-dims@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/compute-dims/-/compute-dims-1.1.0.tgz#6d5b712929b6c531af3b4d580ed5adacbbd77e0c" + integrity sha512-YHMiIKjH/8Eom8zATk3g8/lH3HxGCZcVQyEfEoVrfWI7od/WRpTgRGShnei3jArYSx77mQqPxZNokjGHCdLfxg== + dependencies: + utils-copy "^1.0.0" + validate.io-array "^1.0.6" + validate.io-matrix-like "^1.0.2" + validate.io-ndarray-like "^1.0.0" + validate.io-positive-integer "^1.0.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.5.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +conic-gradient@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/conic-gradient/-/conic-gradient-1.0.0.tgz#0bd7aaddeaa14aa5a7c08b22a6ee90613f610479" + integrity sha512-TEmM3Ondx8nid2AN0Rsw6eQG7PgTUkL6gs90UqX1cNqO/bpt/H/Rw6DwbzoylQ9SSxqLG1SsteAr9/yBsAzdtw== + dependencies: + prefixfree "^1.0.0" + +connect-history-api-fallback@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + +connect@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + +"consolidated-events@^1.1.0 || ^2.0.0": + version "2.0.2" + resolved "https://registry.yarnpkg.com/consolidated-events/-/consolidated-events-2.0.2.tgz#da8d8f8c2b232831413d9e190dc11669c79f4a91" + integrity sha512-2/uRVMdRypf5z/TW/ncD/66l75P5hH2vM/GR8Jf8HLc2xnfJtmina6F6du8+v4Z2vTrMo7jC+W1tmEEuuELgkQ== + +const-max-uint32@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/const-max-uint32/-/const-max-uint32-1.0.2.tgz#f009bb6230e678ed874dd2d6a9cd9e3cbfabb676" + integrity sha1-8Am7YjDmeO2HTdLWqc2ePL+rtnY= + +const-pinf-float64@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/const-pinf-float64/-/const-pinf-float64-1.0.0.tgz#f6efb0d79f9c0986d3e79f2923abf9b70b63d726" + integrity sha1-9u+w15+cCYbT558pI6v5twtj1yY= + +constant-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-3.0.4.tgz#3b84a9aeaf4cf31ec45e6bf5de91bdfb0589faf1" + integrity sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + upper-case "^2.0.2" + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + +convex-hull@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/convex-hull/-/convex-hull-1.0.3.tgz#20a3aa6ce87f4adea2ff7d17971c9fc1c67e1fff" + integrity sha1-IKOqbOh/St6i/30XlxyfwcZ+H/8= + dependencies: + affine-hull "^1.0.0" + incremental-convex-hull "^1.0.1" + monotone-convex-hull-2d "^1.0.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +cookie@~0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" + integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== + +core-js-compat@^3.18.0, core-js-compat@^3.19.1: + version "3.19.2" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.19.2.tgz#18066a3404a302433cb0aa8be82dd3d75c76e5c4" + integrity sha512-ObBY1W5vx/LFFMaL1P5Udo4Npib6fu+cMokeziWkA8Tns4FcDemKF5j9JvaI5JhdkW8EQJQGJN1EcrzmEwuAqQ== + dependencies: + browserslist "^4.18.1" + semver "7.0.0" + +core-js@3.12.1: + version "3.12.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.12.1.tgz#6b5af4ff55616c08a44d386f1f510917ff204112" + integrity sha512-Ne9DKPHTObRuB09Dru5AjwKjY4cJHVGu+y5f7coGn1E9Grkc3p2iBwE9AI/nJzsE29mQF7oq+mhYYRqOMFN1Bw== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cors@~2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +cosmiconfig@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +country-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/country-regex/-/country-regex-1.1.0.tgz#51c333dcdf12927b7e5eeb9c10ac8112a6120896" + integrity sha1-UcMz3N8Sknt+XuucEKyBEqYSCJY= + +cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +css-blank-pseudo@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-2.0.0.tgz#10667f9c5f91e4fbde76c4efac55e8eaa6ed9967" + integrity sha512-n7fxEOyuvAVPLPb9kL4XTIK/gnp2fKQ7KFQ+9lj60W9pDn/jTr5LjS/kHHm+rES/YJ3m0S6+uJgYSuAJg9zOyA== + +css-color-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" + integrity sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU= + +css-font-size-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-font-size-keywords/-/css-font-size-keywords-1.0.0.tgz#854875ace9aca6a8d2ee0d345a44aae9bb6db6cb" + integrity sha1-hUh1rOmspqjS7g00WkSq6btttss= + +css-font-stretch-keywords@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/css-font-stretch-keywords/-/css-font-stretch-keywords-1.0.1.tgz#50cee9b9ba031fb5c952d4723139f1e107b54b10" + integrity sha1-UM7puboDH7XJUtRyMTnx4Qe1SxA= + +css-font-style-keywords@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/css-font-style-keywords/-/css-font-style-keywords-1.0.1.tgz#5c3532813f63b4a1de954d13cea86ab4333409e4" + integrity sha1-XDUygT9jtKHelU0TzqhqtDM0CeQ= + +css-font-weight-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-font-weight-keywords/-/css-font-weight-keywords-1.0.0.tgz#9bc04671ac85bc724b574ef5d3ac96b0d604fd97" + integrity sha1-m8BGcayFvHJLV07106yWsNYE/Zc= + +css-font@^1.0.0, css-font@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-font/-/css-font-1.2.0.tgz#e73cbdc11fd87c8e6c928ad7098a9771c8c2b6e3" + integrity sha512-V4U4Wps4dPDACJ4WpgofJ2RT5Yqwe1lEH6wlOOaIxMi0gTjdIijsc5FmxQlZ7ZZyKQkkutqqvULOp07l9c7ssA== + dependencies: + css-font-size-keywords "^1.0.0" + css-font-stretch-keywords "^1.0.1" + css-font-style-keywords "^1.0.1" + css-font-weight-keywords "^1.0.0" + css-global-keywords "^1.0.1" + css-system-font-keywords "^1.0.0" + pick-by-alias "^1.2.0" + string-split-by "^1.0.0" + unquote "^1.1.0" + +css-global-keywords@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/css-global-keywords/-/css-global-keywords-1.0.1.tgz#72a9aea72796d019b1d2a3252de4e5aaa37e4a69" + integrity sha1-cqmupyeW0Bmx0qMlLeTlqqN+Smk= + +css-has-pseudo@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-2.0.0.tgz#43ae03a990cf3d9e7356837c6b500e04037606b5" + integrity sha512-URYSGI0ggED1W1/xOAH0Zn1bf+YL6tYh1PQzAPlWddEAyyO37mPqMbwCzSjTTNmeCR8BMNXSFLaT5xb6MERdAA== + dependencies: + postcss-selector-parser "^6" + +css-in-js-utils@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz#3b472b398787291b47cfe3e44fecfdd9e914ba99" + integrity sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA== + dependencies: + hyphenate-style-name "^1.0.2" + isobject "^3.0.1" + +css-in-js-utils@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz#640ae6a33646d401fc720c54fc61c42cd76ae2bb" + integrity sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A== + dependencies: + hyphenate-style-name "^1.0.3" + +css-loader@6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.3.0.tgz#334d3500ff0a0c14cfbd4b0670088dbb5b5c1530" + integrity sha512-9NGvHOR+L6ps13Ilw/b216++Q8q+5RpJcVufCdW9S/9iCzs4KBDNa8qnA/n3FK/sSfWmH35PAIK/cfPi7LOSUg== + dependencies: + icss-utils "^5.1.0" + postcss "^8.2.15" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.1.0" + semver "^7.3.5" + +css-loader@^6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.5.1.tgz#0c43d4fbe0d97f699c91e9818cb585759091d1b1" + integrity sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ== + dependencies: + icss-utils "^5.1.0" + postcss "^8.2.15" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.1.0" + semver "^7.3.5" + +css-prefers-color-scheme@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-5.0.0.tgz#a89bc1abfe946e77a1a1e12dbc25a1439705933f" + integrity sha512-XpzVrdwbppHm+Nnrzcb/hQb8eq1aKv4U8Oh59LsLfTsbIZZ6Fvn9razb66ihH2aTJ0VhO9n9sVm8piyKXJAZMA== + +css-system-font-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-system-font-keywords/-/css-system-font-keywords-1.0.0.tgz#85c6f086aba4eb32c571a3086affc434b84823ed" + integrity sha1-hcbwhquk6zLFcaMIav/ENLhII+0= + +css-to-react-native@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.0.0.tgz#62dbe678072a824a689bcfee011fc96e02a7d756" + integrity sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ== + dependencies: + camelize "^1.0.0" + css-color-keywords "^1.0.0" + postcss-value-parser "^4.0.2" + +csscolorparser@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/csscolorparser/-/csscolorparser-1.0.3.tgz#b34f391eea4da8f3e98231e2ccd8df9c041f171b" + integrity sha1-s085HupNqPPpgjHizNjfnAQfFxs= + +cssdb@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-5.0.0.tgz#96db23e70dda3d03a32346de611f0e79fee68b7f" + integrity sha512-Q7982SynYCtcLUBCPgUPFy2TZmDiFyimpdln8K2v4w2c07W4rXL7q5F1ksVAqOAQfxKyyUGCKSsioezKT5bU1Q== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +csstype@^3.0.10, csstype@^3.0.2: + version "3.0.10" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5" + integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA== + +cubic-hermite@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cubic-hermite/-/cubic-hermite-1.0.0.tgz#84e3b2f272b31454e8393b99bb6aed45168c14e5" + integrity sha1-hOOy8nKzFFToOTuZu2rtRRaMFOU= + +custom-event@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" + integrity sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU= + +cwise-compiler@^1.0.0, cwise-compiler@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/cwise-compiler/-/cwise-compiler-1.1.3.tgz#f4d667410e850d3a313a7d2db7b1e505bb034cc5" + integrity sha1-9NZnQQ6FDToxOn0tt7HlBbsDTMU= + dependencies: + uniq "^1.0.0" + +d3-array@1, d3-array@^1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f" + integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw== + +d3-collection@1, d3-collection@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e" + integrity sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A== + +d3-color@1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.4.1.tgz#c52002bf8846ada4424d55d97982fef26eb3bc8a" + integrity sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q== + +d3-dispatch@1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.6.tgz#00d37bcee4dd8cd97729dd893a0ac29caaba5d58" + integrity sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA== + +d3-force@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-1.2.1.tgz#fd29a5d1ff181c9e7f0669e4bd72bdb0e914ec0b" + integrity sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg== + dependencies: + d3-collection "1" + d3-dispatch "1" + d3-quadtree "1" + d3-timer "1" + +d3-hierarchy@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz#2f6bee24caaea43f8dc37545fa01628559647a83" + integrity sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ== + +d3-interpolate@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.4.0.tgz#526e79e2d80daa383f9e0c1c1c7dcc0f0583e987" + integrity sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA== + dependencies: + d3-color "1" + +d3-path@1: + version "1.0.9" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf" + integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg== + +d3-quadtree@1: + version "1.0.7" + resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-1.0.7.tgz#ca8b84df7bb53763fe3c2f24bd435137f4e53135" + integrity sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA== + +d3-shape@^1.2.0: + version "1.3.7" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7" + integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== + dependencies: + d3-path "1" + +d3-timer@1: + version "1.0.10" + resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.10.tgz#dfe76b8a91748831b13b6d9c793ffbd508dd9de5" + integrity sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw== + +d3@^3.5.17: + version "3.5.17" + resolved "https://registry.yarnpkg.com/d3/-/d3-3.5.17.tgz#bc46748004378b21a360c9fc7cf5231790762fb8" + integrity sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g= + +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + +date-fns@^2.27.0: + version "2.28.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.28.0.tgz#9570d656f5fc13143e50c975a3b6bbeb46cd08b2" + integrity sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw== + +date-format@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/date-format/-/date-format-2.1.0.tgz#31d5b5ea211cf5fd764cd38baf9d033df7e125cf" + integrity sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA== + +date-format@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/date-format/-/date-format-3.0.0.tgz#eb8780365c7d2b1511078fb491e6479780f3ad95" + integrity sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w== + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== + dependencies: + ms "2.1.2" + +debug@^3.1.1: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@~4.3.1: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +deep-equal@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" + +deep-equal@^2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.0.5.tgz#55cd2fe326d83f9cbf7261ef0e060b3f724c5cb9" + integrity sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw== + dependencies: + call-bind "^1.0.0" + es-get-iterator "^1.1.1" + get-intrinsic "^1.0.1" + is-arguments "^1.0.4" + is-date-object "^1.0.2" + is-regex "^1.1.1" + isarray "^2.0.5" + object-is "^1.1.4" + object-keys "^1.1.1" + object.assign "^4.1.2" + regexp.prototype.flags "^1.3.0" + side-channel "^1.0.3" + which-boxed-primitive "^1.0.1" + which-collection "^1.0.1" + which-typed-array "^1.1.2" + +deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +default-gateway@^6.0.0: + version "6.0.3" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== + dependencies: + execa "^5.0.0" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +defined@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= + +del@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/del/-/del-6.0.0.tgz#0b40d0332cea743f1614f818be4feb717714c952" + integrity sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ== + dependencies: + globby "^11.0.1" + graceful-fs "^4.2.4" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.2" + p-map "^4.0.0" + rimraf "^3.0.2" + slash "^3.0.0" + +delaunay-triangulate@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/delaunay-triangulate/-/delaunay-triangulate-1.1.6.tgz#5bbca21b078198d4bc3c75796a35cbb98c25954c" + integrity sha1-W7yiGweBmNS8PHV5ajXLuYwllUw= + dependencies: + incremental-convex-hull "^1.0.1" + uniq "^1.0.1" + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-kerning@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/detect-kerning/-/detect-kerning-2.1.2.tgz#4ecd548e4a5a3fc880fe2a50609312d000fa9fc2" + integrity sha512-I3JIbrnKPAntNLl1I6TpSQQdQ4AutYzv/sKMFKbepawV/hlH0GmYKhUoOEMd4xqaUHT+Bm0f4127lh5qs1m1tw== + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +di@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" + integrity sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw= + +diff@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= + +dns-packet@^1.3.1: + version "1.3.4" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" + integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= + dependencies: + buffer-indexof "^1.0.0" + +dom-helpers@^5.1.3: + version "5.2.1" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" + +dom-serialize@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" + integrity sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs= + dependencies: + custom-event "~1.0.0" + ent "~2.2.0" + extend "^3.0.0" + void-elements "^2.0.0" + +dom-serializer@^1.0.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" + integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +domelementtype@^2.0.1, domelementtype@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" + integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== + +domhandler@^4.0, domhandler@^4.2.0, domhandler@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.2.tgz#e825d721d19a86b8c201a35264e226c678ee755f" + integrity sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w== + dependencies: + domelementtype "^2.2.0" + +domutils@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +double-bits@^1.1.0, double-bits@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/double-bits/-/double-bits-1.1.1.tgz#58abba45494da4d0fa36b73ad11a286c9184b1c6" + integrity sha1-WKu6RUlNpND6Nrc60RoobJGEscY= + +draw-svg-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/draw-svg-path/-/draw-svg-path-1.0.0.tgz#6f116d962dd314b99ea534d6f58dd66cdbd69379" + integrity sha1-bxFtli3TFLmepTTW9Y3WbNvWk3k= + dependencies: + abs-svg-path "~0.1.1" + normalize-svg-path "~0.1.0" + +dtype@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dtype/-/dtype-2.0.0.tgz#cd052323ce061444ecd2e8f5748f69a29be28434" + integrity sha1-zQUjI84GFETs0uj1dI9popvihDQ= + +dukat@0.5.8-rc.4: + version "0.5.8-rc.4" + resolved "https://registry.yarnpkg.com/dukat/-/dukat-0.5.8-rc.4.tgz#90384dcb50b14c26f0e99dae92b2dea44f5fce21" + integrity sha512-ZnMt6DGBjlVgK2uQamXfd7uP/AxH7RqI0BL9GLrrJb2gKdDxvJChWy+M9AQEaL+7/6TmxzJxFOsRiInY9oGWTA== + dependencies: + google-protobuf "3.12.2" + typescript "3.9.5" + +dup@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dup/-/dup-1.0.0.tgz#51fc5ac685f8196469df0b905e934b20af5b4029" + integrity sha1-UfxaxoX4GWRp3wuQXpNLIK9bQCk= + +duplexer@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +duplexify@^3.4.5: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +earcut@^2.1.5, earcut@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.2.3.tgz#d44ced2ff5a18859568e327dd9c7d46b16f55cf4" + integrity sha512-iRDI1QeCQIhMCZk48DRDMVgQSSBDmbzzNhnxIo+pwx3swkfjMh6vh0nWLq1NdvGHLKH6wIrAM3vQWeTj6qeoug== + +edges-to-adjacency-list@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/edges-to-adjacency-list/-/edges-to-adjacency-list-1.0.0.tgz#c146d2e084addfba74a51293c6e0199a49f757f1" + integrity sha1-wUbS4ISt37p0pRKTxuAZmkn3V/E= + dependencies: + uniq "^1.0.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +electron-to-chromium@^1.3.896: + version "1.4.5" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.5.tgz#912e8fd1645edee2f0f212558f40916eb538b1f9" + integrity sha512-YKaB+t8ul5crdh6OeqT2qXdxJGI0fAYb6/X8pDIyye+c3a7ndOCk5gVeKX+ABwivCGNS56vOAif3TN0qJMpEHw== + +element-resize-detector@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/element-resize-detector/-/element-resize-detector-1.2.3.tgz#5078d9b99398fe4c589f8c8df94ff99e5d413ff3" + integrity sha512-+dhNzUgLpq9ol5tyhoG7YLoXL3ssjfFW+0gpszXPwRU6NjGr1fVHMEAF8fVzIiRJq57Nre0RFeIjJwI8Nh2NmQ== + dependencies: + batch-processor "1.0.0" + +element-size@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/element-size/-/element-size-1.1.1.tgz#64e5f159d97121631845bcbaecaf279c39b5e34e" + integrity sha1-ZOXxWdlxIWMYRby67K8nnDm1404= + +elementary-circuits-directed-graph@^1.0.4: + version "1.3.1" + resolved "https://registry.yarnpkg.com/elementary-circuits-directed-graph/-/elementary-circuits-directed-graph-1.3.1.tgz#31c5a1c69517de833127247e5460472168e9e1c1" + integrity sha512-ZEiB5qkn2adYmpXGnJKkxT8uJHlW/mxmBpmeqawEHzPxh9HkLD4/1mFYX5l0On+f6rcPIt8/EWlRU2Vo3fX6dQ== + dependencies: + strongly-connected-components "^1.0.1" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.0.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +engine.io-parser@~4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-4.0.3.tgz#83d3a17acfd4226f19e721bb22a1ee8f7662d2f6" + integrity sha512-xEAAY0msNnESNPc00e19y5heTPX4y/TJ36gr8t1voOaNmTojP9b3oK3BbJLFufW2XFPQaaijpFewm2g2Um3uqA== + dependencies: + base64-arraybuffer "0.1.4" + +engine.io@~4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-4.1.1.tgz#9a8f8a5ac5a5ea316183c489bf7f5b6cf91ace5b" + integrity sha512-t2E9wLlssQjGw0nluF6aYyfX8LwYU8Jj0xct+pAhfWfv/YrBn6TSNtEYsgxHIfaMqfrLx07czcMg9bMN6di+3w== + dependencies: + accepts "~1.3.4" + base64id "2.0.0" + cookie "~0.4.1" + cors "~2.8.5" + debug "~4.3.1" + engine.io-parser "~4.0.0" + ws "~7.4.2" + +enhanced-resolve@^3.1.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e" + integrity sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24= + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + object-assign "^4.0.1" + tapable "^0.2.7" + +enhanced-resolve@^5.8.3: + version "5.8.3" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz#6d552d465cce0423f5b3d718511ea53826a7b2f0" + integrity sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +ent@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" + integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0= + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +entities@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" + integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== + +envinfo@^7.7.3: + version "7.8.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + +errno@^0.1.3: + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + dependencies: + prr "~1.0.1" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.18.5: + version "1.19.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" + integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.1" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.1" + is-string "^1.0.7" + is-weakref "^1.0.1" + object-inspect "^1.11.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" + +es-get-iterator@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.2.tgz#9234c54aba713486d7ebde0220864af5e2b283f7" + integrity sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.0" + has-symbols "^1.0.1" + is-arguments "^1.1.0" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.5" + isarray "^2.0.5" + +es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50: + version "0.10.53" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" + integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.3" + next-tick "~1.0.0" + +es6-error@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" + integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== + +es6-iterator@^2.0.3, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-promise@^4.0.3, es6-promise@^4.2.8: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= + dependencies: + es6-promise "^4.0.3" + +es6-symbol@^3.1.1, es6-symbol@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + +es6-weak-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" + integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== + dependencies: + d "1" + es5-ext "^0.10.46" + es6-iterator "^2.0.3" + es6-symbol "^3.1.1" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escodegen@^1.11.1: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-plugin-react-hooks@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz#318dbf312e06fab1c835a4abef00121751ac1172" + integrity sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA== + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1, estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +express@^4.17.1: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +ext@^1.1.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52" + integrity sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg== + dependencies: + type "^2.5.0" + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extract-frustum-planes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/extract-frustum-planes/-/extract-frustum-planes-1.0.0.tgz#97d5703ff0564c8c3c6838cac45f9e7bc52c9ef5" + integrity sha1-l9VwP/BWTIw8aDjKxF+ee8UsnvU= + +extricate-loader@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/extricate-loader/-/extricate-loader-3.0.0.tgz#7a9998e885046d5d6991d62d4887ee113ca1e0bd" + integrity sha512-Ts6BIh25xhFpeGaG0La345bYQdRXWv3ZvUwmJB6/QsXRywWrZmM1hGz8eZfQaBwy/HsmGOZevzGLesVtsrrmyg== + dependencies: + loader-utils "^1.1.0" + +falafel@^2.1.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/falafel/-/falafel-2.2.4.tgz#b5d86c060c2412a43166243cb1bce44d1abd2819" + integrity sha512-0HXjo8XASWRmsS0X1EkhwEMZaD3Qvp7FfURwjLKjG1ghfRm/MGZl2r4cWUTv41KdNghTw4OUMmVtdGQp3+H+uQ== + dependencies: + acorn "^7.1.1" + foreach "^2.0.5" + isarray "^2.0.1" + object-keys "^1.0.6" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.1.1: + version "3.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" + integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-isnumeric@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/fast-isnumeric/-/fast-isnumeric-1.1.4.tgz#e165786ff471c439e9ace2b8c8e66cceb47e2ea4" + integrity sha512-1mM8qOr2LYz8zGaUdmiqRDiuue00Dxjgcb1NQR7TnhLVh6sQyngP9xvLo7Sl7LZpP/sk5eb+bcyWXw530NTBZw== + dependencies: + is-string-blank "^1.0.1" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fastdom@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fastdom/-/fastdom-1.0.10.tgz#4f2c7c9b24e7e249fc70c63131842b859b92bf09" + integrity sha512-sbL4h358IlZn8VsTvA5TYnKVLYif46XhPEll+HTSxVtDSpqZEO/17D/QqlxE9V2K7AQ82GXeYeQLU2HWwKgk1A== + dependencies: + strictdom "^1.0.1" + +fastest-levenshtein@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" + integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== + +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +file-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +file-saver@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-2.0.2.tgz#06d6e728a9ea2df2cce2f8d9e84dfcdc338ec17a" + integrity sha512-Wz3c3XQ5xroCxd1G8b7yL0Ehkf0TC9oYC6buPFkNnU9EnaPlifeAFCyCh+iewXTyFRcg0a6j3J7FmJsIhlhBdw== + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +filtered-vector@^1.2.1: + version "1.2.5" + resolved "https://registry.yarnpkg.com/filtered-vector/-/filtered-vector-1.2.5.tgz#5a831278c159721dd3be34ef017842836ef3d461" + integrity sha512-5Vu6wdtQJ1O2nRmz39dIr9m3hEDq1skYby5k1cJQdNWK4dMgvYcUEiA/9j7NcKfNZ5LGxn8w2LSLiigyH7pTAw== + dependencies: + binary-search-bounds "^2.0.0" + cubic-hermite "^1.0.0" + +finalhandler@1.1.2, finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-cache-dir@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== + +flatten-vertex-data@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/flatten-vertex-data/-/flatten-vertex-data-1.0.2.tgz#889fd60bea506006ca33955ee1105175fb620219" + integrity sha512-BvCBFK2NZqerFTdMDgqfHBwxYWnxeCkwONsw6PvBMcUXqo8U/KDWwmXhqx1x2kLIg7DqIsJfOaJFOmlua3Lxuw== + dependencies: + dtype "^2.0.0" + +flatten@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" + integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== + +flip-pixels@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/flip-pixels/-/flip-pixels-1.0.2.tgz#aad7b7d9fc65932d5f27e2e4dac4b494140845e4" + integrity sha512-oXbJGbjDnfJRWPC7Va38EFhd+A8JWE5/hCiKcK8qjCdbLj9DTpsq6MEudwpRTH+V4qq+Jw7d3pUgQdSr3x3mTA== + +focus-trap@^6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/focus-trap/-/focus-trap-6.7.1.tgz#d474f86dbaf3c7fbf0d53cf0b12295f4f4068d10" + integrity sha512-a6czHbT9twVpy2RpkWQA9vIgwQgB9Nx1PIxNNUxQT4nugG/3QibwxO+tWTh9i+zSY2SFiX4pnYhTaFaQF/6ZAg== + dependencies: + tabbable "^5.2.1" + +focus-visible@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/focus-visible/-/focus-visible-5.2.0.tgz#3a9e41fccf587bd25dcc2ef045508284f0a4d6b3" + integrity sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ== + +follow-redirects@^1.0.0: + version "1.14.5" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.5.tgz#f09a5848981d3c772b5392309778523f8d85c381" + integrity sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA== + +font-atlas@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/font-atlas/-/font-atlas-2.1.0.tgz#aa2d6dcf656a6c871d66abbd3dfbea2f77178348" + integrity sha512-kP3AmvX+HJpW4w3d+PiPR2X6E1yvsBXt2yhuCw+yReO9F1WYhvZwx3c95DGZGwg9xYzDGrgJYa885xmVA+28Cg== + dependencies: + css-font "^1.0.0" + +font-measure@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/font-measure/-/font-measure-1.2.2.tgz#41dbdac5d230dbf4db08865f54da28a475e83026" + integrity sha512-mRLEpdrWzKe9hbfaF3Qpr06TAjquuBVP5cHy4b3hyeNdjc9i0PO6HniGsX5vjL5OWv7+Bd++NiooNpT/s8BvIA== + dependencies: + css-font "^1.2.0" + +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= + +format-util@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/format-util/-/format-util-1.0.5.tgz#1ffb450c8a03e7bccffe40643180918cc297d271" + integrity sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg== + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fraction.js@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.1.2.tgz#13e420a92422b6cf244dff8690ed89401029fbe8" + integrity sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +from2@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-monkey@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" + integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +gamma@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/gamma/-/gamma-0.1.0.tgz#3315643403bf27906ca80ab37c36ece9440ef330" + integrity sha1-MxVkNAO/J5BsqAqzfDbs6UQO8zA= + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +geojson-vt@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/geojson-vt/-/geojson-vt-3.2.1.tgz#f8adb614d2c1d3f6ee7c4265cad4bbf3ad60c8b7" + integrity sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-canvas-context@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-canvas-context/-/get-canvas-context-1.0.2.tgz#d6e7b50bc4e4c86357cd39f22647a84b73601e93" + integrity sha1-1ue1C8TkyGNXzTnyJkeoS3NgHpM= + +get-intrinsic@^1.0.1, get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-stream@^6.0.0, get-stream@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +gl-axes3d@^1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/gl-axes3d/-/gl-axes3d-1.5.3.tgz#47e3dd6c21356a59349910ec01af58e28ea69fe9" + integrity sha512-KRYbguKQcDQ6PcB9g1pgqB8Ly4TY1DQODpPKiDTasyWJ8PxQk0t2Q7XoQQijNqvsguITCpVVCzNb5GVtIWiVlQ== + dependencies: + bit-twiddle "^1.0.2" + dup "^1.0.0" + extract-frustum-planes "^1.0.0" + gl-buffer "^2.1.2" + gl-mat4 "^1.2.0" + gl-shader "^4.2.1" + gl-state "^1.0.0" + gl-vao "^1.3.0" + gl-vec4 "^1.0.1" + glslify "^7.0.0" + robust-orientation "^1.1.3" + split-polygon "^1.0.0" + vectorize-text "^3.2.1" + +gl-buffer@^2.1.1, gl-buffer@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/gl-buffer/-/gl-buffer-2.1.2.tgz#2db8d9c1a5527fba0cdb91289c206e882b889cdb" + integrity sha1-LbjZwaVSf7oM25EonCBuiCuInNs= + dependencies: + ndarray "^1.0.15" + ndarray-ops "^1.1.0" + typedarray-pool "^1.0.0" + +gl-cone3d@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/gl-cone3d/-/gl-cone3d-1.5.2.tgz#66af5c33b7d5174034dfa3654a88e995998d92bc" + integrity sha512-1JNeHH4sUtUmDA4ZK7Om8/kShwb8IZVAsnxaaB7IPRJsNGciLj1sTpODrJGeMl41RNkex5kXD2SQFrzyEAR2Rw== + dependencies: + colormap "^2.3.1" + gl-buffer "^2.1.2" + gl-mat4 "^1.2.0" + gl-shader "^4.2.1" + gl-texture2d "^2.1.0" + gl-vao "^1.3.0" + gl-vec3 "^1.1.3" + glsl-inverse "^1.0.0" + glsl-out-of-range "^1.0.4" + glsl-specular-cook-torrance "^2.0.1" + glslify "^7.0.0" + ndarray "^1.0.18" + +gl-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gl-constants/-/gl-constants-1.0.0.tgz#597a504e364750ff50253aa35f8dea7af4a5d233" + integrity sha1-WXpQTjZHUP9QJTqjX43qevSl0jM= + +gl-contour2d@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/gl-contour2d/-/gl-contour2d-1.1.7.tgz#ca330cf8449673a9ca0b3f6726c83f8d35c7a50c" + integrity sha512-GdebvJ9DtT3pJDpoE+eU2q+Wo9S3MijPpPz5arZbhK85w2bARmpFpVfPaDlZqWkB644W3BlH8TVyvAo1KE4Bhw== + dependencies: + binary-search-bounds "^2.0.4" + cdt2d "^1.0.0" + clean-pslg "^1.1.2" + gl-buffer "^2.1.2" + gl-shader "^4.2.1" + glslify "^7.0.0" + iota-array "^1.0.0" + ndarray "^1.0.18" + surface-nets "^1.0.2" + +gl-error3d@^1.0.16: + version "1.0.16" + resolved "https://registry.yarnpkg.com/gl-error3d/-/gl-error3d-1.0.16.tgz#88a94952f5303d9cf5cb86806789a360777c5446" + integrity sha512-TGJewnKSp7ZnqGgG3XCF9ldrDbxZrO+OWlx6oIet4OdOM//n8xJ5isArnIV/sdPJnFbhfoLxWrW9f5fxHFRQ1A== + dependencies: + gl-buffer "^2.1.2" + gl-shader "^4.2.1" + gl-vao "^1.3.0" + glsl-out-of-range "^1.0.4" + glslify "^7.0.0" + +gl-fbo@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/gl-fbo/-/gl-fbo-2.0.5.tgz#0fa75a497cf787695530691c8f04abb6fb55fa22" + integrity sha1-D6daSXz3h2lVMGkcjwSrtvtV+iI= + dependencies: + gl-texture2d "^2.0.0" + +gl-format-compiler-error@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/gl-format-compiler-error/-/gl-format-compiler-error-1.0.3.tgz#0c79b1751899ce9732e86240f090aa41e98471a8" + integrity sha1-DHmxdRiZzpcy6GJA8JCqQemEcag= + dependencies: + add-line-numbers "^1.0.1" + gl-constants "^1.0.0" + glsl-shader-name "^1.0.0" + sprintf-js "^1.0.3" + +gl-heatmap2d@^1.0.6: + version "1.1.1" + resolved "https://registry.yarnpkg.com/gl-heatmap2d/-/gl-heatmap2d-1.1.1.tgz#dbbb2c288bfe277002fa50985155b0403d87640f" + integrity sha512-6Vo1fPIB1vQFWBA/MR6JAA16XuQuhwvZRbSjYEq++m4QV33iqjGS2HcVIRfJGX+fomd5eiz6bwkVZcKm69zQPw== + dependencies: + binary-search-bounds "^2.0.4" + gl-buffer "^2.1.2" + gl-shader "^4.2.1" + glslify "^7.0.0" + iota-array "^1.0.0" + typedarray-pool "^1.2.0" + +gl-line3d@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/gl-line3d/-/gl-line3d-1.2.1.tgz#632fc5b931a84a315995322b271aaf497e292609" + integrity sha512-eeb0+RI2ZBRqMYJK85SgsRiJK7c4aiOjcnirxv0830A3jmOc99snY3AbPcV8KvKmW0Yaf3KA4e+qNCbHiTOTnA== + dependencies: + binary-search-bounds "^2.0.4" + gl-buffer "^2.1.2" + gl-shader "^4.2.1" + gl-texture2d "^2.1.0" + gl-vao "^1.3.0" + glsl-out-of-range "^1.0.4" + glslify "^7.0.0" + ndarray "^1.0.18" + +gl-mat3@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gl-mat3/-/gl-mat3-1.0.0.tgz#89633219ca429379a16b9185d95d41713453b912" + integrity sha1-iWMyGcpCk3mha5GF2V1BcTRTuRI= + +gl-mat4@^1.0.1, gl-mat4@^1.0.2, gl-mat4@^1.0.3, gl-mat4@^1.1.2, gl-mat4@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gl-mat4/-/gl-mat4-1.2.0.tgz#49d8a7636b70aa00819216635f4a3fd3f4669b26" + integrity sha512-sT5C0pwB1/e9G9AvAoLsoaJtbMGjfd/jfxo8jMCKqYYEnjZuFvqV5rehqar0538EmssjdDeiEWnKyBSTw7quoA== + +gl-matrix@^3.2.1: + version "3.4.3" + resolved "https://registry.yarnpkg.com/gl-matrix/-/gl-matrix-3.4.3.tgz#fc1191e8320009fd4d20e9339595c6041ddc22c9" + integrity sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA== + +gl-mesh3d@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/gl-mesh3d/-/gl-mesh3d-2.3.1.tgz#087a93c5431df923570ca51cfc691bab0d21a6b8" + integrity sha512-pXECamyGgu4/9HeAQSE5OEUuLBGS1aq9V4BCsTcxsND4fNLaajEkYKUz/WY2QSYElqKdsMBVsldGiKRKwlybqA== + dependencies: + barycentric "^1.0.1" + colormap "^2.3.1" + gl-buffer "^2.1.2" + gl-mat4 "^1.2.0" + gl-shader "^4.2.1" + gl-texture2d "^2.1.0" + gl-vao "^1.3.0" + glsl-out-of-range "^1.0.4" + glsl-specular-cook-torrance "^2.0.1" + glslify "^7.0.0" + ndarray "^1.0.18" + normals "^1.1.0" + polytope-closest-point "^1.0.0" + simplicial-complex-contour "^1.0.2" + typedarray-pool "^1.1.0" + +gl-plot2d@^1.4.5: + version "1.4.5" + resolved "https://registry.yarnpkg.com/gl-plot2d/-/gl-plot2d-1.4.5.tgz#6412b8b3f8df3e7d89c5955daac7059e04d657d4" + integrity sha512-6GmCN10SWtV+qHFQ1gjdnVubeHFVsm6P4zmo0HrPIl9TcdePCUHDlBKWAuE6XtFhiMKMj7R8rApOX8O8uXUYog== + dependencies: + binary-search-bounds "^2.0.4" + gl-buffer "^2.1.2" + gl-select-static "^2.0.7" + gl-shader "^4.2.1" + glsl-inverse "^1.0.0" + glslify "^7.0.0" + text-cache "^4.2.2" + +gl-plot3d@^2.4.6: + version "2.4.7" + resolved "https://registry.yarnpkg.com/gl-plot3d/-/gl-plot3d-2.4.7.tgz#b66e18c5affdd664f42c884acf7b82c60b41ee78" + integrity sha512-mLDVWrl4Dj0O0druWyHUK5l7cBQrRIJRn2oROEgrRuOgbbrLAzsREKefwMO0bA0YqkiZMFMnV5VvPA9j57X5Xg== + dependencies: + "3d-view" "^2.0.0" + a-big-triangle "^1.0.3" + gl-axes3d "^1.5.3" + gl-fbo "^2.0.5" + gl-mat4 "^1.2.0" + gl-select-static "^2.0.7" + gl-shader "^4.2.1" + gl-spikes3d "^1.0.10" + glslify "^7.0.0" + has-passive-events "^1.0.0" + is-mobile "^2.2.1" + mouse-change "^1.4.0" + mouse-event-offset "^3.0.2" + mouse-wheel "^1.2.0" + ndarray "^1.0.19" + right-now "^1.0.0" + +gl-pointcloud2d@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/gl-pointcloud2d/-/gl-pointcloud2d-1.0.3.tgz#f37e215f21ccb2e17f0604664e99fc3d6a4e611d" + integrity sha512-OS2e1irvJXVRpg/GziXj10xrFJm9kkRfFoB6BLUvkjCQV7ZRNNcs2CD+YSK1r0gvMwTg2T3lfLM3UPwNtz+4Xw== + dependencies: + gl-buffer "^2.1.2" + gl-shader "^4.2.1" + glslify "^7.0.0" + typedarray-pool "^1.1.0" + +gl-quat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gl-quat/-/gl-quat-1.0.0.tgz#0945ec923386f45329be5dc357b1c8c2d47586c5" + integrity sha1-CUXskjOG9FMpvl3DV7HIwtR1hsU= + dependencies: + gl-mat3 "^1.0.0" + gl-vec3 "^1.0.3" + gl-vec4 "^1.0.0" + +gl-scatter3d@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/gl-scatter3d/-/gl-scatter3d-1.2.3.tgz#83d63700ec2fe4e95b3d1cd613e86de9a6b5f603" + integrity sha512-nXqPlT1w5Qt51dTksj+DUqrZqwWAEWg0PocsKcoDnVNv0X8sGA+LBZ0Y+zrA+KNXUL0PPCX9WR9cF2uJAZl1Sw== + dependencies: + gl-buffer "^2.1.2" + gl-mat4 "^1.2.0" + gl-shader "^4.2.1" + gl-vao "^1.3.0" + glsl-out-of-range "^1.0.4" + glslify "^7.0.0" + is-string-blank "^1.0.1" + typedarray-pool "^1.1.0" + vectorize-text "^3.2.1" + +gl-select-box@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/gl-select-box/-/gl-select-box-1.0.4.tgz#47c11caa2b84f81e8bbfde08c6e39eeebb53d3d8" + integrity sha512-mKsCnglraSKyBbQiGq0Ila0WF+m6Tr+EWT2yfaMn/Sh9aMHq5Wt0F/l6Cf/Ed3CdERq5jHWAY5yxLviZteYu2w== + dependencies: + gl-buffer "^2.1.2" + gl-shader "^4.2.1" + glslify "^7.0.0" + +gl-select-static@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/gl-select-static/-/gl-select-static-2.0.7.tgz#ce7eb05ae0139009c15e2d2d0d731600b3dae5c0" + integrity sha512-OvpYprd+ngl3liEatBTdXhSyNBjwvjMSvV2rN0KHpTU+BTi4viEETXNZXFgGXY37qARs0L28ybk3UQEW6C5Nnw== + dependencies: + bit-twiddle "^1.0.2" + gl-fbo "^2.0.5" + ndarray "^1.0.18" + typedarray-pool "^1.1.0" + +gl-shader@^4.2.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/gl-shader/-/gl-shader-4.3.1.tgz#56094cf3c06e802ac6c286b3b2166abce901d882" + integrity sha512-xLoN6XtRLlg97SEqtuzfKc+pVWpVkQ3YjDI1kuCale8tF7+zMhiKlMfmG4IMQPMdKJZQbIc/Ny8ZusEpfh5U+w== + dependencies: + gl-format-compiler-error "^1.0.2" + weakmap-shim "^1.1.0" + +gl-spikes2d@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/gl-spikes2d/-/gl-spikes2d-1.0.2.tgz#ef8dbcff6c7451dec2b751d7a3c593d09ad5457f" + integrity sha512-QVeOZsi9nQuJJl7NB3132CCv5KA10BWxAY2QgJNsKqbLsG53B/TrGJpjIAohnJftdZ4fT6b3ZojWgeaXk8bOOA== + +gl-spikes3d@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/gl-spikes3d/-/gl-spikes3d-1.0.10.tgz#e3b2b677a6f51750f23c064447af4f093da79305" + integrity sha512-lT3xroowOFxMvlhT5Mof76B2TE02l5zt/NIWljhczV2FFHgIVhA4jMrd5dIv1so1RXMBDJIKu0uJI3QKliDVLg== + dependencies: + gl-buffer "^2.1.2" + gl-shader "^4.2.1" + gl-vao "^1.3.0" + glslify "^7.0.0" + +gl-state@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gl-state/-/gl-state-1.0.0.tgz#262faa75835b0b9c532c12f38adc425d1d30cd17" + integrity sha1-Ji+qdYNbC5xTLBLzitxCXR0wzRc= + dependencies: + uniq "^1.0.0" + +gl-streamtube3d@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/gl-streamtube3d/-/gl-streamtube3d-1.4.1.tgz#bd2b725e00aa96989ce34b06ebf66a76f93e35ae" + integrity sha512-rH02v00kgwgdpkXVo7KsSoPp38bIAYR9TE1iONjcQ4cQAlDhrGRauqT/P5sUaOIzs17A2DxWGcXM+EpNQs9pUA== + dependencies: + gl-cone3d "^1.5.2" + gl-vec3 "^1.1.3" + gl-vec4 "^1.0.1" + glsl-inverse "^1.0.0" + glsl-out-of-range "^1.0.4" + glsl-specular-cook-torrance "^2.0.1" + glslify "^7.0.0" + +gl-surface3d@^1.5.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/gl-surface3d/-/gl-surface3d-1.6.0.tgz#5fc915759a91e9962dcfbf3982296c462a032526" + integrity sha512-x15+u4712ysnB85G55RLJEml6mOB4VaDn0VTlXCc9JcjRl5Es10Tk7lhGGyiPtkCfHwvhnkxzYA1/rHHYN7Y0A== + dependencies: + binary-search-bounds "^2.0.4" + bit-twiddle "^1.0.2" + colormap "^2.3.1" + dup "^1.0.0" + gl-buffer "^2.1.2" + gl-mat4 "^1.2.0" + gl-shader "^4.2.1" + gl-texture2d "^2.1.0" + gl-vao "^1.3.0" + glsl-out-of-range "^1.0.4" + glsl-specular-beckmann "^1.1.2" + glslify "^7.0.0" + ndarray "^1.0.18" + ndarray-gradient "^1.0.0" + ndarray-ops "^1.2.2" + ndarray-pack "^1.2.1" + ndarray-scratch "^1.2.0" + surface-nets "^1.0.2" + typedarray-pool "^1.1.0" + +gl-text@^1.1.8: + version "1.3.1" + resolved "https://registry.yarnpkg.com/gl-text/-/gl-text-1.3.1.tgz#f36594464101b5b053178d6d219c3d08fb9144c8" + integrity sha512-/f5gcEMiZd+UTBJLTl3D+CkCB/0UFGTx3nflH8ZmyWcLkZhsZ1+Xx5YYkw2rgWAzgPeE35xCqBuHSoMKQVsR+w== + dependencies: + bit-twiddle "^1.0.2" + color-normalize "^1.5.0" + css-font "^1.2.0" + detect-kerning "^2.1.2" + es6-weak-map "^2.0.3" + flatten-vertex-data "^1.0.2" + font-atlas "^2.1.0" + font-measure "^1.2.2" + gl-util "^3.1.2" + is-plain-obj "^1.1.0" + object-assign "^4.1.1" + parse-rect "^1.2.0" + parse-unit "^1.0.1" + pick-by-alias "^1.2.0" + regl "^2.0.0" + to-px "^1.0.1" + typedarray-pool "^1.1.0" + +gl-texture2d@^2.0.0, gl-texture2d@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/gl-texture2d/-/gl-texture2d-2.1.0.tgz#ff6824e7e7c31a8ba6fdcdbe9e5c695d7e2187c7" + integrity sha1-/2gk5+fDGoum/c2+nlxpXX4hh8c= + dependencies: + ndarray "^1.0.15" + ndarray-ops "^1.2.2" + typedarray-pool "^1.1.0" + +gl-util@^3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/gl-util/-/gl-util-3.1.3.tgz#1e9a724f844b802597c6e30565d4c1e928546861" + integrity sha512-dvRTggw5MSkJnCbh74jZzSoTOGnVYK+Bt+Ckqm39CVcl6+zSsxqWk4lr5NKhkqXHL6qvZAU9h17ZF8mIskY9mA== + dependencies: + is-browser "^2.0.1" + is-firefox "^1.0.3" + is-plain-obj "^1.1.0" + number-is-integer "^1.0.1" + object-assign "^4.1.0" + pick-by-alias "^1.2.0" + weak-map "^1.0.5" + +gl-vao@^1.2.0, gl-vao@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/gl-vao/-/gl-vao-1.3.0.tgz#e9e92aa95588cab9d5c2f04b693440c3df691923" + integrity sha1-6ekqqVWIyrnVwvBLaTRAw99pGSM= + +gl-vec3@^1.0.2, gl-vec3@^1.0.3, gl-vec3@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/gl-vec3/-/gl-vec3-1.1.3.tgz#a47c62f918774a06cbed1b65bcd0288ecbb03826" + integrity sha512-jduKUqT0SGH02l8Yl+mV1yVsDfYgQAJyXGxkJQGyxPLHRiW25DwVIRPt6uvhrEMHftJfqhqKthRcyZqNEl9Xdw== + +gl-vec4@^1.0.0, gl-vec4@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gl-vec4/-/gl-vec4-1.0.1.tgz#97d96878281b14b532cbce101785dfd1cb340964" + integrity sha1-l9loeCgbFLUyy84QF4Xf0cs0CWQ= + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@7.1.7: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.1.3, glob@^7.1.7: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globby@^11.0.1: + version "11.0.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" + integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +glsl-inject-defines@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/glsl-inject-defines/-/glsl-inject-defines-1.0.3.tgz#dd1aacc2c17fcb2bd3fc32411c6633d0d7b60fd4" + integrity sha1-3RqswsF/yyvT/DJBHGYz0Ne2D9Q= + dependencies: + glsl-token-inject-block "^1.0.0" + glsl-token-string "^1.0.1" + glsl-tokenizer "^2.0.2" + +glsl-inverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/glsl-inverse/-/glsl-inverse-1.0.0.tgz#12c0b1d065f558444d1e6feaf79b5ddf8a918ae6" + integrity sha1-EsCx0GX1WERNHm/q95td34qRiuY= + +glsl-out-of-range@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/glsl-out-of-range/-/glsl-out-of-range-1.0.4.tgz#3d73d083bc9ecc73efd45dfc7063c29e92c9c873" + integrity sha512-fCcDu2LCQ39VBvfe1FbhuazXEf0CqMZI9OYXrYlL6uUARG48CTAbL04+tZBtVM0zo1Ljx4OLu2AxNquq++lxWQ== + +glsl-resolve@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/glsl-resolve/-/glsl-resolve-0.0.1.tgz#894bef73910d792c81b5143180035d0a78af76d3" + integrity sha1-iUvvc5ENeSyBtRQxgANdCnivdtM= + dependencies: + resolve "^0.6.1" + xtend "^2.1.2" + +glsl-shader-name@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/glsl-shader-name/-/glsl-shader-name-1.0.0.tgz#a2c30b3ba73499befb0cc7184d7c7733dd4b487d" + integrity sha1-osMLO6c0mb77DMcYTXx3M91LSH0= + dependencies: + atob-lite "^1.0.0" + glsl-tokenizer "^2.0.2" + +glsl-specular-beckmann@^1.1.1, glsl-specular-beckmann@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/glsl-specular-beckmann/-/glsl-specular-beckmann-1.1.2.tgz#fce9056933ecdf2456278376a54d082893e775f1" + integrity sha1-/OkFaTPs3yRWJ4N2pU0IKJPndfE= + +glsl-specular-cook-torrance@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/glsl-specular-cook-torrance/-/glsl-specular-cook-torrance-2.0.1.tgz#a891cc06c8c7b4f4728702b4824fdacbb967d78f" + integrity sha1-qJHMBsjHtPRyhwK0gk/ay7ln148= + dependencies: + glsl-specular-beckmann "^1.1.1" + +glsl-token-assignments@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/glsl-token-assignments/-/glsl-token-assignments-2.0.2.tgz#a5d82ab78499c2e8a6b83cb69495e6e665ce019f" + integrity sha1-pdgqt4SZwuimuDy2lJXm5mXOAZ8= + +glsl-token-defines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/glsl-token-defines/-/glsl-token-defines-1.0.0.tgz#cb892aa959936231728470d4f74032489697fa9d" + integrity sha1-y4kqqVmTYjFyhHDU90AySJaX+p0= + dependencies: + glsl-tokenizer "^2.0.0" + +glsl-token-depth@^1.1.0, glsl-token-depth@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/glsl-token-depth/-/glsl-token-depth-1.1.2.tgz#23c5e30ee2bd255884b4a28bc850b8f791e95d84" + integrity sha1-I8XjDuK9JViEtKKLyFC495HpXYQ= + +glsl-token-descope@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/glsl-token-descope/-/glsl-token-descope-1.0.2.tgz#0fc90ab326186b82f597b2e77dc9e21efcd32076" + integrity sha1-D8kKsyYYa4L1l7LnfcniHvzTIHY= + dependencies: + glsl-token-assignments "^2.0.0" + glsl-token-depth "^1.1.0" + glsl-token-properties "^1.0.0" + glsl-token-scope "^1.1.0" + +glsl-token-inject-block@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/glsl-token-inject-block/-/glsl-token-inject-block-1.1.0.tgz#e1015f5980c1091824adaa2625f1dfde8bd00034" + integrity sha1-4QFfWYDBCRgkraomJfHf3ovQADQ= + +glsl-token-properties@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/glsl-token-properties/-/glsl-token-properties-1.0.1.tgz#483dc3d839f0d4b5c6171d1591f249be53c28a9e" + integrity sha1-SD3D2Dnw1LXGFx0VkfJJvlPCip4= + +glsl-token-scope@^1.1.0, glsl-token-scope@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/glsl-token-scope/-/glsl-token-scope-1.1.2.tgz#a1728e78df24444f9cb93fd18ef0f75503a643b1" + integrity sha1-oXKOeN8kRE+cuT/RjvD3VQOmQ7E= + +glsl-token-string@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/glsl-token-string/-/glsl-token-string-1.0.1.tgz#59441d2f857de7c3449c945666021ece358e48ec" + integrity sha1-WUQdL4V958NEnJRWZgIezjWOSOw= + +glsl-token-whitespace-trim@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/glsl-token-whitespace-trim/-/glsl-token-whitespace-trim-1.0.0.tgz#46d1dfe98c75bd7d504c05d7d11b1b3e9cc93b10" + integrity sha1-RtHf6Yx1vX1QTAXX0RsbPpzJOxA= + +glsl-tokenizer@^2.0.0, glsl-tokenizer@^2.0.2: + version "2.1.5" + resolved "https://registry.yarnpkg.com/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz#1c2e78c16589933c274ba278d0a63b370c5fee1a" + integrity sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA== + dependencies: + through2 "^0.6.3" + +glslify-bundle@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glslify-bundle/-/glslify-bundle-5.1.1.tgz#30d2ddf2e6b935bf44d1299321e3b729782c409a" + integrity sha512-plaAOQPv62M1r3OsWf2UbjN0hUYAB7Aph5bfH58VxJZJhloRNbxOL9tl/7H71K7OLJoSJ2ZqWOKk3ttQ6wy24A== + dependencies: + glsl-inject-defines "^1.0.1" + glsl-token-defines "^1.0.0" + glsl-token-depth "^1.1.1" + glsl-token-descope "^1.0.2" + glsl-token-scope "^1.1.1" + glsl-token-string "^1.0.1" + glsl-token-whitespace-trim "^1.0.0" + glsl-tokenizer "^2.0.2" + murmurhash-js "^1.0.0" + shallow-copy "0.0.1" + +glslify-deps@^1.2.5: + version "1.3.2" + resolved "https://registry.yarnpkg.com/glslify-deps/-/glslify-deps-1.3.2.tgz#c09ee945352bfc07ac2d8a1cc9e3de776328c72b" + integrity sha512-7S7IkHWygJRjcawveXQjRXLO2FTjijPDYC7QfZyAQanY+yGLCFHYnPtsGT9bdyHiwPTw/5a1m1M9hamT2aBpag== + dependencies: + "@choojs/findup" "^0.2.0" + events "^3.2.0" + glsl-resolve "0.0.1" + glsl-tokenizer "^2.0.0" + graceful-fs "^4.1.2" + inherits "^2.0.1" + map-limit "0.0.1" + resolve "^1.0.0" + +glslify@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glslify/-/glslify-7.1.1.tgz#454d9172b410cb49864029c86d5613947fefd30b" + integrity sha512-bud98CJ6kGZcP9Yxcsi7Iz647wuDz3oN+IZsjCRi5X1PI7t/xPKeL0mOwXJjo+CRZMqvq0CkSJiywCcY7kVYog== + dependencies: + bl "^2.2.1" + concat-stream "^1.5.2" + duplexify "^3.4.5" + falafel "^2.1.0" + from2 "^2.3.0" + glsl-resolve "0.0.1" + glsl-token-whitespace-trim "^1.0.0" + glslify-bundle "^5.0.0" + glslify-deps "^1.2.5" + minimist "^1.2.5" + resolve "^1.1.5" + stack-trace "0.0.9" + static-eval "^2.0.5" + through2 "^2.0.1" + xtend "^4.0.0" + +google-protobuf@3.12.2: + version "3.12.2" + resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.12.2.tgz#50ce9f9b6281235724eb243d6a83e969a2176e53" + integrity sha512-4CZhpuRr1d6HjlyrxoXoocoGFnRYgKULgMtikMddA9ztRyYR59Aondv2FioyxWVamRo0rF2XpYawkTCBEQOSkA== + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6: + version "4.2.8" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" + integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== + +grid-index@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/grid-index/-/grid-index-1.1.0.tgz#97f8221edec1026c8377b86446a7c71e79522ea7" + integrity sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA== + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== + dependencies: + duplexer "^0.1.2" + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-hover@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-hover/-/has-hover-1.0.1.tgz#3d97437aeb199c62b8ac08acbdc53d3bc52c17f7" + integrity sha1-PZdDeusZnGK4rAisvcU9O8UsF/c= + dependencies: + is-browser "^2.0.1" + +has-passive-events@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-passive-events/-/has-passive-events-1.0.0.tgz#75fc3dc6dada182c58f24ebbdc018276d1ea3515" + integrity sha512-2vSj6IeIsgvsRMyeQ0JaCX5Q3lX4zMn5HpoVc7MEhQ6pv8Iq9rsXjsp+E5ZwaT7T0xhMT0KmU8gtt1EFVdbJiw== + dependencies: + is-browser "^2.0.1" + +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +he@1.2.0, he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +header-case@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/header-case/-/header-case-2.0.4.tgz#5a42e63b55177349cf405beb8d775acabb92c063" + integrity sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q== + dependencies: + capital-case "^1.0.4" + tslib "^2.0.3" + +highlight.js@^10.7.2: + version "10.7.3" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" + integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== + +hoist-non-react-statics@^3.0.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +hsluv@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/hsluv/-/hsluv-0.0.3.tgz#829107dafb4a9f8b52a1809ed02e091eade6754c" + integrity sha1-gpEH2vtKn4tSoYCe0C4JHq3mdUw= + +html-entities@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.2.tgz#760b404685cb1d794e4f4b744332e3b00dcfe488" + integrity sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ== + +html-loader@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/html-loader/-/html-loader-3.0.1.tgz#84d9094d7fc2e3fcd871d1524736953742758585" + integrity sha512-90Sxg9FhTkQEzmmHT2KOAQniTZgC72aifcfR0fZsuo1PJz0K4EXiTwxejTUombF8XShLj5RaZKYsUJhxR6G2dA== + dependencies: + html-minifier-terser "^6.0.2" + parse5 "^6.0.1" + +html-minifier-terser@^6.0.2: + version "6.1.0" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" + integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== + dependencies: + camel-case "^4.1.2" + clean-css "^5.2.2" + commander "^8.3.0" + he "^1.2.0" + param-case "^3.0.4" + relateurl "^0.2.7" + terser "^5.10.0" + +html-to-react@^1.3.4: + version "1.4.7" + resolved "https://registry.yarnpkg.com/html-to-react/-/html-to-react-1.4.7.tgz#a58129c1b77c6d4e047a647372bd194e25420b89" + integrity sha512-adtKiee5AtnuUhdB8bxbASRP2bW/A0OrlwysEuqZxXdURb0/1XR0m/woE1V5cJA1U5nyzAvk/PdFNO9S73DE/g== + dependencies: + domhandler "^4.0" + htmlparser2 "^7.0" + lodash.camelcase "^4.3.0" + ramda "^0.27.1" + +htmlparser2@^7.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-7.2.0.tgz#8817cdea38bbc324392a90b1990908e81a65f5a5" + integrity sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.2" + domutils "^2.8.0" + entities "^3.0.1" + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-parser-js@>=0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.5.tgz#d7c30d5d3c90d865b4a2e870181f9d6f22ac7ac5" + integrity sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA== + +http-proxy-middleware@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz#7ef3417a479fb7666a571e09966c66a39bd2c15f" + integrity sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg== + dependencies: + "@types/http-proxy" "^1.17.5" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +hyphenate-style-name@^1.0.2, hyphenate-style-name@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" + integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +icss-utils@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" + integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== + dependencies: + postcss "^7.0.14" + +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +ieee754@^1.1.12: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.1.4: + version "5.1.9" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.9.tgz#9ec1a5cbe8e1446ec60d4420060d43aa6e7382fb" + integrity sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ== + +image-palette@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/image-palette/-/image-palette-2.1.0.tgz#d976525a1df75964ca125d2dba2741e92905547f" + integrity sha512-3ImSEWD26+xuQFdP0RWR4WSXadZwvgrFhjGNpMEapTG1tf2XrBFS2dlKK5hNgH4UIaSQlSUFRn1NeA+zULIWbQ== + dependencies: + color-id "^1.1.0" + pxls "^2.0.0" + quantize "^1.0.2" + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.3.tgz#4d51c2c495ca9393da259ec66b62e022920211e0" + integrity sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +incremental-convex-hull@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/incremental-convex-hull/-/incremental-convex-hull-1.0.1.tgz#51428c14cb9d9a6144bfe69b2851fb377334be1e" + integrity sha1-UUKMFMudmmFEv+abKFH7N3M0vh4= + dependencies: + robust-orientation "^1.1.2" + simplicial-complex "^1.0.0" + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +inline-style-prefixer@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/inline-style-prefixer/-/inline-style-prefixer-6.0.1.tgz#c5c0e43ba8831707afc5f5bbfd97edf45c1fa7ae" + integrity sha512-AsqazZ8KcRzJ9YPN1wMH2aNM7lkWQ8tSPrW5uDk1ziYwiAPWSZnUsC7lfZq+BDqLqz0B4Pho5wscWcJzVvRzDQ== + dependencies: + css-in-js-utils "^2.0.0" + +internal-ip@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-6.2.0.tgz#d5541e79716e406b74ac6b07b856ef18dc1621c1" + integrity sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg== + dependencies: + default-gateway "^6.0.0" + ipaddr.js "^1.9.1" + is-ip "^3.1.0" + p-event "^4.2.0" + +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +interpolate-loader@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/interpolate-loader/-/interpolate-loader-2.0.1.tgz#bdf0092a3d4732842ac29c20bd03f1fb34891705" + integrity sha512-X5/cKHUnAS5gV/oK9Z6pEjg2xVH5EGgnC5QmaOPwK/o7qMOMyyafwFL1mtH3yAK+COCjyaH56MOs9G8uXG12yA== + dependencies: + escape-string-regexp "^2.0.0" + loader-utils "^1.1.0" + +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== + +interval-tree-1d@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/interval-tree-1d/-/interval-tree-1d-1.0.4.tgz#b44f657de7ddae69ea3f98e0a9ad4bb046b07d11" + integrity sha512-wY8QJH+6wNI0uh4pDQzMvl+478Qh7Rl4qLmqiluxALlNvl+I+o5x38Pw3/z7mDPTPS1dQalZJXsmbvxx5gclhQ== + dependencies: + binary-search-bounds "^2.0.0" + +invert-permutation@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-permutation/-/invert-permutation-1.0.0.tgz#a0a78042eadb36bc17551e787efd1439add54933" + integrity sha1-oKeAQurbNrwXVR54fv0UOa3VSTM= + +iota-array@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/iota-array/-/iota-array-1.0.0.tgz#81ef57fe5d05814cd58c2483632a99c30a0e8087" + integrity sha1-ge9X/l0FgUzVjCSDYyqZwwoOgIc= + +ip-regex@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" + integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== + +ip@^1.1.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +ipaddr.js@1.9.1, ipaddr.js@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +ipaddr.js@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" + integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== + +is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + +is-arguments@^1.0.4, is-arguments@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-base64@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-base64/-/is-base64-0.1.0.tgz#a6f20610c6ef4863a51cba32bc0222544b932622" + integrity sha512-WRRyllsGXJM7ZN7gPTCCQ/6wNPTRDwiWdPK66l5sJzcU/oOzcIcRRf0Rux8bkpox/1yjt0F6VJRsQOIG2qz5sg== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-blob@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-blob/-/is-blob-2.1.0.tgz#e36cd82c90653f1e1b930f11baf9c64216a05385" + integrity sha512-SZ/fTft5eUhQM6oF/ZaASFDEdbFVe89Imltn9uZr03wdKMcWNVYSMjQPFtg05QuNkt5l5c135ElvXEQG0rk4tw== + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-browser@^2.0.1, is-browser@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-browser/-/is-browser-2.1.0.tgz#fc084d59a5fced307d6708c59356bad7007371a9" + integrity sha512-F5rTJxDQ2sW81fcfOR1GnCXT6sVJC104fCyfj+mjpwNEwaPYSn5fte5jiHmBg3DHsIoL/l8Kvw5VN5SsTRcRFQ== + +is-buffer@^1.0.2: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-buffer@^2.0.0, is-buffer@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + +is-core-module@^2.2.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548" + integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1, is-date-object@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-decimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-finite@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" + integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== + +is-firefox@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-firefox/-/is-firefox-1.0.3.tgz#2a2a1567783a417f6e158323108f3861b0918562" + integrity sha1-KioVZ3g6QX9uFYMjEI84YbCRhWI= + +is-float-array@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-float-array/-/is-float-array-1.0.0.tgz#96d67b1cbadf47ab1e05be208933acd386978a09" + integrity sha512-4ew1Sx6B6kEAl3T3NOM0yB94J3NZnBdNt4paw0e8nY73yHHTeTEhyQ3Lj7EQEnv5LD+GxNTaT4L46jcKjjpLiQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" + integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== + +is-iexplorer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-iexplorer/-/is-iexplorer-1.0.0.tgz#1d72bc66d3fe22eaf6170dda8cf10943248cfc76" + integrity sha1-HXK8ZtP+Iur2Fw3ajPEJQySM/HY= + +is-ip@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-3.1.0.tgz#2ae5ddfafaf05cb8008a62093cf29734f657c5d8" + integrity sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q== + dependencies: + ip-regex "^4.0.0" + +is-map@^2.0.1, is-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + +is-mobile@^2.2.1, is-mobile@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-mobile/-/is-mobile-2.2.2.tgz#f6c9c5d50ee01254ce05e739bdd835f1ed4e9954" + integrity sha512-wW/SXnYJkTjs++tVK5b6kVITZpAZPtUrt9SF80vvxGiF/Oywal+COk1jlRkiVq15RFNEQKQY31TkV24/1T5cVg== + +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + +is-number-object@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" + integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-path-cwd@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + +is-plain-obj@^2.0.0, is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-obj@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.0.0.tgz#06c0999fd7574edf5a906ba5644ad0feb3a84d22" + integrity sha512-NXRbBtUdBioI73y/HmOhogw/U5msYPC9DAtGkJXeFcFWSFZw0mCUsPxk/snTuJHzNKA8kLBK4rH97RMB1BfCXw== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-regex@^1.0.4, is-regex@^1.1.1, is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-set@^2.0.1, is-set@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + +is-shared-array-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" + integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string-blank@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-string-blank/-/is-string-blank-1.0.1.tgz#866dca066d41d2894ebdfd2d8fe93e586e583a03" + integrity sha512-9H+ZBCVs3L9OYqv8nuUAzpcT9OTgMD1yAWrG7ihlnibdkbtB850heAmYWxHuXc4CHy4lKeK69tN+ny1K7gBIrw== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-svg-path@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-svg-path/-/is-svg-path-1.0.2.tgz#77ab590c12b3d20348e5c7a13d0040c87784dda0" + integrity sha1-d6tZDBKz0gNI5cehPQBAyHeE3aA= + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.8.tgz#cbaa6585dc7db43318bc5b89523ea384a6f65e79" + integrity sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-abstract "^1.18.5" + foreach "^2.0.5" + has-tostringtag "^1.0.0" + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-url-superb@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-url-superb/-/is-url-superb-4.0.0.tgz#b54d1d2499bb16792748ac967aa3ecb41a33a8c2" + integrity sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA== + +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + +is-weakref@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.1.tgz#842dba4ec17fa9ac9850df2d6efbc1737274f2a2" + integrity sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ== + dependencies: + call-bind "^1.0.0" + +is-weakset@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.1.tgz#e9a0af88dbd751589f5e50d80f4c98b780884f83" + integrity sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@^2.0.1, isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isbinaryfile@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.8.tgz#5d34b94865bd4946633ecc78a026fc76c5b11fcf" + integrity sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +jest-worker@^27.0.6: + version "27.4.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.4.0.tgz#fa10dddc611cbb47a4153543dd16a0c7e7fd745c" + integrity sha512-4WuKcUxtzxBoKOUFbt1MtTY9fJwPVD4aN/4Cgxee7OLetPZn5as2bjfZz98XSf2Zq1JFfhqPZpS+43BmWXKgCA== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jquery@3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.5.1.tgz#d7b4d08e1bfdb86ad2f1a3d039ea17304717abb5" + integrity sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== + dependencies: + minimist "^1.2.5" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +just-debounce-it@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/just-debounce-it/-/just-debounce-it-3.0.1.tgz#8c8a4c9327c9523366ec79ac9a959a938153bd2f" + integrity sha512-6EQWOpRV8fm/ame6XvGBSxvsjoMbqj7JS9TV/4Q9aOXt9DQw22GBfTGP6gTAqcBNN/PbzlwtwH7jtM0k9oe9pg== + +karma-chrome-launcher@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz#805a586799a4d05f4e54f72a204979f3f3066738" + integrity sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg== + dependencies: + which "^1.2.1" + +karma-mocha@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/karma-mocha/-/karma-mocha-2.0.1.tgz#4b0254a18dfee71bdbe6188d9a6861bf86b0cd7d" + integrity sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ== + dependencies: + minimist "^1.2.3" + +karma-sourcemap-loader@0.3.8: + version "0.3.8" + resolved "https://registry.yarnpkg.com/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.8.tgz#d4bae72fb7a8397328a62b75013d2df937bdcf9c" + integrity sha512-zorxyAakYZuBcHRJE+vbrK2o2JXLFWK8VVjiT/6P+ltLBUGUvqTEkUiQ119MGdOrK7mrmxXHZF1/pfT6GgIZ6g== + dependencies: + graceful-fs "^4.1.2" + +karma-webpack@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-5.0.0.tgz#2a2c7b80163fe7ffd1010f83f5507f95ef39f840" + integrity sha512-+54i/cd3/piZuP3dr54+NcFeKOPnys5QeM1IY+0SPASwrtHsliXUiCL50iW+K9WWA7RvamC4macvvQ86l3KtaA== + dependencies: + glob "^7.1.3" + minimatch "^3.0.4" + webpack-merge "^4.1.5" + +karma@6.3.4: + version "6.3.4" + resolved "https://registry.yarnpkg.com/karma/-/karma-6.3.4.tgz#359899d3aab3d6b918ea0f57046fd2a6b68565e6" + integrity sha512-hbhRogUYIulfkBTZT7xoPrCYhRBnBoqbbL4fszWD0ReFGUxU+LYBr3dwKdAluaDQ/ynT9/7C+Lf7pPNW4gSx4Q== + dependencies: + body-parser "^1.19.0" + braces "^3.0.2" + chokidar "^3.5.1" + colors "^1.4.0" + connect "^3.7.0" + di "^0.0.1" + dom-serialize "^2.2.1" + glob "^7.1.7" + graceful-fs "^4.2.6" + http-proxy "^1.18.1" + isbinaryfile "^4.0.8" + lodash "^4.17.21" + log4js "^6.3.0" + mime "^2.5.2" + minimatch "^3.0.4" + qjobs "^1.2.0" + range-parser "^1.2.1" + rimraf "^3.0.2" + socket.io "^3.1.0" + source-map "^0.6.1" + tmp "^0.2.1" + ua-parser-js "^0.7.28" + yargs "^16.1.1" + +kdbush@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/kdbush/-/kdbush-3.0.0.tgz#f8484794d47004cc2d85ed3a79353dbe0abc2bf0" + integrity sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew== + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +klona@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" + integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== + +lerp@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/lerp/-/lerp-1.0.3.tgz#a18c8968f917896de15ccfcc28d55a6b731e776e" + integrity sha1-oYyJaPkXiW3hXM/MKNVaa3Med24= + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +loader-runner@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" + integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== + +loader-utils@^1.1.0, loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +loader-utils@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" + integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log4js@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.3.0.tgz#10dfafbb434351a3e30277a00b9879446f715bcb" + integrity sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw== + dependencies: + date-format "^3.0.0" + debug "^4.1.1" + flatted "^2.0.1" + rfdc "^1.1.4" + streamroller "^2.2.4" + +longest-streak@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" + integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg== + +loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +magic-string@^0.25.3: + version "0.25.7" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" + integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== + dependencies: + sourcemap-codec "^1.4.4" + +make-dir@^3.0.2, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +map-limit@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/map-limit/-/map-limit-0.0.1.tgz#eb7961031c0f0e8d001bf2d56fab685d58822f38" + integrity sha1-63lhAxwPDo0AG/LVb6toXViCLzg= + dependencies: + once "~1.3.0" + +mapbox-gl@1.10.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/mapbox-gl/-/mapbox-gl-1.10.1.tgz#7dbd53bdf2f78e45e125c1115e94dea286ef663c" + integrity sha512-0aHt+lFUpYfvh0kMIqXqNXqoYMuhuAsMlw87TbhWrw78Tx2zfuPI0Lx31/YPUgJ+Ire0tzQ4JnuBL7acDNXmMg== + dependencies: + "@mapbox/geojson-rewind" "^0.5.0" + "@mapbox/geojson-types" "^1.0.2" + "@mapbox/jsonlint-lines-primitives" "^2.0.2" + "@mapbox/mapbox-gl-supported" "^1.5.0" + "@mapbox/point-geometry" "^0.1.0" + "@mapbox/tiny-sdf" "^1.1.1" + "@mapbox/unitbezier" "^0.0.0" + "@mapbox/vector-tile" "^1.3.1" + "@mapbox/whoots-js" "^3.1.0" + csscolorparser "~1.0.3" + earcut "^2.2.2" + geojson-vt "^3.2.1" + gl-matrix "^3.2.1" + grid-index "^1.1.0" + minimist "^1.2.5" + murmurhash-js "^1.0.0" + pbf "^3.2.1" + potpack "^1.0.1" + quickselect "^2.0.0" + rw "^1.3.3" + supercluster "^7.0.0" + tinyqueue "^2.0.3" + vt-pbf "^3.1.1" + +marching-simplex-table@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/marching-simplex-table/-/marching-simplex-table-1.0.0.tgz#bc16256e0f8f9b558aa9b2872f8832d9433f52ea" + integrity sha1-vBYlbg+Pm1WKqbKHL4gy2UM/Uuo= + dependencies: + convex-hull "^1.0.3" + +markdown-table@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-2.0.0.tgz#194a90ced26d31fe753d8b9434430214c011865b" + integrity sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A== + dependencies: + repeat-string "^1.0.0" + +mat4-decompose@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mat4-decompose/-/mat4-decompose-1.0.4.tgz#65eb4fe39d70878f7a444eb4624d52f7e7eb2faf" + integrity sha1-ZetP451wh496RE60Yk1S9+frL68= + dependencies: + gl-mat4 "^1.0.1" + gl-vec3 "^1.0.2" + +mat4-interpolate@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mat4-interpolate/-/mat4-interpolate-1.0.4.tgz#55ffe9eb3c35295e2c0d5a9f7725d9068a89ff74" + integrity sha1-Vf/p6zw1KV4sDVqfdyXZBoqJ/3Q= + dependencies: + gl-mat4 "^1.0.1" + gl-vec3 "^1.0.2" + mat4-decompose "^1.0.3" + mat4-recompose "^1.0.3" + quat-slerp "^1.0.0" + +mat4-recompose@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mat4-recompose/-/mat4-recompose-1.0.4.tgz#3953c230ff2473dc772ee014a52c925cf81b0e4d" + integrity sha1-OVPCMP8kc9x3LuAUpSySXPgbDk0= + dependencies: + gl-mat4 "^1.0.1" + +math-log2@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/math-log2/-/math-log2-1.0.1.tgz#fb8941be5f5ebe8979e718e6273b178e58694565" + integrity sha1-+4lBvl9evol55xjmJzsXjlhpRWU= + +matrix-camera-controller@^2.1.1, matrix-camera-controller@^2.1.3: + version "2.1.4" + resolved "https://registry.yarnpkg.com/matrix-camera-controller/-/matrix-camera-controller-2.1.4.tgz#d316ae5e99fe801610c1d7842ab54566d4c62411" + integrity sha512-zsPGPONclrKSImNpqqKDTcqFpWLAIwMXEJtCde4IFPOw1dA9udzFg4HOFytOTosOFanchrx7+Hqq6glLATIxBA== + dependencies: + binary-search-bounds "^2.0.0" + gl-mat4 "^1.1.2" + gl-vec3 "^1.0.3" + mat4-interpolate "^1.0.3" + +mdast-add-list-metadata@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdast-add-list-metadata/-/mdast-add-list-metadata-1.0.1.tgz#95e73640ce2fc1fa2dcb7ec443d09e2bfe7db4cf" + integrity sha512-fB/VP4MJ0LaRsog7hGPxgOrSL3gE/2uEdZyDuSEnKCv/8IkYHiDkIQSbChiJoHyxZZXZ9bzckyRk+vNxFzh8rA== + dependencies: + unist-util-visit-parents "1.1.2" + +mdast-util-find-and-replace@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-1.1.1.tgz#b7db1e873f96f66588c321f1363069abf607d1b5" + integrity sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA== + dependencies: + escape-string-regexp "^4.0.0" + unist-util-is "^4.0.0" + unist-util-visit-parents "^3.0.0" + +mdast-util-from-markdown@^0.8.0: + version "0.8.5" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz#d1ef2ca42bc377ecb0463a987910dae89bd9a28c" + integrity sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-string "^2.0.0" + micromark "~2.11.0" + parse-entities "^2.0.0" + unist-util-stringify-position "^2.0.0" + +mdast-util-gfm-autolink-literal@^0.1.0: + version "0.1.3" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-0.1.3.tgz#9c4ff399c5ddd2ece40bd3b13e5447d84e385fb7" + integrity sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A== + dependencies: + ccount "^1.0.0" + mdast-util-find-and-replace "^1.1.0" + micromark "^2.11.3" + +mdast-util-gfm-strikethrough@^0.2.0: + version "0.2.3" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-0.2.3.tgz#45eea337b7fff0755a291844fbea79996c322890" + integrity sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA== + dependencies: + mdast-util-to-markdown "^0.6.0" + +mdast-util-gfm-table@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-0.1.6.tgz#af05aeadc8e5ee004eeddfb324b2ad8c029b6ecf" + integrity sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ== + dependencies: + markdown-table "^2.0.0" + mdast-util-to-markdown "~0.6.0" + +mdast-util-gfm-task-list-item@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-0.1.6.tgz#70c885e6b9f543ddd7e6b41f9703ee55b084af10" + integrity sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A== + dependencies: + mdast-util-to-markdown "~0.6.0" + +mdast-util-gfm@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-0.1.2.tgz#8ecddafe57d266540f6881f5c57ff19725bd351c" + integrity sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ== + dependencies: + mdast-util-gfm-autolink-literal "^0.1.0" + mdast-util-gfm-strikethrough "^0.2.0" + mdast-util-gfm-table "^0.1.0" + mdast-util-gfm-task-list-item "^0.1.0" + mdast-util-to-markdown "^0.6.1" + +mdast-util-to-markdown@^0.6.0, mdast-util-to-markdown@^0.6.1, mdast-util-to-markdown@~0.6.0: + version "0.6.5" + resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz#b33f67ca820d69e6cc527a93d4039249b504bebe" + integrity sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ== + dependencies: + "@types/unist" "^2.0.0" + longest-streak "^2.0.0" + mdast-util-to-string "^2.0.0" + parse-entities "^2.0.0" + repeat-string "^1.0.0" + zwitch "^1.0.0" + +mdast-util-to-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" + integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +memfs@^3.2.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.0.tgz#8bc12062b973be6b295d4340595736a656f0a257" + integrity sha512-o/RfP0J1d03YwsAxyHxAYs2kyJp55AFkMazlFAZFR2I2IXkxiUTXRabJ6RmNNCQ83LAD2jy52Khj0m3OffpNdA== + dependencies: + fs-monkey "1.0.3" + +memoize-one@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" + integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== + +memory-fs@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromark-extension-gfm-autolink-literal@~0.5.0: + version "0.5.7" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-0.5.7.tgz#53866c1f0c7ef940ae7ca1f72c6faef8fed9f204" + integrity sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw== + dependencies: + micromark "~2.11.3" + +micromark-extension-gfm-strikethrough@~0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-0.6.5.tgz#96cb83356ff87bf31670eefb7ad7bba73e6514d1" + integrity sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw== + dependencies: + micromark "~2.11.0" + +micromark-extension-gfm-table@~0.4.0: + version "0.4.3" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-0.4.3.tgz#4d49f1ce0ca84996c853880b9446698947f1802b" + integrity sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA== + dependencies: + micromark "~2.11.0" + +micromark-extension-gfm-tagfilter@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-0.3.0.tgz#d9f26a65adee984c9ccdd7e182220493562841ad" + integrity sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q== + +micromark-extension-gfm-task-list-item@~0.3.0: + version "0.3.3" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-0.3.3.tgz#d90c755f2533ed55a718129cee11257f136283b8" + integrity sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ== + dependencies: + micromark "~2.11.0" + +micromark-extension-gfm@^0.3.0: + version "0.3.3" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-0.3.3.tgz#36d1a4c089ca8bdfd978c9bd2bf1a0cb24e2acfe" + integrity sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A== + dependencies: + micromark "~2.11.0" + micromark-extension-gfm-autolink-literal "~0.5.0" + micromark-extension-gfm-strikethrough "~0.6.5" + micromark-extension-gfm-table "~0.4.0" + micromark-extension-gfm-tagfilter "~0.3.0" + micromark-extension-gfm-task-list-item "~0.3.0" + +micromark@^2.11.3, micromark@~2.11.0, micromark@~2.11.3: + version "2.11.4" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-2.11.4.tgz#d13436138eea826383e822449c9a5c50ee44665a" + integrity sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA== + dependencies: + debug "^4.0.0" + parse-entities "^2.0.0" + +micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + +mime-db@1.51.0, "mime-db@>= 1.43.0 < 2": + version "1.51.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" + integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== + +mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24: + version "2.1.34" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" + integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== + dependencies: + mime-db "1.51.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.5.2: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimatch@3.0.4, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mkdirp@^0.5.5: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +mocha@9.1.2: + version "9.1.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.1.2.tgz#93f53175b0f0dc4014bd2d612218fccfcf3534d3" + integrity sha512-ta3LtJ+63RIBP03VBjMGtSqbe6cWXRejF9SyM9Zyli1CKZJZ+vfCTj3oW24V7wAphMJdpOFLoMI3hjJ1LWbs0w== + dependencies: + "@ungap/promise-all-settled" "1.1.2" + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.2" + debug "4.3.2" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.1.7" + growl "1.10.5" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "3.0.4" + ms "2.1.3" + nanoid "3.1.25" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + which "2.0.2" + workerpool "6.1.5" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +monotone-convex-hull-2d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/monotone-convex-hull-2d/-/monotone-convex-hull-2d-1.0.1.tgz#47f5daeadf3c4afd37764baa1aa8787a40eee08c" + integrity sha1-R/Xa6t88Sv03dkuqGqh4ekDu4Iw= + dependencies: + robust-orientation "^1.1.3" + +mouse-change@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/mouse-change/-/mouse-change-1.4.0.tgz#c2b77e5bfa34a43ce1445c8157a4e4dc9895c14f" + integrity sha1-wrd+W/o0pDzhRFyBV6Tk3JiVwU8= + dependencies: + mouse-event "^1.0.0" + +mouse-event-offset@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/mouse-event-offset/-/mouse-event-offset-3.0.2.tgz#dfd86a6e248c6ba8cad53b905d5037a2063e9984" + integrity sha1-39hqbiSMa6jK1TuQXVA3ogY+mYQ= + +mouse-event@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/mouse-event/-/mouse-event-1.0.5.tgz#b3789edb7109997d5a932d1d01daa1543a501732" + integrity sha1-s3ie23EJmX1aky0dAdqhVDpQFzI= + +mouse-wheel@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mouse-wheel/-/mouse-wheel-1.2.0.tgz#6d2903b1ea8fb48e61f1b53b9036773f042cdb5c" + integrity sha1-bSkDseqPtI5h8bU7kDZ3PwQs21w= + dependencies: + right-now "^1.0.0" + signum "^1.0.0" + to-px "^1.0.1" + +mrmime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.0.tgz#14d387f0585a5233d291baba339b063752a2398b" + integrity sha512-a70zx7zFfVO7XpnQ2IX1Myh9yY4UYvfld/dikWRnsXxbyvMcfz+u6UfgNAtH+k2QqtJuzVpv6eLTx1G2+WKZbQ== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + +mumath@^3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/mumath/-/mumath-3.3.4.tgz#48d4a0f0fd8cad4e7b32096ee89b161a63d30bbf" + integrity sha1-SNSg8P2MrU57Mglu6JsWGmPTC78= + dependencies: + almost-equal "^1.1.0" + +murmurhash-js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/murmurhash-js/-/murmurhash-js-1.0.0.tgz#b06278e21fc6c37fa5313732b0412bcb6ae15f51" + integrity sha1-sGJ44h/Gw3+lMTcysEEry2rhX1E= + +nanoid@3.1.25: + version "3.1.25" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.25.tgz#09ca32747c0e543f0e1814b7d3793477f9c8e152" + integrity sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q== + +nanoid@^3.1.30: + version "3.1.30" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.30.tgz#63f93cc548d2a113dc5dfbc63bfa09e2b9b64362" + integrity sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ== + +ndarray-extract-contour@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ndarray-extract-contour/-/ndarray-extract-contour-1.0.1.tgz#0aee113a3a33b226b90c4888cf877bf4751305e4" + integrity sha1-Cu4ROjozsia5DEiIz4d79HUTBeQ= + dependencies: + typedarray-pool "^1.0.0" + +ndarray-gradient@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ndarray-gradient/-/ndarray-gradient-1.0.1.tgz#16126a78ac241162248224aa662b6db6a5885402" + integrity sha512-+xONVi7xxTCGL6KOb11Yyoe0tPNqAUKF39CvFoRjL5pdOmPd2G2pckK9lD5bpLF3q45LLnYNyiUSJSdNmQ2MTg== + dependencies: + cwise-compiler "^1.0.0" + dup "^1.0.0" + +ndarray-linear-interpolate@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ndarray-linear-interpolate/-/ndarray-linear-interpolate-1.0.0.tgz#78bc92b85b9abc15b6e67ee65828f9e2137ae72b" + integrity sha1-eLySuFuavBW25n7mWCj54hN65ys= + +ndarray-ops@^1.1.0, ndarray-ops@^1.2.1, ndarray-ops@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/ndarray-ops/-/ndarray-ops-1.2.2.tgz#59e88d2c32a7eebcb1bc690fae141579557a614e" + integrity sha1-WeiNLDKn7ryxvGkPrhQVeVV6YU4= + dependencies: + cwise-compiler "^1.0.0" + +ndarray-pack@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ndarray-pack/-/ndarray-pack-1.2.1.tgz#8caebeaaa24d5ecf70ff86020637977da8ee585a" + integrity sha1-jK6+qqJNXs9w/4YCBjeXfajuWFo= + dependencies: + cwise-compiler "^1.1.2" + ndarray "^1.0.13" + +ndarray-scratch@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ndarray-scratch/-/ndarray-scratch-1.2.0.tgz#6304636d62eba93db4727ac13c693341dba50e01" + integrity sha1-YwRjbWLrqT20cnrBPGkzQdulDgE= + dependencies: + ndarray "^1.0.14" + ndarray-ops "^1.2.1" + typedarray-pool "^1.0.2" + +ndarray-sort@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ndarray-sort/-/ndarray-sort-1.0.1.tgz#fea05b4cb834c7f4e0216a354f3ca751300dfd6a" + integrity sha1-/qBbTLg0x/TgIWo1TzynUTAN/Wo= + dependencies: + typedarray-pool "^1.0.0" + +ndarray@^1.0.11, ndarray@^1.0.13, ndarray@^1.0.14, ndarray@^1.0.15, ndarray@^1.0.18, ndarray@^1.0.19: + version "1.0.19" + resolved "https://registry.yarnpkg.com/ndarray/-/ndarray-1.0.19.tgz#6785b5f5dfa58b83e31ae5b2a058cfd1ab3f694e" + integrity sha512-B4JHA4vdyZU30ELBw3g7/p9bZupyew5a7tX1Y/gGeF2hafrPaQZhgrGQfsvgfYbgdFZjYwuEcnaobeM/WMW+HQ== + dependencies: + iota-array "^1.0.0" + is-buffer "^1.0.2" + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +next-tick@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= + +nextafter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/nextafter/-/nextafter-1.0.0.tgz#b7d77b535310e3e097e6025abb0a903477ec1a3a" + integrity sha1-t9d7U1MQ4+CX5gJauwqQNHfsGjo= + dependencies: + double-bits "^1.1.0" + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-forge@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" + integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== + +node-releases@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" + integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +normalize-svg-path@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/normalize-svg-path/-/normalize-svg-path-1.1.0.tgz#0e614eca23c39f0cffe821d6be6cd17e569a766c" + integrity sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg== + dependencies: + svg-arc-to-cubic-bezier "^3.0.0" + +normalize-svg-path@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/normalize-svg-path/-/normalize-svg-path-0.1.0.tgz#456360e60ece75fbef7b5d7e160480e7ffd16fe5" + integrity sha1-RWNg5g7Odfvve11+FgSA5//Rb+U= + +normals@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/normals/-/normals-1.1.0.tgz#325b595ed34afe467a6c55a14fd9085787ff59c0" + integrity sha1-MltZXtNK/kZ6bFWhT9kIV4f/WcA= + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +number-is-integer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-integer/-/number-is-integer-1.0.1.tgz#e59bca172ffed27318e79c7ceb6cb72c095b2152" + integrity sha1-5ZvKFy/+0nMY55x862y3LAlbIVI= + dependencies: + is-finite "^1.0.1" + +numeric@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/numeric/-/numeric-1.2.6.tgz#765b02bef97988fcf880d4eb3f36b80fa31335aa" + integrity sha1-dlsCvvl5iPz4gNTrPza4D6MTNao= + +object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-inspect@^1.11.0, object-inspect@^1.9.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" + integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== + +object-is@^1.0.1, object-is@^1.1.4: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.0.12, object-keys@^1.0.6, object-keys@^1.0.9, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.0, object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +once@~1.3.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + integrity sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA= + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^8.0.9: + version "8.4.0" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" + integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +opener@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +orbit-camera-controller@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/orbit-camera-controller/-/orbit-camera-controller-4.0.0.tgz#6e2b36f0e7878663c330f50da9b7ce686c277005" + integrity sha1-bis28OeHhmPDMPUNqbfOaGwncAU= + dependencies: + filtered-vector "^1.2.1" + gl-mat4 "^1.0.3" + +os-homedir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-2.0.0.tgz#a0c76bb001a8392a503cbd46e7e650b3423a923c" + integrity sha512-saRNz0DSC5C/I++gFIaJTXoFJMRwiP5zHar5vV3xQ2TkgEw6hDCcU5F272JjUylpiVgBrZNQHnfjkLabTfb92Q== + +p-event@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/p-event/-/p-event-4.2.0.tgz#af4b049c8acd91ae81083ebd1e6f5cae2044c1b5" + integrity sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ== + dependencies: + p-timeout "^3.1.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-retry@^4.5.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.1.tgz#8fcddd5cdf7a67a0911a9cf2ef0e5df7f602316c" + integrity sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA== + dependencies: + "@types/retry" "^0.12.0" + retry "^0.13.1" + +p-timeout@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" + integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== + dependencies: + p-finally "^1.0.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pad-left@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pad-left/-/pad-left-1.0.2.tgz#19e5735ea98395a26cedc6ab926ead10f3100d4c" + integrity sha1-GeVzXqmDlaJs7carkm6tEPMQDUw= + dependencies: + repeat-string "^1.3.0" + +param-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parenthesis@^3.1.5: + version "3.1.8" + resolved "https://registry.yarnpkg.com/parenthesis/-/parenthesis-3.1.8.tgz#3457fccb8f05db27572b841dad9d2630b912f125" + integrity sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw== + +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-rect@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parse-rect/-/parse-rect-1.2.0.tgz#e0a5b0dbaaaee637a0a1eb9779969e19399d8dec" + integrity sha512-4QZ6KYbnE6RTwg9E0HpLchUM9EZt6DnDxajFZZDSV4p/12ZJEvPO702DZpGvRYEPo00yKDys7jASi+/w7aO8LA== + dependencies: + pick-by-alias "^1.2.0" + +parse-svg-path@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/parse-svg-path/-/parse-svg-path-0.1.2.tgz#7a7ec0d1eb06fa5325c7d3e009b859a09b5d49eb" + integrity sha1-en7A0esG+lMlx9PgCbhZoJtdSes= + +parse-unit@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-unit/-/parse-unit-1.0.1.tgz#7e1bb6d5bef3874c28e392526a2541170291eecf" + integrity sha1-fhu21b7zh0wo45JSaiVBFwKR7s8= + +parse5@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +path-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/path-case/-/path-case-3.0.4.tgz#9168645334eb942658375c56f80b4c0cb5f82c6f" + integrity sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pbf@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/pbf/-/pbf-3.2.1.tgz#b4c1b9e72af966cd82c6531691115cc0409ffe2a" + integrity sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ== + dependencies: + ieee754 "^1.1.12" + resolve-protobuf-schema "^2.1.0" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +permutation-parity@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/permutation-parity/-/permutation-parity-1.0.0.tgz#0174d51fca704b11b9a4b152b23d537fdc6b5ef4" + integrity sha1-AXTVH8pwSxG5pLFSsj1Tf9xrXvQ= + dependencies: + typedarray-pool "^1.0.0" + +permutation-rank@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/permutation-rank/-/permutation-rank-1.0.0.tgz#9fd98bbcecf08fbf5994b5eadc94a62e679483b5" + integrity sha1-n9mLvOzwj79ZlLXq3JSmLmeUg7U= + dependencies: + invert-permutation "^1.0.0" + typedarray-pool "^1.0.0" + +pick-by-alias@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pick-by-alias/-/pick-by-alias-1.2.0.tgz#5f7cb2b1f21a6e1e884a0c87855aa4a37361107b" + integrity sha1-X3yysfIabh6ISgyHhVqko3NhEHs= + +picocolors@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" + integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + +pkg-dir@^4.1.0, pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +planar-dual@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/planar-dual/-/planar-dual-1.0.2.tgz#b6a4235523b1b0cb79e5f926f8ea335dd982d563" + integrity sha1-tqQjVSOxsMt55fkm+OozXdmC1WM= + dependencies: + compare-angle "^1.0.0" + dup "^1.0.0" + +planar-graph-to-polyline@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/planar-graph-to-polyline/-/planar-graph-to-polyline-1.0.6.tgz#ed300620c33001ee2cca0ac6d1dae8d02d23f009" + integrity sha512-h8a9kdAjo7mRhC0X6HZ42xzFp7vKDZA+Hygyhsq/08Qi4vVAQYJaLLYLvKUUzRbVKvdYqq0reXHyV0EygyEBHA== + dependencies: + edges-to-adjacency-list "^1.0.0" + planar-dual "^1.0.0" + point-in-big-polygon "^2.0.1" + robust-orientation "^1.0.1" + robust-sum "^1.0.0" + two-product "^1.0.0" + uniq "^1.0.0" + +plotly.js@1.54.6: + version "1.54.6" + resolved "https://registry.yarnpkg.com/plotly.js/-/plotly.js-1.54.6.tgz#ed021aa8da85759c69602c97bd3dab2b09eeec22" + integrity sha512-z6FDeo/O4iNN+TfKJvk3Sv+MS7prFfM6oLJK5q9TYpwIQEz8oOtxwKQJospqtKub6mvxOhPoDIxxmpDZeiNopQ== + dependencies: + "@plotly/d3-sankey" "0.7.2" + "@plotly/d3-sankey-circular" "0.33.1" + "@turf/area" "^6.0.1" + "@turf/bbox" "^6.0.1" + "@turf/centroid" "^6.0.2" + alpha-shape "^1.0.0" + canvas-fit "^1.5.0" + color-normalize "^1.5.0" + color-rgba "^2.1.1" + convex-hull "^1.0.3" + country-regex "^1.1.0" + d3 "^3.5.17" + d3-force "^1.2.1" + d3-hierarchy "^1.1.9" + d3-interpolate "^1.4.0" + delaunay-triangulate "^1.1.6" + es6-promise "^4.2.8" + fast-isnumeric "^1.1.4" + gl-cone3d "^1.5.2" + gl-contour2d "^1.1.7" + gl-error3d "^1.0.16" + gl-heatmap2d "^1.0.6" + gl-line3d "1.2.1" + gl-mat4 "^1.2.0" + gl-mesh3d "^2.3.1" + gl-plot2d "^1.4.5" + gl-plot3d "^2.4.6" + gl-pointcloud2d "^1.0.3" + gl-scatter3d "^1.2.3" + gl-select-box "^1.0.4" + gl-spikes2d "^1.0.2" + gl-streamtube3d "^1.4.1" + gl-surface3d "^1.5.2" + gl-text "^1.1.8" + glslify "^7.0.0" + has-hover "^1.0.1" + has-passive-events "^1.0.0" + is-mobile "^2.2.2" + mapbox-gl "1.10.1" + matrix-camera-controller "^2.1.3" + mouse-change "^1.4.0" + mouse-event-offset "^3.0.2" + mouse-wheel "^1.2.0" + ndarray "^1.0.19" + ndarray-linear-interpolate "^1.0.0" + parse-svg-path "^0.1.2" + point-cluster "^3.1.8" + polybooljs "^1.2.0" + regl "^1.6.1" + regl-error2d "^2.0.8" + regl-line2d "^3.0.15" + regl-scatter2d "^3.1.8" + regl-splom "^1.0.8" + right-now "^1.0.0" + robust-orientation "^1.1.3" + sane-topojson "^4.0.0" + strongly-connected-components "^1.0.1" + superscript-text "^1.0.0" + svg-path-sdf "^1.1.3" + tinycolor2 "^1.4.1" + to-px "1.0.1" + topojson-client "^3.1.0" + webgl-context "^2.2.0" + world-calendars "^1.0.3" + +point-cluster@^3.1.8: + version "3.1.8" + resolved "https://registry.yarnpkg.com/point-cluster/-/point-cluster-3.1.8.tgz#a63625fd8964f2a5b446025a1acf8bcac42500c0" + integrity sha512-7klIr45dpMeZuqjIK9+qBg3m2IhyZJNJkdqjJFw0Olq75FM8ojrTMjClVUrMjNYRVqtwztxCHH71Fyjhg+YwyQ== + dependencies: + array-bounds "^1.0.1" + array-normalize "^1.1.4" + binary-search-bounds "^2.0.4" + bubleify "^1.1.0" + clamp "^1.0.1" + defined "^1.0.0" + dtype "^2.0.0" + flatten-vertex-data "^1.0.2" + is-obj "^1.0.1" + math-log2 "^1.0.1" + parse-rect "^1.2.0" + pick-by-alias "^1.2.0" + +point-in-big-polygon@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/point-in-big-polygon/-/point-in-big-polygon-2.0.1.tgz#69d293010cead58af08c3082ad1d23f600ef10af" + integrity sha512-DtrN8pa2VfMlvmWlCcypTFeBE4+OYz1ojDNJLKCWa4doiVAD6PRBbxFYAT71tsp5oKaRXT5sxEiHCAQKb1zr2Q== + dependencies: + binary-search-bounds "^2.0.0" + interval-tree-1d "^1.0.1" + robust-orientation "^1.1.3" + slab-decomposition "^1.0.1" + +polybooljs@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/polybooljs/-/polybooljs-1.2.0.tgz#b4390c2e079d4c262d3b2504c6288d95ba7a4758" + integrity sha1-tDkMLgedTCYtOyUExiiNlbp6R1g= + +polytope-closest-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/polytope-closest-point/-/polytope-closest-point-1.0.0.tgz#e6e57f4081ab5e8c778b811ef06e2c48ae338c3f" + integrity sha1-5uV/QIGrXox3i4Ee8G4sSK4zjD8= + dependencies: + numeric "^1.2.6" + +popper.js@1.16.1: + version "1.16.1" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" + integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== + +portfinder@^1.0.28: + version "1.0.28" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" + integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== + dependencies: + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.5" + +postcss-attribute-case-insensitive@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.0.tgz#39cbf6babf3ded1e4abf37d09d6eda21c644105c" + integrity sha512-b4g9eagFGq9T5SWX4+USfVyjIb3liPnjhHHRMP7FMB2kFVpYyfEscV0wP3eaXhKlcHKUut8lt5BGoeylWA/dBQ== + dependencies: + postcss-selector-parser "^6.0.2" + +postcss-calc@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.0.0.tgz#a05b87aacd132740a5db09462a3612453e5df90a" + integrity sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g== + dependencies: + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.2" + +postcss-color-functional-notation@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-4.0.1.tgz#2fd769959e7fe658b4c0e7d40b0ab245fc8664f1" + integrity sha512-qxD/7Q2rdmqJLSYxlJFJM9gVdyVLTBVrOUc+B6+KbOe4t2G2KnoI3HdimdK4PerGLqAqKnEVGgal7YKImm0g+w== + dependencies: + postcss-values-parser "6.0.1" + +postcss-color-hex-alpha@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.0.tgz#84bfd985a93b0a18e047ebcb5fd463e2cae5e7a6" + integrity sha512-Z0xiE0j+hbefUj0LWOMkzmTIS7k+dqJKzLwoKww0KJhju/sWXr+84Yk7rmvFoML/4LjGpJgefZvDwExrsWfHZw== + dependencies: + postcss-values-parser "^6.0.0" + +postcss-color-rebeccapurple@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.0.0.tgz#980fbd98eb68ebbb38be02a82c7554e043c8fdf4" + integrity sha512-+Ogw3SA0ESjjO87S8Dn+aAEHK6hFAWAVbTVnyXnmbV6Xh0TKi0vXpzhlKG/yrxujxtlgQcMQNQjg75uWWv28xA== + dependencies: + postcss-values-parser "^6" + +postcss-custom-media@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz#1be6aff8be7dc9bf1fe014bde3b71b92bb4552f1" + integrity sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g== + +postcss-custom-properties@^12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-12.0.0.tgz#fd01ec9bd1462336ea8af7ba3c1a2c47c203031e" + integrity sha512-eAyX3rMjZKxdne6tWKjkWbNWfw6bbv4xTsrjNJ7C3uGDODrzbQXR+ueshRkw7Lhlhc3qyTmYH/sFfD0AbhgdSQ== + dependencies: + postcss-values-parser "^6" + +postcss-custom-selectors@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-6.0.0.tgz#022839e41fbf71c47ae6e316cb0e6213012df5ef" + integrity sha512-/1iyBhz/W8jUepjGyu7V1OPcGbc636snN1yXEQCinb6Bwt7KxsiU7/bLQlp8GwAXzCh7cobBU5odNn/2zQWR8Q== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-dir-pseudo-class@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.0.tgz#7026a070a4849072a232eaf0cdd960de3013658d" + integrity sha512-TC4eB5ZnLRSV1PLsAPualEjxFysU9IVEBx8h+Md2qzo8iWdNqwWCckx5fTWfe6dJxUpB0TWEpWEFhZ/YHvjSCA== + dependencies: + postcss-selector-parser "6.0.6" + +postcss-double-position-gradients@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-3.0.1.tgz#3c21ad52b6f13d81caf2563b0010a2c5872272af" + integrity sha512-L18N4Y1gpKQPEnZ6JOxO3H5gswZzTNR+ZqruZG7cOtOF/GR6J1YBRKn5hdTn3Vs4Y9XuDqaBD8vIXFIEft9Jqw== + dependencies: + postcss-values-parser "6.0.1" + +postcss-env-function@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-4.0.2.tgz#5509d008ff0f069fa18bd2eace4f3fdb18150c28" + integrity sha512-VXKv0Vskq7olS3Q2zj38G4au4PkW+YWBRgng2Czx0pP9PyqU6uzjS6uVU1VkJN8i0OTPM7g82YFUdiz/7pEvpg== + dependencies: + postcss-values-parser "6.0.1" + +postcss-flexbugs-fixes@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz#2028e145313074fc9abe276cb7ca14e5401eb49d" + integrity sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ== + +postcss-focus-visible@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-6.0.1.tgz#b12a859616eca7152976fec24ef337ab29bbc405" + integrity sha512-UddLlBmJ78Nu7OrKME70EKxCPBdxTx7pKIyD3GDNRM8Tnq19zmscT9QzsvR8gygz0i0nNUjMtSz4N3AEWZ5R/Q== + +postcss-focus-within@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-5.0.1.tgz#615659122325d86e00bc8ed84ab6129d0b3a0f62" + integrity sha512-50v1AZVlFSVzLTNdBQG521Aa54VABf/X1RkhR8Fm/9dDQby0W0XdwOnuo8Juvf0ZZXbKkxyTkyyQD0QaNVZVGg== + +postcss-font-family-system-ui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-font-family-system-ui/-/postcss-font-family-system-ui-5.0.0.tgz#cceb13dccb11019e9d6246db9a93137a30a53e21" + integrity sha512-3ndzyyMPhSbZekEPTuvKZz17jQXftAGMcVxNV4rTKNXsOsl23ZKlHcccEPB9tpB/SmGtDszdPvajdJrjZeKBfQ== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.30000655" + +postcss-font-variant@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz#efd59b4b7ea8bb06127f2d031bfbb7f24d32fa66" + integrity sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA== + +postcss-gap-properties@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-3.0.0.tgz#8941c400df902247603fd915c7dc81e1d7686b15" + integrity sha512-QJOkz1epC/iCuOdhQPm3n9T+F25+P+MYJEEcs5xz/Q+020mc9c6ZRGJkzPJd8FS9hFmT9eEKFEx9PEDl+lH5og== + +postcss-image-set-function@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-4.0.2.tgz#95b64db01b8812fcbece3bb36a3f2b8133bf7c91" + integrity sha512-NbTOc3xOq/YjIJS8/UVnhI16NxRuCiEWjem0eYt87sKvjdpk00niQ9oVo3eSR+kmMKWIO979x3j5i1GYJNxe1A== + dependencies: + postcss-values-parser "6.0.1" + +postcss-initial@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-4.0.1.tgz#529f735f72c5724a0fb30527df6fb7ac54d7de42" + integrity sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ== + +postcss-lab-function@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-4.0.1.tgz#b6a1fb1032ddd7f4f7198ca78ec84c9b5bc7d80e" + integrity sha512-8F2keZUlUiX/tznbCZ5y3Bmx6pnc19kvL4oq+x+uoK0ZYQjUWmHDdVHBG6iMq2T0Fteu+AgGAo94UcIsL4ay2w== + dependencies: + "@csstools/convert-colors" "2.0.0" + postcss-values-parser "6.0.1" + +postcss-loader@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-6.2.1.tgz#0895f7346b1702103d30fdc66e4d494a93c008ef" + integrity sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q== + dependencies: + cosmiconfig "^7.0.0" + klona "^2.0.5" + semver "^7.3.5" + +postcss-logical@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-5.0.0.tgz#f646ef6a3562890e1123a32e695d14cc271afb21" + integrity sha512-fWEWMn/xf6F9SMzAD7OS0GTm8Qh1BlBmEbVT/YZGYhwipQEwOpO7YOOu+qnzLksDg9JjLRj5tLmeN8OW8+ogIA== + +postcss-media-minmax@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz#7140bddec173e2d6d657edbd8554a55794e2a5b5" + integrity sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ== + +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" + integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values-replace@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values-replace/-/postcss-modules-values-replace-3.4.0.tgz#259192a73a291888816edb93934dd7177fb877ac" + integrity sha512-pY8iCSKxdt25uE+N4dO1PUUDOl8FIuvtZfT5964TuFJVhq+CEG8uqDpOCpCnqda/3K9ZFCNo4prn84H9SgP4Rw== + dependencies: + enhanced-resolve "^3.1.0" + es6-promisify "^5.0.0" + icss-utils "^4.0.0" + loader-utils "^2.0.0" + postcss "^7.0.0" + postcss-values-parser "^1.3.1" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-nesting@^10.0.2: + version "10.0.2" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-10.0.2.tgz#0cf9e81712fe7b6c3005e7d884cce2cb0a06326e" + integrity sha512-FdecapAKIe+kp6uLNW7icw1g1B2HRhAAfsNv/TPzopeM08gpUbnBpqKSVqxrCqLDwzQG854ZJn5I0BiJ35WvmA== + dependencies: + postcss-selector-parser "6.0.6" + +postcss-overflow-shorthand@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.0.tgz#f57631672333b302ffdcfc0735b8b7d0244c2a25" + integrity sha512-4fTapLT68wUoIr4m3Z0sKn1NbXX0lJYvj4aDA2++KpNx8wMSVf55UuLPz0nSjXa7dV1p0xQHlJ0iFJRNrSY2mw== + +postcss-page-break@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-3.0.4.tgz#7fbf741c233621622b68d435babfb70dd8c1ee5f" + integrity sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ== + +postcss-place@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-7.0.1.tgz#9fbd18b3d1d438d313b2a29f5a50424c8ebca28d" + integrity sha512-X+vHHzqZjI4JbSoj3uYpL6rGRUHE1O9F8g+jBFn5U94U0t6GjJuL/xSN7tU6Pnm9tpfXioHfxwt9E8+JrCB9OQ== + dependencies: + postcss-values-parser "6.0.1" + +postcss-preset-env@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-7.0.1.tgz#7f1fc5ac38e60a8e5ff9a920396d936a830e6120" + integrity sha512-oB7IJGwLBEwnao823mS2b9hqbp5Brm0EZKWRVROayjGwyPQVjY9gZpPZk/ItFakdx7GAPgv3ya+9R3KrUqCwYA== + dependencies: + autoprefixer "^10.4.0" + browserslist "^4.17.5" + caniuse-lite "^1.0.30001272" + css-blank-pseudo "^2.0.0" + css-has-pseudo "^2.0.0" + css-prefers-color-scheme "^5.0.0" + cssdb "^5.0.0" + postcss "^8.3" + postcss-attribute-case-insensitive "^5.0.0" + postcss-color-functional-notation "^4.0.1" + postcss-color-hex-alpha "^8.0.0" + postcss-color-rebeccapurple "^7.0.0" + postcss-custom-media "^8.0.0" + postcss-custom-properties "^12.0.0" + postcss-custom-selectors "^6.0.0" + postcss-dir-pseudo-class "^6.0.0" + postcss-double-position-gradients "^3.0.1" + postcss-env-function "^4.0.2" + postcss-focus-visible "^6.0.1" + postcss-focus-within "^5.0.1" + postcss-font-variant "^5.0.0" + postcss-gap-properties "^3.0.0" + postcss-image-set-function "^4.0.2" + postcss-initial "^4.0.1" + postcss-lab-function "^4.0.1" + postcss-logical "^5.0.0" + postcss-media-minmax "^5.0.0" + postcss-nesting "^10.0.2" + postcss-overflow-shorthand "^3.0.0" + postcss-page-break "^3.0.4" + postcss-place "^7.0.1" + postcss-pseudo-class-any-link "^7.0.0" + postcss-replace-overflow-wrap "^4.0.0" + postcss-selector-not "^5.0.0" + +postcss-pseudo-class-any-link@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.0.0.tgz#b06483c8a241cee1e420f9ebd08680d4f95b2b20" + integrity sha512-Q4KjHlyBo91nvW+wTDZHGYcjtlSSkYwxweMuq1g8+dx1S8qAnedItvHLnbdAAdqJCZP1is5dLqiI8TvfJ+cjVQ== + dependencies: + postcss-selector-parser "^6" + +postcss-replace-overflow-wrap@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz#d2df6bed10b477bf9c52fab28c568b4b29ca4319" + integrity sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw== + +postcss-selector-not@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz#ac5fc506f7565dd872f82f5314c0f81a05630dc7" + integrity sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ== + dependencies: + balanced-match "^1.0.0" + +postcss-selector-parser@6.0.6, postcss-selector-parser@^6, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: + version "6.0.6" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea" + integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss-values-parser@6.0.1, postcss-values-parser@^6, postcss-values-parser@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-6.0.1.tgz#aeb5e4522c4aabeb1ebbb14122194b9c08069675" + integrity sha512-hH3HREaFAEsVOzUgYiwvFggUqUvoIZoXD2OjhzY2CEM7uVDaQTKP5bmqbchCBoVvywsqiGVYhwC8p2wMUzpW+Q== + dependencies: + color-name "^1.1.4" + is-url-superb "^4.0.0" + quote-unquote "^1.0.0" + +postcss-values-parser@^1.3.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-1.5.0.tgz#5d9fa63e2bcb0179ce48f3235303765eb89f3047" + integrity sha512-3M3p+2gMp0AH3da530TlX8kiO1nxdTnc3C6vr8dMxRLIlh8UYkz0/wcwptSXjhtx2Fr0TySI7a+BHDQ8NL7LaQ== + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss@^6.0.1: + version "6.0.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" + integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.4.0" + +postcss@^7.0.0, postcss@^7.0.14: + version "7.0.39" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" + integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== + dependencies: + picocolors "^0.2.1" + source-map "^0.6.1" + +postcss@^8.2.15, postcss@^8.3: + version "8.4.4" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.4.tgz#d53d4ec6a75fd62557a66bb41978bf47ff0c2869" + integrity sha512-joU6fBsN6EIer28Lj6GDFoC/5yOZzLCfn0zHAn/MYXI7aPt4m4hK5KC5ovEZXy+lnCjmYIbQWngvju2ddyEr8Q== + dependencies: + nanoid "^3.1.30" + picocolors "^1.0.0" + source-map-js "^1.0.1" + +postcss@^8.4.4: + version "8.4.5" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.5.tgz#bae665764dfd4c6fcc24dc0fdf7e7aa00cc77f95" + integrity sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg== + dependencies: + nanoid "^3.1.30" + picocolors "^1.0.0" + source-map-js "^1.0.1" + +potpack@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/potpack/-/potpack-1.0.2.tgz#23b99e64eb74f5741ffe7656b5b5c4ddce8dfc14" + integrity sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ== + +prefixfree@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prefixfree/-/prefixfree-1.0.0.tgz#82b0edbbac107f2a3e2dc569d6c3df4035cd7910" + integrity sha1-grDtu6wQfyo+LcVp1sPfQDXNeRA= + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +prop-types@^15.0.0, prop-types@^15.7.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +protocol-buffers-schema@^3.3.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz#77bc75a48b2ff142c1ad5b5b90c94cd0fa2efd03" + integrity sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw== + +proxy-addr@~2.0.5: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +pxls@^2.0.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/pxls/-/pxls-2.3.2.tgz#79100d2cc95089fc6e00053a9d93c1ddddb2c7b4" + integrity sha512-pQkwgbLqWPcuES5iEmGa10OlCf5xG0blkIF3dg7PpRZShbTYcvAdfFfGL03SMrkaSUaa/V0UpN9HWg40O2AIIw== + dependencies: + arr-flatten "^1.1.0" + compute-dims "^1.1.0" + flip-pixels "^1.0.2" + is-browser "^2.1.0" + is-buffer "^2.0.3" + to-uint8 "^1.4.1" + +qjobs@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" + integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +quantize@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/quantize/-/quantize-1.0.2.tgz#d25ac200a77b6d70f40127ca171a10e33c8546de" + integrity sha1-0lrCAKd7bXD0ASfKFxoQ4zyFRt4= + +quat-slerp@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/quat-slerp/-/quat-slerp-1.0.1.tgz#2baa15ce3a6bbdc3241d972eb17283139ed69f29" + integrity sha1-K6oVzjprvcMkHZcusXKDE57Wnyk= + dependencies: + gl-quat "^1.0.0" + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quickselect@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/quickselect/-/quickselect-2.0.0.tgz#f19680a486a5eefb581303e023e98faaf25dd018" + integrity sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw== + +quote-unquote@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/quote-unquote/-/quote-unquote-1.0.0.tgz#67a9a77148effeaf81a4d428404a710baaac8a0b" + integrity sha1-Z6mncUjv/q+BpNQoQEpxC6qsigs= + +raf@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== + dependencies: + performance-now "^2.1.0" + +ramda@^0.27.1: + version "0.27.1" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.1.tgz#66fc2df3ef873874ffc2da6aa8984658abacf5c9" + integrity sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +rat-vec@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/rat-vec/-/rat-vec-1.1.1.tgz#0dde2b66b7b34bb1bcd2a23805eac806d87fd17f" + integrity sha1-Dd4rZrezS7G80qI4BerIBth/0X8= + dependencies: + big-rat "^1.0.3" + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +react-dom@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" + integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + scheduler "^0.20.2" + +react-file-drop@3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/react-file-drop/-/react-file-drop-3.0.6.tgz#7fb75bdc0e9a10be4f6c653d2a906cacdd460d3e" + integrity sha512-OXfSpA8YY/OsKNITXPAOr+Rar8izqNZkx/N7B5vkp00AhQOFvj8ctC4bWInq1Mzpm4De5+XfpXAYbj4D4ze1QA== + dependencies: + prop-types "^15.7.2" + +react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.6: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +react-lifecycles-compat@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== + +react-markdown@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-5.0.3.tgz#41040ea7a9324b564b328fb81dd6c04f2a5373ac" + integrity sha512-jDWOc1AvWn0WahpjW6NK64mtx6cwjM4iSsLHJPNBqoAgGOVoIdJMqaKX4++plhOtdd4JksdqzlDibgPx6B/M2w== + dependencies: + "@types/mdast" "^3.0.3" + "@types/unist" "^2.0.3" + html-to-react "^1.3.4" + mdast-add-list-metadata "1.0.1" + prop-types "^15.7.2" + react-is "^16.8.6" + remark-parse "^9.0.0" + unified "^9.0.0" + unist-util-visit "^2.0.0" + xtend "^4.0.1" + +react-movable@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/react-movable/-/react-movable-3.0.2.tgz#45e6bd95db9f8340a114ddc8860dc9994719e94a" + integrity sha512-dDDYm3CRnDy8YLXMyyaR2MbcQiTwhPOP+dfl3fZukiI6mN1flVatcjSozT7HXjVk2yHwBC67ZOWGVAmjY6F/dA== + +react-virtualized@^9.22.3: + version "9.22.3" + resolved "https://registry.yarnpkg.com/react-virtualized/-/react-virtualized-9.22.3.tgz#f430f16beb0a42db420dbd4d340403c0de334421" + integrity sha512-MKovKMxWTcwPSxE1kK1HcheQTWfuCxAuBoSTf2gwyMM21NdX/PXUhnoP8Uc5dRKd+nKm8v41R36OellhdCpkrw== + dependencies: + "@babel/runtime" "^7.7.2" + clsx "^1.0.4" + dom-helpers "^5.1.3" + loose-envify "^1.4.0" + prop-types "^15.7.2" + react-lifecycles-compat "^3.0.4" + +react-waypoint@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/react-waypoint/-/react-waypoint-10.1.0.tgz#6ab522a61bd52946260e4a78b3182759a97b40ec" + integrity sha512-wiVF0lTslVm27xHbnvUUADUrcDjrQxAp9lEYGExvcoEBScYbXu3Kt++pLrfj6CqOeeRAL4HcX8aANVLSn6bK0Q== + dependencies: + "@babel/runtime" "^7.12.5" + consolidated-events "^1.1.0 || ^2.0.0" + prop-types "^15.0.0" + react-is "^17.0.1" + +react@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" + integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +"readable-stream@>=1.0.33-1 <1.1.0-0": + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.2.2, readable-stream@^2.3.5, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +rechoir@^0.7.0: + version "0.7.1" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" + integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== + dependencies: + resolve "^1.9.0" + +reduce-simplicial-complex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/reduce-simplicial-complex/-/reduce-simplicial-complex-1.0.0.tgz#74d696a2f835f7a6dcd92065fd8c5181f2edf8bc" + integrity sha1-dNaWovg196bc2SBl/YxRgfLt+Lw= + dependencies: + cell-orientation "^1.0.1" + compare-cell "^1.0.0" + compare-oriented-cell "^1.0.1" + +regenerate-unicode-properties@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326" + integrity sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.4: + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + +regenerator-transform@^0.14.2: + version "0.14.5" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== + dependencies: + "@babel/runtime" "^7.8.4" + +regex-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/regex-regex/-/regex-regex-1.0.0.tgz#9048a1eaeb870f4d480dabc76fc42cdcc0bc3a72" + integrity sha1-kEih6uuHD01IDavHb8Qs3MC8OnI= + +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" + integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +regexpu-core@^4.5.4, regexpu-core@^4.7.1: + version "4.8.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.8.0.tgz#e5605ba361b67b1718478501327502f4479a98f0" + integrity sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^9.0.0" + regjsgen "^0.5.2" + regjsparser "^0.7.0" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.0.0" + +regjsgen@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== + +regjsparser@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.7.0.tgz#a6b667b54c885e18b52554cb4960ef71187e9968" + integrity sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ== + dependencies: + jsesc "~0.5.0" + +regl-error2d@^2.0.8: + version "2.0.12" + resolved "https://registry.yarnpkg.com/regl-error2d/-/regl-error2d-2.0.12.tgz#3b976e13fe641d5242a154fcacc80aecfa0a9881" + integrity sha512-r7BUprZoPO9AbyqM5qlJesrSRkl+hZnVKWKsVp7YhOl/3RIpi4UDGASGJY0puQ96u5fBYw/OlqV24IGcgJ0McA== + dependencies: + array-bounds "^1.0.1" + color-normalize "^1.5.0" + flatten-vertex-data "^1.0.2" + object-assign "^4.1.1" + pick-by-alias "^1.2.0" + to-float32 "^1.1.0" + update-diff "^1.1.0" + +regl-line2d@^3.0.15: + version "3.1.2" + resolved "https://registry.yarnpkg.com/regl-line2d/-/regl-line2d-3.1.2.tgz#2bedef7f44c1f7fae75c90f9918258723ca84c1c" + integrity sha512-nmT7WWS/WxmXAQMkgaMKWXaVmwJ65KCrjbqHGOUjjqQi6shfT96YbBOvelXwO9hG7/hjvbzjtQ2UO0L3e7YaXQ== + dependencies: + array-bounds "^1.0.1" + array-find-index "^1.0.2" + array-normalize "^1.1.4" + color-normalize "^1.5.0" + earcut "^2.1.5" + es6-weak-map "^2.0.3" + flatten-vertex-data "^1.0.2" + glslify "^7.0.0" + object-assign "^4.1.1" + parse-rect "^1.2.0" + pick-by-alias "^1.2.0" + to-float32 "^1.1.0" + +regl-scatter2d@^3.1.8, regl-scatter2d@^3.2.3: + version "3.2.8" + resolved "https://registry.yarnpkg.com/regl-scatter2d/-/regl-scatter2d-3.2.8.tgz#a1360e803e3fdf628ca09a72a435a0b7d4cf5675" + integrity sha512-bqrqJyeHkGBa9mEfuBnRd7FUtdtZ1l+gsM2C5Ugr1U3vJG5K3mdWdVWtOAllZ5FHHyWJV/vgjVvftgFUg6CDig== + dependencies: + "@plotly/point-cluster" "^3.1.9" + array-range "^1.0.1" + array-rearrange "^2.2.2" + clamp "^1.0.1" + color-id "^1.1.0" + color-normalize "^1.5.0" + color-rgba "^2.1.1" + flatten-vertex-data "^1.0.2" + glslify "^7.0.0" + image-palette "^2.1.0" + is-iexplorer "^1.0.0" + object-assign "^4.1.1" + parse-rect "^1.2.0" + pick-by-alias "^1.2.0" + to-float32 "^1.1.0" + update-diff "^1.1.0" + +regl-splom@^1.0.8: + version "1.0.14" + resolved "https://registry.yarnpkg.com/regl-splom/-/regl-splom-1.0.14.tgz#58800b7bbd7576aa323499a1966868a6c9ea1456" + integrity sha512-OiLqjmPRYbd7kDlHC6/zDf6L8lxgDC65BhC8JirhP4ykrK4x22ZyS+BnY8EUinXKDeMgmpRwCvUmk7BK4Nweuw== + dependencies: + array-bounds "^1.0.1" + array-range "^1.0.1" + color-alpha "^1.0.4" + flatten-vertex-data "^1.0.2" + parse-rect "^1.2.0" + pick-by-alias "^1.2.0" + raf "^3.4.1" + regl-scatter2d "^3.2.3" + +regl@^1.6.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/regl/-/regl-1.7.0.tgz#0d185431044a356bf80e9b775b11b935ef2746d3" + integrity sha512-bEAtp/qrtKucxXSJkD4ebopFZYP0q1+3Vb2WECWv/T8yQEgKxDxJ7ztO285tAMaYZVR6mM1GgI6CCn8FROtL1w== + +regl@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/regl/-/regl-2.1.0.tgz#7dae71e9ff20f29c4f42f510c70cd92ebb6b657c" + integrity sha512-oWUce/aVoEvW5l2V0LK7O5KJMzUSKeiOwFuJehzpSFd43dO5spP9r+sSUfhKtsky4u6MCqWJaRL+abzExynfTg== + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + +remark-breaks@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/remark-breaks/-/remark-breaks-3.0.2.tgz#f466b9d3474d7323146c0149fc1496dabadd908e" + integrity sha512-x96YDJ9X+Ry0/JNZFKfr1hpcAKvGYWfUTszxY9RbxKEqq6uzPPoLCuHdZsLPZZUdAv3nCROyc7FPrQLWr2rxyw== + dependencies: + "@types/mdast" "^3.0.0" + unified "^10.0.0" + unist-util-visit "^4.0.0" + +remark-gfm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-1.0.0.tgz#9213643001be3f277da6256464d56fd28c3b3c0d" + integrity sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA== + dependencies: + mdast-util-gfm "^0.1.0" + micromark-extension-gfm "^0.3.0" + +remark-parse@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-9.0.0.tgz#4d20a299665880e4f4af5d90b7c7b8a935853640" + integrity sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw== + dependencies: + mdast-util-from-markdown "^0.8.0" + +repeat-string@^1.0.0, repeat-string@^1.3.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-protobuf-schema@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz#9ca9a9e69cf192bbdaf1006ec1973948aa4a3758" + integrity sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ== + dependencies: + protocol-buffers-schema "^3.3.1" + +resolve@^0.6.1: + version "0.6.3" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-0.6.3.tgz#dd957982e7e736debdf53b58a4dd91754575dd46" + integrity sha1-3ZV5gufnNt699TtYpN2RdUV13UY= + +resolve@^1.0.0, resolve@^1.1.5, resolve@^1.14.2, resolve@^1.9.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rfdc@^1.1.4: + version "1.3.0" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" + integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + +right-now@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/right-now/-/right-now-1.0.0.tgz#6e89609deebd7dcdaf8daecc9aea39cf585a0918" + integrity sha1-bolgne69fc2vja7Mmuo5z1haCRg= + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +robust-compress@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/robust-compress/-/robust-compress-1.0.0.tgz#4cf62c4b318d8308516012bb8c11752f39329b1b" + integrity sha1-TPYsSzGNgwhRYBK7jBF1Lzkymxs= + +robust-determinant@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/robust-determinant/-/robust-determinant-1.1.0.tgz#8ecae79b79caab3e74f6debe2237e5391a27e9c7" + integrity sha1-jsrnm3nKqz509t6+IjflORon6cc= + dependencies: + robust-compress "^1.0.0" + robust-scale "^1.0.0" + robust-sum "^1.0.0" + two-product "^1.0.0" + +robust-dot-product@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/robust-dot-product/-/robust-dot-product-1.0.0.tgz#c9ba0178bd2c304bfd725f58e889f1d946004553" + integrity sha1-yboBeL0sMEv9cl9Y6Inx2UYARVM= + dependencies: + robust-sum "^1.0.0" + two-product "^1.0.0" + +robust-in-sphere@^1.1.3: + version "1.2.1" + resolved "https://registry.yarnpkg.com/robust-in-sphere/-/robust-in-sphere-1.2.1.tgz#ece3c2ae0fdf36b351680566adea7e93c6ba46da" + integrity sha512-3zJdcMIOP1gdwux93MKTS0RiMYEGwQBoE5R1IW/9ZQmGeZzP7f7i4+xdcK8ujJvF/dEOS1WPuI9IB1WNFbj3Cg== + dependencies: + robust-scale "^1.0.0" + robust-subtract "^1.0.0" + robust-sum "^1.0.0" + two-product "^1.0.0" + +robust-linear-solve@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/robust-linear-solve/-/robust-linear-solve-1.0.0.tgz#0cd6ac5040691a6f2aa3cd6311d728905ca3a1f1" + integrity sha1-DNasUEBpGm8qo81jEdcokFyjofE= + dependencies: + robust-determinant "^1.1.0" + +robust-orientation@^1.0.1, robust-orientation@^1.0.2, robust-orientation@^1.1.2, robust-orientation@^1.1.3: + version "1.2.1" + resolved "https://registry.yarnpkg.com/robust-orientation/-/robust-orientation-1.2.1.tgz#f6c2b00a5df5f1cb9597be63a45190f273899361" + integrity sha512-FuTptgKwY6iNuU15nrIJDLjXzCChWB+T4AvksRtwPS/WZ3HuP1CElCm1t+OBfgQKfWbtZIawip+61k7+buRKAg== + dependencies: + robust-scale "^1.0.2" + robust-subtract "^1.0.0" + robust-sum "^1.0.0" + two-product "^1.0.2" + +robust-product@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/robust-product/-/robust-product-1.0.0.tgz#685250007cdbba7cf1de75bff6d2927011098abe" + integrity sha1-aFJQAHzbunzx3nW/9tKScBEJir4= + dependencies: + robust-scale "^1.0.0" + robust-sum "^1.0.0" + +robust-scale@^1.0.0, robust-scale@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/robust-scale/-/robust-scale-1.0.2.tgz#775132ed09542d028e58b2cc79c06290bcf78c32" + integrity sha1-d1Ey7QlULQKOWLLMecBikLz3jDI= + dependencies: + two-product "^1.0.2" + two-sum "^1.0.0" + +robust-segment-intersect@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/robust-segment-intersect/-/robust-segment-intersect-1.0.1.tgz#3252b6a0fc1ba14ade6915ccbe09cbce9aab1c1c" + integrity sha1-MlK2oPwboUreaRXMvgnLzpqrHBw= + dependencies: + robust-orientation "^1.1.3" + +robust-subtract@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/robust-subtract/-/robust-subtract-1.0.0.tgz#e0b164e1ed8ba4e3a5dda45a12038348dbed3e9a" + integrity sha1-4LFk4e2LpOOl3aRaEgODSNvtPpo= + +robust-sum@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/robust-sum/-/robust-sum-1.0.0.tgz#16646e525292b4d25d82757a286955e0bbfa53d9" + integrity sha1-FmRuUlKStNJdgnV6KGlV4Lv6U9k= + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rw@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" + integrity sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q= + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sane-topojson@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/sane-topojson/-/sane-topojson-4.0.0.tgz#624cdb26fc6d9392c806897bfd1a393f29bb5308" + integrity sha512-bJILrpBboQfabG3BNnHI2hZl52pbt80BE09u4WhnrmzuF2JbMKZdl62G5glXskJ46p+gxE2IzOwGj/awR4g8AA== + +scheduler@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" + integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +schema-utils@^2.6.5: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" + integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.8.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.0.0" + +scrollbar-width@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/scrollbar-width/-/scrollbar-width-3.1.1.tgz#c62e63efa5934dac37b43da34f7550caca8444a2" + integrity sha1-xi5j76WTTaw3tD2jT3VQysqERKI= + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + +selfsigned@^1.10.11: + version "1.10.11" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.11.tgz#24929cd906fe0f44b6d01fb23999a739537acbe9" + integrity sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA== + dependencies: + node-forge "^0.10.0" + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +sentence-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-3.0.4.tgz#3645a7b8c117c787fde8702056225bb62a45131f" + integrity sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + upper-case-first "^2.0.2" + +serialize-javascript@6.0.0, serialize-javascript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shallow-copy@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170" + integrity sha1-QV9CcC1z2BAzApLMXuhurhoRoXA= + +shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.3, side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.3: + version "3.0.6" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" + integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== + +signum@^0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/signum/-/signum-0.0.0.tgz#ab551b1003351070a704783f1a09c5e7691f9cf6" + integrity sha1-q1UbEAM1EHCnBHg/GgnF52kfnPY= + +signum@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/signum/-/signum-1.0.0.tgz#74a7d2bf2a20b40eba16a92b152124f1d559fa77" + integrity sha1-dKfSvyogtA66FqkrFSEk8dVZ+nc= + +simple-is@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/simple-is/-/simple-is-0.2.0.tgz#2abb75aade39deb5cc815ce10e6191164850baf0" + integrity sha1-Krt1qt453rXMgVzhDmGRFkhQuvA= + +simplicial-complex-boundary@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simplicial-complex-boundary/-/simplicial-complex-boundary-1.0.1.tgz#72c9ff1e24deaa374c9bb2fa0cbf0c081ebef815" + integrity sha1-csn/HiTeqjdMm7L6DL8MCB6++BU= + dependencies: + boundary-cells "^2.0.0" + reduce-simplicial-complex "^1.0.0" + +simplicial-complex-contour@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/simplicial-complex-contour/-/simplicial-complex-contour-1.0.2.tgz#890aacac284365340110545cf2629a26e04bf9d1" + integrity sha1-iQqsrChDZTQBEFRc8mKaJuBL+dE= + dependencies: + marching-simplex-table "^1.0.0" + ndarray "^1.0.15" + ndarray-sort "^1.0.0" + typedarray-pool "^1.1.0" + +simplicial-complex@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/simplicial-complex/-/simplicial-complex-0.3.3.tgz#4c30cad57f9e45729dd8f306c8753579f46be99e" + integrity sha1-TDDK1X+eRXKd2PMGyHU1efRr6Z4= + dependencies: + bit-twiddle "~0.0.1" + union-find "~0.0.3" + +simplicial-complex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/simplicial-complex/-/simplicial-complex-1.0.0.tgz#6c33a4ed69fcd4d91b7bcadd3b30b63683eae241" + integrity sha1-bDOk7Wn81Nkbe8rdOzC2NoPq4kE= + dependencies: + bit-twiddle "^1.0.0" + union-find "^1.0.0" + +simplify-planar-graph@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/simplify-planar-graph/-/simplify-planar-graph-2.0.1.tgz#bc85893725f32e8fa8ae25681398446d2cbcf766" + integrity sha1-vIWJNyXzLo+oriVoE5hEbSy892Y= + dependencies: + robust-orientation "^1.0.1" + simplicial-complex "^0.3.3" + +simply-uuid@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simply-uuid/-/simply-uuid-1.0.1.tgz#539241d81528969cef23892faf4588005fa99ab8" + integrity sha1-U5JB2BUolpzvI4kvr0WIAF+pmrg= + +sirv@^1.0.7: + version "1.0.19" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.19.tgz#1d73979b38c7fe91fcba49c85280daa9c2363b49" + integrity sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ== + dependencies: + "@polka/url" "^1.0.0-next.20" + mrmime "^1.0.0" + totalist "^1.0.0" + +slab-decomposition@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/slab-decomposition/-/slab-decomposition-1.0.3.tgz#0345b3d364d78dad3f400cd5c8e0424547d23e7c" + integrity sha512-1EfR304JHvX9vYQkUi4AKqN62mLsjk6W45xTk/TxwN8zd3HGwS7PVj9zj0I6fgCZqfGlimDEY+RzzASHn97ZmQ== + dependencies: + binary-search-bounds "^2.0.0" + functional-red-black-tree "^1.0.0" + robust-orientation "^1.1.3" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +snake-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" + integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +sniffr@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/sniffr/-/sniffr-1.2.0.tgz#d4e31073ef4f7c00d87dba89289736fba25cadb4" + integrity sha512-k7C0ZcHBU330LcSkKyc2cOOB0uHosME8b2t9qFJqdqB1cKwGmZWd7BVwBz5mWOMJ5dggK1dy2qv+DSwteKLBzQ== + +socket.io-adapter@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.1.0.tgz#edc5dc36602f2985918d631c1399215e97a1b527" + integrity sha512-+vDov/aTsLjViYTwS9fPy5pEtTkrbEKsw2M+oVSoFGw6OD1IpvlV1VPhUzNbofCQ8oyMbdYJqDtGdmHQK6TdPg== + +socket.io-parser@~4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.0.4.tgz#9ea21b0d61508d18196ef04a2c6b9ab630f4c2b0" + integrity sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g== + dependencies: + "@types/component-emitter" "^1.2.10" + component-emitter "~1.3.0" + debug "~4.3.1" + +socket.io@^3.1.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-3.1.2.tgz#06e27caa1c4fc9617547acfbb5da9bc1747da39a" + integrity sha512-JubKZnTQ4Z8G4IZWtaAZSiRP3I/inpy8c/Bsx2jrwGrTbKeVU5xd6qkKMHpChYeM3dWZSO0QACiGK+obhBNwYw== + dependencies: + "@types/cookie" "^0.4.0" + "@types/cors" "^2.8.8" + "@types/node" ">=10.0.0" + accepts "~1.3.4" + base64id "~2.0.0" + debug "~4.3.1" + engine.io "~4.1.0" + socket.io-adapter "~2.1.0" + socket.io-parser "~4.0.3" + +sockjs@^0.3.21: + version "0.3.24" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== + dependencies: + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" + +source-map-js@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e" + integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug== + +source-map-js@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.1.tgz#a1741c131e3c77d048252adfa24e23b908670caf" + integrity sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA== + +source-map-loader@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-3.0.0.tgz#f2a04ee2808ad01c774dea6b7d2639839f3b3049" + integrity sha512-GKGWqWvYr04M7tn8dryIWvb0s8YM41z82iQv01yBtIylgxax0CwvSy6gc2Y02iuXwEfGWRlMicH0nvms9UZphw== + dependencies: + abab "^2.0.5" + iconv-lite "^0.6.2" + source-map-js "^0.6.2" + +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.5.0: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@~0.7.2: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +sourcemap-codec@^1.4.4: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +split-polygon@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/split-polygon/-/split-polygon-1.0.0.tgz#0eacc8a136a76b12a3d95256ea7da45db0c2d247" + integrity sha1-DqzIoTanaxKj2VJW6n2kXbDC0kc= + dependencies: + robust-dot-product "^1.0.0" + robust-sum "^1.0.0" + +sprintf-js@^1.0.3: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" + integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== + +stack-trace@0.0.9: + version "0.0.9" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.9.tgz#a8f6eaeca90674c333e7c43953f275b451510695" + integrity sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU= + +static-eval@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.1.0.tgz#a16dbe54522d7fa5ef1389129d813fd47b148014" + integrity sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw== + dependencies: + escodegen "^1.11.1" + +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + +streamroller@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-2.2.4.tgz#c198ced42db94086a6193608187ce80a5f2b0e53" + integrity sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ== + dependencies: + date-format "^2.1.0" + debug "^4.1.1" + fs-extra "^8.1.0" + +strictdom@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strictdom/-/strictdom-1.0.1.tgz#189de91649f73d44d59b8432efa68ef9d2659460" + integrity sha1-GJ3pFkn3PUTVm4Qy76aO+dJllGA= + +string-split-by@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string-split-by/-/string-split-by-1.0.0.tgz#53895fb3397ebc60adab1f1e3a131f5372586812" + integrity sha512-KaJKY+hfpzNyet/emP81PJA9hTVSfxNLS9SFTWxdCnnW1/zOOwiV248+EfoX7IQFcBaOp4G5YE6xTJMF+pLg6A== + dependencies: + parenthesis "^3.1.5" + +string-to-arraybuffer@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-to-arraybuffer/-/string-to-arraybuffer-1.0.2.tgz#161147fbadea02e28b0935002cec4c40f1ca7f0a" + integrity sha512-DaGZidzi93dwjQen5I2osxR9ERS/R7B1PFyufNMnzhj+fmlDQAc1DSDIJVJhgI8Oq221efIMbABUBdPHDRt43Q== + dependencies: + atob-lite "^2.0.0" + is-base64 "^0.1.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" + integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== + dependencies: + ansi-regex "^6.0.1" + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strongly-connected-components@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strongly-connected-components/-/strongly-connected-components-1.0.1.tgz#0920e2b4df67c8eaee96c6b6234fe29e873dba99" + integrity sha1-CSDitN9nyOrulsa2I0/inoc9upk= + +style-inject@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/style-inject/-/style-inject-0.3.0.tgz#d21c477affec91811cc82355832a700d22bf8dd3" + integrity sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw== + +style-loader@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.0.tgz#d66ea95fc50b22f8b79b69a9e414760fcf58d8d8" + integrity sha512-szANub7ksJtQioJYtpbWwh1hUl99uK15n5HDlikeCRil/zYMZgSxucHddyF/4A3qJMUiAjPhFowrrQuNMA7jwQ== + +style-loader@~3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.1.tgz#057dfa6b3d4d7c7064462830f9113ed417d38575" + integrity sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ== + +styled-components@^5.3.3: + version "5.3.3" + resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.3.3.tgz#312a3d9a549f4708f0fb0edc829eb34bde032743" + integrity sha512-++4iHwBM7ZN+x6DtPPWkCI4vdtwumQ+inA/DdAsqYd4SVgUKJie5vXyzotA00ttcFdQkCng7zc6grwlfIfw+lw== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/traverse" "^7.4.5" + "@emotion/is-prop-valid" "^0.8.8" + "@emotion/stylis" "^0.8.4" + "@emotion/unitless" "^0.7.4" + babel-plugin-styled-components ">= 1.12.0" + css-to-react-native "^3.0.0" + hoist-non-react-statics "^3.0.0" + shallowequal "^1.1.0" + supports-color "^5.5.0" + +supercluster@^7.0.0: + version "7.1.4" + resolved "https://registry.yarnpkg.com/supercluster/-/supercluster-7.1.4.tgz#6762aabfd985d3390b49f13b815567d5116a828a" + integrity sha512-GhKkRM1jMR6WUwGPw05fs66pOFWhf59lXq+Q3J3SxPvhNcmgOtLRV6aVQPMRsmXdpaeFJGivt+t7QXUPL3ff4g== + dependencies: + kdbush "^3.0.0" + +superscript-text@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/superscript-text/-/superscript-text-1.0.0.tgz#e7cb2752567360df50beb0610ce8df3d71d8dfd8" + integrity sha1-58snUlZzYN9QvrBhDOjfPXHY39g= + +supports-color@8.1.1, supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +surface-nets@^1.0.0, surface-nets@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/surface-nets/-/surface-nets-1.0.2.tgz#e433c8cbba94a7274c6f4c99552b461bf1fc7a4b" + integrity sha1-5DPIy7qUpydMb0yZVStGG/H8eks= + dependencies: + ndarray-extract-contour "^1.0.0" + triangulate-hypercube "^1.0.0" + zero-crossings "^1.0.0" + +svg-arc-to-cubic-bezier@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz#390c450035ae1c4a0104d90650304c3bc814abe6" + integrity sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g== + +svg-path-bounds@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/svg-path-bounds/-/svg-path-bounds-1.0.2.tgz#00312f672b08afc432a66ddfbd06db40cec8d0d0" + integrity sha512-H4/uAgLWrppIC0kHsb2/dWUYSmb4GE5UqH06uqWBcg6LBjX2fu0A8+JrO2/FJPZiSsNOKZAhyFFgsLTdYUvSqQ== + dependencies: + abs-svg-path "^0.1.1" + is-svg-path "^1.0.1" + normalize-svg-path "^1.0.0" + parse-svg-path "^0.1.2" + +svg-path-sdf@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/svg-path-sdf/-/svg-path-sdf-1.1.3.tgz#92957a31784c0eaf68945472c8dc6bf9e6d126fc" + integrity sha512-vJJjVq/R5lSr2KLfVXVAStktfcfa1pNFjFOgyJnzZFXlO/fDZ5DmM8FpnSKKzLPfEYTVeXuVBTHF296TpxuJVg== + dependencies: + bitmap-sdf "^1.0.0" + draw-svg-path "^1.0.0" + is-svg-path "^1.0.1" + parse-svg-path "^0.1.2" + svg-path-bounds "^1.0.1" + +tabbable@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-5.2.1.tgz#e3fda7367ddbb172dcda9f871c0fdb36d1c4cd9c" + integrity sha512-40pEZ2mhjaZzK0BnI+QGNjJO8UYx9pP5v7BGe17SORTO0OEuuaAwQTkAp8whcZvqon44wKFOikD+Al11K3JICQ== + +tabulator-tables@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/tabulator-tables/-/tabulator-tables-5.0.1.tgz#c077de5da11ddca654a3132e908e80ff5f5382e2" + integrity sha512-zSPYzkLIBGwmAFEPOgUpXXNKzO95bVj6EKRikS0Em32gnfhSR9n73mN5TpQV1jU4nPv/pUUTbMZVVHrjzIaaJQ== + +tapable@^0.2.7: + version "0.2.9" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.9.tgz#af2d8bbc9b04f74ee17af2b4d9048f807acd18a8" + integrity sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A== + +tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +terser-webpack-plugin@^5.1.3: + version "5.2.5" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.2.5.tgz#ce65b9880a0c36872555c4874f45bbdb02ee32c9" + integrity sha512-3luOVHku5l0QBeYS8r4CdHYWEGMmIj3H1U64jgkdZzECcSOJAyJ9TjuqcQZvw1Y+4AOBN9SeYJPJmFn2cM4/2g== + dependencies: + jest-worker "^27.0.6" + schema-utils "^3.1.1" + serialize-javascript "^6.0.0" + source-map "^0.6.1" + terser "^5.7.2" + +terser@^5.10.0, terser@^5.7.2: + version "5.10.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.10.0.tgz#b86390809c0389105eb0a0b62397563096ddafcc" + integrity sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA== + dependencies: + commander "^2.20.0" + source-map "~0.7.2" + source-map-support "~0.5.20" + +text-cache@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/text-cache/-/text-cache-4.2.2.tgz#d0d30ba89b7312ea1c1a31cd9a4db56c1cef7fe7" + integrity sha512-zky+UDYiX0a/aPw/YTBD+EzKMlCTu1chFuCMZeAkgoRiceySdROu1V2kJXhCbtEdBhiOviYnAdGiSYl58HW0ZQ== + dependencies: + vectorize-text "^3.2.1" + +three-csg-ts@3.1.9: + version "3.1.9" + resolved "https://registry.yarnpkg.com/three-csg-ts/-/three-csg-ts-3.1.9.tgz#1438de3b6747b9b55deb88d9e0acdc6e47681979" + integrity sha512-Qke0+07AKDfeiRjh46sOF2iiilSMcKnfgHjuArdMB4poZs3X0FQLHGFIEBbGrv3ejrkHASW9o5pLRfFFQhk9hg== + +three@0.130.1: + version "0.130.1" + resolved "https://registry.yarnpkg.com/three/-/three-0.130.1.tgz#797588b2877ace31603bbbc864eb2e3022f0b3b4" + integrity sha512-OSPPKcGvFSiGkG3jFrwwC76PBV/ZSrGxpBbg28bW8s9GU8r/y2spNGtEXHEb/CVqo0Ctf5Lx2rVaxQZB6OasaA== + +through2@^0.6.3: + version "0.6.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" + integrity sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg= + dependencies: + readable-stream ">=1.0.33-1 <1.1.0-0" + xtend ">=4.0.0 <4.1.0-0" + +through2@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +tinycolor2@^1.4.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.2.tgz#3f6a4d1071ad07676d7fa472e1fac40a719d8803" + integrity sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA== + +tinyqueue@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/tinyqueue/-/tinyqueue-2.0.3.tgz#64d8492ebf39e7801d7bd34062e29b45b2035f08" + integrity sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA== + +tmp@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +to-array-buffer@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/to-array-buffer/-/to-array-buffer-3.2.0.tgz#cb684dd691a7368c3b249c2348d75227f7d4dbb4" + integrity sha512-zN33mwi0gpL+7xW1ITLfJ48CEj6ZQW0ZAP0MU+2W3kEY0PAIncyuxmD4OqkUVhPAbTP7amq9j/iwvZKYS+lzSQ== + dependencies: + flatten-vertex-data "^1.0.2" + is-blob "^2.0.1" + string-to-arraybuffer "^1.0.0" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-float32@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/to-float32/-/to-float32-1.1.0.tgz#39bd3b11eadccd490c08f5f9171da5127b6f3946" + integrity sha512-keDnAusn/vc+R3iEiSDw8TOF7gPiTLdK1ArvWtYbJQiVfmRg6i/CAvbKq3uIS0vWroAC7ZecN3DjQKw3aSklUg== + +to-px@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-px/-/to-px-1.0.1.tgz#5bbaed5e5d4f76445bcc903c293a2307dd324646" + integrity sha1-W7rtXl1PdkRbzJA8KTojB90yRkY= + dependencies: + parse-unit "^1.0.1" + +to-px@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/to-px/-/to-px-1.1.0.tgz#b6b269ed5db0cc9aefc15272a4c8bcb2ca1e99ca" + integrity sha512-bfg3GLYrGoEzrGoE05TAL/Uw+H/qrf2ptr9V3W7U0lkjjyYnIfgxmVLUfhQ1hZpIQwin81uxhDjvUkDYsC0xWw== + dependencies: + parse-unit "^1.0.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-uint8@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/to-uint8/-/to-uint8-1.4.1.tgz#9f45694905b827f247d37bc8ec83b2818d81fac9" + integrity sha512-o+ochsMlTZyucbww8It401FC2Rx+OP2RpDeYbA6h+y9HgedDl1UjdsJ9CmzKEG7AFP9es5PmJ4eDWeeeXihESg== + dependencies: + arr-flatten "^1.1.0" + clamp "^1.0.1" + is-base64 "^0.1.0" + is-float-array "^1.0.0" + to-array-buffer "^3.0.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +topojson-client@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/topojson-client/-/topojson-client-3.1.0.tgz#22e8b1ed08a2b922feeb4af6f53b6ef09a467b99" + integrity sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw== + dependencies: + commander "2" + +totalist@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df" + integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== + +traverse@0.6.6: + version "0.6.6" + resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137" + integrity sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc= + +triangulate-hypercube@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/triangulate-hypercube/-/triangulate-hypercube-1.0.1.tgz#d8071db2ebfcfd51f308d0bcf2a5c48a5b36d137" + integrity sha1-2Acdsuv8/VHzCNC88qXEils20Tc= + dependencies: + gamma "^0.1.0" + permutation-parity "^1.0.0" + permutation-rank "^1.0.0" + +triangulate-polyline@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/triangulate-polyline/-/triangulate-polyline-1.0.3.tgz#bf8ba877a85054103feb9fa5a61b4e8d7017814d" + integrity sha1-v4uod6hQVBA/65+lphtOjXAXgU0= + dependencies: + cdt2d "^1.0.0" + +trough@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" + integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== + +trough@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/trough/-/trough-2.0.2.tgz#94a3aa9d5ce379fc561f6244905b3f36b7458d96" + integrity sha512-FnHq5sTMxC0sk957wHDzRnemFnNBvt/gSY99HzK8F7UP5WAbvP70yX5bd7CjEQkN+TjdxwI7g7lJ6podqrG2/w== + +tslib@^2.0.3: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + +turntable-camera-controller@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/turntable-camera-controller/-/turntable-camera-controller-3.0.1.tgz#8dbd3fe00550191c65164cb888971049578afd99" + integrity sha1-jb0/4AVQGRxlFky4iJcQSVeK/Zk= + dependencies: + filtered-vector "^1.2.1" + gl-mat4 "^1.0.2" + gl-vec3 "^1.0.2" + +two-product@^1.0.0, two-product@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/two-product/-/two-product-1.0.2.tgz#67d95d4b257a921e2cb4bd7af9511f9088522eaa" + integrity sha1-Z9ldSyV6kh4stL16+VEfkIhSLqo= + +two-sum@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/two-sum/-/two-sum-1.0.0.tgz#31d3f32239e4f731eca9df9155e2b297f008ab64" + integrity sha1-MdPzIjnk9zHsqd+RVeKyl/AIq2Q= + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +type-name@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/type-name/-/type-name-2.0.2.tgz#efe7d4123d8ac52afff7f40c7e4dec5266008fb4" + integrity sha1-7+fUEj2KxSr/9/QMfk3sUmYAj7Q= + +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d" + integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw== + +typedarray-pool@^1.0.0, typedarray-pool@^1.0.2, typedarray-pool@^1.1.0, typedarray-pool@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/typedarray-pool/-/typedarray-pool-1.2.0.tgz#e7e90720144ba02b9ed660438af6f3aacfe33ac3" + integrity sha512-YTSQbzX43yvtpfRtIDAYygoYtgT+Rpjuxy9iOpczrjpXLgGoyG7aS5USJXV2d3nn8uHTeb9rXDvzS27zUg5KYQ== + dependencies: + bit-twiddle "^1.0.0" + dup "^1.0.0" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +typescript@3.9.5: + version "3.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.5.tgz#586f0dba300cde8be52dd1ac4f7e1009c1b13f36" + integrity sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ== + +ua-parser-js@^0.7.28: + version "0.7.31" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" + integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== + +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" + integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" + integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== + +unified@^10.0.0: + version "10.1.1" + resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.1.tgz#345e349e3ab353ab612878338eb9d57b4dea1d46" + integrity sha512-v4ky1+6BN9X3pQrOdkFIPWAaeDsHPE1svRDxq7YpTc2plkIqFMwukfqM+l0ewpP9EfwARlt9pPFAeWYhHm8X9w== + dependencies: + "@types/unist" "^2.0.0" + bail "^2.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^4.0.0" + trough "^2.0.0" + vfile "^5.0.0" + +unified@^9.0.0: + version "9.2.2" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" + integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + +union-find@^1.0.0, union-find@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/union-find/-/union-find-1.0.2.tgz#292bac415e6ad3a89535d237010db4a536284e58" + integrity sha1-KSusQV5q06iVNdI3AQ20pTYoTlg= + +union-find@~0.0.3: + version "0.0.4" + resolved "https://registry.yarnpkg.com/union-find/-/union-find-0.0.4.tgz#b854b3301619bdad144b0014c78f96eac0d2f0f6" + integrity sha1-uFSzMBYZva0USwAUx4+W6sDS8PY= + +uniq@^1.0.0, uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +unist-util-is@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" + integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== + +unist-util-is@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.1.1.tgz#e8aece0b102fa9bc097b0fef8f870c496d4a6236" + integrity sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ== + +unist-util-stringify-position@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" + integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== + dependencies: + "@types/unist" "^2.0.2" + +unist-util-stringify-position@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.0.tgz#d517d2883d74d0daa0b565adc3d10a02b4a8cde9" + integrity sha512-SdfAl8fsDclywZpfMDTVDxA2V7LjtRDTOFd44wUJamgl6OlVngsqWjxvermMYf60elWHbxhuRCZml7AnuXCaSA== + dependencies: + "@types/unist" "^2.0.0" + +unist-util-visit-parents@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-1.1.2.tgz#f6e3afee8bdbf961c0e6f028ea3c0480028c3d06" + integrity sha512-yvo+MMLjEwdc3RhhPYSximset7rwjMrdt9E41Smmvg25UQIenzrN83cRnF1JMzoMi9zZOQeYXHSDf7p+IQkW3Q== + +unist-util-visit-parents@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" + integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + +unist-util-visit-parents@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.0.tgz#44bbc5d25f2411e7dfc5cecff12de43296aa8521" + integrity sha512-y+QVLcY5eR/YVpqDsLf/xh9R3Q2Y4HxkZTp7ViLDU6WtJCEcPmRzW1gpdWDCDIqIlhuPDXOgttqPlykrHYDekg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" + +unist-util-visit@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" + integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + unist-util-visit-parents "^3.0.0" + +unist-util-visit@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.0.tgz#f41e407a9e94da31594e6b1c9811c51ab0b3d8f5" + integrity sha512-n7lyhFKJfVZ9MnKtqbsqkQEk5P1KShj0+//V7mAcoI6bpbUjh3C/OG8HVD+pBihfh6Ovl01m8dkcv9HNqYajmQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" + unist-util-visit-parents "^5.0.0" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unquote@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + +update-diff@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/update-diff/-/update-diff-1.1.0.tgz#f510182d81ee819fb82c3a6b22b62bbdeda7808f" + integrity sha1-9RAYLYHugZ+4LDprIrYrve2ngI8= + +upper-case-first@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-2.0.2.tgz#992c3273f882abd19d1e02894cc147117f844324" + integrity sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg== + dependencies: + tslib "^2.0.3" + +upper-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-2.0.2.tgz#d89810823faab1df1549b7d97a76f8662bae6f7a" + integrity sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg== + dependencies: + tslib "^2.0.3" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-loader@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" + integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== + dependencies: + loader-utils "^2.0.0" + mime-types "^2.1.27" + schema-utils "^3.0.0" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +utils-copy-error@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-copy-error/-/utils-copy-error-1.0.1.tgz#791de393c0f09890afd59f3cbea635f079a94fa5" + integrity sha1-eR3jk8DwmJCv1Z88vqY18HmpT6U= + dependencies: + object-keys "^1.0.9" + utils-copy "^1.1.0" + +utils-copy@^1.0.0, utils-copy@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/utils-copy/-/utils-copy-1.1.1.tgz#6e2b97982aa8cd73e1182a3e6f8bec3c0f4058a7" + integrity sha1-biuXmCqozXPhGCo+b4vsPA9AWKc= + dependencies: + const-pinf-float64 "^1.0.0" + object-keys "^1.0.9" + type-name "^2.0.0" + utils-copy-error "^1.0.0" + utils-indexof "^1.0.0" + utils-regex-from-string "^1.0.0" + validate.io-array "^1.0.3" + validate.io-buffer "^1.0.1" + validate.io-nonnegative-integer "^1.0.0" + +utils-indexof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/utils-indexof/-/utils-indexof-1.0.0.tgz#20feabf09ef1018b523643e8380e7bc83ec61b5c" + integrity sha1-IP6r8J7xAYtSNkPoOA57yD7GG1w= + dependencies: + validate.io-array-like "^1.0.1" + validate.io-integer-primitive "^1.0.0" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +utils-regex-from-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/utils-regex-from-string/-/utils-regex-from-string-1.0.0.tgz#fe1a2909f8de0ff0d5182c80fbc654d6a687d189" + integrity sha1-/hopCfjeD/DVGCyA+8ZU1qaH0Yk= + dependencies: + regex-regex "^1.0.0" + validate.io-string-primitive "^1.0.0" + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + +validate.io-array-like@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/validate.io-array-like/-/validate.io-array-like-1.0.2.tgz#7af9f7eb7b51715beb2215668ec5cce54faddb5a" + integrity sha1-evn363tRcVvrIhVmjsXM5U+t21o= + dependencies: + const-max-uint32 "^1.0.2" + validate.io-integer-primitive "^1.0.0" + +validate.io-array@^1.0.3, validate.io-array@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/validate.io-array/-/validate.io-array-1.0.6.tgz#5b5a2cafd8f8b85abb2f886ba153f2d93a27774d" + integrity sha1-W1osr9j4uFq7L4hroVPy2Tond00= + +validate.io-buffer@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/validate.io-buffer/-/validate.io-buffer-1.0.2.tgz#852d6734021914d5d13afc32531761e3720ed44e" + integrity sha1-hS1nNAIZFNXROvwyUxdh43IO1E4= + +validate.io-integer-primitive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/validate.io-integer-primitive/-/validate.io-integer-primitive-1.0.0.tgz#a9aa010355fe8681c0fea6c1a74ad2419cadddc6" + integrity sha1-qaoBA1X+hoHA/qbBp0rSQZyt3cY= + dependencies: + validate.io-number-primitive "^1.0.0" + +validate.io-integer@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/validate.io-integer/-/validate.io-integer-1.0.5.tgz#168496480b95be2247ec443f2233de4f89878068" + integrity sha1-FoSWSAuVviJH7EQ/IjPeT4mHgGg= + dependencies: + validate.io-number "^1.0.3" + +validate.io-matrix-like@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/validate.io-matrix-like/-/validate.io-matrix-like-1.0.2.tgz#5ec32a75d0889dac736dea68bdd6145b155edfc3" + integrity sha1-XsMqddCInaxzbepovdYUWxVe38M= + +validate.io-ndarray-like@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/validate.io-ndarray-like/-/validate.io-ndarray-like-1.0.0.tgz#d8a3b0ed165bbf1d2fc0d0073270cfa552295919" + integrity sha1-2KOw7RZbvx0vwNAHMnDPpVIpWRk= + +validate.io-nonnegative-integer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/validate.io-nonnegative-integer/-/validate.io-nonnegative-integer-1.0.0.tgz#8069243a08c5f98e95413c929dfd7b18f3f6f29f" + integrity sha1-gGkkOgjF+Y6VQTySnf17GPP28p8= + dependencies: + validate.io-integer "^1.0.5" + +validate.io-number-primitive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/validate.io-number-primitive/-/validate.io-number-primitive-1.0.0.tgz#d2e01f202989369dcf1155449564203afe584e55" + integrity sha1-0uAfICmJNp3PEVVElWQgOv5YTlU= + +validate.io-number@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/validate.io-number/-/validate.io-number-1.0.3.tgz#f63ffeda248bf28a67a8d48e0e3b461a1665baf8" + integrity sha1-9j/+2iSL8opnqNSODjtGGhZluvg= + +validate.io-positive-integer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/validate.io-positive-integer/-/validate.io-positive-integer-1.0.0.tgz#7ed2d03b4c27558cc66a00aab0f0e921814a6582" + integrity sha1-ftLQO0wnVYzGagCqsPDpIYFKZYI= + dependencies: + validate.io-integer "^1.0.5" + +validate.io-string-primitive@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/validate.io-string-primitive/-/validate.io-string-primitive-1.0.1.tgz#b8135b9fb1372bde02fdd53ad1d0ccd6de798fee" + integrity sha1-uBNbn7E3K94C/dU60dDM1t55j+4= + +vary@^1, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +vectorize-text@^3.2.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/vectorize-text/-/vectorize-text-3.2.2.tgz#3e978889df4ae333975d38669529c942a63e1f65" + integrity sha512-34NVOCpMMQVXujU4vb/c6u98h6djI0jGdtC202H4Huvzn48B6ARsR7cmGh1xsAc0pHNQiUKGK/aHF05VtGv+eA== + dependencies: + cdt2d "^1.0.0" + clean-pslg "^1.1.0" + ndarray "^1.0.11" + planar-graph-to-polyline "^1.0.6" + simplify-planar-graph "^2.0.1" + surface-nets "^1.0.0" + triangulate-polyline "^1.0.0" + +vfile-message@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" + integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^2.0.0" + +vfile-message@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.0.2.tgz#db7eaebe7fecb853010f2ef1664427f52baf8f74" + integrity sha512-UUjZYIOg9lDRwwiBAuezLIsu9KlXntdxwG+nXnjuQAHvBpcX3x0eN8h+I7TkY5nkCXj+cWVp4ZqebtGBvok8ww== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^3.0.0" + +vfile@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" + integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^2.0.0" + vfile-message "^2.0.0" + +vfile@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.2.0.tgz#a32a646ff9251c274dbe8675644a39031025b369" + integrity sha512-ftCpb6pU8Jrzcqku8zE6N3Gi4/RkDhRwEXSWudzZzA2eEOn/cBpsfk9aulCUR+j1raRSAykYQap9u6j6rhUaCA== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^3.0.0" + vfile-message "^3.0.0" + +void-elements@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" + integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w= + +vt-pbf@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/vt-pbf/-/vt-pbf-3.1.3.tgz#68fd150756465e2edae1cc5c048e063916dcfaac" + integrity sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA== + dependencies: + "@mapbox/point-geometry" "0.1.0" + "@mapbox/vector-tile" "^1.3.1" + pbf "^3.2.1" + +watchpack@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.0.tgz#a41bca3da6afaff31e92a433f4c856a0c25ea0c4" + integrity sha512-MnN0Q1OsvB/GGHETrFeZPQaOelWh/7O+EiFlj8sM9GPjtQkis7k01aAxrg/18kTfoIVcLL+haEVFlXDaSRwKRw== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +weak-map@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/weak-map/-/weak-map-1.0.5.tgz#79691584d98607f5070bd3b70a40e6bb22e401eb" + integrity sha1-eWkVhNmGB/UHC9O3CkDmuyLkAes= + +weakmap-shim@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/weakmap-shim/-/weakmap-shim-1.1.1.tgz#d65afd784109b2166e00ff571c33150ec2a40b49" + integrity sha1-1lr9eEEJshZuAP9XHDMVDsKkC0k= + +webgl-context@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/webgl-context/-/webgl-context-2.2.0.tgz#8f37d7257cf6df1cd0a49e6a7b1b721b94cc86a0" + integrity sha1-jzfXJXz23xzQpJ5qextyG5TMhqA= + dependencies: + get-canvas-context "^1.0.1" + +webpack-bundle-analyzer@4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz#1b0eea2947e73528754a6f9af3e91b2b6e0f79d5" + integrity sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ== + dependencies: + acorn "^8.0.4" + acorn-walk "^8.0.0" + chalk "^4.1.0" + commander "^7.2.0" + gzip-size "^6.0.0" + lodash "^4.17.20" + opener "^1.5.2" + sirv "^1.0.7" + ws "^7.3.1" + +webpack-cli@4.9.0: + version "4.9.0" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.9.0.tgz#dc43e6e0f80dd52e89cbf73d5294bcd7ad6eb343" + integrity sha512-n/jZZBMzVEl4PYIBs+auy2WI0WTQ74EnJDiyD98O2JZY6IVIHJNitkYp/uTXOviIOMfgzrNvC9foKv/8o8KSZw== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^1.1.0" + "@webpack-cli/info" "^1.4.0" + "@webpack-cli/serve" "^1.6.0" + colorette "^2.0.14" + commander "^7.0.0" + execa "^5.0.0" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^2.2.0" + rechoir "^0.7.0" + v8-compile-cache "^2.2.0" + webpack-merge "^5.7.3" + +webpack-dev-middleware@^5.2.1: + version "5.2.2" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.2.2.tgz#eb5193faa5479ca1086b9f7bed68b89c731bff62" + integrity sha512-DjZyYrsHhkikAFNvSNKrpnziXukU1EChFAh9j4LAm6ndPLPW8cN0KhM7T+RAiOqsQ6ABfQ8hoKIs9IWMTjov+w== + dependencies: + colorette "^2.0.10" + memfs "^3.2.2" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-server@4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.3.1.tgz#759d3337f0fbea297fbd1e433ab04ccfc000076b" + integrity sha512-qNXQCVYo1kYhH9pgLtm8LRNkXX3XzTfHSj/zqzaqYzGPca+Qjr+81wj1jgPMCHhIhso9WEQ+kX9z23iG9PzQ7w== + dependencies: + ansi-html-community "^0.0.8" + bonjour "^3.5.0" + chokidar "^3.5.1" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^1.6.0" + del "^6.0.0" + express "^4.17.1" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.0" + internal-ip "^6.2.0" + ipaddr.js "^2.0.1" + open "^8.0.9" + p-retry "^4.5.0" + portfinder "^1.0.28" + schema-utils "^3.1.0" + selfsigned "^1.10.11" + serve-index "^1.9.1" + sockjs "^0.3.21" + spdy "^4.0.2" + strip-ansi "^7.0.0" + url "^0.11.0" + webpack-dev-middleware "^5.2.1" + ws "^8.1.0" + +webpack-merge@^4.1.5: + version "4.2.2" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" + integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g== + dependencies: + lodash "^4.17.15" + +webpack-merge@^5.7.3: + version "5.8.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.2.tgz#d88e3741833efec57c4c789b6010db9977545260" + integrity sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw== + +webpack@5.57.1: + version "5.57.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.57.1.tgz#ead5ace2c17ecef2ae8126f143bfeaa7f55eab44" + integrity sha512-kHszukYjTPVfCOEyrUthA3jqJwduY/P3eO8I0gMNOZGIQWKAwZftxmp5hq6paophvwo9NoUrcZOecs9ulOyyTg== + dependencies: + "@types/eslint-scope" "^3.7.0" + "@types/estree" "^0.0.50" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.4.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.8.3" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.4" + json-parse-better-errors "^1.0.2" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.2.0" + webpack-sources "^3.2.0" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +which-boxed-primitive@^1.0.1, which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + +which-typed-array@^1.1.2: + version "1.1.7" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.7.tgz#2761799b9a22d4b8660b3c1b40abaa7739691793" + integrity sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-abstract "^1.18.5" + foreach "^2.0.5" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.7" + +which@2.0.2, which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +which@^1.2.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +workerpool@6.1.5: + version "6.1.5" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.5.tgz#0f7cf076b6215fd7e1da903ff6f22ddd1886b581" + integrity sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw== + +world-calendars@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/world-calendars/-/world-calendars-1.0.3.tgz#b25c5032ba24128ffc41d09faf4a5ec1b9c14335" + integrity sha1-slxQMrokEo/8QdCfr0pewbnBQzU= + dependencies: + object-assign "^4.1.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +ws@^7.3.1: + version "7.5.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b" + integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA== + +ws@^8.1.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.3.0.tgz#7185e252c8973a60d57170175ff55fdbd116070d" + integrity sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw== + +ws@~7.4.2: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +xtend@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.2.0.tgz#eef6b1f198c1c8deafad8b1765a04dad4a01c5a9" + integrity sha1-7vax8ZjByN6vrYsXZaBNrUoBxak= + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0, yargs@^16.1.1: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zero-crossings@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/zero-crossings/-/zero-crossings-1.0.1.tgz#c562bd3113643f3443a245d12406b88b69b9a9ff" + integrity sha1-xWK9MRNkPzRDokXRJAa4i2m5qf8= + dependencies: + cwise-compiler "^1.0.0" + +zwitch@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" + integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== From e512e9bbcf41b09376b82f7251ce59c433aeb090 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 7 Jan 2022 20:11:49 +0300 Subject: [PATCH 102/109] Update build.yml --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cbf40304..f4e597ac 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,7 +7,7 @@ on: jobs: build: - runs-on: ubuntu-20.04 + runs-on: windows-latest timeout-minutes: 40 steps: - uses: actions/checkout@v2 From f2f6608a2e21f3728576022e3e0a2fa7b0c485b9 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 7 Jan 2022 20:37:31 +0300 Subject: [PATCH 103/109] fix css rules excludes --- demo/playground/webpack.config.d/01.ring.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/demo/playground/webpack.config.d/01.ring.js b/demo/playground/webpack.config.d/01.ring.js index fbde1b41..b3cc4770 100644 --- a/demo/playground/webpack.config.d/01.ring.js +++ b/demo/playground/webpack.config.d/01.ring.js @@ -1,4 +1,5 @@ const ringConfig = require('@jetbrains/ring-ui/webpack.config').config; +const path = require('path'); config.module.rules.push(...ringConfig.module.rules) @@ -6,7 +7,7 @@ config.module.rules.push( { test: /\.css$/, exclude: [ - 'D:\\Work\\Projects\\visionforge\\build\\js\\node_modules\\@jetbrains\\ring-ui' + path.resolve(__dirname, "../../node_modules/@jetbrains/ring-ui") ], use: [ { From ad9f43f5a5e5b7aa7766a94006ee214fc18902b9 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 11 Jan 2022 19:40:12 +0300 Subject: [PATCH 104/109] Update build.yml --- .github/workflows/build.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f4e597ac..1f87ce02 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -16,9 +16,6 @@ jobs: with: java-version: 11 distribution: liberica - - uses: actions/setup-node@v2.5.1 - with: - node-version: '16' - name: execute build uses: gradle/gradle-build-action@v2 with: From bfa7f5ea573d0c30c63b179d1da752923a88465b Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 11 Jan 2022 20:49:15 +0300 Subject: [PATCH 105/109] Remove unnecessary rotation and position updates --- .../src/jvmMain/kotlin/allThingsDemo.kt | 11 +++++++--- .../src/jvmMain/kotlin/serverExtensions.kt | 1 - .../space/kscience/visionforge/html/Page.kt | 2 ++ .../kscience/visionforge/solid/Composite.kt | 10 --------- .../kscience/visionforge/solid/Quaternion.kt | 11 ++++++++++ .../space/kscience/visionforge/solid/Solid.kt | 21 ++++++++++++++++--- .../kscience/visionforge/solid/SolidGroup.kt | 9 ++++---- .../kscience/visionforge/solid/geometry.kt | 10 ++++----- .../visionforge/solid/three/ThreeFactory.kt | 14 ++++++++++++- .../kscience/visionforge/solid/three/three.kt | 5 ----- 10 files changed, 62 insertions(+), 32 deletions(-) create mode 100644 visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Quaternion.kt diff --git a/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt b/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt index 0ff49d40..9c68af8b 100644 --- a/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt +++ b/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt @@ -1,6 +1,5 @@ package space.kscience.visionforge.examples -import kotlinx.html.h1 import kotlinx.html.h2 import space.kscience.dataforge.context.Context import space.kscience.dataforge.values.ValueType @@ -13,11 +12,15 @@ import space.kscience.visionforge.html.ResourceLocation import space.kscience.visionforge.markup.markdown import space.kscience.visionforge.plotly.PlotlyPlugin import space.kscience.visionforge.plotly.plotly -import space.kscience.visionforge.solid.* +import space.kscience.visionforge.solid.Solids +import space.kscience.visionforge.solid.box +import space.kscience.visionforge.solid.solid +import space.kscience.visionforge.solid.z import space.kscience.visionforge.tables.TableVisionPlugin import space.kscience.visionforge.tables.columnTable import java.nio.file.Paths + fun main() { val context = Context { plugin(Solids) @@ -41,7 +44,9 @@ fun main() { h2 { +"3D visualization with Three-js" } vision("3D") { solid { - box(100, 100, 100, name = "aBox") + box(100, 100, 100, name = "aBox"){ + z = 50.0 + } } } diff --git a/demo/playground/src/jvmMain/kotlin/serverExtensions.kt b/demo/playground/src/jvmMain/kotlin/serverExtensions.kt index b8bb633a..62d318ad 100644 --- a/demo/playground/src/jvmMain/kotlin/serverExtensions.kt +++ b/demo/playground/src/jvmMain/kotlin/serverExtensions.kt @@ -29,7 +29,6 @@ public fun Context.makeVisionFile( val actualPath = visionManager.page(title, content = content).makeFile(path) { actualPath -> mapOf( "playground" to scriptHeader("js/visionforge-playground.js", resourceLocation, actualPath), - //"tables" to tabulatorCssHader ) } if (show) Desktop.getDesktop().browse(actualPath.toFile().toURI()) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/Page.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/Page.kt index 96cae1ce..d575208e 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/Page.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/Page.kt @@ -4,6 +4,8 @@ import kotlinx.html.* import space.kscience.dataforge.misc.DFExperimental import space.kscience.visionforge.VisionManager +//data class HeaderContainer + public data class Page( public val visionManager: VisionManager, public val title: String, diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt index 3c7773bc..d63e08b6 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt @@ -39,16 +39,6 @@ public inline fun VisionContainerBuilder.composite( res.meta.update(group.meta) - if (group.position != null) { - res.position = group.position - } - if (group.rotation != null) { - res.rotation = group.rotation - } - if (group.scale != null) { - res.scale = group.scale - } - set(name, res) return res } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Quaternion.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Quaternion.kt new file mode 100644 index 00000000..617c7a38 --- /dev/null +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Quaternion.kt @@ -0,0 +1,11 @@ +package space.kscience.visionforge.solid + +import kotlin.jvm.JvmInline + +@JvmInline +public value class Quaternion(public val values: DoubleArray) + +public operator fun Quaternion.component1(): Double = values[0] +public operator fun Quaternion.component2(): Double = values[1] +public operator fun Quaternion.component3(): Double = values[2] +public operator fun Quaternion.component4(): Double = values[3] \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt index 39ed06ac..2b9c883b 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt @@ -1,13 +1,21 @@ package space.kscience.visionforge.solid -import space.kscience.dataforge.meta.* -import space.kscience.dataforge.meta.descriptors.* +import space.kscience.dataforge.meta.descriptors.MetaDescriptor +import space.kscience.dataforge.meta.descriptors.enum +import space.kscience.dataforge.meta.descriptors.node +import space.kscience.dataforge.meta.descriptors.value +import space.kscience.dataforge.meta.float +import space.kscience.dataforge.meta.get +import space.kscience.dataforge.meta.number import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus import space.kscience.dataforge.values.* -import space.kscience.visionforge.* +import space.kscience.visionforge.Vision import space.kscience.visionforge.Vision.Companion.VISIBLE_KEY +import space.kscience.visionforge.hide +import space.kscience.visionforge.inherited +import space.kscience.visionforge.setProperty import space.kscience.visionforge.solid.Solid.Companion.DETAIL_KEY import space.kscience.visionforge.solid.Solid.Companion.IGNORE_KEY import space.kscience.visionforge.solid.Solid.Companion.LAYER_KEY @@ -199,6 +207,13 @@ public var Solid.rotationX: Number by float(X_ROTATION_KEY, 0f) public var Solid.rotationY: Number by float(Y_ROTATION_KEY, 0f) public var Solid.rotationZ: Number by float(Z_ROTATION_KEY, 0f) +//public var Solid.quaternion: Quaternion? +// get() = meta[Solid::quaternion.name]?.value?.doubleArray?.let { Quaternion(it) } +// set(value) { +// meta[Solid::quaternion.name] = value?.values?.asValue() +// } + + public var Solid.scaleX: Number by float(X_SCALE_KEY, 1f) public var Solid.scaleY: Number by float(Y_SCALE_KEY, 1f) public var Solid.scaleZ: Number by float(Z_SCALE_KEY, 1f) \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt index b3e8ccd8..a501f7a0 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt @@ -60,10 +60,11 @@ public class SolidGroup : VisionGroupBase(), Solid, PrototypeHolder { override fun createGroup(): SolidGroup = SolidGroup() - override fun update(change: VisionChange) { - updatePosition(change.properties) - super.update(change) - } +// +// override fun update(change: VisionChange) { +// updatePosition(change.properties) +// super.update(change) +// } public companion object { public val PROTOTYPES_TOKEN: NameToken = NameToken("@prototypes") diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt index f815a262..a0ad09a0 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt @@ -117,8 +117,8 @@ internal fun Meta.toVector(default: Float = 0f) = Point3D( this[Solid.Z_KEY].float ?: default ) -internal fun Solid.updatePosition(meta: Meta?) { - meta?.get(Solid.POSITION_KEY)?.toVector()?.let { position = it } - meta?.get(Solid.ROTATION_KEY)?.toVector()?.let { rotation = it } - meta?.get(Solid.SCALE_KEY)?.toVector(1f)?.let { scale = it } -} \ No newline at end of file +//internal fun Solid.updatePosition(meta: Meta?) { +// meta?.get(Solid.POSITION_KEY)?.toVector()?.let { position = it } +// meta?.get(Solid.ROTATION_KEY)?.toVector()?.let { rotation = it } +// meta?.get(Solid.SCALE_KEY)?.toVector(1f)?.let { scale = it } +//} \ No newline at end of file diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt index 81749fd3..df9f2c94 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt @@ -2,6 +2,7 @@ package space.kscience.visionforge.solid.three import info.laht.threekt.core.BufferGeometry import info.laht.threekt.core.Object3D +import info.laht.threekt.math.Euler import info.laht.threekt.objects.Mesh import space.kscience.dataforge.misc.Type import space.kscience.dataforge.names.Name @@ -36,7 +37,18 @@ public fun Object3D.updatePosition(obj: Vision) { visible = obj.visible ?: true if (obj is Solid) { position.set(obj.x, obj.y, obj.z) - setRotationFromEuler(obj.euler) + +// val quaternion = obj.quaternion +// +// if (quaternion != null) { +// val (x, y, z, w) = quaternion +// setRotationFromQuaternion(Quaternion(x, y, z, w)) +// } else { +// setRotationFromEuler( Euler(obj.rotationX, obj.rotationY, obj.rotationZ, obj.rotationOrder.name)) +// } + + setRotationFromEuler( Euler(obj.rotationX, obj.rotationY, obj.rotationZ, obj.rotationOrder.name)) + scale.set(obj.scaleX, obj.scaleY, obj.scaleZ) updateMatrix() } diff --git a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/three.kt b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/three.kt index ea609e58..447cf4b6 100644 --- a/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/three.kt +++ b/visionforge-threejs/src/main/kotlin/space/kscience/visionforge/solid/three/three.kt @@ -4,19 +4,14 @@ import info.laht.threekt.core.BufferGeometry import info.laht.threekt.core.Layers import info.laht.threekt.external.controls.OrbitControls import info.laht.threekt.materials.Material -import info.laht.threekt.math.Euler import info.laht.threekt.math.Vector3 import info.laht.threekt.objects.Mesh import info.laht.threekt.textures.Texture import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.float import space.kscience.dataforge.meta.get -import space.kscience.dataforge.meta.node -import space.kscience.visionforge.solid.* import kotlin.math.PI -public val Solid.euler: Euler get() = Euler(rotationX, rotationY, rotationZ, rotationOrder.name) - public val Meta.vector: Vector3 get() = Vector3(this["x"].float ?: 0f, this["y"].float ?: 0f, this["z"].float ?: 0f) From 9745a5887355e03bbbe0c12e1e48a4091f02a350 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Thu, 20 Jan 2022 11:13:17 +0300 Subject: [PATCH 106/109] Refactor page headers and fragment requirements --- .../kotlin/VisionForgePlayGroundForJupyter.kt | 4 +- .../src/jvmMain/kotlin/allThingsDemo.kt | 276 +++++++++--------- .../src/jvmMain/kotlin/formServer.kt | 14 +- .../src/jvmMain/kotlin/gdmlCubes.kt | 14 +- .../src/jvmMain/kotlin/gdmlCurve.kt | 12 +- .../playground/src/jvmMain/kotlin/gdmlIaxo.kt | 12 +- .../src/jvmMain/kotlin/plotlyVision.kt | 19 +- .../src/jvmMain/kotlin/randomSpheres.kt | 41 ++- .../src/jvmMain/kotlin/rootParser.kt | 9 +- .../src/jvmMain/kotlin/serverExtensions.kt | 27 +- .../src/jvmMain/kotlin/simpleCube.kt | 24 +- demo/playground/src/jvmMain/kotlin/tables.kt | 7 +- .../main/kotlin/ru/mipt/npm/sat/satServer.kt | 22 +- .../visionforge/solid/demo/ThreeDemoApp.kt | 4 +- .../src/jvmMain/kotlin/JupyterPluginBase.kt | 4 +- .../jvmMain/kotlin/VisionForgeForNotebook.kt | 6 +- .../src/jvmMain/kotlin/GdmlForJupyter.kt | 4 +- .../kscience/visionforge/html/HtmlFragment.kt | 7 +- .../visionforge/html/HtmlVisionRenderer.kt | 16 +- .../space/kscience/visionforge/html/Page.kt | 53 ++-- .../visionforge/html/VisionTagConsumer.kt | 64 ++-- .../kscience/visionforge/html/HtmlTagTest.kt | 5 +- .../kscience/visionforge/html/headers.kt | 6 +- .../kscience/visionforge/gdml/gdmlLoader.kt | 5 +- .../visionforge/plotly/VisionOfPlotly.kt | 5 +- .../{three => }/server/VisionServer.kt | 76 ++--- .../kscience/visionforge/solid/Solids.kt | 6 +- .../visionforge/tables/VisionOfTable.kt | 6 +- .../visionforge/three/{server => }/jsMain.kt | 2 +- .../three/server/serverExtensions.kt | 30 -- .../visionforge/three/serverExtensions.kt | 29 ++ 31 files changed, 374 insertions(+), 435 deletions(-) rename visionforge-server/src/main/kotlin/space/kscience/visionforge/{three => }/server/VisionServer.kt (82%) rename visionforge-threejs/visionforge-threejs-server/src/jsMain/kotlin/space/kscience/visionforge/three/{server => }/jsMain.kt (83%) delete mode 100644 visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/server/serverExtensions.kt create mode 100644 visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/serverExtensions.kt diff --git a/demo/playground/src/jvmMain/kotlin/VisionForgePlayGroundForJupyter.kt b/demo/playground/src/jvmMain/kotlin/VisionForgePlayGroundForJupyter.kt index 6cbe311d..651b580d 100644 --- a/demo/playground/src/jvmMain/kotlin/VisionForgePlayGroundForJupyter.kt +++ b/demo/playground/src/jvmMain/kotlin/VisionForgePlayGroundForJupyter.kt @@ -36,13 +36,13 @@ internal class VisionForgePlayGroundForJupyter : JupyterPluginBase( render { gdmlModel -> handler.produceHtml { - vision(gdmlModel.toVision()) + vision { gdmlModel.toVision() } } } render { plot -> handler.produceHtml { - vision(plot.asVision()) + vision { plot.asVision() } } } } diff --git a/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt b/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt index 9c68af8b..23b73af4 100644 --- a/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt +++ b/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt @@ -1,7 +1,6 @@ package space.kscience.visionforge.examples import kotlinx.html.h2 -import space.kscience.dataforge.context.Context import space.kscience.dataforge.values.ValueType import space.kscience.plotly.layout import space.kscience.plotly.models.ScatterMode @@ -10,177 +9,166 @@ import space.kscience.plotly.scatter import space.kscience.tables.ColumnHeader import space.kscience.visionforge.html.ResourceLocation import space.kscience.visionforge.markup.markdown -import space.kscience.visionforge.plotly.PlotlyPlugin import space.kscience.visionforge.plotly.plotly -import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.solid.box import space.kscience.visionforge.solid.solid import space.kscience.visionforge.solid.z -import space.kscience.visionforge.tables.TableVisionPlugin import space.kscience.visionforge.tables.columnTable import java.nio.file.Paths -fun main() { - val context = Context { - plugin(Solids) - plugin(PlotlyPlugin) - plugin(TableVisionPlugin) +fun main() = makeVisionFile( + Paths.get("VisionForgeDemo.html"), + resourceLocation = ResourceLocation.EMBED +) { + markdown { + //language=markdown + """ + # VisionForge + + This is a demo for current VisionForge features. This text is written in [MarkDown](https://github.com/JetBrains/markdown) + """.trimIndent() } - context.makeVisionFile( - Paths.get("VisionForgeDemo.html"), - resourceLocation = ResourceLocation.EMBED - ) { - markdown { - //language=markdown - """ - # VisionForge - - This is a demo for current VisionForge features. This text is written in [MarkDown](https://github.com/JetBrains/markdown) - """.trimIndent() - } - - h2 { +"3D visualization with Three-js" } - vision("3D") { - solid { - box(100, 100, 100, name = "aBox"){ - z = 50.0 - } + h2 { +"3D visualization with Three-js" } + vision("3D") { + solid { + box(100, 100, 100, name = "aBox"){ + z = 50.0 } } + } - h2 { +"Interactive plots with Plotly" } - vision("plot") { - plotly { - scatter { - x(1, 2, 3, 4) - y(10, 15, 13, 17) - mode = ScatterMode.markers - name = "Team A" - text("A-1", "A-2", "A-3", "A-4", "A-5") - textposition = TextPosition.`top center` - textfont { - family = "Raleway, sans-serif" - } - marker { size = 12 } + h2 { +"Interactive plots with Plotly" } + vision("plot") { + plotly { + scatter { + x(1, 2, 3, 4) + y(10, 15, 13, 17) + mode = ScatterMode.markers + name = "Team A" + text("A-1", "A-2", "A-3", "A-4", "A-5") + textposition = TextPosition.`top center` + textfont { + family = "Raleway, sans-serif" } + marker { size = 12 } + } - scatter { - x(2, 3, 4, 5) - y(10, 15, 13, 17) - mode = ScatterMode.lines - name = "Team B" - text("B-a", "B-b", "B-c", "B-d", "B-e") - textposition = TextPosition.`bottom center` - textfont { - family = "Times New Roman" - } - marker { size = 12 } + scatter { + x(2, 3, 4, 5) + y(10, 15, 13, 17) + mode = ScatterMode.lines + name = "Team B" + text("B-a", "B-b", "B-c", "B-d", "B-e") + textposition = TextPosition.`bottom center` + textfont { + family = "Times New Roman" } + marker { size = 12 } + } - layout { - title = "Data Labels Hover" - xaxis { - range(0.75..5.25) - } - legend { - y = 0.5 - font { - family = "Arial, sans-serif" - size = 20 - color("grey") - } + layout { + title = "Data Labels Hover" + xaxis { + range(0.75..5.25) + } + legend { + y = 0.5 + font { + family = "Arial, sans-serif" + size = 20 + color("grey") } } } } - h2 { +"Interactive tables with Tabulator" } - vision("table") { - val x by ColumnHeader.value(ValueType.NUMBER) - val y by ColumnHeader.value(ValueType.NUMBER) - columnTable( - x to listOf(2, 3, 4, 5), - y to listOf(10, 15, 13, 17) - ) - } - markdown { - //language=markdown - """ - ## The code for everything above - ```kotlin - markdown { - //language=markdown - ""${'"'} - # VisionForge - - This is a demo for current VisionForge features. This text is written in [MarkDown](https://github.com/JetBrains/markdown) - ""${'"'}.trimIndent() + } + h2 { +"Interactive tables with Tabulator" } + vision("table") { + val x by ColumnHeader.value(ValueType.NUMBER) + val y by ColumnHeader.value(ValueType.NUMBER) + columnTable( + x to listOf(2, 3, 4, 5), + y to listOf(10, 15, 13, 17) + ) + } + markdown { + //language=markdown + """ + ## The code for everything above + ```kotlin + markdown { + //language=markdown + ""${'"'} + # VisionForge + + This is a demo for current VisionForge features. This text is written in [MarkDown](https://github.com/JetBrains/markdown) + ""${'"'}.trimIndent() + } + + h2 { +"3D visualization with Three-js" } + vision("3D") { + solid { + box(100, 100, 100, name = "aBox") } - - h2 { +"3D visualization with Three-js" } - vision("3D") { - solid { - box(100, 100, 100, name = "aBox") + } + + h2 { +"Interactive plots with Plotly" } + vision("plot") { + plotly { + scatter { + x(1, 2, 3, 4) + y(10, 15, 13, 17) + mode = ScatterMode.markers + name = "Team A" + text("A-1", "A-2", "A-3", "A-4", "A-5") + textposition = TextPosition.`top center` + textfont { + family = "Raleway, sans-serif" + } + marker { size = 12 } } - } - - h2 { +"Interactive plots with Plotly" } - vision("plot") { - plotly { - scatter { - x(1, 2, 3, 4) - y(10, 15, 13, 17) - mode = ScatterMode.markers - name = "Team A" - text("A-1", "A-2", "A-3", "A-4", "A-5") - textposition = TextPosition.`top center` - textfont { - family = "Raleway, sans-serif" - } - marker { size = 12 } + + scatter { + x(2, 3, 4, 5) + y(10, 15, 13, 17) + mode = ScatterMode.lines + name = "Team B" + text("B-a", "B-b", "B-c", "B-d", "B-e") + textposition = TextPosition.`bottom center` + textfont { + family = "Times New Roman" } - - scatter { - x(2, 3, 4, 5) - y(10, 15, 13, 17) - mode = ScatterMode.lines - name = "Team B" - text("B-a", "B-b", "B-c", "B-d", "B-e") - textposition = TextPosition.`bottom center` - textfont { - family = "Times New Roman" - } - marker { size = 12 } + marker { size = 12 } + } + + layout { + title = "Data Labels Hover" + xaxis { + range(0.75..5.25) } - - layout { - title = "Data Labels Hover" - xaxis { - range(0.75..5.25) - } - legend { - y = 0.5 - font { - family = "Arial, sans-serif" - size = 20 - color("grey") - } + legend { + y = 0.5 + font { + family = "Arial, sans-serif" + size = 20 + color("grey") } } } } - h2 { +"Interactive tables with Tabulator" } - vision("table") { - val x by ColumnHeader.value(ValueType.NUMBER) - val y by ColumnHeader.value(ValueType.NUMBER) - columnTable( - x to listOf(2, 3, 4, 5), - y to listOf(10, 15, 13, 17) - ) - } - ``` - """.trimIndent() - } + } + h2 { +"Interactive tables with Tabulator" } + vision("table") { + val x by ColumnHeader.value(ValueType.NUMBER) + val y by ColumnHeader.value(ValueType.NUMBER) + columnTable( + x to listOf(2, 3, 4, 5), + y to listOf(10, 15, 13, 17) + ) + } + ``` + """.trimIndent() } } \ No newline at end of file diff --git a/demo/playground/src/jvmMain/kotlin/formServer.kt b/demo/playground/src/jvmMain/kotlin/formServer.kt index c5276554..7397b6b6 100644 --- a/demo/playground/src/jvmMain/kotlin/formServer.kt +++ b/demo/playground/src/jvmMain/kotlin/formServer.kt @@ -3,21 +3,19 @@ package space.kscience.visionforge.examples import kotlinx.html.* import space.kscience.dataforge.context.Global import space.kscience.dataforge.context.fetch -import space.kscience.dataforge.names.asName import space.kscience.visionforge.VisionManager +import space.kscience.visionforge.html.Page import space.kscience.visionforge.html.formFragment import space.kscience.visionforge.onPropertyChange -import space.kscience.visionforge.three.server.close -import space.kscience.visionforge.three.server.openInBrowser -import space.kscience.visionforge.three.server.serve -import space.kscience.visionforge.three.server.useScript +import space.kscience.visionforge.server.close +import space.kscience.visionforge.server.openInBrowser +import space.kscience.visionforge.server.serve fun main() { val visionManager = Global.fetch(VisionManager) val server = visionManager.serve { - useScript("js/visionforge-playground.js") - page { + page(header = Page.scriptHeader("js/visionforge-playground.js")) { val form = formFragment("form") { label { htmlFor = "fname" @@ -50,7 +48,7 @@ fun main() { } } - vision("form".asName(), form) + vision("form") { form } form.onPropertyChange { println(this) } diff --git a/demo/playground/src/jvmMain/kotlin/gdmlCubes.kt b/demo/playground/src/jvmMain/kotlin/gdmlCubes.kt index 9de22003..d5d483bc 100644 --- a/demo/playground/src/jvmMain/kotlin/gdmlCubes.kt +++ b/demo/playground/src/jvmMain/kotlin/gdmlCubes.kt @@ -1,19 +1,13 @@ package space.kscience.visionforge.examples -import space.kscience.dataforge.context.Context import space.kscience.gdml.GdmlShowCase import space.kscience.visionforge.gdml.toVision import space.kscience.visionforge.html.ResourceLocation import space.kscience.visionforge.solid.Solids -fun main() { - val context = Context { - plugin(Solids) - } - - context.makeVisionFile(resourceLocation = ResourceLocation.SYSTEM){ - vision("canvas") { - GdmlShowCase.cubes().toVision() - } +fun main() = makeVisionFile(resourceLocation = ResourceLocation.SYSTEM){ + vision("canvas") { + requirePlugin(Solids) + GdmlShowCase.cubes().toVision() } } \ No newline at end of file diff --git a/demo/playground/src/jvmMain/kotlin/gdmlCurve.kt b/demo/playground/src/jvmMain/kotlin/gdmlCurve.kt index 1a646d97..81facd71 100644 --- a/demo/playground/src/jvmMain/kotlin/gdmlCurve.kt +++ b/demo/playground/src/jvmMain/kotlin/gdmlCurve.kt @@ -1,6 +1,5 @@ package space.kscience.visionforge.examples -import space.kscience.dataforge.context.Context import space.kscience.gdml.* import space.kscience.visionforge.gdml.toVision import space.kscience.visionforge.html.ResourceLocation @@ -10,13 +9,9 @@ import space.kscience.visionforge.solid.invoke import space.kscience.visionforge.visible import java.nio.file.Path -fun main() { - val context = Context { - plugin(Solids) - } - - context.makeVisionFile(Path.of("curves.html"), resourceLocation = ResourceLocation.EMBED) { +fun main() = makeVisionFile(Path.of("curves.html"), resourceLocation = ResourceLocation.EMBED) { vision("canvas") { + requirePlugin(Solids) Gdml { // geometry variables val worldSize = 500 @@ -240,5 +235,4 @@ fun main() { } } } - } -} \ No newline at end of file + } \ No newline at end of file diff --git a/demo/playground/src/jvmMain/kotlin/gdmlIaxo.kt b/demo/playground/src/jvmMain/kotlin/gdmlIaxo.kt index a9070af7..6ee718a2 100644 --- a/demo/playground/src/jvmMain/kotlin/gdmlIaxo.kt +++ b/demo/playground/src/jvmMain/kotlin/gdmlIaxo.kt @@ -1,16 +1,12 @@ package space.kscience.visionforge.examples -import space.kscience.dataforge.context.Context import space.kscience.gdml.GdmlShowCase import space.kscience.visionforge.gdml.toVision import space.kscience.visionforge.solid.Solids -fun main() { - val context = Context { - plugin(Solids) - } - - context.makeVisionFile { - vision("canvas") { GdmlShowCase.babyIaxo().toVision() } +fun main() = makeVisionFile { + vision("canvas") { + requirePlugin(Solids) + GdmlShowCase.babyIaxo().toVision() } } \ No newline at end of file diff --git a/demo/playground/src/jvmMain/kotlin/plotlyVision.kt b/demo/playground/src/jvmMain/kotlin/plotlyVision.kt index 4575b952..4b91c352 100644 --- a/demo/playground/src/jvmMain/kotlin/plotlyVision.kt +++ b/demo/playground/src/jvmMain/kotlin/plotlyVision.kt @@ -1,22 +1,15 @@ package space.kscience.visionforge.examples -import space.kscience.dataforge.context.Context import space.kscience.plotly.scatter import space.kscience.visionforge.html.ResourceLocation -import space.kscience.visionforge.plotly.PlotlyPlugin import space.kscience.visionforge.plotly.plotly -fun main() { - val context = Context { - plugin(PlotlyPlugin) - } - context.makeVisionFile(resourceLocation = ResourceLocation.SYSTEM){ - vision { - plotly { - scatter { - x(1, 2, 3) - y(5, 8, 7) - } +fun main() = makeVisionFile(resourceLocation = ResourceLocation.SYSTEM) { + vision { + plotly { + scatter { + x(1, 2, 3) + y(5, 8, 7) } } } diff --git a/demo/playground/src/jvmMain/kotlin/randomSpheres.kt b/demo/playground/src/jvmMain/kotlin/randomSpheres.kt index 0185bdc8..2d9a5f05 100644 --- a/demo/playground/src/jvmMain/kotlin/randomSpheres.kt +++ b/demo/playground/src/jvmMain/kotlin/randomSpheres.kt @@ -2,37 +2,30 @@ package space.kscience.visionforge.examples import kotlinx.html.div import kotlinx.html.h1 -import space.kscience.dataforge.context.Context import space.kscience.visionforge.html.ResourceLocation import space.kscience.visionforge.solid.* import java.nio.file.Paths import kotlin.random.Random -fun main() { - val context = Context { - plugin(Solids) - } +private val random = Random(112233) - val random = Random(112233) - - context.makeVisionFile( - Paths.get("randomSpheres.html"), - resourceLocation = ResourceLocation.SYSTEM - ) { - h1 { +"Happy new year!" } - div { - vision { - solid { - repeat(100) { - sphere(5, name = "sphere[$it]") { - x = random.nextDouble(-300.0, 300.0) - y = random.nextDouble(-300.0, 300.0) - z = random.nextDouble(-300.0, 300.0) - material { - color(random.nextInt()) - } - detail = 16 +fun main() = makeVisionFile( + Paths.get("randomSpheres.html"), + resourceLocation = ResourceLocation.SYSTEM +) { + h1 { +"Happy new year!" } + div { + vision { + solid { + repeat(100) { + sphere(5, name = "sphere[$it]") { + x = random.nextDouble(-300.0, 300.0) + y = random.nextDouble(-300.0, 300.0) + z = random.nextDouble(-300.0, 300.0) + material { + color(random.nextInt()) } + detail = 16 } } } diff --git a/demo/playground/src/jvmMain/kotlin/rootParser.kt b/demo/playground/src/jvmMain/kotlin/rootParser.kt index afe8528f..184557da 100644 --- a/demo/playground/src/jvmMain/kotlin/rootParser.kt +++ b/demo/playground/src/jvmMain/kotlin/rootParser.kt @@ -3,7 +3,6 @@ package space.kscience.visionforge.examples import ru.mipt.npm.root.DGeoManager import ru.mipt.npm.root.serialization.TGeoManager import ru.mipt.npm.root.toSolid -import space.kscience.dataforge.context.Context import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.isLeaf @@ -22,11 +21,6 @@ private fun Meta.countTypes(): Sequence = sequence { } fun main() { - val context = Context { - plugin(Solids) - } - - val string = ZipInputStream(TGeoManager::class.java.getResourceAsStream("/root/BM@N_geometry.zip")!!).use { it.nextEntry it.readAllBytes().decodeToString() @@ -45,8 +39,9 @@ fun main() { Paths.get("BM@N.vf.json").writeText(Solids.encodeToString(solid)) //println(Solids.encodeToString(solid)) - context.makeVisionFile { + makeVisionFile { vision("canvas") { + requirePlugin(Solids) solid } } diff --git a/demo/playground/src/jvmMain/kotlin/serverExtensions.kt b/demo/playground/src/jvmMain/kotlin/serverExtensions.kt index 62d318ad..e8be7112 100644 --- a/demo/playground/src/jvmMain/kotlin/serverExtensions.kt +++ b/demo/playground/src/jvmMain/kotlin/serverExtensions.kt @@ -1,34 +1,25 @@ package space.kscience.visionforge.examples -import space.kscience.dataforge.context.Context -import space.kscience.dataforge.misc.DFExperimental +import space.kscience.dataforge.context.Global +import space.kscience.visionforge.html.HtmlVisionFragment +import space.kscience.visionforge.html.Page import space.kscience.visionforge.html.ResourceLocation -import space.kscience.visionforge.html.VisionTagConsumer -import space.kscience.visionforge.html.page -import space.kscience.visionforge.html.scriptHeader +import space.kscience.visionforge.html.importScriptHeader import space.kscience.visionforge.makeFile -import space.kscience.visionforge.three.server.VisionServer -import space.kscience.visionforge.three.server.useScript -import space.kscience.visionforge.visionManager import java.awt.Desktop import java.nio.file.Path - -public fun VisionServer.usePlayground(): Unit { - useScript("js/visionforge-playground.js") -} - -@OptIn(DFExperimental::class) -public fun Context.makeVisionFile( +public fun makeVisionFile( path: Path? = null, title: String = "VisionForge page", resourceLocation: ResourceLocation = ResourceLocation.SYSTEM, show: Boolean = true, - content: VisionTagConsumer<*>.() -> Unit, + content: HtmlVisionFragment, ): Unit { - val actualPath = visionManager.page(title, content = content).makeFile(path) { actualPath -> + val actualPath = Page(Global, content = content).makeFile(path) { actualPath -> mapOf( - "playground" to scriptHeader("js/visionforge-playground.js", resourceLocation, actualPath), + "title" to Page.title(title), + "playground" to Page.importScriptHeader("js/visionforge-playground.js", resourceLocation, actualPath), ) } if (show) Desktop.getDesktop().browse(actualPath.toFile().toURI()) diff --git a/demo/playground/src/jvmMain/kotlin/simpleCube.kt b/demo/playground/src/jvmMain/kotlin/simpleCube.kt index f804228b..e1fc91eb 100644 --- a/demo/playground/src/jvmMain/kotlin/simpleCube.kt +++ b/demo/playground/src/jvmMain/kotlin/simpleCube.kt @@ -1,21 +1,17 @@ package space.kscience.visionforge.examples -import space.kscience.dataforge.context.Context import space.kscience.visionforge.html.ResourceLocation -import space.kscience.visionforge.solid.* +import space.kscience.visionforge.solid.box +import space.kscience.visionforge.solid.invoke +import space.kscience.visionforge.solid.material +import space.kscience.visionforge.solid.solid -fun main() { - val context = Context { - plugin(Solids) - } - - context.makeVisionFile(resourceLocation = ResourceLocation.SYSTEM){ - vision("canvas") { - solid { - box(100, 100, 100) - material { - emissiveColor("red") - } +fun main() = makeVisionFile(resourceLocation = ResourceLocation.SYSTEM) { + vision("canvas") { + solid { + box(100, 100, 100) + material { + emissiveColor("red") } } } diff --git a/demo/playground/src/jvmMain/kotlin/tables.kt b/demo/playground/src/jvmMain/kotlin/tables.kt index c386ffda..46cad89d 100644 --- a/demo/playground/src/jvmMain/kotlin/tables.kt +++ b/demo/playground/src/jvmMain/kotlin/tables.kt @@ -1,22 +1,17 @@ package space.kscience.visionforge.examples -import space.kscience.dataforge.context.Context import space.kscience.dataforge.values.ValueType import space.kscience.tables.ColumnHeader import space.kscience.tables.valueRow import space.kscience.visionforge.html.ResourceLocation -import space.kscience.visionforge.tables.TableVisionPlugin import space.kscience.visionforge.tables.table import kotlin.math.pow fun main() { - val context = Context { - plugin(TableVisionPlugin) - } val x by ColumnHeader.value(ValueType.NUMBER) val y by ColumnHeader.value(ValueType.NUMBER) - context.makeVisionFile(resourceLocation = ResourceLocation.SYSTEM) { + makeVisionFile(resourceLocation = ResourceLocation.SYSTEM) { vision { table(x, y) { repeat(100) { diff --git a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt index 93f2ec7c..fbacc5b1 100644 --- a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt +++ b/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt @@ -1,19 +1,22 @@ package ru.mipt.npm.sat -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.delay -import kotlinx.coroutines.isActive -import kotlinx.coroutines.launch +import kotlinx.coroutines.* import kotlinx.html.div import kotlinx.html.h1 import space.kscience.dataforge.context.Context import space.kscience.dataforge.names.Name +import space.kscience.visionforge.html.Page +import space.kscience.visionforge.html.plus +import space.kscience.visionforge.server.close +import space.kscience.visionforge.server.openInBrowser +import space.kscience.visionforge.server.serve import space.kscience.visionforge.solid.* -import space.kscience.visionforge.three.server.* +import space.kscience.visionforge.three.threeJsHeader import space.kscience.visionforge.visionManager import kotlin.random.Random + fun main() { val satContext = Context("sat") { plugin(Solids) @@ -23,20 +26,17 @@ fun main() { val sat = visionOfSatellite(ySegments = 3) val server = satContext.visionManager.serve { - //use client library - useThreeJs() - //use css - useCss("css/styles.css") - page { + page(header = Page.threeJsHeader + Page.styleSheetHeader("css/styles.css")) { div("flex-column") { h1 { +"Satellite detector demo" } - vision(sat) + vision { sat } } } } server.openInBrowser() + @OptIn(DelicateCoroutinesApi::class) GlobalScope.launch { while (isActive) { val randomLayer = Random.nextInt(1, 11) diff --git a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/ThreeDemoApp.kt b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/ThreeDemoApp.kt index db6ebbff..eb27f4d6 100644 --- a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/ThreeDemoApp.kt +++ b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/ThreeDemoApp.kt @@ -1,7 +1,6 @@ package space.kscience.visionforge.solid.demo import kotlinx.browser.document -import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.delay import kotlinx.coroutines.isActive import kotlinx.coroutines.launch @@ -30,7 +29,8 @@ private class ThreeDemoApp : Application { } } } - GlobalScope.launch { + + launch { while (isActive) { delay(500) boxes.forEach { box -> diff --git a/jupyter/src/jvmMain/kotlin/JupyterPluginBase.kt b/jupyter/src/jvmMain/kotlin/JupyterPluginBase.kt index 4eb4c9f7..2fbe51c8 100644 --- a/jupyter/src/jvmMain/kotlin/JupyterPluginBase.kt +++ b/jupyter/src/jvmMain/kotlin/JupyterPluginBase.kt @@ -44,7 +44,7 @@ public abstract class JupyterPluginBase(final override val context: Context) : J render { vision -> handler.produceHtml { - vision(vision) + vision { vision } } } @@ -62,7 +62,7 @@ public abstract class JupyterPluginBase(final override val context: Context) : J } } fragment(fragment.formBody) - vision(fragment.vision) + vision { fragment.vision } } } diff --git a/jupyter/src/jvmMain/kotlin/VisionForgeForNotebook.kt b/jupyter/src/jvmMain/kotlin/VisionForgeForNotebook.kt index 8b17bc82..a91733ce 100644 --- a/jupyter/src/jvmMain/kotlin/VisionForgeForNotebook.kt +++ b/jupyter/src/jvmMain/kotlin/VisionForgeForNotebook.kt @@ -18,8 +18,8 @@ import space.kscience.dataforge.meta.string import space.kscience.visionforge.html.HtmlFormFragment import space.kscience.visionforge.html.HtmlVisionFragment import space.kscience.visionforge.html.visionFragment -import space.kscience.visionforge.three.server.VisionServer -import space.kscience.visionforge.three.server.serve +import space.kscience.visionforge.server.VisionServer +import space.kscience.visionforge.server.serve import space.kscience.visionforge.visionManager /** @@ -75,7 +75,7 @@ public class VisionForgeForNotebook(override val context: Context) : ContextAwar fragment: HtmlVisionFragment, ): String = server?.serveVisionsFromFragment("content[${counter++}]", fragment) ?: createHTML().apply { - visionFragment(context.visionManager, fragment = fragment) + visionFragment(context, fragment = fragment) }.finalize() public fun produceHtml(isolated: Boolean? = null, fragment: HtmlVisionFragment): MimeTypedResult = diff --git a/jupyter/visionforge-jupyter-gdml/src/jvmMain/kotlin/GdmlForJupyter.kt b/jupyter/visionforge-jupyter-gdml/src/jvmMain/kotlin/GdmlForJupyter.kt index 9dc95d6d..0a112ba2 100644 --- a/jupyter/visionforge-jupyter-gdml/src/jvmMain/kotlin/GdmlForJupyter.kt +++ b/jupyter/visionforge-jupyter-gdml/src/jvmMain/kotlin/GdmlForJupyter.kt @@ -29,7 +29,9 @@ internal class GdmlForJupyter : JupyterPluginBase( ) render { gdmlModel -> - handler.produceHtml { vision(gdmlModel.toVision()) } + handler.produceHtml { + vision { gdmlModel.toVision() } + } } } } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlFragment.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlFragment.kt index 343a29ce..b733e6a4 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlFragment.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlFragment.kt @@ -6,7 +6,7 @@ import kotlinx.html.stream.createHTML public typealias HtmlFragment = TagConsumer<*>.() -> Unit -public fun HtmlFragment.render(): String = createHTML().apply(this).finalize() +public fun HtmlFragment.renderToString(): String = createHTML().apply(this).finalize() public fun TagConsumer<*>.fragment(fragment: HtmlFragment) { fragment() @@ -14,4 +14,9 @@ public fun TagConsumer<*>.fragment(fragment: HtmlFragment) { public fun FlowContent.fragment(fragment: HtmlFragment) { fragment(consumer) +} + +public operator fun HtmlFragment.plus(other: HtmlFragment): HtmlFragment = { + this@plus() + other() } \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt index 6ec98684..f5abdf42 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt @@ -1,6 +1,8 @@ package space.kscience.visionforge.html import kotlinx.html.* +import space.kscience.dataforge.context.Context +import space.kscience.dataforge.context.Global import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name @@ -28,7 +30,7 @@ internal const val RENDER_FUNCTION_NAME = "renderAllVisionsById" * @param renderScript if true add rendering script after the fragment */ public fun TagConsumer<*>.visionFragment( - manager: VisionManager, + context: Context = Global, embedData: Boolean = true, fetchDataUrl: String? = null, fetchUpdatesUrl: String? = null, @@ -37,8 +39,8 @@ public fun TagConsumer<*>.visionFragment( fragment: HtmlVisionFragment, ): Map { val visionMap = HashMap() - val consumer = object : VisionTagConsumer(this@visionFragment, manager, idPrefix) { - override fun DIV.renderVision(name: Name, vision: Vision, outputMeta: Meta) { + val consumer = object : VisionTagConsumer(this@visionFragment, context, idPrefix) { + override fun DIV.renderVision(manager: VisionManager, name: Name, vision: Vision, outputMeta: Meta) { visionMap[name] = vision // Toggle update mode @@ -78,19 +80,19 @@ public fun TagConsumer<*>.visionFragment( } public fun FlowContent.visionFragment( - manager: VisionManager, + context: Context = Global, embedData: Boolean = true, fetchDataUrl: String? = null, fetchUpdatesUrl: String? = null, idPrefix: String? = null, - renderSctipt: Boolean = true, + renderScript: Boolean = true, fragment: HtmlVisionFragment, ): Map = consumer.visionFragment( - manager, + context, embedData, fetchDataUrl, fetchUpdatesUrl, idPrefix, - renderSctipt, + renderScript, fragment ) \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/Page.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/Page.kt index d575208e..bdd5e417 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/Page.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/Page.kt @@ -1,37 +1,52 @@ package space.kscience.visionforge.html import kotlinx.html.* -import space.kscience.dataforge.misc.DFExperimental -import space.kscience.visionforge.VisionManager - -//data class HeaderContainer +import space.kscience.dataforge.context.Context public data class Page( - public val visionManager: VisionManager, - public val title: String, - public val headers: Map, + public val context: Context, + public val headers: Map = emptyMap(), public val content: HtmlVisionFragment, ) { public fun render(root: TagConsumer): R = root.apply { head { meta { charset = "utf-8" - headers.values.forEach { - fragment(it) - } } - title(this@Page.title) + headers.values.forEach { + fragment(it) + } } body { - visionFragment(visionManager, fragment = content) + visionFragment(context, fragment = content) } }.finalize() -} + public companion object{ + /** + * Use a script with given [src] as a global header for all pages. + */ + public fun scriptHeader(src: String, block: SCRIPT.() -> Unit = {}): HtmlFragment = { + script { + type = "text/javascript" + this.src = src + block() + } + } -@DFExperimental -public fun VisionManager.page( - title: String = "VisionForge page", - vararg headers: Pair, - content: HtmlVisionFragment, -): Page = Page(this, title, mapOf(*headers), content) \ No newline at end of file + /** + * Use css with given stylesheet link as a global header for all pages. + */ + public fun styleSheetHeader(href: String, block: LINK.() -> Unit = {}): HtmlFragment = { + link { + rel = "stylesheet" + this.href = href + block() + } + } + + public fun title(title:String): HtmlFragment = { + title(title) + } + } +} \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt index 7a17f0f5..afdd686f 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt @@ -1,6 +1,8 @@ package space.kscience.visionforge.html import kotlinx.html.* +import space.kscience.dataforge.context.Context +import space.kscience.dataforge.context.PluginFactory import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.MetaSerializer import space.kscience.dataforge.meta.MutableMeta @@ -9,9 +11,12 @@ import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.NameToken import space.kscience.dataforge.names.asName +import space.kscience.dataforge.names.parseAsName import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionManager +import space.kscience.visionforge.html.VisionTagConsumer.Companion.DEFAULT_VISION_NAME import space.kscience.visionforge.setAsRoot +import space.kscience.visionforge.visionManager import kotlin.collections.set @DslMarker @@ -22,10 +27,25 @@ public annotation class VisionDSL */ @DFExperimental @VisionDSL -public class VisionOutput @PublishedApi internal constructor(public val manager: VisionManager) { +public class VisionOutput @PublishedApi internal constructor(public val context: Context, public val name: Name?) { public var meta: Meta = Meta.EMPTY - //TODO expose a way to define required plugins. + private val requirements: MutableSet> = HashSet() + + public fun requirePlugin(factory: PluginFactory<*>) { + requirements.add(factory) + } + + internal fun buildVisionManager(): VisionManager = + if (requirements.all { req -> context.plugins.find(true) { it.tag == req.tag } != null }) { + context.visionManager + } else { + val newContext = context.buildContext(NameToken(DEFAULT_VISION_NAME, name.toString()).asName()) { + plugin(VisionManager) + requirements.forEach { plugin(it) } + } + newContext.visionManager + } public inline fun meta(block: MutableMeta.() -> Unit) { this.meta = Meta(block) @@ -36,9 +56,10 @@ public class VisionOutput @PublishedApi internal constructor(public val manager: * Modified [TagConsumer] that allows rendering output fragments and visions in them */ @VisionDSL +@OptIn(DFExperimental::class) public abstract class VisionTagConsumer( private val root: TagConsumer, - public val manager: VisionManager, + public val context: Context, private val idPrefix: String? = null, ) : TagConsumer by root { @@ -46,23 +67,26 @@ public abstract class VisionTagConsumer( /** * Render a vision inside the output fragment + * @param manager a [VisionManager] to be used in renderer * @param name name of the output container * @param vision an object to be rendered * @param outputMeta optional configuration for the output container */ - protected abstract fun DIV.renderVision(name: Name, vision: Vision, outputMeta: Meta) + protected abstract fun DIV.renderVision(manager: VisionManager, name: Name, vision: Vision, outputMeta: Meta) /** * Create a placeholder for a vision output with optional [Vision] in it * TODO with multi-receivers could be replaced by [VisionTagConsumer, TagConsumer] extension */ - public fun TagConsumer.vision( + private fun TagConsumer.vision( name: Name, - vision: Vision? = null, + manager: VisionManager, + vision: Vision, outputMeta: Meta = Meta.EMPTY, ): T = div { id = resolveId(name) classes = setOf(OUTPUT_CLASS) + vision.setAsRoot(manager) attributes[OUTPUT_NAME_ATTRIBUTE] = name.toString() if (!outputMeta.isEmpty()) { //Hard-code output configuration @@ -73,9 +97,7 @@ public abstract class VisionTagConsumer( } } } - vision?.let { - renderVision(name, it, outputMeta) - } + renderVision(manager, name, vision, outputMeta) } /** @@ -83,14 +105,14 @@ public abstract class VisionTagConsumer( * TODO replace by multi-receiver */ @OptIn(DFExperimental::class) - public inline fun TagConsumer.vision( - name: Name, + public fun TagConsumer.vision( + name: Name? = null, @OptIn(DFExperimental::class) visionProvider: VisionOutput.() -> Vision, ): T { - val output = VisionOutput(manager) + val output = VisionOutput(context, name) val vision = output.visionProvider() - vision.setAsRoot(manager) - return vision(name, vision, output.meta) + val actualName = name ?: NameToken(DEFAULT_VISION_NAME, vision.hashCode().toUInt().toString()).asName() + return vision(actualName, output.buildVisionManager(), vision, output.meta) } /** @@ -98,14 +120,10 @@ public abstract class VisionTagConsumer( */ @OptIn(DFExperimental::class) @VisionDSL - public inline fun TagConsumer.vision( - name: String = DEFAULT_VISION_NAME, - visionProvider: VisionOutput.() -> Vision, - ): T = vision(Name.parse(name), visionProvider) - public fun TagConsumer.vision( - vision: Vision, - ): T = vision(NameToken("vision", vision.hashCode().toString()).asName(), vision) + name: String?, + @OptIn(DFExperimental::class) visionProvider: VisionOutput.() -> Vision, + ): T = vision(name?.parseAsName(), visionProvider) /** * Process the resulting object produced by [TagConsumer] @@ -114,9 +132,7 @@ public abstract class VisionTagConsumer( //do nothing by default } - override fun finalize(): R { - return root.finalize().also { processResult(it) } - } + override fun finalize(): R = root.finalize().also { processResult(it) } public companion object { public const val OUTPUT_CLASS: String = "visionforge-output" diff --git a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt index d6cd8dd1..42a9ba1f 100644 --- a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt +++ b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt @@ -3,7 +3,6 @@ package space.kscience.visionforge.html import kotlinx.html.* import kotlinx.html.stream.createHTML import space.kscience.dataforge.context.Global -import space.kscience.dataforge.context.fetch import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.configure import space.kscience.dataforge.meta.set @@ -23,8 +22,8 @@ fun FlowContent.renderVisionFragment( fragment: HtmlVisionFragment, ): Map { val visionMap = HashMap() - val consumer = object : VisionTagConsumer(consumer, Global.fetch(VisionManager), idPrefix) { - override fun DIV.renderVision(name: Name, vision: Vision, outputMeta: Meta) { + val consumer = object : VisionTagConsumer(consumer, Global, idPrefix) { + override fun DIV.renderVision(manager: VisionManager, name: Name, vision: Vision, outputMeta: Meta) { visionMap[name] = vision renderer(name, vision, outputMeta) } diff --git a/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/headers.kt b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/headers.kt index 9837c60a..d8be2a39 100644 --- a/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/headers.kt +++ b/visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html/headers.kt @@ -4,7 +4,6 @@ import kotlinx.html.link import kotlinx.html.script import kotlinx.html.unsafe import org.slf4j.LoggerFactory -import space.kscience.dataforge.misc.DFExperimental import space.kscience.visionforge.VisionManager import java.nio.file.Files import java.nio.file.Path @@ -113,10 +112,9 @@ internal fun fileCssHeader( } /** - * Make a script header, automatically copying file to appropriate location + * Make a script header from a resource file, automatically copying file to appropriate location */ -@DFExperimental -public fun scriptHeader( +public fun Page.Companion.importScriptHeader( scriptResource: String, resourceLocation: ResourceLocation, htmlPath: Path? = null, diff --git a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt index d1b89c9e..f80a5511 100644 --- a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt +++ b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/gdmlLoader.kt @@ -390,4 +390,7 @@ public fun SolidGroup.gdml(gdml: Gdml, key: String? = null, transformer: GdmlLoa @VisionBuilder @DFExperimental -public inline fun VisionOutput.gdml(block: Gdml.() -> Unit): SolidGroup = Gdml(block).toVision() \ No newline at end of file +public inline fun VisionOutput.gdml(block: Gdml.() -> Unit): SolidGroup { + requirePlugin(Solids) + return Gdml(block).toVision() +} \ No newline at end of file diff --git a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt index eaa94573..ebb4773c 100644 --- a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt +++ b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt @@ -24,4 +24,7 @@ public fun Plot.asVision(): VisionOfPlotly = VisionOfPlotly(this) @DFExperimental public inline fun VisionOutput.plotly( block: Plot.() -> Unit, -): VisionOfPlotly = VisionOfPlotly(Plotly.plot(block)) \ No newline at end of file +): VisionOfPlotly { + requirePlugin(PlotlyPlugin) + return VisionOfPlotly(Plotly.plot(block)) +} \ No newline at end of file diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt similarity index 82% rename from visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt rename to visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt index b5b78ba0..2abb6efb 100644 --- a/visionforge-server/src/main/kotlin/space/kscience/visionforge/three/server/VisionServer.kt +++ b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt @@ -1,4 +1,4 @@ -package space.kscience.visionforge.three.server +package space.kscience.visionforge.server import io.ktor.application.* import io.ktor.features.CORS @@ -14,9 +14,9 @@ import io.ktor.routing.* import io.ktor.server.cio.CIO import io.ktor.server.engine.ApplicationEngine import io.ktor.server.engine.embeddedServer +import io.ktor.util.getOrFail import io.ktor.websocket.WebSockets import io.ktor.websocket.webSocket -import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.channels.consumeEach import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch @@ -32,9 +32,8 @@ import space.kscience.visionforge.VisionManager import space.kscience.visionforge.flowChanges import space.kscience.visionforge.html.HtmlFragment import space.kscience.visionforge.html.HtmlVisionFragment -import space.kscience.visionforge.html.fragment import space.kscience.visionforge.html.visionFragment -import space.kscience.visionforge.three.server.VisionServer.Companion.DEFAULT_PAGE +import space.kscience.visionforge.server.VisionServer.Companion.DEFAULT_PAGE import java.awt.Desktop import java.net.URI import kotlin.time.Duration.Companion.milliseconds @@ -48,7 +47,10 @@ public class VisionServer internal constructor( private val visionManager: VisionManager, private val serverUrl: Url, private val root: Route, -) : Configurable, CoroutineScope by root.application { +) : Configurable { + + public val application: Application get() = root.application + override val meta: ObservableMutableMeta = MutableMeta() /** @@ -76,22 +78,10 @@ public class VisionServer internal constructor( */ public var dataUpdate: Boolean by meta.boolean(true, Name.parse("data.update")) - /** - * a list of headers that should be applied to all pages - */ - private val globalHeaders: ArrayList = ArrayList() - - /** - * Add a header to all pages produced by this server - */ - public fun header(block: TagConsumer<*>.() -> Unit) { - globalHeaders.add(block) - } - private fun HTML.visionPage( title: String, pagePath: String, - headers: List, + header: HtmlFragment, visionFragment: HtmlVisionFragment, ): Map { var visionMap: Map? = null @@ -99,16 +89,14 @@ public class VisionServer internal constructor( head { meta { charset = "utf-8" - (globalHeaders + headers).forEach { - fragment(it) - } + header() } title(title) } body { //Load the fragment and remember all loaded visions visionMap = visionFragment( - manager = visionManager, + context = visionManager.context, embedData = true, fetchUpdatesUrl = "$serverUrl$pagePath/ws", fragment = visionFragment @@ -127,9 +115,7 @@ public class VisionServer internal constructor( //Update websocket webSocket("ws") { - val name: String = call.request.queryParameters["name"] - ?: error("Vision name is not defined in parameters") - + val name: String = call.request.queryParameters.getOrFail("name") application.log.debug("Opened server socket for $name") val vision: Vision = visions[Name.parse(name)] ?: error("Plot with id='$name' not registered") @@ -158,8 +144,7 @@ public class VisionServer internal constructor( } //Plots in their json representation get("data") { - val name: String = call.request.queryParameters["name"] - ?: error("Vision name is not defined in parameters") + val name: String = call.request.queryParameters.getOrFail("name") val vision: Vision? = visions[Name.parse(name)] if (vision == null) { @@ -178,7 +163,7 @@ public class VisionServer internal constructor( /** * Serve visions in a given [route] without providing a page template */ - public fun serveVisions(route: String, visions: Map): Unit { + public fun serveVisions(route: String, visions: Map) { root.route(route) { serveVisions(this, visions) } @@ -192,7 +177,7 @@ public class VisionServer internal constructor( fragment: HtmlVisionFragment, ): String = createHTML().apply { val visions = visionFragment( - visionManager, + visionManager.context, embedData = true, fetchUpdatesUrl = "$serverUrl$route/ws", renderScript = true, @@ -203,12 +188,11 @@ public class VisionServer internal constructor( /** * Serve a page, potentially containing any number of visions at a given [pagePath] with given [headers]. - * */ public fun page( pagePath: String = DEFAULT_PAGE, title: String = "VisionForge server page '$pagePath'", - headers: List = emptyList(), + header: HtmlFragment = {}, visionFragment: HtmlVisionFragment, ) { val visions = HashMap() @@ -216,7 +200,7 @@ public class VisionServer internal constructor( val cachedHtml: String? = if (cacheFragments) { //Create and cache page html and map of visions createHTML(true).html { - visions.putAll(visionPage(title, pagePath, headers, visionFragment)) + visions.putAll(visionPage(title, pagePath, header, visionFragment)) } } else { null @@ -230,7 +214,7 @@ public class VisionServer internal constructor( //re-create html and vision list on each call call.respondHtml { visions.clear() - visions.putAll(visionPage(title, pagePath, headers, visionFragment)) + visions.putAll(visionPage(title, pagePath, header, visionFragment)) } } else { //Use cached html @@ -249,32 +233,6 @@ public class VisionServer internal constructor( } } -/** - * Use a script with given [src] as a global header for all pages. - */ -public inline fun VisionServer.useScript(src: String, crossinline block: SCRIPT.() -> Unit = {}) { - header { - script { - type = "text/javascript" - this.src = src - block() - } - } -} - -/** - * Use css with given stylesheet link as a global header for all pages. - */ -public inline fun VisionServer.useCss(href: String, crossinline block: LINK.() -> Unit = {}) { - header { - link { - rel = "stylesheet" - this.href = href - block() - } - } -} - /** * Attach VisionForge server application to given server */ diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt index c5b9b04b..12a22ab6 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solids.kt @@ -69,5 +69,7 @@ public class Solids(meta: Meta) : VisionPlugin(meta) { @VisionBuilder @DFExperimental -public inline fun VisionOutput.solid(block: SolidGroup.() -> Unit): SolidGroup = - SolidGroup().apply(block) +public inline fun VisionOutput.solid(block: SolidGroup.() -> Unit): SolidGroup { + requirePlugin(Solids) + return SolidGroup().apply(block) +} diff --git a/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt b/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt index a3147236..95888f67 100644 --- a/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt +++ b/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt @@ -87,7 +87,10 @@ public fun Table.toVision(): VisionOfTable = toVision { (it ?: Double.Na public inline fun VisionOutput.table( vararg headers: ColumnHeader, block: MutableRowTable.() -> Unit, -): VisionOfTable = RowTable(*headers, block = block).toVision() +): VisionOfTable { + requirePlugin(TableVisionPlugin) + return RowTable(*headers, block = block).toVision() +} @DFExperimental public inline fun VisionOutput.columnTable( @@ -99,6 +102,7 @@ public inline fun VisionOutput.columnTable( public fun VisionOutput.columnTable( vararg dataAndHeaders: Pair, List>, ): VisionOfTable { + requirePlugin(TableVisionPlugin) val columns = dataAndHeaders.map { (header, data) -> ListColumn(header, data.map { Value.of(it) }) } diff --git a/visionforge-threejs/visionforge-threejs-server/src/jsMain/kotlin/space/kscience/visionforge/three/server/jsMain.kt b/visionforge-threejs/visionforge-threejs-server/src/jsMain/kotlin/space/kscience/visionforge/three/jsMain.kt similarity index 83% rename from visionforge-threejs/visionforge-threejs-server/src/jsMain/kotlin/space/kscience/visionforge/three/server/jsMain.kt rename to visionforge-threejs/visionforge-threejs-server/src/jsMain/kotlin/space/kscience/visionforge/three/jsMain.kt index d6d191f0..ed2908f5 100644 --- a/visionforge-threejs/visionforge-threejs-server/src/jsMain/kotlin/space/kscience/visionforge/three/server/jsMain.kt +++ b/visionforge-threejs/visionforge-threejs-server/src/jsMain/kotlin/space/kscience/visionforge/three/jsMain.kt @@ -1,4 +1,4 @@ -package space.kscience.visionforge.three.server +package space.kscience.visionforge.three import space.kscience.dataforge.misc.DFExperimental import space.kscience.visionforge.runVisionClient diff --git a/visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/server/serverExtensions.kt b/visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/server/serverExtensions.kt deleted file mode 100644 index d6656c46..00000000 --- a/visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/server/serverExtensions.kt +++ /dev/null @@ -1,30 +0,0 @@ -package space.kscience.visionforge.three.server - -import space.kscience.dataforge.misc.DFExperimental -import space.kscience.visionforge.VisionManager -import space.kscience.visionforge.html.HtmlVisionFragment -import space.kscience.visionforge.html.ResourceLocation -import space.kscience.visionforge.html.page -import space.kscience.visionforge.html.scriptHeader -import space.kscience.visionforge.makeFile -import java.awt.Desktop -import java.nio.file.Path - - -public fun VisionServer.useThreeJs(): Unit { - useScript("js/visionforge-three.js") -} - -@DFExperimental -public fun VisionManager.makeThreeJsFile( - content: HtmlVisionFragment, - path: Path? = null, - title: String = "VisionForge page", - resourceLocation: ResourceLocation = ResourceLocation.SYSTEM, - show: Boolean = true, -): Unit { - val actualPath = page(title, content = content).makeFile(path) { actualPath -> - mapOf("threeJs" to scriptHeader("js/visionforge-three.js", resourceLocation, actualPath)) - } - if (show) Desktop.getDesktop().browse(actualPath.toFile().toURI()) -} diff --git a/visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/serverExtensions.kt b/visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/serverExtensions.kt new file mode 100644 index 00000000..6c70e0ed --- /dev/null +++ b/visionforge-threejs/visionforge-threejs-server/src/jvmMain/kotlin/space/kscience/visionforge/three/serverExtensions.kt @@ -0,0 +1,29 @@ +package space.kscience.visionforge.three + +import space.kscience.dataforge.context.Global +import space.kscience.dataforge.misc.DFExperimental +import space.kscience.visionforge.html.* +import space.kscience.visionforge.makeFile +import java.awt.Desktop +import java.nio.file.Path + + +public val Page.Companion.threeJsHeader: HtmlFragment get() = scriptHeader("js/visionforge-three.js") + + +@DFExperimental +public fun makeThreeJsFile( + path: Path? = null, + title: String = "VisionForge page", + resourceLocation: ResourceLocation = ResourceLocation.SYSTEM, + show: Boolean = true, + content: HtmlVisionFragment, +): Unit { + val actualPath = Page(Global, content = content).makeFile(path) { actualPath -> + mapOf( + "title" to Page.title(title), + "threeJs" to Page.importScriptHeader("js/visionforge-three.js", resourceLocation, actualPath) + ) + } + if (show) Desktop.getDesktop().browse(actualPath.toFile().toURI()) +} From 8a6fab97e3dc443465dc4d0d9f71796e6557e8a2 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Thu, 20 Jan 2022 11:52:58 +0300 Subject: [PATCH 107/109] Update gh-actions and api --- .github/workflows/build.yml | 2 +- .github/workflows/pages.yml | 17 +- .github/workflows/publish.yml | 27 + .gitignore | 1 + build.gradle.kts | 2 +- cern-root-loader/api/cern-root-loader.api | 926 ++++++++++++++++ demo/gdml/api/gdml.api | 27 + demo/muon-monitor/api/muon-monitor.api | 148 +++ .../npm/muon/monitor/{server => }/MMServer.kt | 0 demo/playground/api/playground.api | 60 ++ demo/sat-demo/api/sat-demo.api | 5 + demo/solid-showcase/api/solid-showcase.api | 48 + visionforge-core/api/visionforge-core.api | 815 ++++++++++++++ visionforge-gdml/api/visionforge-gdml.api | 49 + .../api/visionforge-markdown.api | 40 + visionforge-plotly/api/visionforge-plotly.api | 42 + visionforge-server/api/visionforge-server.api | 36 + visionforge-solid/api/visionforge-solid.api | 996 ++++++++++++++++++ visionforge-tables/api/visionforge-tables.api | 63 ++ .../api/visionforge-threejs-server.api | 6 + 20 files changed, 3298 insertions(+), 12 deletions(-) create mode 100644 .github/workflows/publish.yml create mode 100644 cern-root-loader/api/cern-root-loader.api create mode 100644 demo/gdml/api/gdml.api create mode 100644 demo/muon-monitor/api/muon-monitor.api rename demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/{server => }/MMServer.kt (100%) create mode 100644 demo/playground/api/playground.api create mode 100644 demo/sat-demo/api/sat-demo.api create mode 100644 demo/solid-showcase/api/solid-showcase.api create mode 100644 visionforge-core/api/visionforge-core.api create mode 100644 visionforge-gdml/api/visionforge-gdml.api create mode 100644 visionforge-markdown/api/visionforge-markdown.api create mode 100644 visionforge-plotly/api/visionforge-plotly.api create mode 100644 visionforge-server/api/visionforge-server.api create mode 100644 visionforge-solid/api/visionforge-solid.api create mode 100644 visionforge-tables/api/visionforge-tables.api create mode 100644 visionforge-threejs/visionforge-threejs-server/api/visionforge-threejs-server.api diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1f87ce02..8c73f7d9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,7 +7,7 @@ on: jobs: build: - runs-on: windows-latest + runs-on: ubuntu-latest timeout-minutes: 40 steps: - uses: actions/checkout@v2 diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 134d3d48..aee354f6 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -10,18 +10,15 @@ jobs: timeout-minutes: 40 steps: - uses: actions/checkout@v2 - - uses: DeLaGuardo/setup-graalvm@4.0 + - name: Set up JDK 11 + uses: actions/setup-java@v2.5.0 with: - graalvm: 21.2.0 - java: java11 - arch: amd64 - - uses: actions/cache@v2 + java-version: 11 + distribution: liberica + - name: execute build + uses: gradle/gradle-build-action@v2 with: - path: ~/.gradle/caches - key: ${{ runner.os }}-gradle-${{ hashFiles('*.gradle.kts') }} - restore-keys: | - ${{ runner.os }}-gradle- - - run: ./gradlew dokkaHtmlMultiModule --build-cache --no-daemon --no-parallel --stacktrace + arguments: dokkaHtmlMultiModule - uses: JamesIves/github-pages-deploy-action@4.1.0 with: branch: gh-pages diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 00000000..99355168 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,27 @@ +name: Gradle publish + +on: + workflow_dispatch: + release: + types: [ created ] + +jobs: + publish: + environment: + name: publish + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2.5.0 + with: + java-version: 11 + distribution: liberica + - name: execute build + uses: gradle/gradle-build-action@v2 + - name: Publish + shell: bash + run: > + ./gradlew release --no-daemon --build-cache -Ppublishing.enabled=true + -Ppublishing.space.user=${{ secrets.SPACE_APP_ID }} + -Ppublishing.space.token=${{ secrets.SPACE_APP_SECRET }} diff --git a/.gitignore b/.gitignore index 33607764..7fab40d3 100644 --- a/.gitignore +++ b/.gitignore @@ -4,5 +4,6 @@ out/ .gradle build/ +data/ !gradle-wrapper.jar diff --git a/build.gradle.kts b/build.gradle.kts index 664171c9..0f892c76 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -8,7 +8,7 @@ val fxVersion by extra("11") allprojects{ group = "space.kscience" - version = "0.2.0-dev-99" + version = "0.2.0" } subprojects { diff --git a/cern-root-loader/api/cern-root-loader.api b/cern-root-loader/api/cern-root-loader.api new file mode 100644 index 00000000..2788976b --- /dev/null +++ b/cern-root-loader/api/cern-root-loader.api @@ -0,0 +1,926 @@ +public final class ru/mipt/npm/root/DGeoBoolNode : ru/mipt/npm/root/DObject { + public fun (Lspace/kscience/dataforge/meta/Meta;Lru/mipt/npm/root/DObjectCache;)V + public final fun getFLeft ()Lru/mipt/npm/root/DGeoShape; + public final fun getFLeftMat ()Lru/mipt/npm/root/DGeoMatrix; + public final fun getFRight ()Lru/mipt/npm/root/DGeoShape; + public final fun getFRightMat ()Lru/mipt/npm/root/DGeoMatrix; +} + +public final class ru/mipt/npm/root/DGeoManager : ru/mipt/npm/root/DNamed { + public static final field Companion Lru/mipt/npm/root/DGeoManager$Companion; + public fun (Lspace/kscience/dataforge/meta/Meta;Lru/mipt/npm/root/DObjectCache;)V + public final fun getFMatrices ()Ljava/util/List; + public final fun getFNodes ()Ljava/util/List; + public final fun getFShapes ()Ljava/util/List; + public final fun getFVolumes ()Ljava/util/List; +} + +public final class ru/mipt/npm/root/DGeoManager$Companion { + public final fun parse (Ljava/lang/String;)Lru/mipt/npm/root/DGeoManager; +} + +public final class ru/mipt/npm/root/DGeoMaterial : ru/mipt/npm/root/DNamed { + public fun (Lspace/kscience/dataforge/meta/Meta;Lru/mipt/npm/root/DObjectCache;)V +} + +public class ru/mipt/npm/root/DGeoMatrix : ru/mipt/npm/root/DNamed { + public fun (Lspace/kscience/dataforge/meta/Meta;Lru/mipt/npm/root/DObjectCache;)V +} + +public final class ru/mipt/npm/root/DGeoMedium : ru/mipt/npm/root/DNamed { + public fun (Lspace/kscience/dataforge/meta/Meta;Lru/mipt/npm/root/DObjectCache;)V + public final fun getFMaterial ()Lru/mipt/npm/root/DGeoMaterial; + public final fun getFParams ()[D +} + +public final class ru/mipt/npm/root/DGeoNode : ru/mipt/npm/root/DNamed { + public fun (Lspace/kscience/dataforge/meta/Meta;Lru/mipt/npm/root/DObjectCache;)V + public final fun getFVolume ()Lru/mipt/npm/root/DGeoVolume; +} + +public class ru/mipt/npm/root/DGeoScale : ru/mipt/npm/root/DGeoMatrix { + public fun (Lspace/kscience/dataforge/meta/Meta;Lru/mipt/npm/root/DObjectCache;)V + public final fun getFScale ()[D + public final fun getX ()D + public final fun getY ()D + public final fun getZ ()D +} + +public final class ru/mipt/npm/root/DGeoShape : ru/mipt/npm/root/DNamed { + public fun (Lspace/kscience/dataforge/meta/Meta;Lru/mipt/npm/root/DObjectCache;)V + public final fun getFDX ()D + public final fun getFDY ()D + public final fun getFDZ ()D +} + +public final class ru/mipt/npm/root/DGeoVolume : ru/mipt/npm/root/DNamed, space/kscience/dataforge/misc/Named { + public fun (Lspace/kscience/dataforge/meta/Meta;Lru/mipt/npm/root/DObjectCache;)V + public final fun getFFillColor ()Ljava/lang/Integer; + public final fun getFMedium ()Lru/mipt/npm/root/DGeoMedium; + public final fun getFNodes ()Ljava/util/List; + public final fun getFShape ()Lru/mipt/npm/root/DGeoShape; + public fun getName ()Lspace/kscience/dataforge/names/Name; +} + +public class ru/mipt/npm/root/DNamed : ru/mipt/npm/root/DObject { + public fun (Lspace/kscience/dataforge/meta/Meta;Lru/mipt/npm/root/DObjectCache;)V + public final fun getFName ()Ljava/lang/String; + public final fun getFTitle ()Ljava/lang/String; +} + +public class ru/mipt/npm/root/DObject { + public fun (Lspace/kscience/dataforge/meta/Meta;Lru/mipt/npm/root/DObjectCache;)V + public final fun getMeta ()Lspace/kscience/dataforge/meta/Meta; + public final fun getRefCache ()Lru/mipt/npm/root/DObjectCache; + public final fun getTypename ()Ljava/lang/String; +} + +public final class ru/mipt/npm/root/DObjectCache { + public static final field Companion Lru/mipt/npm/root/DObjectCache$Companion; + public fun (Ljava/util/List;Ljava/util/List;)V + public synthetic fun (Ljava/util/List;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun get (I)Lspace/kscience/dataforge/meta/Meta; + public final fun getRefStack ()Ljava/util/List; + public final fun stack (I)Lru/mipt/npm/root/DObjectCache; +} + +public final class ru/mipt/npm/root/DObjectCache$Companion { + public final fun getEmpty ()Lru/mipt/npm/root/DObjectCache; +} + +public final class ru/mipt/npm/root/DObjectKt { + public static final fun doubleArray (Lspace/kscience/dataforge/meta/MetaProvider;[DLspace/kscience/dataforge/names/Name;)Lkotlin/properties/ReadOnlyProperty; + public static synthetic fun doubleArray$default (Lspace/kscience/dataforge/meta/MetaProvider;[DLspace/kscience/dataforge/names/Name;ILjava/lang/Object;)Lkotlin/properties/ReadOnlyProperty; +} + +public final class ru/mipt/npm/root/DRootToSolidKt { + public static final fun toSolid (Lru/mipt/npm/root/DGeoManager;)Lspace/kscience/visionforge/solid/SolidGroup; +} + +public final class ru/mipt/npm/root/RootColors { + public static final field INSTANCE Lru/mipt/npm/root/RootColors; + public final fun get (I)Ljava/lang/String; +} + +public final class ru/mipt/npm/root/serialization/JsonToRootKt { + public static final fun decodeFromJson (Lru/mipt/npm/root/serialization/TObject;Lkotlinx/serialization/KSerializer;Lkotlinx/serialization/json/JsonElement;)Lru/mipt/npm/root/serialization/TObject; + public static final fun decodeFromString (Lru/mipt/npm/root/serialization/TObject;Lkotlinx/serialization/KSerializer;Ljava/lang/String;)Lru/mipt/npm/root/serialization/TObject; +} + +public final class ru/mipt/npm/root/serialization/RootToSolidKt { + public static final fun toSolid (Lru/mipt/npm/root/serialization/TGeoManager;)Lspace/kscience/visionforge/solid/SolidGroup; +} + +public class ru/mipt/npm/root/serialization/TGeoBBox : ru/mipt/npm/root/serialization/TGeoShape { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoBBox$Companion; + public fun ()V + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;IDDD[DLkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getFDX ()D + public final fun getFDY ()D + public final fun getFDZ ()D + public final fun getFOrigin ()[D + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoBBox;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoBBox$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoBBox$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoBBox; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoBBox;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoBBox$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract class ru/mipt/npm/root/serialization/TGeoBoolNode : ru/mipt/npm/root/serialization/TObject { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoBoolNode$Companion; + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Lru/mipt/npm/root/serialization/TGeoMatrix;Lru/mipt/npm/root/serialization/TGeoMatrix;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public abstract fun getFLeft ()Lru/mipt/npm/root/serialization/TGeoShape; + public final fun getFLeftMat ()Lru/mipt/npm/root/serialization/TGeoMatrix; + public abstract fun getFRight ()Lru/mipt/npm/root/serialization/TGeoShape; + public final fun getFRightMat ()Lru/mipt/npm/root/serialization/TGeoMatrix; + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoBoolNode;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoBoolNode$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoCombiTrans : ru/mipt/npm/root/serialization/TGeoMatrix { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoCombiTrans$Companion; + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;[DLru/mipt/npm/root/serialization/TGeoRotation;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun ([DLru/mipt/npm/root/serialization/TGeoRotation;)V + public synthetic fun ([DLru/mipt/npm/root/serialization/TGeoRotation;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getFRotation ()Lru/mipt/npm/root/serialization/TGeoRotation; + public final fun getFTranslation ()[D + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoCombiTrans;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoCombiTrans$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoCombiTrans$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoCombiTrans; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoCombiTrans;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoCombiTrans$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoCompositeShape : ru/mipt/npm/root/serialization/TGeoBBox { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoCompositeShape$Companion; + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;IDDD[DLru/mipt/npm/root/serialization/TGeoBoolNode;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Lru/mipt/npm/root/serialization/TGeoBoolNode;)V + public final fun getFNode ()Lru/mipt/npm/root/serialization/TGeoBoolNode; + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoCompositeShape;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoCompositeShape$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoCompositeShape$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoCompositeShape; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoCompositeShape;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoCompositeShape$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoHMatrix : ru/mipt/npm/root/serialization/TGeoMatrix { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoHMatrix$Companion; + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;[D[D[DLkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun ([D[D[D)V + public final fun getFRotationMatrix ()[D + public final fun getFScale ()[D + public final fun getFTranslation ()[D + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoHMatrix;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoHMatrix$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoHMatrix$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoHMatrix; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoHMatrix;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoHMatrix$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoIdentity : ru/mipt/npm/root/serialization/TGeoMatrix { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoIdentity$Companion; + public fun ()V + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoIdentity;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoIdentity$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoIdentity$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoIdentity; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoIdentity;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoIdentity$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoIntersection : ru/mipt/npm/root/serialization/TGeoBoolNode { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoIntersection$Companion; + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Lru/mipt/npm/root/serialization/TGeoMatrix;Lru/mipt/npm/root/serialization/TGeoMatrix;Lru/mipt/npm/root/serialization/TGeoShape;Lru/mipt/npm/root/serialization/TGeoShape;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Lru/mipt/npm/root/serialization/TGeoShape;Lru/mipt/npm/root/serialization/TGeoShape;)V + public fun getFLeft ()Lru/mipt/npm/root/serialization/TGeoShape; + public fun getFRight ()Lru/mipt/npm/root/serialization/TGeoShape; + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoIntersection;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoIntersection$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoIntersection$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoIntersection; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoIntersection;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoIntersection$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoManager : ru/mipt/npm/root/serialization/TNamed { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoManager$Companion; + public fun ()V + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lru/mipt/npm/root/serialization/TObjArray;Lru/mipt/npm/root/serialization/TObjArray;Lru/mipt/npm/root/serialization/TObjArray;Lru/mipt/npm/root/serialization/TObjArray;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getFMatrices ()Lru/mipt/npm/root/serialization/TObjArray; + public final fun getFNodes ()Lru/mipt/npm/root/serialization/TObjArray; + public final fun getFShapes ()Lru/mipt/npm/root/serialization/TObjArray; + public final fun getFVolumes ()Lru/mipt/npm/root/serialization/TObjArray; + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoManager;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoManager$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoManager$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoManager; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoManager;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoManager$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public class ru/mipt/npm/root/serialization/TGeoMaterial : ru/mipt/npm/root/serialization/TNamed { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoMaterial$Companion; + public fun ()V + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoMaterial;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoMaterial$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoMaterial$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoMaterial; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoMaterial;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoMaterial$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract class ru/mipt/npm/root/serialization/TGeoMatrix : ru/mipt/npm/root/serialization/TNamed { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoMatrix$Companion; + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoMatrix;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoMatrix$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoMedium : ru/mipt/npm/root/serialization/TNamed { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoMedium$Companion; + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;ILru/mipt/npm/root/serialization/TGeoMaterial;[DLkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (ILru/mipt/npm/root/serialization/TGeoMaterial;[D)V + public final fun getFId ()I + public final fun getFMaterial ()Lru/mipt/npm/root/serialization/TGeoMaterial; + public final fun getFParams ()[D + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoMedium;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoMedium$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoMedium$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoMedium; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoMedium;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoMedium$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoMixture : ru/mipt/npm/root/serialization/TGeoMaterial { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoMixture$Companion; + public fun ()V + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoMixture;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoMixture$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoMixture$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoMixture; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoMixture;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoMixture$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public class ru/mipt/npm/root/serialization/TGeoNode : ru/mipt/npm/root/serialization/TNamed { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoNode$Companion; + public fun ()V + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;Lru/mipt/npm/root/serialization/TGeoVolume;II[ILkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getFGeoAtt-pVg5ArA ()I + public final fun getFNovlp ()I + public final fun getFNumber ()I + public final fun getFOverlaps ()[I + public final fun getFVolume ()Lru/mipt/npm/root/serialization/TGeoVolume; + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoNode;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoNode$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoNode$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoNode; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoNode;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoNode$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoNodeMatrix : ru/mipt/npm/root/serialization/TGeoNode { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoNodeMatrix$Companion; + public fun ()V + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;Lru/mipt/npm/root/serialization/TGeoVolume;II[ILru/mipt/npm/root/serialization/TGeoMatrix;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getFMatrix ()Lru/mipt/npm/root/serialization/TGeoMatrix; + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoNodeMatrix;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoNodeMatrix$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoNodeMatrix$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoNodeMatrix; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoNodeMatrix;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoNodeMatrix$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoNodeOffset : ru/mipt/npm/root/serialization/TGeoNode { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoNodeOffset$Companion; + public fun ()V + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;Lru/mipt/npm/root/serialization/TGeoVolume;II[IDLkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getFOffset ()D + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoNodeOffset;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoNodeOffset$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoNodeOffset$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoNodeOffset; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoNodeOffset;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoNodeOffset$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public class ru/mipt/npm/root/serialization/TGeoPcon : ru/mipt/npm/root/serialization/TGeoBBox { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoPcon$Companion; + public fun ()V + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;IDDD[DIDD[D[D[DLkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getFDphi ()D + public final fun getFNz ()I + public final fun getFPhi1 ()D + public final fun getFRmax ()[D + public final fun getFRmin ()[D + public final fun getFZ ()[D + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoPcon;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoPcon$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoPcon$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoPcon; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoPcon;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoPcon$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public class ru/mipt/npm/root/serialization/TGeoPgon : ru/mipt/npm/root/serialization/TGeoPcon { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoPgon$Companion; + public fun ()V + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;IDDD[DIDD[D[D[DILkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getFNedges ()I + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoPgon;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoPgon$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoPgon$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoPgon; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoPgon;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoPgon$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoRotation : ru/mipt/npm/root/serialization/TGeoMatrix { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoRotation$Companion; + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;[DLkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun ([D)V + public final fun getFRotationMatrix ()[D + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoRotation;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoRotation$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoRotation$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoRotation; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoRotation;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoRotation$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract class ru/mipt/npm/root/serialization/TGeoShape : ru/mipt/npm/root/serialization/TNamed { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoShape$Companion; + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;ILkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getFShapeBits-pVg5ArA ()I + public final fun getFShapeId ()I + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoShape;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoShape$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoShapeAssembly : ru/mipt/npm/root/serialization/TGeoBBox { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoShapeAssembly$Companion; + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;IDDD[DLru/mipt/npm/root/serialization/TGeoVolumeAssembly;ZLkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Lru/mipt/npm/root/serialization/TGeoVolumeAssembly;Z)V + public synthetic fun (Lru/mipt/npm/root/serialization/TGeoVolumeAssembly;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getFBBoxOK ()Z + public final fun getFVolume ()Lru/mipt/npm/root/serialization/TGeoVolumeAssembly; + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoShapeAssembly;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoShapeAssembly$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoShapeAssembly$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoShapeAssembly; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoShapeAssembly;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoShapeAssembly$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoShapeRef : ru/mipt/npm/root/serialization/TGeoShape { + public fun (Lkotlin/jvm/functions/Function0;)V + public final fun getValue ()Lru/mipt/npm/root/serialization/TGeoShape; +} + +public final class ru/mipt/npm/root/serialization/TGeoSubtraction : ru/mipt/npm/root/serialization/TGeoBoolNode { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoSubtraction$Companion; + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Lru/mipt/npm/root/serialization/TGeoMatrix;Lru/mipt/npm/root/serialization/TGeoMatrix;Lru/mipt/npm/root/serialization/TGeoShape;Lru/mipt/npm/root/serialization/TGeoShape;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Lru/mipt/npm/root/serialization/TGeoShape;Lru/mipt/npm/root/serialization/TGeoShape;)V + public fun getFLeft ()Lru/mipt/npm/root/serialization/TGeoShape; + public fun getFRight ()Lru/mipt/npm/root/serialization/TGeoShape; + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoSubtraction;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoSubtraction$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoSubtraction$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoSubtraction; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoSubtraction;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoSubtraction$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoTranslation : ru/mipt/npm/root/serialization/TGeoMatrix { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoTranslation$Companion; + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;[DLkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun ([D)V + public final fun getFTranslation ()[D + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoTranslation;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoTranslation$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoTranslation$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoTranslation; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoTranslation;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoTranslation$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public class ru/mipt/npm/root/serialization/TGeoTube : ru/mipt/npm/root/serialization/TGeoBBox { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoTube$Companion; + public fun ()V + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;IDDD[DDDDLkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getFDz ()D + public final fun getFRmax ()D + public final fun getFRmin ()D + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoTube;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoTube$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoTube$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoTube; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoTube;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoTube$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoTubeSeg : ru/mipt/npm/root/serialization/TGeoTube { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoTubeSeg$Companion; + public fun (DDDDDDDDD)V + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;IDDD[DDDDDDDDDDDDDLkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getFC1 ()D + public final fun getFC2 ()D + public final fun getFCdfi ()D + public final fun getFCm ()D + public final fun getFPhi1 ()D + public final fun getFPhi2 ()D + public final fun getFS1 ()D + public final fun getFS2 ()D + public final fun getFSm ()D + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoTubeSeg;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoTubeSeg$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoTubeSeg$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoTubeSeg; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoTubeSeg;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoTubeSeg$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoUnion : ru/mipt/npm/root/serialization/TGeoBoolNode { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoUnion$Companion; + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Lru/mipt/npm/root/serialization/TGeoMatrix;Lru/mipt/npm/root/serialization/TGeoMatrix;Lru/mipt/npm/root/serialization/TGeoShape;Lru/mipt/npm/root/serialization/TGeoShape;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Lru/mipt/npm/root/serialization/TGeoShape;Lru/mipt/npm/root/serialization/TGeoShape;)V + public fun getFLeft ()Lru/mipt/npm/root/serialization/TGeoShape; + public fun getFRight ()Lru/mipt/npm/root/serialization/TGeoShape; + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoUnion;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoUnion$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoUnion$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoUnion; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoUnion;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoUnion$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public class ru/mipt/npm/root/serialization/TGeoVolume : ru/mipt/npm/root/serialization/TNamed { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoVolume$Companion; + public fun ()V + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;ILjava/lang/Integer;Lkotlin/UInt;Ljava/lang/Integer;Ljava/lang/Integer;Lru/mipt/npm/root/serialization/TObjArray;Lru/mipt/npm/root/serialization/TGeoShape;Lru/mipt/npm/root/serialization/TGeoMedium;IIILkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getFFillColor ()Ljava/lang/Integer; + public final fun getFFillStyle ()Ljava/lang/Integer; + public final fun getFGeoAtt-pVg5ArA ()I + public final fun getFLineColor ()I + public final fun getFLineStyle ()Ljava/lang/Integer; + public final fun getFLineWidth-pVg5ArA ()I + public final fun getFMedium ()Lru/mipt/npm/root/serialization/TGeoMedium; + public final fun getFNodes ()Lru/mipt/npm/root/serialization/TObjArray; + public final fun getFNtotal ()I + public final fun getFNumber ()I + public final fun getFRefCount ()I + public final fun getFShape ()Lru/mipt/npm/root/serialization/TGeoShape; + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoVolume;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoVolume$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoVolume$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoVolume; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoVolume;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoVolume$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public class ru/mipt/npm/root/serialization/TGeoVolumeAssembly : ru/mipt/npm/root/serialization/TGeoVolume { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoVolumeAssembly$Companion; + public fun ()V + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;ILjava/lang/Integer;Lkotlin/UInt;Ljava/lang/Integer;Ljava/lang/Integer;Lru/mipt/npm/root/serialization/TObjArray;Lru/mipt/npm/root/serialization/TGeoShape;Lru/mipt/npm/root/serialization/TGeoMedium;IIILkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoVolumeAssembly;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoVolumeAssembly$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoVolumeAssembly$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoVolumeAssembly; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoVolumeAssembly;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoVolumeAssembly$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoVolumeAssemblyRef : ru/mipt/npm/root/serialization/TGeoVolumeAssembly { + public fun (Lkotlin/jvm/functions/Function0;)V + public final fun getValue ()Lru/mipt/npm/root/serialization/TGeoVolumeAssembly; +} + +public final class ru/mipt/npm/root/serialization/TGeoVolumeRef : ru/mipt/npm/root/serialization/TGeoVolume { + public fun (Lkotlin/jvm/functions/Function0;)V + public final fun getValue ()Lru/mipt/npm/root/serialization/TGeoVolume; +} + +public final class ru/mipt/npm/root/serialization/TGeoXtru : ru/mipt/npm/root/serialization/TGeoBBox { + public static final field Companion Lru/mipt/npm/root/serialization/TGeoXtru$Companion; + public fun (IID[D[D[D[D[D[D)V + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;IDDD[DIID[D[D[D[D[D[DLkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getFNvert ()I + public final fun getFNz ()I + public final fun getFScale ()[D + public final fun getFX ()[D + public final fun getFX0 ()[D + public final fun getFY ()[D + public final fun getFY0 ()[D + public final fun getFZ ()[D + public final fun getFZcurrent ()D + public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoXtru;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TGeoXtru$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoXtru$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoXtru; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TGeoXtru;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TGeoXtru$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/THashList : ru/mipt/npm/root/serialization/TObject { + public static final field Companion Lru/mipt/npm/root/serialization/THashList$Companion; + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/util/List;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/util/List;)V + public final fun getArr ()Ljava/util/List; + public static final fun write$Self (Lru/mipt/npm/root/serialization/THashList;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/THashList$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/THashList$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/THashList; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/THashList;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/THashList$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TList : ru/mipt/npm/root/serialization/TObject { + public static final field Companion Lru/mipt/npm/root/serialization/TList$Companion; + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/util/List;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/util/List;)V + public final fun getArr ()Ljava/util/List; + public static final fun write$Self (Lru/mipt/npm/root/serialization/TList;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TList$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TList$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TList; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TList;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TList$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public class ru/mipt/npm/root/serialization/TNamed : ru/mipt/npm/root/serialization/TObject { + public static final field Companion Lru/mipt/npm/root/serialization/TNamed$Companion; + public fun ()V + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getFName ()Ljava/lang/String; + public final fun getFTitle ()Ljava/lang/String; + public static final fun write$Self (Lru/mipt/npm/root/serialization/TNamed;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TNamed$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/serialization/TNamed$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TNamed; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TNamed;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TNamed$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TObjArray : ru/mipt/npm/root/serialization/TObject { + public static final field Companion Lru/mipt/npm/root/serialization/TObjArray$Companion; + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/util/List;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/util/List;)V + public final fun getArr ()Ljava/util/List; + public static final fun write$Self (Lru/mipt/npm/root/serialization/TObjArray;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlinx/serialization/KSerializer;)V +} + +public final class ru/mipt/npm/root/serialization/TObjArray$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun (Lkotlinx/serialization/KSerializer;)V + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TObjArray; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/serialization/TObjArray;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/serialization/TObjArray$Companion { + public final fun getEmpty ()Lru/mipt/npm/root/serialization/TObjArray; + public final fun serializer (Lkotlinx/serialization/KSerializer;)Lkotlinx/serialization/KSerializer; +} + +public abstract class ru/mipt/npm/root/serialization/TObject { + public static final field Companion Lru/mipt/npm/root/serialization/TObject$Companion; + public fun ()V + public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getFBits-pVg5ArA ()I + public final fun getFUniqueID-pVg5ArA ()I + public static final fun write$Self (Lru/mipt/npm/root/serialization/TObject;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/root/serialization/TObject$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + diff --git a/demo/gdml/api/gdml.api b/demo/gdml/api/gdml.api new file mode 100644 index 00000000..480385c3 --- /dev/null +++ b/demo/gdml/api/gdml.api @@ -0,0 +1,27 @@ +public final class space/kscience/visionforge/gdml/demo/GDMLDemoApp : tornadofx/App { + public fun ()V +} + +public final class space/kscience/visionforge/gdml/demo/GDMLView : tornadofx/View { + public static final field Companion Lspace/kscience/visionforge/gdml/demo/GDMLView$Companion; + public fun ()V + public fun getRoot ()Ljavafx/scene/Parent; +} + +public final class space/kscience/visionforge/gdml/demo/GDMLView$Companion { +} + +public final class space/kscience/visionforge/gdml/demo/GdmlFxDemoAppKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + +public final class space/kscience/visionforge/gdml/demo/ReadFileKt { + public static final fun readFile (Lspace/kscience/visionforge/VisionManager;Ljava/io/File;)Lspace/kscience/visionforge/Vision; + public static final fun readFile (Lspace/kscience/visionforge/VisionManager;Ljava/lang/String;)Lspace/kscience/visionforge/Vision; +} + +public final class space/kscience/visionforge/gdml/demo/SaveToJsonKt { + public static final fun main ([Ljava/lang/String;)V +} + diff --git a/demo/muon-monitor/api/muon-monitor.api b/demo/muon-monitor/api/muon-monitor.api new file mode 100644 index 00000000..da3a84ed --- /dev/null +++ b/demo/muon-monitor/api/muon-monitor.api @@ -0,0 +1,148 @@ +public final class ru/mipt/npm/muon/monitor/Event { + public static final field Companion Lru/mipt/npm/muon/monitor/Event$Companion; + public synthetic fun (IILjava/util/List;Ljava/util/Collection;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (ILjava/util/List;Ljava/util/Collection;)V + public final fun component1 ()I + public final fun component2 ()Ljava/util/List; + public final fun component3 ()Ljava/util/Collection; + public final fun copy (ILjava/util/List;Ljava/util/Collection;)Lru/mipt/npm/muon/monitor/Event; + public static synthetic fun copy$default (Lru/mipt/npm/muon/monitor/Event;ILjava/util/List;Ljava/util/Collection;ILjava/lang/Object;)Lru/mipt/npm/muon/monitor/Event; + public fun equals (Ljava/lang/Object;)Z + public final fun getHits ()Ljava/util/Collection; + public final fun getId ()I + public final fun getTrack ()Ljava/util/List; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; + public static final fun write$Self (Lru/mipt/npm/muon/monitor/Event;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class ru/mipt/npm/muon/monitor/Event$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/muon/monitor/Event$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/muon/monitor/Event; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/muon/monitor/Event;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/muon/monitor/Event$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/muon/monitor/Model { + public fun (Lspace/kscience/visionforge/VisionManager;)V + public final fun displayEvent (Lru/mipt/npm/muon/monitor/Event;)V + public final fun encodeToString ()Ljava/lang/String; + public final fun getManager ()Lspace/kscience/visionforge/VisionManager; + public final fun getRoot ()Lspace/kscience/visionforge/solid/SolidGroup; + public final fun getTracks ()Lspace/kscience/visionforge/solid/SolidGroup; + public final fun reset ()V + public final fun setTracks (Lspace/kscience/visionforge/solid/SolidGroup;)V +} + +public final class ru/mipt/npm/muon/monitor/Monitor { + public static final field CENTRAL_LAYER_Z F + public static final field GEOMETRY_TOLERANCE D + public static final field INSTANCE Lru/mipt/npm/muon/monitor/Monitor; + public static final field LOWER_LAYER_Z F + public static final field PIXEL_XY_SIZE F + public static final field PIXEL_XY_SPACING F + public static final field PIXEL_Z_SIZE F + public static final field UPPER_LAYER_Z F + public final fun getDetectors ()Ljava/util/Collection; + public final fun getPixels ()Ljava/util/Collection; +} + +public final class ru/mipt/npm/muon/monitor/ReadResourceKt { + public static final fun readResource (Ljava/lang/String;)Ljava/lang/String; +} + +public final class ru/mipt/npm/muon/monitor/SC1 { + public fun (Ljava/lang/String;Lspace/kscience/visionforge/solid/Point3D;FFF)V + public synthetic fun (Ljava/lang/String;Lspace/kscience/visionforge/solid/Point3D;FFFILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getCenter ()Lspace/kscience/visionforge/solid/Point3D; + public final fun getName ()Ljava/lang/String; + public final fun getXSize ()F + public final fun getYSize ()F + public final fun getZSize ()F +} + +public final class ru/mipt/npm/muon/monitor/SC16 { + public fun (Ljava/lang/String;Lspace/kscience/visionforge/solid/Point3D;)V + public final fun getCenter ()Lspace/kscience/visionforge/solid/Point3D; + public final fun getName ()Ljava/lang/String; + public final fun getPixels ()Ljava/util/Collection; +} + +public final class ru/mipt/npm/muon/monitor/server/MMServerKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V + public static final fun module (Lio/ktor/application/Application;Lspace/kscience/dataforge/context/Context;)V + public static synthetic fun module$default (Lio/ktor/application/Application;Lspace/kscience/dataforge/context/Context;ILjava/lang/Object;)V +} + +public final class ru/mipt/npm/muon/monitor/sim/Cos2TrackGenerator : ru/mipt/npm/muon/monitor/sim/TrackGenerator { + public fun (Lorg/apache/commons/math3/random/RandomGenerator;DFF)V + public synthetic fun (Lorg/apache/commons/math3/random/RandomGenerator;DFFILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun generate ()Lorg/apache/commons/math3/geometry/euclidean/threed/Line; + public final fun getMaxX ()F + public final fun getMaxY ()F + public final fun getPower ()D + public fun getRnd ()Lorg/apache/commons/math3/random/RandomGenerator; +} + +public final class ru/mipt/npm/muon/monitor/sim/FixedAngleGenerator : ru/mipt/npm/muon/monitor/sim/TrackGenerator { + public fun (Lorg/apache/commons/math3/random/RandomGenerator;DDFF)V + public synthetic fun (Lorg/apache/commons/math3/random/RandomGenerator;DDFFILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun generate ()Lorg/apache/commons/math3/geometry/euclidean/threed/Line; + public final fun getMaxX ()F + public final fun getMaxY ()F + public final fun getPhi ()D + public fun getRnd ()Lorg/apache/commons/math3/random/RandomGenerator; + public final fun getTheta ()D +} + +public final class ru/mipt/npm/muon/monitor/sim/LineKt { + public static final fun getPhi (Lorg/apache/commons/math3/geometry/euclidean/threed/Line;)D + public static final fun getTheta (Lorg/apache/commons/math3/geometry/euclidean/threed/Line;)D + public static final fun getX (Lorg/apache/commons/math3/geometry/euclidean/threed/Line;)D + public static final fun getY (Lorg/apache/commons/math3/geometry/euclidean/threed/Line;)D + public static final fun makeTrack (DDDD)Lorg/apache/commons/math3/geometry/euclidean/threed/Line; + public static final fun makeTrack (Lorg/apache/commons/math3/geometry/euclidean/threed/Vector3D;Lorg/apache/commons/math3/geometry/euclidean/threed/Vector3D;)Lorg/apache/commons/math3/geometry/euclidean/threed/Line; + public static final fun toPoint (Lorg/apache/commons/math3/geometry/euclidean/threed/Vector3D;)Lspace/kscience/visionforge/solid/Point3D; + public static final fun toPoints (Lorg/apache/commons/math3/geometry/euclidean/threed/Line;)Ljava/util/List; +} + +public final class ru/mipt/npm/muon/monitor/sim/MonitorKt { + public static final fun buildEventByTrack (ILorg/apache/commons/math3/geometry/euclidean/threed/Line;Lkotlin/jvm/functions/Function1;)Lru/mipt/npm/muon/monitor/Event; + public static synthetic fun buildEventByTrack$default (ILorg/apache/commons/math3/geometry/euclidean/threed/Line;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lru/mipt/npm/muon/monitor/Event; + public static final fun findLayer (F)Lorg/apache/commons/math3/geometry/euclidean/threed/Plane; + public static final fun getDefaultHitResolver ()Lkotlin/jvm/functions/Function1; + public static final fun readEffs ()Ljava/util/Map; +} + +public final class ru/mipt/npm/muon/monitor/sim/PixelKt { + public static final fun isHit (Lru/mipt/npm/muon/monitor/SC1;Lorg/apache/commons/math3/geometry/euclidean/threed/Line;)Z +} + +public final class ru/mipt/npm/muon/monitor/sim/SimulationKt { + public static final fun simulateOne (Lru/mipt/npm/muon/monitor/sim/TrackGenerator;)Lru/mipt/npm/muon/monitor/Event; +} + +public abstract interface class ru/mipt/npm/muon/monitor/sim/TrackGenerator { + public abstract fun generate ()Lorg/apache/commons/math3/geometry/euclidean/threed/Line; + public abstract fun getRnd ()Lorg/apache/commons/math3/random/RandomGenerator; +} + +public final class ru/mipt/npm/muon/monitor/sim/UniformTrackGenerator : ru/mipt/npm/muon/monitor/sim/TrackGenerator { + public fun (Lorg/apache/commons/math3/random/RandomGenerator;FF)V + public synthetic fun (Lorg/apache/commons/math3/random/RandomGenerator;FFILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun generate ()Lorg/apache/commons/math3/geometry/euclidean/threed/Line; + public final fun getMaxX ()F + public final fun getMaxY ()F + public fun getRnd ()Lorg/apache/commons/math3/random/RandomGenerator; +} + diff --git a/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/server/MMServer.kt b/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/MMServer.kt similarity index 100% rename from demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/server/MMServer.kt rename to demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/MMServer.kt diff --git a/demo/playground/api/playground.api b/demo/playground/api/playground.api new file mode 100644 index 00000000..7a050caa --- /dev/null +++ b/demo/playground/api/playground.api @@ -0,0 +1,60 @@ +public final class space/kscience/visionforge/examples/AllThingsDemoKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + +public final class space/kscience/visionforge/examples/FormServerKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + +public final class space/kscience/visionforge/examples/GdmlCubesKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + +public final class space/kscience/visionforge/examples/GdmlCurveKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + +public final class space/kscience/visionforge/examples/GdmlIaxoKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + +public final class space/kscience/visionforge/examples/GenerateSchemaKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + +public final class space/kscience/visionforge/examples/PlotlyVisionKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + +public final class space/kscience/visionforge/examples/RandomSpheresKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + +public final class space/kscience/visionforge/examples/RootParserKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + +public final class space/kscience/visionforge/examples/ServerExtensionsKt { + public static final fun makeVisionFile (Ljava/nio/file/Path;Ljava/lang/String;Lspace/kscience/visionforge/html/ResourceLocation;ZLkotlin/jvm/functions/Function1;)V + public static synthetic fun makeVisionFile$default (Ljava/nio/file/Path;Ljava/lang/String;Lspace/kscience/visionforge/html/ResourceLocation;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)V +} + +public final class space/kscience/visionforge/examples/SimpleCubeKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + +public final class space/kscience/visionforge/examples/TablesKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + diff --git a/demo/sat-demo/api/sat-demo.api b/demo/sat-demo/api/sat-demo.api new file mode 100644 index 00000000..00e5cedd --- /dev/null +++ b/demo/sat-demo/api/sat-demo.api @@ -0,0 +1,5 @@ +public final class ru/mipt/npm/sat/SatServerKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + diff --git a/demo/solid-showcase/api/solid-showcase.api b/demo/solid-showcase/api/solid-showcase.api new file mode 100644 index 00000000..4cc47c7d --- /dev/null +++ b/demo/solid-showcase/api/solid-showcase.api @@ -0,0 +1,48 @@ +public final class space/kscience/visionforge/demo/MetaEditorDemo : tornadofx/View { + public fun ()V + public final fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; + public final fun getMeta ()Lspace/kscience/dataforge/meta/ObservableMutableMeta; + public synthetic fun getRoot ()Ljavafx/scene/Parent; + public fun getRoot ()Ljavafx/scene/control/SplitPane; +} + +public final class space/kscience/visionforge/demo/MetaEditorDemoApp : tornadofx/App { + public fun ()V +} + +public final class space/kscience/visionforge/demo/MetaEditorDemoKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + +public final class space/kscience/visionforge/solid/demo/DemoKt { + public static final fun demo (Lspace/kscience/visionforge/solid/demo/VisionLayout;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V + public static synthetic fun demo$default (Lspace/kscience/visionforge/solid/demo/VisionLayout;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V + public static final fun getCanvasOptions ()Lspace/kscience/visionforge/solid/specifications/Canvas3DOptions; + public static final fun showcase (Lspace/kscience/visionforge/solid/demo/VisionLayout;)V + public static final fun showcaseCSG (Lspace/kscience/visionforge/solid/demo/VisionLayout;)V +} + +public final class space/kscience/visionforge/solid/demo/FXDemoApp : tornadofx/App { + public fun ()V + public final fun getView ()Lspace/kscience/visionforge/solid/demo/FXDemoGrid; + public fun start (Ljavafx/stage/Stage;)V +} + +public final class space/kscience/visionforge/solid/demo/FXDemoAppKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + +public final class space/kscience/visionforge/solid/demo/FXDemoGrid : tornadofx/View, space/kscience/visionforge/solid/demo/VisionLayout { + public fun ()V + public fun getRoot ()Ljavafx/scene/Parent; + public synthetic fun render (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;)V + public fun render (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/dataforge/meta/Meta;)V +} + +public abstract interface class space/kscience/visionforge/solid/demo/VisionLayout { + public abstract fun render (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;)V + public static synthetic fun render$default (Lspace/kscience/visionforge/solid/demo/VisionLayout;Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;ILjava/lang/Object;)V +} + diff --git a/visionforge-core/api/visionforge-core.api b/visionforge-core/api/visionforge-core.api new file mode 100644 index 00000000..0937e26d --- /dev/null +++ b/visionforge-core/api/visionforge-core.api @@ -0,0 +1,815 @@ +public final class space/kscience/visionforge/Colors { + public static final field BLUE_KEY Ljava/lang/String; + public static final field GREEN_KEY Ljava/lang/String; + public static final field INSTANCE Lspace/kscience/visionforge/Colors; + public static final field RED_KEY Ljava/lang/String; + public static final field aliceblue I + public static final field antiquewhite I + public static final field aqua I + public static final field aquamarine I + public static final field azure I + public static final field beige I + public static final field bisque I + public static final field black I + public static final field blanchedalmond I + public static final field blue I + public static final field blueviolet I + public static final field brown I + public static final field burlywood I + public static final field cadetblue I + public static final field chartreuse I + public static final field chocolate I + public static final field coral I + public static final field cornflowerblue I + public static final field cornsilk I + public static final field crimson I + public static final field cyan I + public static final field darkblue I + public static final field darkcyan I + public static final field darkgoldenrod I + public static final field darkgray I + public static final field darkgreen I + public static final field darkgrey I + public static final field darkkhaki I + public static final field darkmagenta I + public static final field darkolivegreen I + public static final field darkorange I + public static final field darkorchid I + public static final field darkred I + public static final field darksalmon I + public static final field darkseagreen I + public static final field darkslateblue I + public static final field darkslategray I + public static final field darkslategrey I + public static final field darkturquoise I + public static final field darkviolet I + public static final field deeppink I + public static final field deepskyblue I + public static final field dimgray I + public static final field dimgrey I + public static final field dodgerblue I + public static final field firebrick I + public static final field floralwhite I + public static final field forestgreen I + public static final field fuchsia I + public static final field gainsboro I + public static final field ghostwhite I + public static final field gold I + public static final field goldenrod I + public static final field gray I + public static final field green I + public static final field greenyellow I + public static final field grey I + public static final field honeydew I + public static final field hotpink I + public static final field indianred I + public static final field indigo I + public static final field ivory I + public static final field khaki I + public static final field lavender I + public static final field lavenderblush I + public static final field lawngreen I + public static final field lemonchiffon I + public static final field lightblue I + public static final field lightcoral I + public static final field lightcyan I + public static final field lightgoldenrodyellow I + public static final field lightgray I + public static final field lightgreen I + public static final field lightgrey I + public static final field lightpink I + public static final field lightsalmon I + public static final field lightseagreen I + public static final field lightskyblue I + public static final field lightslategray I + public static final field lightslategrey I + public static final field lightsteelblue I + public static final field lightyellow I + public static final field lime I + public static final field limegreen I + public static final field linen I + public static final field magenta I + public static final field maroon I + public static final field mediumaquamarine I + public static final field mediumblue I + public static final field mediumorchid I + public static final field mediumpurple I + public static final field mediumseagreen I + public static final field mediumslateblue I + public static final field mediumspringgreen I + public static final field mediumturquoise I + public static final field mediumvioletred I + public static final field midnightblue I + public static final field mintcream I + public static final field mistyrose I + public static final field moccasin I + public static final field navajowhite I + public static final field navy I + public static final field oldlace I + public static final field olive I + public static final field olivedrab I + public static final field orange I + public static final field orangered I + public static final field orchid I + public static final field palegoldenrod I + public static final field palegreen I + public static final field paleturquoise I + public static final field palevioletred I + public static final field papayawhip I + public static final field peachpuff I + public static final field peru I + public static final field pink I + public static final field plum I + public static final field powderblue I + public static final field purple I + public static final field rebeccapurple I + public static final field red I + public static final field rosybrown I + public static final field royalblue I + public static final field saddlebrown I + public static final field salmon I + public static final field sandybrown I + public static final field seagreen I + public static final field seashell I + public static final field sienna I + public static final field silver I + public static final field skyblue I + public static final field slateblue I + public static final field slategray I + public static final field slategrey I + public static final field snow I + public static final field springgreen I + public static final field steelblue I + public static final field tan I + public static final field teal I + public static final field thistle I + public static final field tomato I + public static final field turquoise I + public static final field violet I + public static final field wheat I + public static final field white I + public static final field whitesmoke I + public static final field yellow I + public static final field yellowgreen I + public final fun fromMeta (Lspace/kscience/dataforge/meta/Meta;)Ljava/lang/String; + public final fun rgbToString (I)Ljava/lang/String; + public final fun rgbToString-8NGXxBw (BBB)Ljava/lang/String; +} + +public final class space/kscience/visionforge/ComputedVisionPropertiesKt { + public static final fun computeProperties (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;)Lspace/kscience/dataforge/meta/Meta; + public static synthetic fun computeProperties$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;ILjava/lang/Object;)Lspace/kscience/dataforge/meta/Meta; + public static final fun computeProperty (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;)Lspace/kscience/dataforge/values/Value; + public static synthetic fun computeProperty$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;ILjava/lang/Object;)Lspace/kscience/dataforge/values/Value; + public static final fun computePropertyNode (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;)Lspace/kscience/dataforge/meta/Meta; + public static synthetic fun computePropertyNode$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;ILjava/lang/Object;)Lspace/kscience/dataforge/meta/Meta; + public static final fun computePropertyValues (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;)Lspace/kscience/dataforge/values/MutableValueProvider; + public static synthetic fun computePropertyValues$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;ILjava/lang/Object;)Lspace/kscience/dataforge/values/MutableValueProvider; +} + +public final class space/kscience/visionforge/HtmlExportKt { + public static final fun makeFile (Lspace/kscience/visionforge/html/Page;Ljava/nio/file/Path;Lkotlin/jvm/functions/Function1;)Ljava/nio/file/Path; + public static synthetic fun makeFile$default (Lspace/kscience/visionforge/html/Page;Ljava/nio/file/Path;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/nio/file/Path; + public static final fun show (Lspace/kscience/visionforge/html/Page;Ljava/nio/file/Path;)V + public static synthetic fun show$default (Lspace/kscience/visionforge/html/Page;Ljava/nio/file/Path;ILjava/lang/Object;)V +} + +public abstract interface class space/kscience/visionforge/MutableVisionGroup : space/kscience/visionforge/VisionContainerBuilder, space/kscience/visionforge/VisionGroup { + public abstract fun onStructureChanged (Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V + public abstract fun removeStructureListener (Ljava/lang/Object;)V +} + +public class space/kscience/visionforge/SimpleVisionPropertyContainer : space/kscience/dataforge/meta/Configurable, space/kscience/visionforge/VisionPropertyContainer { + public fun (Lspace/kscience/dataforge/meta/ObservableMutableMeta;)V + public synthetic fun getMeta ()Lspace/kscience/dataforge/meta/MutableMeta; + public fun getMeta ()Lspace/kscience/dataforge/meta/ObservableMutableMeta; + public fun getPropertyValue (Lspace/kscience/dataforge/names/Name;ZZZ)Lspace/kscience/dataforge/values/Value; +} + +public final class space/kscience/visionforge/StyleReference { + public fun (Lspace/kscience/visionforge/VisionGroup;Ljava/lang/String;)V + public final fun getName ()Ljava/lang/String; + public final fun getOwner ()Lspace/kscience/visionforge/VisionGroup; +} + +public final class space/kscience/visionforge/StyleReferenceKt { + public static final fun style (Lspace/kscience/visionforge/VisionGroup;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lkotlin/properties/ReadOnlyProperty; + public static final fun style (Lspace/kscience/visionforge/VisionGroup;Lspace/kscience/dataforge/meta/Specification;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lkotlin/properties/ReadOnlyProperty; + public static synthetic fun style$default (Lspace/kscience/visionforge/VisionGroup;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlin/properties/ReadOnlyProperty; + public static synthetic fun style$default (Lspace/kscience/visionforge/VisionGroup;Lspace/kscience/dataforge/meta/Specification;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlin/properties/ReadOnlyProperty; + public static final fun useStyle (Lspace/kscience/visionforge/Vision;Lspace/kscience/visionforge/StyleReference;)V +} + +public final class space/kscience/visionforge/StyleSheet { + public static final field Companion Lspace/kscience/visionforge/StyleSheet$Companion; + public static final synthetic fun box-impl (Lspace/kscience/visionforge/VisionGroup;)Lspace/kscience/visionforge/StyleSheet; + public static fun constructor-impl (Lspace/kscience/visionforge/VisionGroup;)Lspace/kscience/visionforge/VisionGroup; + public static final fun define-impl (Lspace/kscience/visionforge/VisionGroup;Ljava/lang/String;Lspace/kscience/dataforge/meta/Meta;)V + public fun equals (Ljava/lang/Object;)Z + public static fun equals-impl (Lspace/kscience/visionforge/VisionGroup;Ljava/lang/Object;)Z + public static final fun equals-impl0 (Lspace/kscience/visionforge/VisionGroup;Lspace/kscience/visionforge/VisionGroup;)Z + public static final fun get-impl (Lspace/kscience/visionforge/VisionGroup;Ljava/lang/String;)Lspace/kscience/dataforge/meta/Meta; + public static final fun getItems-impl (Lspace/kscience/visionforge/VisionGroup;)Ljava/util/Map; + public fun hashCode ()I + public static fun hashCode-impl (Lspace/kscience/visionforge/VisionGroup;)I + public static final fun invoke-impl (Lspace/kscience/visionforge/VisionGroup;Lkotlin/jvm/functions/Function1;)V + public static final fun set-impl (Lspace/kscience/visionforge/VisionGroup;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V + public static final fun set-impl (Lspace/kscience/visionforge/VisionGroup;Ljava/lang/String;Lspace/kscience/dataforge/meta/Meta;)V + public fun toString ()Ljava/lang/String; + public static fun toString-impl (Lspace/kscience/visionforge/VisionGroup;)Ljava/lang/String; + public final synthetic fun unbox-impl ()Lspace/kscience/visionforge/VisionGroup; +} + +public final class space/kscience/visionforge/StyleSheet$Companion { + public final fun getSTYLESHEET_KEY ()Lspace/kscience/dataforge/names/Name; +} + +public final class space/kscience/visionforge/StyleSheetKt { + public static final fun getStyle (Lspace/kscience/visionforge/Vision;Ljava/lang/String;)Lspace/kscience/dataforge/meta/Meta; + public static final fun getStyleNodes (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;)Ljava/util/List; + public static final fun getStyleProperty (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;)Lspace/kscience/dataforge/values/Value; + public static final fun getStyleSheet (Lspace/kscience/visionforge/VisionGroup;)Lspace/kscience/visionforge/VisionGroup; + public static final fun getStyles (Lspace/kscience/visionforge/Vision;)Ljava/util/List; + public static final fun setStyles (Lspace/kscience/visionforge/Vision;Ljava/util/List;)V + public static final fun useStyle (Lspace/kscience/visionforge/Vision;Ljava/lang/String;)V +} + +public abstract interface class space/kscience/visionforge/Vision : space/kscience/dataforge/meta/Configurable, space/kscience/dataforge/meta/descriptors/Described { + public static final field Companion Lspace/kscience/visionforge/Vision$Companion; + public static final field TYPE Ljava/lang/String; + public abstract fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; + public fun getManager ()Lspace/kscience/visionforge/VisionManager; + public abstract fun getMeta ()Lspace/kscience/dataforge/meta/ObservableMutableMeta; + public abstract fun getParent ()Lspace/kscience/visionforge/VisionGroup; + public abstract fun getPropertyValue (Lspace/kscience/dataforge/names/Name;ZZZ)Lspace/kscience/dataforge/values/Value; + public static synthetic fun getPropertyValue$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;ZZZILjava/lang/Object;)Lspace/kscience/dataforge/values/Value; + public abstract fun invalidateProperty (Lspace/kscience/dataforge/names/Name;)V + public abstract fun setParent (Lspace/kscience/visionforge/VisionGroup;)V + public abstract fun update (Lspace/kscience/visionforge/VisionChange;)V +} + +public final class space/kscience/visionforge/Vision$Companion { + public static final field TYPE Ljava/lang/String; + public final fun getSTYLE_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getVISIBLE_KEY ()Lspace/kscience/dataforge/names/Name; +} + +public class space/kscience/visionforge/VisionBase : space/kscience/visionforge/Vision { + public static final field Companion Lspace/kscience/visionforge/VisionBase$Companion; + public fun ()V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Lspace/kscience/visionforge/VisionGroup;Lspace/kscience/dataforge/meta/MutableMeta;)V + public synthetic fun (Lspace/kscience/visionforge/VisionGroup;Lspace/kscience/dataforge/meta/MutableMeta;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; + public synthetic fun getMeta ()Lspace/kscience/dataforge/meta/MutableMeta; + public final fun getMeta ()Lspace/kscience/dataforge/meta/ObservableMutableMeta; + protected final fun getOrCreateProperties ()Lspace/kscience/dataforge/meta/MutableMeta; + public fun getParent ()Lspace/kscience/visionforge/VisionGroup; + protected final fun getProperties ()Lspace/kscience/dataforge/meta/MutableMeta; + public fun getPropertyValue (Lspace/kscience/dataforge/names/Name;ZZZ)Lspace/kscience/dataforge/values/Value; + public fun invalidateProperty (Lspace/kscience/dataforge/names/Name;)V + public fun setParent (Lspace/kscience/visionforge/VisionGroup;)V + protected final fun setProperties (Lspace/kscience/dataforge/meta/MutableMeta;)V + public fun update (Lspace/kscience/visionforge/VisionChange;)V + public static final fun write$Self (Lspace/kscience/visionforge/VisionBase;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/VisionBase$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/VisionBase$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/VisionBase; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/VisionBase;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/VisionBase$Companion { + public final fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; + public final fun serializer ()Lkotlinx/serialization/KSerializer; + public final fun updateProperties (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/meta/Meta;)V +} + +public abstract interface annotation class space/kscience/visionforge/VisionBuilder : java/lang/annotation/Annotation { +} + +public final class space/kscience/visionforge/VisionChange { + public static final field Companion Lspace/kscience/visionforge/VisionChange$Companion; + public fun ()V + public synthetic fun (IZLspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;Ljava/util/Map;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (ZLspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;Ljava/util/Map;)V + public synthetic fun (ZLspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Z + public final fun component2 ()Lspace/kscience/visionforge/Vision; + public final fun component3 ()Lspace/kscience/dataforge/meta/Meta; + public final fun component4 ()Ljava/util/Map; + public final fun copy (ZLspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;Ljava/util/Map;)Lspace/kscience/visionforge/VisionChange; + public static synthetic fun copy$default (Lspace/kscience/visionforge/VisionChange;ZLspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;Ljava/util/Map;ILjava/lang/Object;)Lspace/kscience/visionforge/VisionChange; + public fun equals (Ljava/lang/Object;)Z + public final fun getChildren ()Ljava/util/Map; + public final fun getDelete ()Z + public final fun getProperties ()Lspace/kscience/dataforge/meta/Meta; + public final fun getVision ()Lspace/kscience/visionforge/Vision; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; + public static final fun write$Self (Lspace/kscience/visionforge/VisionChange;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/VisionChange$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/VisionChange$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/VisionChange; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/VisionChange;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/VisionChange$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/VisionChangeBuilder : space/kscience/visionforge/VisionContainerBuilder { + public fun ()V + public final fun deepCopy ()Lspace/kscience/visionforge/VisionChange; + public final fun isEmpty ()Z + public final fun propertyChanged (Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/meta/Meta;)V + public fun set (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;)V +} + +public final class space/kscience/visionforge/VisionChangeKt { + public static final fun VisionChange (Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/VisionChange; + public static final fun flowChanges-HG0u8IE (Lspace/kscience/visionforge/Vision;J)Lkotlinx/coroutines/flow/Flow; +} + +public abstract interface class space/kscience/visionforge/VisionContainer { + public abstract fun get (Lspace/kscience/dataforge/names/Name;)Lspace/kscience/visionforge/Vision; +} + +public abstract interface class space/kscience/visionforge/VisionContainerBuilder { + public abstract fun set (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;)V +} + +public final class space/kscience/visionforge/VisionDelegatesKt { + public static final fun numberProperty (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;ZZZ)Lkotlin/properties/ReadWriteProperty; + public static final fun numberProperty (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;ZZZLkotlin/jvm/functions/Function0;)Lkotlin/properties/ReadWriteProperty; + public static synthetic fun numberProperty$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;ZZZILjava/lang/Object;)Lkotlin/properties/ReadWriteProperty; + public static synthetic fun numberProperty$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;ZZZLkotlin/jvm/functions/Function0;ILjava/lang/Object;)Lkotlin/properties/ReadWriteProperty; + public static final fun propertyValue (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;ZZZ)Lkotlin/properties/ReadWriteProperty; + public static final fun propertyValue (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;ZZZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lkotlin/properties/ReadWriteProperty; + public static synthetic fun propertyValue$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;ZZZILjava/lang/Object;)Lkotlin/properties/ReadWriteProperty; + public static synthetic fun propertyValue$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;ZZZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlin/properties/ReadWriteProperty; +} + +public final class space/kscience/visionforge/VisionDescriptorKt { + public static final fun getHidden (Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;)Z + public static final fun getInherited (Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;)Ljava/lang/Boolean; + public static final fun getInherited (Lspace/kscience/dataforge/meta/descriptors/MetaDescriptorBuilder;)Ljava/lang/Boolean; + public static final fun getUsesStyles (Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;)Ljava/lang/Boolean; + public static final fun getUsesStyles (Lspace/kscience/dataforge/meta/descriptors/MetaDescriptorBuilder;)Ljava/lang/Boolean; + public static final fun getWidget (Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;)Lspace/kscience/dataforge/meta/Meta; + public static final fun getWidget (Lspace/kscience/dataforge/meta/descriptors/MetaDescriptorBuilder;)Lspace/kscience/dataforge/meta/Meta; + public static final fun getWidgetType (Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;)Ljava/lang/String; + public static final fun getWidgetType (Lspace/kscience/dataforge/meta/descriptors/MetaDescriptorBuilder;)Ljava/lang/String; + public static final fun hide (Lspace/kscience/dataforge/meta/descriptors/MetaDescriptorBuilder;)V + public static final fun setInherited (Lspace/kscience/dataforge/meta/descriptors/MetaDescriptorBuilder;Ljava/lang/Boolean;)V + public static final fun setUsesStyles (Lspace/kscience/dataforge/meta/descriptors/MetaDescriptorBuilder;Ljava/lang/Boolean;)V + public static final fun setWidget (Lspace/kscience/dataforge/meta/descriptors/MetaDescriptorBuilder;Lspace/kscience/dataforge/meta/Meta;)V + public static final fun setWidgetType (Lspace/kscience/dataforge/meta/descriptors/MetaDescriptorBuilder;Ljava/lang/String;)V +} + +public abstract interface class space/kscience/visionforge/VisionGroup : space/kscience/dataforge/provider/Provider, space/kscience/visionforge/Vision, space/kscience/visionforge/VisionContainer { + public static final field Companion Lspace/kscience/visionforge/VisionGroup$Companion; + public static final field STYLE_TARGET Ljava/lang/String; + public fun content (Ljava/lang/String;)Ljava/util/Map; + public fun get (Lspace/kscience/dataforge/names/Name;)Lspace/kscience/visionforge/Vision; + public abstract fun getChildren ()Ljava/util/Map; + public fun getDefaultTarget ()Ljava/lang/String; +} + +public final class space/kscience/visionforge/VisionGroup$Companion { + public static final field STYLE_TARGET Ljava/lang/String; +} + +public class space/kscience/visionforge/VisionGroupBase : space/kscience/visionforge/VisionBase, space/kscience/visionforge/MutableVisionGroup { + public static final field Companion Lspace/kscience/visionforge/VisionGroupBase$Companion; + public fun ()V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/util/Map;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Ljava/util/Map;)V + public synthetic fun (Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + protected fun addStatic (Lspace/kscience/visionforge/Vision;)V + protected final fun childrenChanged (Lspace/kscience/dataforge/names/Name;)V + protected fun createGroup ()Lspace/kscience/visionforge/VisionGroupBase; + public fun getChildren ()Ljava/util/Map; + protected final fun getChildrenInternal ()Ljava/util/Map; + public fun invalidateProperty (Lspace/kscience/dataforge/names/Name;)V + public fun onStructureChanged (Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V + public fun removeStructureListener (Ljava/lang/Object;)V + public fun set (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;)V + public fun update (Lspace/kscience/visionforge/VisionChange;)V + public static final fun write$Self (Lspace/kscience/visionforge/VisionGroupBase;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/VisionGroupBase$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/VisionGroupBase$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/VisionGroupBase; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/VisionGroupBase;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/VisionGroupBase$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/VisionGroupBaseKt { + public static final fun setAsRoot (Lspace/kscience/visionforge/Vision;Lspace/kscience/visionforge/VisionManager;)V +} + +public final class space/kscience/visionforge/VisionGroupKt { + public static final fun get (Lspace/kscience/visionforge/VisionContainer;Ljava/lang/String;)Lspace/kscience/visionforge/Vision; + public static final fun getStructureChanges (Lspace/kscience/visionforge/MutableVisionGroup;)Lkotlinx/coroutines/flow/Flow; + public static final fun isEmpty (Lspace/kscience/visionforge/VisionGroup;)Z + public static final fun iterator (Lspace/kscience/visionforge/VisionGroup;)Ljava/util/Iterator; + public static final fun removeAll (Lspace/kscience/visionforge/MutableVisionGroup;)V + public static final fun set (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lspace/kscience/visionforge/Vision;)V + public static final fun set (Lspace/kscience/visionforge/VisionContainerBuilder;Lspace/kscience/dataforge/names/NameToken;Lspace/kscience/visionforge/Vision;)V +} + +public final class space/kscience/visionforge/VisionKt { + public static final fun getPropertyChanges (Lspace/kscience/visionforge/Vision;)Lkotlinx/coroutines/flow/Flow; + public static final fun getPropertyValue (Lspace/kscience/visionforge/Vision;Ljava/lang/String;ZZZ)Lspace/kscience/dataforge/values/Value; + public static synthetic fun getPropertyValue$default (Lspace/kscience/visionforge/Vision;Ljava/lang/String;ZZZILjava/lang/Object;)Lspace/kscience/dataforge/values/Value; + public static final fun getVisible (Lspace/kscience/visionforge/Vision;)Ljava/lang/Boolean; + public static final fun onPropertyChange (Lspace/kscience/visionforge/Vision;Lkotlin/jvm/functions/Function2;)V + public static final fun setProperty (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;Ljava/lang/Object;)V + public static final fun setPropertyNode (Lspace/kscience/visionforge/Vision;Ljava/lang/String;Ljava/lang/Object;)V + public static final fun setVisible (Lspace/kscience/visionforge/Vision;Ljava/lang/Boolean;)V + public static final fun useProperty (Lspace/kscience/visionforge/Vision;Lkotlin/reflect/KProperty1;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V + public static synthetic fun useProperty$default (Lspace/kscience/visionforge/Vision;Lkotlin/reflect/KProperty1;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)V +} + +public final class space/kscience/visionforge/VisionManager : space/kscience/dataforge/context/AbstractPlugin { + public static final field Companion Lspace/kscience/visionforge/VisionManager$Companion; + public static final field VISION_SERIALIZER_MODULE_TARGET Ljava/lang/String; + public fun (Lspace/kscience/dataforge/meta/Meta;)V + public final fun decodeFromJson (Lkotlinx/serialization/json/JsonElement;)Lspace/kscience/visionforge/Vision; + public final fun decodeFromMeta (Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;)Lspace/kscience/visionforge/Vision; + public static synthetic fun decodeFromMeta$default (Lspace/kscience/visionforge/VisionManager;Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;ILjava/lang/Object;)Lspace/kscience/visionforge/Vision; + public final fun decodeFromString (Ljava/lang/String;)Lspace/kscience/visionforge/Vision; + public final fun encodeToJsonElement (Lspace/kscience/visionforge/Vision;)Lkotlinx/serialization/json/JsonElement; + public final fun encodeToMeta (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;)Lspace/kscience/dataforge/meta/Meta; + public static synthetic fun encodeToMeta$default (Lspace/kscience/visionforge/VisionManager;Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;ILjava/lang/Object;)Lspace/kscience/dataforge/meta/Meta; + public final fun encodeToString (Lspace/kscience/visionforge/Vision;)Ljava/lang/String; + public final fun encodeToString (Lspace/kscience/visionforge/VisionChange;)Ljava/lang/String; + public final fun getJsonFormat ()Lkotlinx/serialization/json/Json; + public final fun getSerializersModule ()Lkotlinx/serialization/modules/SerializersModule; + public fun getTag ()Lspace/kscience/dataforge/context/PluginTag; +} + +public final class space/kscience/visionforge/VisionManager$Companion : space/kscience/dataforge/context/PluginFactory { + public final fun getDefaultJson ()Lkotlinx/serialization/json/Json; + public fun getTag ()Lspace/kscience/dataforge/context/PluginTag; + public fun getType ()Lkotlin/reflect/KClass; + public synthetic fun invoke (Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/context/Context;)Ljava/lang/Object; + public fun invoke (Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/context/Context;)Lspace/kscience/visionforge/VisionManager; +} + +public final class space/kscience/visionforge/VisionManagerKt { + public static final fun encodeToString (Lspace/kscience/visionforge/Vision;)Ljava/lang/String; + public static final fun getVisionManager (Lspace/kscience/dataforge/context/Context;)Lspace/kscience/visionforge/VisionManager; +} + +public abstract class space/kscience/visionforge/VisionPlugin : space/kscience/dataforge/context/AbstractPlugin { + public fun ()V + public fun (Lspace/kscience/dataforge/meta/Meta;)V + public synthetic fun (Lspace/kscience/dataforge/meta/Meta;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun content (Ljava/lang/String;)Ljava/util/Map; + public final fun getVisionManager ()Lspace/kscience/visionforge/VisionManager; + protected abstract fun getVisionSerializersModule ()Lkotlinx/serialization/modules/SerializersModule; +} + +public abstract interface class space/kscience/visionforge/VisionPropertyContainer { + public abstract fun getMeta ()Lspace/kscience/dataforge/meta/MutableMeta; + public abstract fun getPropertyValue (Lspace/kscience/dataforge/names/Name;ZZZ)Lspace/kscience/dataforge/values/Value; + public static synthetic fun getPropertyValue$default (Lspace/kscience/visionforge/VisionPropertyContainer;Lspace/kscience/dataforge/names/Name;ZZZILjava/lang/Object;)Lspace/kscience/dataforge/values/Value; +} + +public final class space/kscience/visionforge/html/HeadersKt { + public static final fun importScriptHeader (Lspace/kscience/visionforge/html/Page$Companion;Ljava/lang/String;Lspace/kscience/visionforge/html/ResourceLocation;Ljava/nio/file/Path;)Lkotlin/jvm/functions/Function1; + public static synthetic fun importScriptHeader$default (Lspace/kscience/visionforge/html/Page$Companion;Ljava/lang/String;Lspace/kscience/visionforge/html/ResourceLocation;Ljava/nio/file/Path;ILjava/lang/Object;)Lkotlin/jvm/functions/Function1; +} + +public final class space/kscience/visionforge/html/HtmlFormFragment { + public final fun get (Ljava/lang/String;)Lspace/kscience/dataforge/meta/Meta; + public final fun getFormBody ()Lkotlin/jvm/functions/Function1; + public final fun getValues ()Lspace/kscience/dataforge/meta/Meta; + public final fun getVision ()Lspace/kscience/visionforge/html/VisionOfHtmlForm; +} + +public final class space/kscience/visionforge/html/HtmlFragmentKt { + public static final fun fragment (Lkotlinx/html/FlowContent;Lkotlin/jvm/functions/Function1;)V + public static final fun fragment (Lkotlinx/html/TagConsumer;Lkotlin/jvm/functions/Function1;)V + public static final fun plus (Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lkotlin/jvm/functions/Function1; + public static final fun renderToString (Lkotlin/jvm/functions/Function1;)Ljava/lang/String; +} + +public final class space/kscience/visionforge/html/HtmlVisionRendererKt { + public static final fun HtmlVisionFragment (Lkotlin/jvm/functions/Function1;)Lkotlin/jvm/functions/Function1; + public static final fun visionFragment (Lkotlinx/html/FlowContent;Lspace/kscience/dataforge/context/Context;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;)Ljava/util/Map; + public static final fun visionFragment (Lkotlinx/html/TagConsumer;Lspace/kscience/dataforge/context/Context;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;)Ljava/util/Map; + public static synthetic fun visionFragment$default (Lkotlinx/html/FlowContent;Lspace/kscience/dataforge/context/Context;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/util/Map; + public static synthetic fun visionFragment$default (Lkotlinx/html/TagConsumer;Lspace/kscience/dataforge/context/Context;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/util/Map; +} + +public final class space/kscience/visionforge/html/Page { + public static final field Companion Lspace/kscience/visionforge/html/Page$Companion; + public fun (Lspace/kscience/dataforge/context/Context;Ljava/util/Map;Lkotlin/jvm/functions/Function1;)V + public synthetic fun (Lspace/kscience/dataforge/context/Context;Ljava/util/Map;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lspace/kscience/dataforge/context/Context; + public final fun component2 ()Ljava/util/Map; + public final fun component3 ()Lkotlin/jvm/functions/Function1; + public final fun copy (Lspace/kscience/dataforge/context/Context;Ljava/util/Map;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/html/Page; + public static synthetic fun copy$default (Lspace/kscience/visionforge/html/Page;Lspace/kscience/dataforge/context/Context;Ljava/util/Map;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/html/Page; + public fun equals (Ljava/lang/Object;)Z + public final fun getContent ()Lkotlin/jvm/functions/Function1; + public final fun getContext ()Lspace/kscience/dataforge/context/Context; + public final fun getHeaders ()Ljava/util/Map; + public fun hashCode ()I + public final fun render (Lkotlinx/html/TagConsumer;)Ljava/lang/Object; + public fun toString ()Ljava/lang/String; +} + +public final class space/kscience/visionforge/html/Page$Companion { + public final fun scriptHeader (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lkotlin/jvm/functions/Function1; + public static synthetic fun scriptHeader$default (Lspace/kscience/visionforge/html/Page$Companion;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlin/jvm/functions/Function1; + public final fun styleSheetHeader (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lkotlin/jvm/functions/Function1; + public static synthetic fun styleSheetHeader$default (Lspace/kscience/visionforge/html/Page$Companion;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlin/jvm/functions/Function1; + public final fun title (Ljava/lang/String;)Lkotlin/jvm/functions/Function1; +} + +public final class space/kscience/visionforge/html/ResourceLocation : java/lang/Enum { + public static final field EMBED Lspace/kscience/visionforge/html/ResourceLocation; + public static final field LOCAL Lspace/kscience/visionforge/html/ResourceLocation; + public static final field SYSTEM Lspace/kscience/visionforge/html/ResourceLocation; + public static fun valueOf (Ljava/lang/String;)Lspace/kscience/visionforge/html/ResourceLocation; + public static fun values ()[Lspace/kscience/visionforge/html/ResourceLocation; +} + +public abstract interface annotation class space/kscience/visionforge/html/VisionDSL : java/lang/annotation/Annotation { +} + +public final class space/kscience/visionforge/html/VisionOfCheckbox : space/kscience/visionforge/html/VisionOfHtmlInput { + public static final field Companion Lspace/kscience/visionforge/html/VisionOfCheckbox$Companion; + public fun ()V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getChecked ()Ljava/lang/Boolean; + public final fun getLabel ()Ljava/lang/String; + public final fun getName ()Ljava/lang/String; + public final fun setChecked (Ljava/lang/Boolean;)V + public static final fun write$Self (Lspace/kscience/visionforge/html/VisionOfCheckbox;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/html/VisionOfCheckbox$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/html/VisionOfCheckbox$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/html/VisionOfCheckbox; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/html/VisionOfCheckbox;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/html/VisionOfCheckbox$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/html/VisionOfHtmlForm : space/kscience/visionforge/html/VisionOfHtmlInput { + public static final field Companion Lspace/kscience/visionforge/html/VisionOfHtmlForm$Companion; + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Ljava/lang/String;)V + public final fun getFormId ()Ljava/lang/String; + public final fun getValues ()Lspace/kscience/dataforge/meta/Meta; + public final fun setValues (Lspace/kscience/dataforge/meta/Meta;)V + public static final fun write$Self (Lspace/kscience/visionforge/html/VisionOfHtmlForm;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/html/VisionOfHtmlForm$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/html/VisionOfHtmlForm$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/html/VisionOfHtmlForm; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/html/VisionOfHtmlForm;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/html/VisionOfHtmlForm$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/html/VisionOfHtmlFormKt { + public static final fun HtmlFormFragment (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/html/HtmlFormFragment; + public static synthetic fun HtmlFormFragment$default (Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/html/HtmlFormFragment; + public static final fun formFragment (Lkotlinx/html/TagConsumer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/html/VisionOfHtmlForm; + public static synthetic fun formFragment$default (Lkotlinx/html/TagConsumer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/html/VisionOfHtmlForm; +} + +public abstract class space/kscience/visionforge/html/VisionOfHtmlInput : space/kscience/visionforge/VisionBase { + public static final field Companion Lspace/kscience/visionforge/html/VisionOfHtmlInput$Companion; + public fun ()V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public final fun getDisabled ()Z + public final fun setDisabled (Z)V + public static final fun write$Self (Lspace/kscience/visionforge/html/VisionOfHtmlInput;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/html/VisionOfHtmlInput$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/html/VisionOfNumberField : space/kscience/visionforge/html/VisionOfHtmlInput { + public static final field Companion Lspace/kscience/visionforge/html/VisionOfNumberField$Companion; + public fun ()V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getLabel ()Ljava/lang/String; + public final fun getName ()Ljava/lang/String; + public final fun getValue ()Ljava/lang/Number; + public final fun setValue (Ljava/lang/Number;)V + public static final fun write$Self (Lspace/kscience/visionforge/html/VisionOfNumberField;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/html/VisionOfNumberField$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/html/VisionOfNumberField$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/html/VisionOfNumberField; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/html/VisionOfNumberField;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/html/VisionOfNumberField$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/html/VisionOfRangeField : space/kscience/visionforge/html/VisionOfHtmlInput { + public static final field Companion Lspace/kscience/visionforge/html/VisionOfRangeField$Companion; + public fun (DDDLjava/lang/String;Ljava/lang/String;)V + public synthetic fun (DDDLjava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;DDDLjava/lang/String;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public final fun getLabel ()Ljava/lang/String; + public final fun getMax ()D + public final fun getMin ()D + public final fun getName ()Ljava/lang/String; + public final fun getStep ()D + public final fun getValue ()Ljava/lang/Number; + public final fun setValue (Ljava/lang/Number;)V + public static final fun write$Self (Lspace/kscience/visionforge/html/VisionOfRangeField;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/html/VisionOfRangeField$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/html/VisionOfRangeField$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/html/VisionOfRangeField; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/html/VisionOfRangeField;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/html/VisionOfRangeField$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/html/VisionOfTextField : space/kscience/visionforge/html/VisionOfHtmlInput { + public static final field Companion Lspace/kscience/visionforge/html/VisionOfTextField$Companion; + public fun ()V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getLabel ()Ljava/lang/String; + public final fun getName ()Ljava/lang/String; + public final fun getText ()Ljava/lang/String; + public final fun setText (Ljava/lang/String;)V + public static final fun write$Self (Lspace/kscience/visionforge/html/VisionOfTextField;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/html/VisionOfTextField$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/html/VisionOfTextField$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/html/VisionOfTextField; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/html/VisionOfTextField;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/html/VisionOfTextField$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/html/VisionOutput { + public fun (Lspace/kscience/dataforge/context/Context;Lspace/kscience/dataforge/names/Name;)V + public final fun getContext ()Lspace/kscience/dataforge/context/Context; + public final fun getMeta ()Lspace/kscience/dataforge/meta/Meta; + public final fun getName ()Lspace/kscience/dataforge/names/Name; + public final fun meta (Lkotlin/jvm/functions/Function1;)V + public final fun requirePlugin (Lspace/kscience/dataforge/context/PluginFactory;)V + public final fun setMeta (Lspace/kscience/dataforge/meta/Meta;)V +} + +public abstract class space/kscience/visionforge/html/VisionTagConsumer : kotlinx/html/TagConsumer { + public static final field AUTO_DATA_ATTRIBUTE Ljava/lang/String; + public static final field Companion Lspace/kscience/visionforge/html/VisionTagConsumer$Companion; + public static final field DEFAULT_ENDPOINT Ljava/lang/String; + public static final field DEFAULT_VISION_NAME Ljava/lang/String; + public static final field OUTPUT_CLASS Ljava/lang/String; + public static final field OUTPUT_CONNECT_ATTRIBUTE Ljava/lang/String; + public static final field OUTPUT_DATA_CLASS Ljava/lang/String; + public static final field OUTPUT_ENDPOINT_ATTRIBUTE Ljava/lang/String; + public static final field OUTPUT_FETCH_ATTRIBUTE Ljava/lang/String; + public static final field OUTPUT_META_CLASS Ljava/lang/String; + public static final field OUTPUT_NAME_ATTRIBUTE Ljava/lang/String; + public static final field OUTPUT_RENDERED Ljava/lang/String; + public fun (Lkotlinx/html/TagConsumer;Lspace/kscience/dataforge/context/Context;Ljava/lang/String;)V + public synthetic fun (Lkotlinx/html/TagConsumer;Lspace/kscience/dataforge/context/Context;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun finalize ()Ljava/lang/Object; + public final fun getContext ()Lspace/kscience/dataforge/context/Context; + public fun onTagAttributeChange (Lkotlinx/html/Tag;Ljava/lang/String;Ljava/lang/String;)V + public fun onTagComment (Ljava/lang/CharSequence;)V + public fun onTagContent (Ljava/lang/CharSequence;)V + public fun onTagContentEntity (Lkotlinx/html/Entities;)V + public fun onTagContentUnsafe (Lkotlin/jvm/functions/Function1;)V + public fun onTagEnd (Lkotlinx/html/Tag;)V + public fun onTagError (Lkotlinx/html/Tag;Ljava/lang/Throwable;)V + public fun onTagEvent (Lkotlinx/html/Tag;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V + public fun onTagStart (Lkotlinx/html/Tag;)V + protected fun processResult (Ljava/lang/Object;)V + protected abstract fun renderVision (Lkotlinx/html/DIV;Lspace/kscience/visionforge/VisionManager;Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;)V + public fun resolveId (Lspace/kscience/dataforge/names/Name;)Ljava/lang/String; + public final fun vision (Lkotlinx/html/TagConsumer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; + public final fun vision (Lkotlinx/html/TagConsumer;Lspace/kscience/dataforge/names/Name;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; + public static synthetic fun vision$default (Lspace/kscience/visionforge/html/VisionTagConsumer;Lkotlinx/html/TagConsumer;Lspace/kscience/dataforge/names/Name;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/Object; +} + +public final class space/kscience/visionforge/html/VisionTagConsumer$Companion { +} + +public final class space/kscience/visionforge/visitor/CountDistinctKt { + public static final fun countDistinct (Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun countDistinctBy (Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class space/kscience/visionforge/visitor/DefaultVisionStatistics { + public fun (Lspace/kscience/dataforge/names/Name;Lkotlin/reflect/KClass;)V + public final fun component1 ()Lspace/kscience/dataforge/names/Name; + public final fun component2 ()Lkotlin/reflect/KClass; + public final fun copy (Lspace/kscience/dataforge/names/Name;Lkotlin/reflect/KClass;)Lspace/kscience/visionforge/visitor/DefaultVisionStatistics; + public static synthetic fun copy$default (Lspace/kscience/visionforge/visitor/DefaultVisionStatistics;Lspace/kscience/dataforge/names/Name;Lkotlin/reflect/KClass;ILjava/lang/Object;)Lspace/kscience/visionforge/visitor/DefaultVisionStatistics; + public fun equals (Ljava/lang/Object;)Z + public final fun getDepth ()I + public final fun getName ()Lspace/kscience/dataforge/names/Name; + public final fun getType ()Lkotlin/reflect/KClass; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class space/kscience/visionforge/visitor/StatisticsVisitorKt { + public static final fun flowStatistics (Lspace/kscience/visionforge/Vision;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun flowStatistics (Lspace/kscience/visionforge/Vision;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public abstract interface class space/kscience/visionforge/visitor/VisionVisitor { + public static final field Companion Lspace/kscience/visionforge/visitor/VisionVisitor$Companion; + public fun skip (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;)Z + public abstract fun visit (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun visitChildren (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/VisionGroup;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class space/kscience/visionforge/visitor/VisionVisitor$Companion { + public final fun visitTree (Lspace/kscience/visionforge/visitor/VisionVisitor;Lkotlinx/coroutines/CoroutineScope;Lspace/kscience/visionforge/Vision;)Lkotlinx/coroutines/Job; +} + diff --git a/visionforge-gdml/api/visionforge-gdml.api b/visionforge-gdml/api/visionforge-gdml.api new file mode 100644 index 00000000..1a73d170 --- /dev/null +++ b/visionforge-gdml/api/visionforge-gdml.api @@ -0,0 +1,49 @@ +public final class space/kscience/visionforge/gdml/GdmlJVMKt { + public static final fun gdml (Lspace/kscience/visionforge/solid/SolidGroup;Ljava/nio/file/Path;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;)V + public static synthetic fun gdml$default (Lspace/kscience/visionforge/solid/SolidGroup;Ljava/nio/file/Path;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)V +} + +public final class space/kscience/visionforge/gdml/GdmlLoaderKt { + public static final fun gdml (Lspace/kscience/visionforge/html/VisionOutput;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/SolidGroup; + public static final fun gdml (Lspace/kscience/visionforge/solid/SolidGroup;Lspace/kscience/gdml/Gdml;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V + public static synthetic fun gdml$default (Lspace/kscience/visionforge/solid/SolidGroup;Lspace/kscience/gdml/Gdml;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V + public static final fun toVision (Lspace/kscience/gdml/Gdml;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/SolidGroup; + public static synthetic fun toVision$default (Lspace/kscience/gdml/Gdml;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/SolidGroup; +} + +public final class space/kscience/visionforge/gdml/GdmlLoaderOptions { + public static final field Companion Lspace/kscience/visionforge/gdml/GdmlLoaderOptions$Companion; + public fun ()V + public final fun configure (Lkotlin/jvm/functions/Function4;)V + public final fun getAUnit ()Lspace/kscience/gdml/AUnit; + public final fun getConfigurePaint ()Lkotlin/jvm/functions/Function3; + public final fun getConfigureSolid ()Lkotlin/jvm/functions/Function4; + public final fun getLUnit ()Lspace/kscience/gdml/LUnit; + public final fun getSolidAction ()Lkotlin/jvm/functions/Function1; + public final fun getVolumeAction ()Lkotlin/jvm/functions/Function1; + public final fun paint (Lkotlin/jvm/functions/Function3;)V + public final fun registerAndUseStyle (Lspace/kscience/visionforge/solid/Solid;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V + public final fun setAUnit (Lspace/kscience/gdml/AUnit;)V + public final fun setLUnit (Lspace/kscience/gdml/LUnit;)V + public final fun setSolidAction (Lkotlin/jvm/functions/Function1;)V + public final fun setVolumeAction (Lkotlin/jvm/functions/Function1;)V + public final fun transparent (Lspace/kscience/visionforge/solid/Solid;)V +} + +public final class space/kscience/visionforge/gdml/GdmlLoaderOptions$Action : java/lang/Enum { + public static final field ADD Lspace/kscience/visionforge/gdml/GdmlLoaderOptions$Action; + public static final field PROTOTYPE Lspace/kscience/visionforge/gdml/GdmlLoaderOptions$Action; + public static final field REJECT Lspace/kscience/visionforge/gdml/GdmlLoaderOptions$Action; + public static fun valueOf (Ljava/lang/String;)Lspace/kscience/visionforge/gdml/GdmlLoaderOptions$Action; + public static fun values ()[Lspace/kscience/visionforge/gdml/GdmlLoaderOptions$Action; +} + +public final class space/kscience/visionforge/gdml/GdmlLoaderOptions$Companion { + public final fun randomColor (Lspace/kscience/gdml/GdmlMaterial;)I +} + +public final class space/kscience/visionforge/gdml/MarkLayersKt { + public static final fun markLayers (Lspace/kscience/visionforge/solid/SolidGroup;Ljava/util/List;)V + public static synthetic fun markLayers$default (Lspace/kscience/visionforge/solid/SolidGroup;Ljava/util/List;ILjava/lang/Object;)V +} + diff --git a/visionforge-markdown/api/visionforge-markdown.api b/visionforge-markdown/api/visionforge-markdown.api new file mode 100644 index 00000000..08028532 --- /dev/null +++ b/visionforge-markdown/api/visionforge-markdown.api @@ -0,0 +1,40 @@ +public final class space/kscience/visionforge/markup/MarkdownKt { + public static final fun markdown (Lkotlinx/html/TagConsumer;Lorg/intellij/markdown/flavours/MarkdownFlavourDescriptor;Lkotlin/jvm/functions/Function0;)Ljava/lang/Object; + public static synthetic fun markdown$default (Lkotlinx/html/TagConsumer;Lorg/intellij/markdown/flavours/MarkdownFlavourDescriptor;Lkotlin/jvm/functions/Function0;ILjava/lang/Object;)Ljava/lang/Object; +} + +public final class space/kscience/visionforge/markup/VisionOfMarkup : space/kscience/visionforge/VisionBase { + public static final field COMMONMARK_FORMAT Ljava/lang/String; + public static final field Companion Lspace/kscience/visionforge/markup/VisionOfMarkup$Companion; + public static final field GFM_FORMAT Ljava/lang/String; + public fun ()V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getContent ()Ljava/lang/String; + public final fun getFormat ()Ljava/lang/String; + public final fun setContent (Ljava/lang/String;)V + public static final fun write$Self (Lspace/kscience/visionforge/markup/VisionOfMarkup;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/markup/VisionOfMarkup$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/markup/VisionOfMarkup$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/markup/VisionOfMarkup; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/markup/VisionOfMarkup;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/markup/VisionOfMarkup$Companion { + public final fun getCONTENT_PROPERTY_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/markup/VisionOfMarkupKt { + public static final fun content (Lspace/kscience/visionforge/markup/VisionOfMarkup;Lkotlin/jvm/functions/Function0;)V +} + diff --git a/visionforge-plotly/api/visionforge-plotly.api b/visionforge-plotly/api/visionforge-plotly.api new file mode 100644 index 00000000..273f3123 --- /dev/null +++ b/visionforge-plotly/api/visionforge-plotly.api @@ -0,0 +1,42 @@ +public final class space/kscience/visionforge/plotly/PlotlyPlugin : space/kscience/visionforge/VisionPlugin { + public static final field Companion Lspace/kscience/visionforge/plotly/PlotlyPlugin$Companion; + public fun ()V + public fun getTag ()Lspace/kscience/dataforge/context/PluginTag; +} + +public final class space/kscience/visionforge/plotly/PlotlyPlugin$Companion : space/kscience/dataforge/context/PluginFactory { + public fun getTag ()Lspace/kscience/dataforge/context/PluginTag; + public fun getType ()Lkotlin/reflect/KClass; + public synthetic fun invoke (Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/context/Context;)Ljava/lang/Object; + public fun invoke (Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/context/Context;)Lspace/kscience/visionforge/plotly/PlotlyPlugin; +} + +public final class space/kscience/visionforge/plotly/VisionOfPlotly : space/kscience/visionforge/VisionBase { + public static final field Companion Lspace/kscience/visionforge/plotly/VisionOfPlotly$Companion; + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Lspace/kscience/plotly/Plot;)V + public final fun getPlot ()Lspace/kscience/plotly/Plot; + public static final fun write$Self (Lspace/kscience/visionforge/plotly/VisionOfPlotly;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/plotly/VisionOfPlotly$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/plotly/VisionOfPlotly$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/plotly/VisionOfPlotly; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/plotly/VisionOfPlotly;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/plotly/VisionOfPlotly$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/plotly/VisionOfPlotlyKt { + public static final fun asVision (Lspace/kscience/plotly/Plot;)Lspace/kscience/visionforge/plotly/VisionOfPlotly; + public static final fun plotly (Lspace/kscience/visionforge/html/VisionOutput;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/plotly/VisionOfPlotly; +} + diff --git a/visionforge-server/api/visionforge-server.api b/visionforge-server/api/visionforge-server.api new file mode 100644 index 00000000..3446765b --- /dev/null +++ b/visionforge-server/api/visionforge-server.api @@ -0,0 +1,36 @@ +public final class space/kscience/visionforge/server/VisionServer : space/kscience/dataforge/meta/Configurable { + public static final field Companion Lspace/kscience/visionforge/server/VisionServer$Companion; + public static final field DEFAULT_PAGE Ljava/lang/String; + public static final field DEFAULT_PORT I + public final fun getApplication ()Lio/ktor/application/Application; + public final fun getCacheFragments ()Z + public final fun getDataEmbed ()Z + public final fun getDataFetch ()Z + public final fun getDataUpdate ()Z + public synthetic fun getMeta ()Lspace/kscience/dataforge/meta/MutableMeta; + public fun getMeta ()Lspace/kscience/dataforge/meta/ObservableMutableMeta; + public final fun getUpdateInterval ()J + public final fun page (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V + public static synthetic fun page$default (Lspace/kscience/visionforge/server/VisionServer;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V + public final fun serveVisions (Ljava/lang/String;Ljava/util/Map;)V + public final fun serveVisionsFromFragment (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Ljava/lang/String; + public final fun setCacheFragments (Z)V + public final fun setDataEmbed (Z)V + public final fun setDataFetch (Z)V + public final fun setDataUpdate (Z)V + public final fun setUpdateInterval (J)V +} + +public final class space/kscience/visionforge/server/VisionServer$Companion { + public final fun getUPDATE_INTERVAL_KEY ()Lspace/kscience/dataforge/names/Name; +} + +public final class space/kscience/visionforge/server/VisionServerKt { + public static final fun close (Lio/ktor/server/engine/ApplicationEngine;)V + public static final fun openInBrowser (Lio/ktor/server/engine/ApplicationEngine;)V + public static final fun serve (Lspace/kscience/visionforge/VisionManager;Ljava/lang/String;ILkotlin/jvm/functions/Function1;)Lio/ktor/server/engine/ApplicationEngine; + public static synthetic fun serve$default (Lspace/kscience/visionforge/VisionManager;Ljava/lang/String;ILkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lio/ktor/server/engine/ApplicationEngine; + public static final fun visionServer (Lio/ktor/application/Application;Lspace/kscience/visionforge/VisionManager;Lio/ktor/http/Url;Ljava/lang/String;)Lspace/kscience/visionforge/server/VisionServer; + public static synthetic fun visionServer$default (Lio/ktor/application/Application;Lspace/kscience/visionforge/VisionManager;Lio/ktor/http/Url;Ljava/lang/String;ILjava/lang/Object;)Lspace/kscience/visionforge/server/VisionServer; +} + diff --git a/visionforge-solid/api/visionforge-solid.api b/visionforge-solid/api/visionforge-solid.api new file mode 100644 index 00000000..34c11260 --- /dev/null +++ b/visionforge-solid/api/visionforge-solid.api @@ -0,0 +1,996 @@ +public final class space/kscience/visionforge/solid/Box : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/solid/Hexagon { + public static final field Companion Lspace/kscience/visionforge/solid/Box$Companion; + public fun (FFF)V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;FFFLkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun getNode1 ()Lspace/kscience/visionforge/solid/Point3D; + public fun getNode2 ()Lspace/kscience/visionforge/solid/Point3D; + public fun getNode3 ()Lspace/kscience/visionforge/solid/Point3D; + public fun getNode4 ()Lspace/kscience/visionforge/solid/Point3D; + public fun getNode5 ()Lspace/kscience/visionforge/solid/Point3D; + public fun getNode6 ()Lspace/kscience/visionforge/solid/Point3D; + public fun getNode7 ()Lspace/kscience/visionforge/solid/Point3D; + public fun getNode8 ()Lspace/kscience/visionforge/solid/Point3D; + public final fun getXSize ()F + public final fun getYSize ()F + public final fun getZSize ()F + public static final fun write$Self (Lspace/kscience/visionforge/solid/Box;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/solid/Box$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/Box$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/Box; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/Box;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/Box$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/ColorAccessor : space/kscience/dataforge/values/MutableValueProvider { + public fun (Lspace/kscience/dataforge/values/MutableValueProvider;Lspace/kscience/dataforge/names/Name;)V + public final fun getValue ()Lspace/kscience/dataforge/values/Value; + public fun getValue (Lspace/kscience/dataforge/names/Name;)Lspace/kscience/dataforge/values/Value; + public fun setValue (Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/values/Value;)V + public final fun setValue (Lspace/kscience/dataforge/values/Value;)V +} + +public final class space/kscience/visionforge/solid/ColorAccessorKt { + public static final fun clear (Lspace/kscience/visionforge/solid/ColorAccessor;)V + public static final fun getString (Lspace/kscience/visionforge/solid/ColorAccessor;)Ljava/lang/String; + public static final fun invoke (Lspace/kscience/visionforge/solid/ColorAccessor;I)V + public static final fun invoke (Lspace/kscience/visionforge/solid/ColorAccessor;Ljava/lang/String;)V + public static final fun invoke-SGtJIdY (Lspace/kscience/visionforge/solid/ColorAccessor;BBB)V + public static final fun setString (Lspace/kscience/visionforge/solid/ColorAccessor;Ljava/lang/String;)V +} + +public final class space/kscience/visionforge/solid/Composite : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/VisionPropertyContainer { + public static final field Companion Lspace/kscience/visionforge/solid/Composite$Companion; + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Lspace/kscience/visionforge/solid/CompositeType;Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/visionforge/solid/Solid;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Lspace/kscience/visionforge/solid/CompositeType;Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/visionforge/solid/Solid;)V + public final fun getCompositeType ()Lspace/kscience/visionforge/solid/CompositeType; + public final fun getFirst ()Lspace/kscience/visionforge/solid/Solid; + public final fun getSecond ()Lspace/kscience/visionforge/solid/Solid; + public static final fun write$Self (Lspace/kscience/visionforge/solid/Composite;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/solid/Composite$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/Composite$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/Composite; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/Composite;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/Composite$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/CompositeKt { + public static final fun composite (Lspace/kscience/visionforge/VisionContainerBuilder;Lspace/kscience/visionforge/solid/CompositeType;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Composite; + public static synthetic fun composite$default (Lspace/kscience/visionforge/VisionContainerBuilder;Lspace/kscience/visionforge/solid/CompositeType;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Composite; + public static final fun intersect (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Composite; + public static synthetic fun intersect$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Composite; + public static final fun smartComposite (Lspace/kscience/visionforge/solid/SolidGroup;Lspace/kscience/visionforge/solid/CompositeType;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Solid; + public static synthetic fun smartComposite$default (Lspace/kscience/visionforge/solid/SolidGroup;Lspace/kscience/visionforge/solid/CompositeType;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Solid; + public static final fun subtract (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Composite; + public static synthetic fun subtract$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Composite; + public static final fun union (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Composite; + public static synthetic fun union$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Composite; +} + +public final class space/kscience/visionforge/solid/CompositeType : java/lang/Enum { + public static final field GROUP Lspace/kscience/visionforge/solid/CompositeType; + public static final field INTERSECT Lspace/kscience/visionforge/solid/CompositeType; + public static final field SUBTRACT Lspace/kscience/visionforge/solid/CompositeType; + public static final field UNION Lspace/kscience/visionforge/solid/CompositeType; + public static fun valueOf (Ljava/lang/String;)Lspace/kscience/visionforge/solid/CompositeType; + public static fun values ()[Lspace/kscience/visionforge/solid/CompositeType; +} + +public final class space/kscience/visionforge/solid/ConeSegment : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/solid/GeometrySolid { + public static final field Companion Lspace/kscience/visionforge/solid/ConeSegment$Companion; + public fun (FFFFF)V + public synthetic fun (FFFFFILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;FFFFFLkotlinx/serialization/internal/SerializationConstructorMarker;)V + public final fun getAngle ()F + public final fun getBottomRadius ()F + public final fun getHeight ()F + public final fun getStartAngle ()F + public final fun getTopRadius ()F + public fun toGeometry (Lspace/kscience/visionforge/solid/GeometryBuilder;)V + public static final fun write$Self (Lspace/kscience/visionforge/solid/ConeSegment;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/solid/ConeSegment$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/ConeSegment$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/ConeSegment; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/ConeSegment;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/ConeSegment$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/ConeSegmentKt { + public static final fun cone (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/ConeSegment; + public static synthetic fun cone$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/ConeSegment; + public static final fun cylinder (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/ConeSegment; + public static synthetic fun cylinder$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/ConeSegment; +} + +public final class space/kscience/visionforge/solid/ConeSurface : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/VisionPropertyContainer, space/kscience/visionforge/solid/GeometrySolid { + public static final field Companion Lspace/kscience/visionforge/solid/ConeSurface$Companion; + public fun (FFFFFFF)V + public synthetic fun (FFFFFFFILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;FFFFFFFLkotlinx/serialization/internal/SerializationConstructorMarker;)V + public final fun getAngle ()F + public final fun getBottomInnerRadius ()F + public final fun getBottomRadius ()F + public final fun getHeight ()F + public final fun getStartAngle ()F + public final fun getTopInnerRadius ()F + public final fun getTopRadius ()F + public fun toGeometry (Lspace/kscience/visionforge/solid/GeometryBuilder;)V + public static final fun write$Self (Lspace/kscience/visionforge/solid/ConeSurface;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/solid/ConeSurface$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/ConeSurface$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/ConeSurface; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/ConeSurface;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/ConeSurface$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/ConeSurfaceKt { + public static final fun coneSurface (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/ConeSurface; + public static synthetic fun coneSurface$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/ConeSurface; + public static final fun tube (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/ConeSurface; + public static synthetic fun tube$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/ConeSurface; +} + +public final class space/kscience/visionforge/solid/Convex : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/VisionPropertyContainer { + public static final field Companion Lspace/kscience/visionforge/solid/Convex$Companion; + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/util/List;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Ljava/util/List;)V + public final fun getPoints ()Ljava/util/List; + public static final fun write$Self (Lspace/kscience/visionforge/solid/Convex;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/solid/Convex$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/Convex$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/Convex; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/Convex;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/Convex$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/ConvexBuilder { + public fun ()V + public final fun build ()Lspace/kscience/visionforge/solid/Convex; + public final fun point (Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;)V +} + +public final class space/kscience/visionforge/solid/ConvexKt { + public static final fun convex (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Convex; + public static synthetic fun convex$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Convex; +} + +public final class space/kscience/visionforge/solid/ExtrudeBuilder : space/kscience/visionforge/SimpleVisionPropertyContainer { + public fun ()V + public fun (Ljava/util/List;Ljava/util/List;Lspace/kscience/dataforge/meta/ObservableMutableMeta;)V + public synthetic fun (Ljava/util/List;Ljava/util/List;Lspace/kscience/dataforge/meta/ObservableMutableMeta;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getLayers ()Ljava/util/List; + public final fun getShape ()Ljava/util/List; + public final fun layer (Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;)V + public static synthetic fun layer$default (Lspace/kscience/visionforge/solid/ExtrudeBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;ILjava/lang/Object;)V + public final fun setLayers (Ljava/util/List;)V + public final fun setShape (Ljava/util/List;)V + public final fun shape (Lkotlin/jvm/functions/Function1;)V +} + +public final class space/kscience/visionforge/solid/Extruded : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/VisionPropertyContainer, space/kscience/visionforge/solid/GeometrySolid { + public static final field Companion Lspace/kscience/visionforge/solid/Extruded$Companion; + public static final field TYPE Ljava/lang/String; + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/util/List;Ljava/util/List;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Ljava/util/List;Ljava/util/List;)V + public final fun getLayers ()Ljava/util/List; + public final fun getShape ()Ljava/util/List; + public fun toGeometry (Lspace/kscience/visionforge/solid/GeometryBuilder;)V + public static final fun write$Self (Lspace/kscience/visionforge/solid/Extruded;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/solid/Extruded$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/Extruded$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/Extruded; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/Extruded;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/Extruded$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/ExtrudedKt { + public static final fun extruded (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Extruded; + public static synthetic fun extruded$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Extruded; + public static final fun polygon (Lspace/kscience/visionforge/solid/Shape2DBuilder;ILjava/lang/Number;)V +} + +public final class space/kscience/visionforge/solid/GenericHexagon : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/solid/Hexagon { + public static final field Companion Lspace/kscience/visionforge/solid/GenericHexagon$Companion; + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;)V + public fun getNode1 ()Lspace/kscience/visionforge/solid/Point3D; + public fun getNode2 ()Lspace/kscience/visionforge/solid/Point3D; + public fun getNode3 ()Lspace/kscience/visionforge/solid/Point3D; + public fun getNode4 ()Lspace/kscience/visionforge/solid/Point3D; + public fun getNode5 ()Lspace/kscience/visionforge/solid/Point3D; + public fun getNode6 ()Lspace/kscience/visionforge/solid/Point3D; + public fun getNode7 ()Lspace/kscience/visionforge/solid/Point3D; + public fun getNode8 ()Lspace/kscience/visionforge/solid/Point3D; + public static final fun write$Self (Lspace/kscience/visionforge/solid/GenericHexagon;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/solid/GenericHexagon$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/GenericHexagon$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/GenericHexagon; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/GenericHexagon;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/GenericHexagon$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract interface class space/kscience/visionforge/solid/GeometryBuilder { + public abstract fun build ()Ljava/lang/Object; + public abstract fun face (Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/dataforge/meta/Meta;)V + public static synthetic fun face$default (Lspace/kscience/visionforge/solid/GeometryBuilder;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/dataforge/meta/Meta;ILjava/lang/Object;)V +} + +public final class space/kscience/visionforge/solid/GeometryBuilderKt { + public static final fun cap (Lspace/kscience/visionforge/solid/GeometryBuilder;Ljava/util/List;Lspace/kscience/visionforge/solid/Point3D;)V + public static synthetic fun cap$default (Lspace/kscience/visionforge/solid/GeometryBuilder;Ljava/util/List;Lspace/kscience/visionforge/solid/Point3D;ILjava/lang/Object;)V + public static final fun face4 (Lspace/kscience/visionforge/solid/GeometryBuilder;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/dataforge/meta/Meta;)V + public static synthetic fun face4$default (Lspace/kscience/visionforge/solid/GeometryBuilder;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/dataforge/meta/Meta;ILjava/lang/Object;)V +} + +public final class space/kscience/visionforge/solid/GeometryKt { + public static final field PI2 F + public static final fun Point2D (Ljava/lang/Number;Ljava/lang/Number;)Lspace/kscience/visionforge/solid/Point2D; + public static final fun Point3D (Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;)Lspace/kscience/visionforge/solid/Point3D; + public static final fun cross (Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;)Lspace/kscience/visionforge/solid/Point3D; + public static final fun minus (Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;)Lspace/kscience/visionforge/solid/Point3D; + public static final fun normalizeInPlace (Lspace/kscience/visionforge/solid/MutablePoint3D;)V + public static final fun plus (Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;)Lspace/kscience/visionforge/solid/Point3D; + public static final fun toMeta (Lspace/kscience/visionforge/solid/Point2D;)Lspace/kscience/dataforge/meta/Meta; + public static final fun toMeta (Lspace/kscience/visionforge/solid/Point3D;)Lspace/kscience/dataforge/meta/Meta; + public static final fun unaryMinus (Lspace/kscience/visionforge/solid/Point3D;)Lspace/kscience/visionforge/solid/Point3D; +} + +public abstract interface class space/kscience/visionforge/solid/GeometrySolid : space/kscience/visionforge/solid/Solid { + public abstract fun toGeometry (Lspace/kscience/visionforge/solid/GeometryBuilder;)V +} + +public abstract interface class space/kscience/visionforge/solid/Hexagon : space/kscience/visionforge/solid/GeometrySolid { + public abstract fun getNode1 ()Lspace/kscience/visionforge/solid/Point3D; + public abstract fun getNode2 ()Lspace/kscience/visionforge/solid/Point3D; + public abstract fun getNode3 ()Lspace/kscience/visionforge/solid/Point3D; + public abstract fun getNode4 ()Lspace/kscience/visionforge/solid/Point3D; + public abstract fun getNode5 ()Lspace/kscience/visionforge/solid/Point3D; + public abstract fun getNode6 ()Lspace/kscience/visionforge/solid/Point3D; + public abstract fun getNode7 ()Lspace/kscience/visionforge/solid/Point3D; + public abstract fun getNode8 ()Lspace/kscience/visionforge/solid/Point3D; + public fun toGeometry (Lspace/kscience/visionforge/solid/GeometryBuilder;)V +} + +public final class space/kscience/visionforge/solid/HexagonKt { + public static final fun box (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Box; + public static synthetic fun box$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Box; + public static final fun hexagon (Lspace/kscience/visionforge/VisionContainerBuilder;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Hexagon; + public static synthetic fun hexagon$default (Lspace/kscience/visionforge/VisionContainerBuilder;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Hexagon; +} + +public final class space/kscience/visionforge/solid/Layer { + public static final field Companion Lspace/kscience/visionforge/solid/Layer$Companion; + public fun (FFFF)V + public synthetic fun (IFFFFLkotlinx/serialization/internal/SerializationConstructorMarker;)V + public final fun component1 ()F + public final fun component2 ()F + public final fun component3 ()F + public final fun component4 ()F + public final fun copy (FFFF)Lspace/kscience/visionforge/solid/Layer; + public static synthetic fun copy$default (Lspace/kscience/visionforge/solid/Layer;FFFFILjava/lang/Object;)Lspace/kscience/visionforge/solid/Layer; + public fun equals (Ljava/lang/Object;)Z + public final fun getScale ()F + public final fun getX ()F + public final fun getY ()F + public final fun getZ ()F + public fun hashCode ()I + public final fun setScale (F)V + public final fun setX (F)V + public final fun setY (F)V + public final fun setZ (F)V + public fun toString ()Ljava/lang/String; + public static final fun write$Self (Lspace/kscience/visionforge/solid/Layer;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/solid/Layer$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/Layer$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/Layer; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/Layer;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/Layer$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract interface class space/kscience/visionforge/solid/MutablePoint3D : space/kscience/visionforge/solid/Point3D { + public abstract fun getX ()F + public abstract fun getY ()F + public abstract fun getZ ()F + public abstract fun setX (F)V + public abstract fun setY (F)V + public abstract fun setZ (F)V +} + +public final class space/kscience/visionforge/solid/Point2D { + public static final field Companion Lspace/kscience/visionforge/solid/Point2D$Companion; + public fun (FF)V + public synthetic fun (IFFLkotlinx/serialization/internal/SerializationConstructorMarker;)V + public final fun component1 ()F + public final fun component2 ()F + public final fun copy (FF)Lspace/kscience/visionforge/solid/Point2D; + public static synthetic fun copy$default (Lspace/kscience/visionforge/solid/Point2D;FFILjava/lang/Object;)Lspace/kscience/visionforge/solid/Point2D; + public fun equals (Ljava/lang/Object;)Z + public final fun getX ()F + public final fun getY ()F + public fun hashCode ()I + public final fun setX (F)V + public final fun setY (F)V + public fun toString ()Ljava/lang/String; + public static final fun write$Self (Lspace/kscience/visionforge/solid/Point2D;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/solid/Point2D$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/Point2D$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/Point2D; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/Point2D;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/Point2D$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract interface class space/kscience/visionforge/solid/Point3D { + public static final field Companion Lspace/kscience/visionforge/solid/Point3D$Companion; + public abstract fun getX ()F + public abstract fun getY ()F + public abstract fun getZ ()F +} + +public final class space/kscience/visionforge/solid/Point3D$Companion { + public final fun getONE ()Lspace/kscience/visionforge/solid/Point3D; + public final fun getZERO ()Lspace/kscience/visionforge/solid/Point3D; +} + +public final class space/kscience/visionforge/solid/PolyLine : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/VisionPropertyContainer { + public static final field Companion Lspace/kscience/visionforge/solid/PolyLine$Companion; + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/util/List;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Ljava/util/List;)V + public final fun getPoints ()Ljava/util/List; + public final fun getThickness ()Ljava/lang/Number; + public final fun setThickness (Ljava/lang/Number;)V + public static final fun write$Self (Lspace/kscience/visionforge/solid/PolyLine;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/solid/PolyLine$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/PolyLine$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/PolyLine; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/PolyLine;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/PolyLine$Companion { + public final fun getTHICKNESS_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/PolyLineKt { + public static final fun polyline (Lspace/kscience/visionforge/VisionContainerBuilder;[Lspace/kscience/visionforge/solid/Point3D;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/PolyLine; + public static synthetic fun polyline$default (Lspace/kscience/visionforge/VisionContainerBuilder;[Lspace/kscience/visionforge/solid/Point3D;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/PolyLine; +} + +public abstract interface class space/kscience/visionforge/solid/PrototypeHolder { + public abstract fun getPrototype (Lspace/kscience/dataforge/names/Name;)Lspace/kscience/visionforge/solid/Solid; + public abstract fun prototypes (Lkotlin/jvm/functions/Function1;)V +} + +public final class space/kscience/visionforge/solid/Quaternion { + public static final synthetic fun box-impl ([D)Lspace/kscience/visionforge/solid/Quaternion; + public static fun constructor-impl ([D)[D + public fun equals (Ljava/lang/Object;)Z + public static fun equals-impl ([DLjava/lang/Object;)Z + public static final fun equals-impl0 ([D[D)Z + public final fun getValues ()[D + public fun hashCode ()I + public static fun hashCode-impl ([D)I + public fun toString ()Ljava/lang/String; + public static fun toString-impl ([D)Ljava/lang/String; + public final synthetic fun unbox-impl ()[D +} + +public final class space/kscience/visionforge/solid/QuaternionKt { + public static final fun component1-VMqeIco ([D)D + public static final fun component2-VMqeIco ([D)D + public static final fun component3-VMqeIco ([D)D + public static final fun component4-VMqeIco ([D)D +} + +public final class space/kscience/visionforge/solid/RotationOrder : java/lang/Enum { + public static final field XYZ Lspace/kscience/visionforge/solid/RotationOrder; + public static final field XZY Lspace/kscience/visionforge/solid/RotationOrder; + public static final field YXZ Lspace/kscience/visionforge/solid/RotationOrder; + public static final field YZX Lspace/kscience/visionforge/solid/RotationOrder; + public static final field ZXY Lspace/kscience/visionforge/solid/RotationOrder; + public static final field ZYX Lspace/kscience/visionforge/solid/RotationOrder; + public static fun valueOf (Ljava/lang/String;)Lspace/kscience/visionforge/solid/RotationOrder; + public static fun values ()[Lspace/kscience/visionforge/solid/RotationOrder; +} + +public final class space/kscience/visionforge/solid/Shape2DBuilder { + public static final field Companion Lspace/kscience/visionforge/solid/Shape2DBuilder$Companion; + public fun ()V + public synthetic fun (ILjava/util/ArrayList;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Ljava/util/ArrayList;)V + public synthetic fun (Ljava/util/ArrayList;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun build ()Ljava/util/List; + public final fun point (Ljava/lang/Number;Ljava/lang/Number;)V + public final fun to (Ljava/lang/Number;Ljava/lang/Number;)V + public static final fun write$Self (Lspace/kscience/visionforge/solid/Shape2DBuilder;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/solid/Shape2DBuilder$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/Shape2DBuilder$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/Shape2DBuilder; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/Shape2DBuilder;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/Shape2DBuilder$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract interface class space/kscience/visionforge/solid/Solid : space/kscience/visionforge/Vision { + public static final field Companion Lspace/kscience/visionforge/solid/Solid$Companion; + public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; +} + +public final class space/kscience/visionforge/solid/Solid$Companion { + public final fun getDETAIL_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; + public final fun getGEOMETRY_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getIGNORE_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getLAYER_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getPOSITION_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getROTATION_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getROTATION_ORDER_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getSCALE_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getX_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getX_POSITION_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getX_ROTATION_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getX_SCALE_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getY_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getY_POSITION_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getY_ROTATION_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getY_SCALE_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getZ_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getZ_POSITION_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getZ_ROTATION_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getZ_SCALE_KEY ()Lspace/kscience/dataforge/names/Name; +} + +public class space/kscience/visionforge/solid/SolidBase : space/kscience/visionforge/VisionBase, space/kscience/visionforge/solid/Solid { + public static final field Companion Lspace/kscience/visionforge/solid/SolidBase$Companion; + public fun ()V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; + public static final fun write$Self (Lspace/kscience/visionforge/solid/SolidBase;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/solid/SolidBase$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/SolidBase$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/SolidBase; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/SolidBase;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/SolidBase$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/SolidGroup : space/kscience/visionforge/VisionGroupBase, space/kscience/visionforge/solid/PrototypeHolder, space/kscience/visionforge/solid/Solid { + public static final field Companion Lspace/kscience/visionforge/solid/SolidGroup$Companion; + public fun ()V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/util/Map;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public synthetic fun createGroup ()Lspace/kscience/visionforge/VisionGroupBase; + public fun getChildren ()Ljava/util/Map; + public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; + public fun getPrototype (Lspace/kscience/dataforge/names/Name;)Lspace/kscience/visionforge/solid/Solid; + public fun prototypes (Lkotlin/jvm/functions/Function1;)V + public static final fun write$Self (Lspace/kscience/visionforge/solid/SolidGroup;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/solid/SolidGroup$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/SolidGroup$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/SolidGroup; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/SolidGroup;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/SolidGroup$Companion { + public final fun getPROTOTYPES_TOKEN ()Lspace/kscience/dataforge/names/NameToken; + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/SolidGroupKt { + public static final fun SolidGroup (Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/SolidGroup; + public static final fun group (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/SolidGroup; + public static final fun group (Lspace/kscience/visionforge/VisionContainerBuilder;Lspace/kscience/dataforge/names/Name;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/SolidGroup; + public static synthetic fun group$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/SolidGroup; + public static synthetic fun group$default (Lspace/kscience/visionforge/VisionContainerBuilder;Lspace/kscience/dataforge/names/Name;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/SolidGroup; +} + +public final class space/kscience/visionforge/solid/SolidKt { + public static final fun getDetail (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/Integer; + public static final fun getIgnore (Lspace/kscience/visionforge/Vision;)Ljava/lang/Boolean; + public static final fun getLayer (Lspace/kscience/visionforge/solid/Solid;)I + public static final fun getPosition (Lspace/kscience/visionforge/solid/Solid;)Lspace/kscience/visionforge/solid/Point3D; + public static final fun getRotation (Lspace/kscience/visionforge/solid/Solid;)Lspace/kscience/visionforge/solid/Point3D; + public static final fun getRotationOrder (Lspace/kscience/visionforge/solid/Solid;)Lspace/kscience/visionforge/solid/RotationOrder; + public static final fun getRotationX (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/Number; + public static final fun getRotationY (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/Number; + public static final fun getRotationZ (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/Number; + public static final fun getScale (Lspace/kscience/visionforge/solid/Solid;)Lspace/kscience/visionforge/solid/Point3D; + public static final fun getScaleX (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/Number; + public static final fun getScaleY (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/Number; + public static final fun getScaleZ (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/Number; + public static final fun getX (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/Number; + public static final fun getY (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/Number; + public static final fun getZ (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/Number; + public static final fun setDetail (Lspace/kscience/visionforge/solid/Solid;Ljava/lang/Integer;)V + public static final fun setIgnore (Lspace/kscience/visionforge/Vision;Ljava/lang/Boolean;)V + public static final fun setLayer (Lspace/kscience/visionforge/solid/Solid;I)V + public static final fun setPosition (Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/visionforge/solid/Point3D;)V + public static final fun setRotation (Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/visionforge/solid/Point3D;)V + public static final fun setRotationOrder (Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/visionforge/solid/RotationOrder;)V + public static final fun setRotationX (Lspace/kscience/visionforge/solid/Solid;Ljava/lang/Number;)V + public static final fun setRotationY (Lspace/kscience/visionforge/solid/Solid;Ljava/lang/Number;)V + public static final fun setRotationZ (Lspace/kscience/visionforge/solid/Solid;Ljava/lang/Number;)V + public static final fun setScale (Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/visionforge/solid/Point3D;)V + public static final fun setScaleX (Lspace/kscience/visionforge/solid/Solid;Ljava/lang/Number;)V + public static final fun setScaleY (Lspace/kscience/visionforge/solid/Solid;Ljava/lang/Number;)V + public static final fun setScaleZ (Lspace/kscience/visionforge/solid/Solid;Ljava/lang/Number;)V + public static final fun setX (Lspace/kscience/visionforge/solid/Solid;Ljava/lang/Number;)V + public static final fun setY (Lspace/kscience/visionforge/solid/Solid;Ljava/lang/Number;)V + public static final fun setZ (Lspace/kscience/visionforge/solid/Solid;Ljava/lang/Number;)V +} + +public final class space/kscience/visionforge/solid/SolidLabel : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/VisionPropertyContainer { + public static final field Companion Lspace/kscience/visionforge/solid/SolidLabel$Companion; + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/lang/String;DLjava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Ljava/lang/String;DLjava/lang/String;)V + public final fun getFontFamily ()Ljava/lang/String; + public final fun getFontSize ()D + public final fun getText ()Ljava/lang/String; + public static final fun write$Self (Lspace/kscience/visionforge/solid/SolidLabel;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/solid/SolidLabel$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/SolidLabel$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/SolidLabel; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/SolidLabel;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/SolidLabel$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/SolidLabelKt { + public static final fun label (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Ljava/lang/Number;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/SolidLabel; + public static synthetic fun label$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Ljava/lang/Number;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/SolidLabel; +} + +public final class space/kscience/visionforge/solid/SolidMaterial : space/kscience/dataforge/meta/Scheme { + public static final field Companion Lspace/kscience/visionforge/solid/SolidMaterial$Companion; + public fun ()V + public final fun getColor ()Lspace/kscience/visionforge/solid/ColorAccessor; + public final fun getEmissiveColor ()Lspace/kscience/visionforge/solid/ColorAccessor; + public final fun getOpacity ()F + public final fun getSpecularColor ()Lspace/kscience/visionforge/solid/ColorAccessor; + public final fun getWireframe ()Z + public final fun setOpacity (F)V + public final fun setWireframe (Z)V +} + +public final class space/kscience/visionforge/solid/SolidMaterial$Companion : space/kscience/dataforge/meta/SchemeSpec { + public final fun getCOLOR_KEY ()Lspace/kscience/dataforge/names/Name; + public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; + public final fun getMATERIAL_COLOR_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getMATERIAL_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getMATERIAL_OPACITY_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getMATERIAL_SPECULAR_COLOR_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getMATERIAL_WIREFRAME_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getOPACITY_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getSPECULAR_COLOR_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getWIREFRAME_KEY ()Lspace/kscience/dataforge/names/Name; +} + +public final class space/kscience/visionforge/solid/SolidMaterialKt { + public static final fun getColor (Lspace/kscience/visionforge/solid/Solid;)Lspace/kscience/visionforge/solid/ColorAccessor; + public static final fun getMaterial (Lspace/kscience/visionforge/solid/Solid;)Lspace/kscience/visionforge/solid/SolidMaterial; + public static final fun getOpacity (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/Number; + public static final fun material (Lspace/kscience/visionforge/solid/Solid;Lkotlin/jvm/functions/Function1;)V + public static final fun setMaterial (Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/visionforge/solid/SolidMaterial;)V + public static final fun setOpacity (Lspace/kscience/visionforge/solid/Solid;Ljava/lang/Number;)V +} + +public abstract interface class space/kscience/visionforge/solid/SolidReference : space/kscience/visionforge/VisionGroup { + public fun getPropertyValue (Lspace/kscience/dataforge/names/Name;ZZZ)Lspace/kscience/dataforge/values/Value; + public abstract fun getPrototype ()Lspace/kscience/visionforge/solid/Solid; +} + +public final class space/kscience/visionforge/solid/SolidReferenceGroup : space/kscience/visionforge/VisionBase, space/kscience/visionforge/VisionGroup, space/kscience/visionforge/solid/Solid, space/kscience/visionforge/solid/SolidReference { + public static final field Companion Lspace/kscience/visionforge/solid/SolidReferenceGroup$Companion; + public static final field REFERENCE_CHILD_PROPERTY_PREFIX Ljava/lang/String; + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Lspace/kscience/dataforge/names/Name;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Lspace/kscience/dataforge/names/Name;)V + public fun getChildren ()Ljava/util/Map; + public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; + public fun getPropertyValue (Lspace/kscience/dataforge/names/Name;ZZZ)Lspace/kscience/dataforge/values/Value; + public fun getPrototype ()Lspace/kscience/visionforge/solid/Solid; + public final fun getRefName ()Lspace/kscience/dataforge/names/Name; + public static final fun write$Self (Lspace/kscience/visionforge/solid/SolidReferenceGroup;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/solid/SolidReferenceGroup$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/SolidReferenceGroup$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/SolidReferenceGroup; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/SolidReferenceGroup;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/SolidReferenceGroup$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/SolidReferenceKt { + public static final fun getUnref (Lspace/kscience/visionforge/Vision;)Lspace/kscience/visionforge/solid/Solid; + public static final fun newRef (Lspace/kscience/visionforge/solid/SolidGroup;Ljava/lang/String;Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/visionforge/solid/PrototypeHolder;Lspace/kscience/dataforge/names/Name;)Lspace/kscience/visionforge/solid/SolidReferenceGroup; + public static synthetic fun newRef$default (Lspace/kscience/visionforge/solid/SolidGroup;Ljava/lang/String;Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/visionforge/solid/PrototypeHolder;Lspace/kscience/dataforge/names/Name;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/SolidReferenceGroup; + public static final fun ref (Lspace/kscience/visionforge/solid/SolidGroup;Ljava/lang/String;Ljava/lang/String;)Lspace/kscience/visionforge/solid/SolidReferenceGroup; + public static final fun ref (Lspace/kscience/visionforge/solid/SolidGroup;Lspace/kscience/dataforge/names/Name;Ljava/lang/String;)Lspace/kscience/visionforge/solid/SolidReferenceGroup; + public static synthetic fun ref$default (Lspace/kscience/visionforge/solid/SolidGroup;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/SolidReferenceGroup; + public static synthetic fun ref$default (Lspace/kscience/visionforge/solid/SolidGroup;Lspace/kscience/dataforge/names/Name;Ljava/lang/String;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/SolidReferenceGroup; +} + +public final class space/kscience/visionforge/solid/Solids : space/kscience/visionforge/VisionPlugin { + public static final field Companion Lspace/kscience/visionforge/solid/Solids$Companion; + public fun (Lspace/kscience/dataforge/meta/Meta;)V + public fun getTag ()Lspace/kscience/dataforge/context/PluginTag; +} + +public final class space/kscience/visionforge/solid/Solids$Companion : space/kscience/dataforge/context/PluginFactory { + public final fun decodeFromString (Ljava/lang/String;)Lspace/kscience/visionforge/solid/Solid; + public final fun encodeToString (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/String; + public final fun getSerializersModuleForSolids ()Lkotlinx/serialization/modules/SerializersModule; + public fun getTag ()Lspace/kscience/dataforge/context/PluginTag; + public fun getType ()Lkotlin/reflect/KClass; + public synthetic fun invoke (Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/context/Context;)Ljava/lang/Object; + public fun invoke (Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/context/Context;)Lspace/kscience/visionforge/solid/Solids; +} + +public final class space/kscience/visionforge/solid/SolidsKt { + public static final fun solid (Lspace/kscience/visionforge/html/VisionOutput;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/SolidGroup; +} + +public final class space/kscience/visionforge/solid/Sphere : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/VisionPropertyContainer, space/kscience/visionforge/solid/GeometrySolid { + public static final field Companion Lspace/kscience/visionforge/solid/Sphere$Companion; + public fun (FFFFF)V + public synthetic fun (FFFFFILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;FFFFFLkotlinx/serialization/internal/SerializationConstructorMarker;)V + public final fun getPhi ()F + public final fun getPhiStart ()F + public final fun getRadius ()F + public final fun getTheta ()F + public final fun getThetaStart ()F + public fun toGeometry (Lspace/kscience/visionforge/solid/GeometryBuilder;)V + public static final fun write$Self (Lspace/kscience/visionforge/solid/Sphere;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/solid/Sphere$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/Sphere$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/Sphere; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/Sphere;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/Sphere$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/SphereKt { + public static final fun sphere (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Sphere; + public static synthetic fun sphere$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Sphere; +} + +public final class space/kscience/visionforge/solid/SphereLayer : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/solid/GeometrySolid { + public static final field Companion Lspace/kscience/visionforge/solid/SphereLayer$Companion; + public fun (FFFFFF)V + public synthetic fun (FFFFFFILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;FFFFFFLkotlinx/serialization/internal/SerializationConstructorMarker;)V + public final fun getInnerRadius ()F + public final fun getOuterRadius ()F + public final fun getPhi ()F + public final fun getPhiStart ()F + public final fun getTheta ()F + public final fun getThetaStart ()F + public fun toGeometry (Lspace/kscience/visionforge/solid/GeometryBuilder;)V + public static final fun write$Self (Lspace/kscience/visionforge/solid/SphereLayer;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/solid/SphereLayer$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/SphereLayer$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/SphereLayer; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/SphereLayer;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/SphereLayer$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/SphereLayerKt { + public static final fun sphereLayer (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/SphereLayer; + public static synthetic fun sphereLayer$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/SphereLayer; +} + +public final class space/kscience/visionforge/solid/specifications/Axes : space/kscience/dataforge/meta/Scheme { + public static final field AXIS_SIZE D + public static final field AXIS_WIDTH D + public static final field Companion Lspace/kscience/visionforge/solid/specifications/Axes$Companion; + public fun ()V + public final fun getSize ()D + public final fun getVisible ()Z + public final fun getWidth ()D + public final fun setSize (D)V + public final fun setVisible (Z)V + public final fun setWidth (D)V +} + +public final class space/kscience/visionforge/solid/specifications/Axes$Companion : space/kscience/dataforge/meta/SchemeSpec { + public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; +} + +public final class space/kscience/visionforge/solid/specifications/Camera : space/kscience/dataforge/meta/Scheme { + public static final field Companion Lspace/kscience/visionforge/solid/specifications/Camera$Companion; + public static final field FAR_CLIP D + public static final field FIELD_OF_VIEW I + public static final field INITIAL_AZIMUTH D + public static final field INITIAL_DISTANCE D + public static final field INITIAL_LATITUDE D + public static final field NEAR_CLIP D + public fun ()V + public final fun getAzimuth ()D + public final fun getDistance ()D + public final fun getFarClip ()D + public final fun getFov ()I + public final fun getLatitude ()D + public final fun getNearClip ()D + public final fun setAzimuth (D)V + public final fun setDistance (D)V + public final fun setFarClip (D)V + public final fun setFov (I)V + public final fun setLatitude (D)V + public final fun setNearClip (D)V +} + +public final class space/kscience/visionforge/solid/specifications/Camera$Companion : space/kscience/dataforge/meta/SchemeSpec { + public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; +} + +public final class space/kscience/visionforge/solid/specifications/CameraKt { + public static final fun getZenith (Lspace/kscience/visionforge/solid/specifications/Camera;)D +} + +public final class space/kscience/visionforge/solid/specifications/Canvas3DOptions : space/kscience/dataforge/meta/Scheme { + public static final field Companion Lspace/kscience/visionforge/solid/specifications/Canvas3DOptions$Companion; + public fun ()V + public final fun getAxes ()Lspace/kscience/visionforge/solid/specifications/Axes; + public final fun getCamera ()Lspace/kscience/visionforge/solid/specifications/Camera; + public final fun getClipping ()Lspace/kscience/visionforge/solid/specifications/Clipping; + public final fun getControls ()Lspace/kscience/visionforge/solid/specifications/Controls; + public final fun getLayers ()Ljava/util/List; + public final fun getLight ()Lspace/kscience/visionforge/solid/specifications/Light; + public final fun getOnSelect ()Lkotlin/jvm/functions/Function1; + public final fun getSize ()Lspace/kscience/visionforge/solid/specifications/CanvasSize; + public final fun setAxes (Lspace/kscience/visionforge/solid/specifications/Axes;)V + public final fun setCamera (Lspace/kscience/visionforge/solid/specifications/Camera;)V + public final fun setClipping (Lspace/kscience/visionforge/solid/specifications/Clipping;)V + public final fun setControls (Lspace/kscience/visionforge/solid/specifications/Controls;)V + public final fun setLayers (Ljava/util/List;)V + public final fun setLight (Lspace/kscience/visionforge/solid/specifications/Light;)V + public final fun setOnSelect (Lkotlin/jvm/functions/Function1;)V + public final fun setSize (Lspace/kscience/visionforge/solid/specifications/CanvasSize;)V +} + +public final class space/kscience/visionforge/solid/specifications/Canvas3DOptions$Companion : space/kscience/dataforge/meta/SchemeSpec { + public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; +} + +public final class space/kscience/visionforge/solid/specifications/Canvas3DOptionsKt { + public static final fun computeHeight (Lspace/kscience/visionforge/solid/specifications/CanvasSize;Ljava/lang/Number;)I + public static final fun computeWidth (Lspace/kscience/visionforge/solid/specifications/CanvasSize;Ljava/lang/Number;)I +} + +public final class space/kscience/visionforge/solid/specifications/CanvasSize : space/kscience/dataforge/meta/Scheme { + public static final field Companion Lspace/kscience/visionforge/solid/specifications/CanvasSize$Companion; + public fun ()V + public final fun getMaxHeight ()Ljava/lang/Number; + public final fun getMaxSize ()I + public final fun getMaxWith ()Ljava/lang/Number; + public final fun getMinHeight ()Ljava/lang/Number; + public final fun getMinSize ()I + public final fun getMinWith ()Ljava/lang/Number; + public final fun setMaxHeight (Ljava/lang/Number;)V + public final fun setMaxSize (I)V + public final fun setMaxWith (Ljava/lang/Number;)V + public final fun setMinHeight (Ljava/lang/Number;)V + public final fun setMinSize (I)V + public final fun setMinWith (Ljava/lang/Number;)V +} + +public final class space/kscience/visionforge/solid/specifications/CanvasSize$Companion : space/kscience/dataforge/meta/SchemeSpec { + public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; +} + +public final class space/kscience/visionforge/solid/specifications/Clipping : space/kscience/dataforge/meta/Scheme { + public static final field Companion Lspace/kscience/visionforge/solid/specifications/Clipping$Companion; + public fun ()V + public final fun getX ()Ljava/lang/Double; + public final fun getY ()Ljava/lang/Double; + public final fun getZ ()Ljava/lang/Double; + public final fun setX (Ljava/lang/Double;)V + public final fun setY (Ljava/lang/Double;)V + public final fun setZ (Ljava/lang/Double;)V +} + +public final class space/kscience/visionforge/solid/specifications/Clipping$Companion : space/kscience/dataforge/meta/SchemeSpec { + public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; +} + +public final class space/kscience/visionforge/solid/specifications/Controls : space/kscience/dataforge/meta/Scheme { + public static final field Companion Lspace/kscience/visionforge/solid/specifications/Controls$Companion; + public fun ()V +} + +public final class space/kscience/visionforge/solid/specifications/Controls$Companion : space/kscience/dataforge/meta/SchemeSpec { +} + +public final class space/kscience/visionforge/solid/specifications/Light : space/kscience/dataforge/meta/Scheme { + public static final field Companion Lspace/kscience/visionforge/solid/specifications/Light$Companion; + public fun ()V +} + +public final class space/kscience/visionforge/solid/specifications/Light$Companion : space/kscience/dataforge/meta/SchemeSpec { +} + +public abstract class space/kscience/visionforge/solid/transform/VisualTreeTransform { + public fun ()V + protected abstract fun clone (Lspace/kscience/visionforge/Vision;)Lspace/kscience/visionforge/Vision; + public final fun invoke (Lspace/kscience/visionforge/Vision;Z)Lspace/kscience/visionforge/Vision; + public static synthetic fun invoke$default (Lspace/kscience/visionforge/solid/transform/VisualTreeTransform;Lspace/kscience/visionforge/Vision;ZILjava/lang/Object;)Lspace/kscience/visionforge/Vision; + protected abstract fun transformInPlace (Lspace/kscience/visionforge/Vision;)V +} + +public final class space/kscience/visionforge/solid/transform/VisualTreeTransformKt { + public static final fun transform (Lspace/kscience/visionforge/Vision;[Lspace/kscience/visionforge/solid/transform/VisualTreeTransform;)Lspace/kscience/visionforge/Vision; + public static final fun transformInPlace (Lspace/kscience/visionforge/Vision;[Lspace/kscience/visionforge/solid/transform/VisualTreeTransform;)V +} + diff --git a/visionforge-tables/api/visionforge-tables.api b/visionforge-tables/api/visionforge-tables.api new file mode 100644 index 00000000..3a4af1fb --- /dev/null +++ b/visionforge-tables/api/visionforge-tables.api @@ -0,0 +1,63 @@ +public final class space/kscience/visionforge/tables/ColumnHeaderScheme : space/kscience/dataforge/meta/Scheme, space/kscience/tables/ColumnHeader { + public static final field Companion Lspace/kscience/visionforge/tables/ColumnHeaderScheme$Companion; + public fun ()V + public synthetic fun getMeta ()Lspace/kscience/dataforge/meta/Meta; + public fun getName ()Ljava/lang/String; + public final fun getProperties ()Lspace/kscience/tables/ValueColumnScheme; + public fun getType ()Lkotlin/reflect/KType; + public fun setName (Ljava/lang/String;)V + public final fun setProperties (Lspace/kscience/tables/ValueColumnScheme;)V +} + +public final class space/kscience/visionforge/tables/ColumnHeaderScheme$Companion : space/kscience/dataforge/meta/SchemeSpec { +} + +public final class space/kscience/visionforge/tables/TablePlugin : space/kscience/visionforge/VisionPlugin { + public static final field Companion Lspace/kscience/visionforge/tables/TablePlugin$Companion; + public fun ()V + public fun getTag ()Lspace/kscience/dataforge/context/PluginTag; +} + +public final class space/kscience/visionforge/tables/TablePlugin$Companion : space/kscience/dataforge/context/PluginFactory { + public fun getTag ()Lspace/kscience/dataforge/context/PluginTag; + public fun getType ()Lkotlin/reflect/KClass; + public synthetic fun invoke (Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/context/Context;)Ljava/lang/Object; + public fun invoke (Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/context/Context;)Lspace/kscience/visionforge/tables/TablePlugin; +} + +public final class space/kscience/visionforge/tables/VisionOfTable : space/kscience/visionforge/VisionBase, space/kscience/tables/Rows { + public static final field Companion Lspace/kscience/visionforge/tables/VisionOfTable$Companion; + public fun ()V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public final fun getData ()Lspace/kscience/dataforge/values/Value; + public fun getHeaders ()Ljava/util/List; + public fun rowSequence ()Lkotlin/sequences/Sequence; + public final fun setData (Lspace/kscience/dataforge/values/Value;)V + public fun setHeaders (Ljava/util/List;)V + public static final fun write$Self (Lspace/kscience/visionforge/tables/VisionOfTable;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/tables/VisionOfTable$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/tables/VisionOfTable$$serializer; + public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/tables/VisionOfTable; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/tables/VisionOfTable;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/tables/VisionOfTable$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/tables/VisionOfTableKt { + public static final fun numberTableToVision (Lspace/kscience/tables/Table;)Lspace/kscience/visionforge/tables/VisionOfTable; + public static final fun stringTableToVision (Lspace/kscience/tables/Table;)Lspace/kscience/visionforge/tables/VisionOfTable; + public static final fun table (Lspace/kscience/visionforge/html/VisionOutput;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/tables/VisionOfTable; + public static final fun toVision (Lspace/kscience/tables/Table;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/tables/VisionOfTable; + public static final fun valueTableToVision (Lspace/kscience/tables/Table;)Lspace/kscience/visionforge/tables/VisionOfTable; +} + diff --git a/visionforge-threejs/visionforge-threejs-server/api/visionforge-threejs-server.api b/visionforge-threejs/visionforge-threejs-server/api/visionforge-threejs-server.api new file mode 100644 index 00000000..d2d708d9 --- /dev/null +++ b/visionforge-threejs/visionforge-threejs-server/api/visionforge-threejs-server.api @@ -0,0 +1,6 @@ +public final class space/kscience/visionforge/three/ServerExtensionsKt { + public static final fun getThreeJsHeader (Lspace/kscience/visionforge/html/Page$Companion;)Lkotlin/jvm/functions/Function1; + public static final fun makeThreeJsFile (Ljava/nio/file/Path;Ljava/lang/String;Lspace/kscience/visionforge/html/ResourceLocation;ZLkotlin/jvm/functions/Function1;)V + public static synthetic fun makeThreeJsFile$default (Ljava/nio/file/Path;Ljava/lang/String;Lspace/kscience/visionforge/html/ResourceLocation;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)V +} + From d504943295cd7384ff0201376fe1df68437d1cb1 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 23 Jan 2022 15:06:47 +0300 Subject: [PATCH 108/109] Update readmes --- CHANGELOG.md | 20 +++ README.md | 159 +++++++++++++++++- cern-root-loader/README.md | 4 + demo/README.md | 4 + demo/gdml/README.md | 11 +- demo/js-playground/README.md | 4 + demo/muon-monitor/README.md | 31 +--- demo/playground/README.md | 4 + .../src/jvmMain/kotlin/gdmlCurve.kt | 2 + demo/plotly-fx/README.md | 4 + demo/sat-demo/README.md | 4 + demo/solid-showcase/README.md | 17 +- docs/templates/ARTIFACT-TEMPLATE.md | 11 -- docs/templates/README-TEMPLATE.md | 17 +- gradle.properties | 2 +- jupyter/README.md | 4 + jupyter/visionforge-jupyter-gdml/README.md | 32 ++++ settings.gradle.kts | 2 +- ui/README.md | 4 + ui/bootstrap/README.md | 4 + ui/react/README.md | 4 + ui/ring/README.md | 4 + visionforge-core/README.md | 32 ++++ visionforge-fx/README.md | 32 ++++ visionforge-gdml/README.md | 32 ++++ visionforge-markdown/README.md | 32 ++++ visionforge-plotly/README.md | 32 ++++ visionforge-server/README.md | 32 ++++ visionforge-solid/README.md | 32 ++++ visionforge-tables/README.md | 32 ++++ visionforge-threejs/README.md | 32 ++++ .../visionforge-threejs-server/README.md | 32 ++++ 32 files changed, 594 insertions(+), 74 deletions(-) create mode 100644 cern-root-loader/README.md create mode 100644 demo/README.md create mode 100644 demo/js-playground/README.md create mode 100644 demo/playground/README.md create mode 100644 demo/plotly-fx/README.md create mode 100644 demo/sat-demo/README.md create mode 100644 jupyter/README.md create mode 100644 jupyter/visionforge-jupyter-gdml/README.md create mode 100644 ui/README.md create mode 100644 ui/bootstrap/README.md create mode 100644 ui/react/README.md create mode 100644 ui/ring/README.md create mode 100644 visionforge-core/README.md create mode 100644 visionforge-fx/README.md create mode 100644 visionforge-gdml/README.md create mode 100644 visionforge-markdown/README.md create mode 100644 visionforge-plotly/README.md create mode 100644 visionforge-server/README.md create mode 100644 visionforge-solid/README.md create mode 100644 visionforge-tables/README.md create mode 100644 visionforge-threejs/README.md create mode 100644 visionforge-threejs/visionforge-threejs-server/README.md diff --git a/CHANGELOG.md b/CHANGELOG.md index d638f0c8..2ffcb3c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,19 @@ ## [Unreleased] ### Added + +### Changed + +### Deprecated + +### Removed + +### Fixed + +### Security + +## [0.2.0] +### Added - Server module - Change collector - Customizable accessors for colors @@ -9,6 +22,9 @@ - Hexagon interface and GenericHexagon implementation (Box inherits Hexagon) - Increased the default detail level for spheres and cones to 32 - Simple clipping for Solids in ThreeJs +- Markdown module +- Tables module + ### Changed - Vision does not implement ItemProvider anymore. Property changes are done via `getProperty`/`setProperty` and `property` delegate. @@ -25,12 +41,16 @@ - Property listeners are not triggered if there are no changes. - Feedback websocket connection in the client. + ### Deprecated ### Removed - Primary modules dependencies on UI + ### Fixed - Version conflicts + ### Security + diff --git a/README.md b/README.md index 6a77447e..eeeaab9e 100644 --- a/README.md +++ b/README.md @@ -16,9 +16,9 @@ * [Modules contained in this repository](#modules-contained-in-this-repository) * [Visualization for External Systems](#visualization-for-external-systems) * [Demonstrations](#demonstrations) - * [Simple Example - Solid Showcase](#simple-example---solid-showcase) - * [Full-Stack Application Example - Muon Monitor](#full-stack-application-example---muon-monitor-visualization) - * [GDML Example](#gdml-example) + * [Simple Example - Solid Showcase](#simple-example---solid-showcase) + * [Full-Stack Application Example - Muon Monitor](#full-stack-application-example---muon-monitor-visualization) + * [GDML Example](#gdml-example) ## Introduction @@ -61,7 +61,158 @@ To learn more about DataForge, please consult the following URLs: ## Modules contained in this repository -$modules +
+ +* ### [cern-root-loader](cern-root-loader) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [demo](demo) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [jupyter](jupyter) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [ui](ui) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [visionforge-core](visionforge-core) +> +> +> **Maturity**: DEVELOPMENT +
+ +* ### [visionforge-fx](visionforge-fx) +> +> +> **Maturity**: PROTOTYPE +
+ +* ### [visionforge-gdml](visionforge-gdml) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [visionforge-markdown](visionforge-markdown) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [visionforge-plotly](visionforge-plotly) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [visionforge-server](visionforge-server) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [visionforge-solid](visionforge-solid) +> +> +> **Maturity**: DEVELOPMENT +
+ +* ### [visionforge-tables](visionforge-tables) +> +> +> **Maturity**: PROTOTYPE +
+ +* ### [visionforge-threejs](visionforge-threejs) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [gdml](demo/gdml) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [js-playground](demo/js-playground) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [muon-monitor](demo/muon-monitor) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [playground](demo/playground) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [plotly-fx](demo/plotly-fx) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [sat-demo](demo/sat-demo) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [solid-showcase](demo/solid-showcase) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [visionforge-jupyter-gdml](jupyter/visionforge-jupyter-gdml) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [bootstrap](ui/bootstrap) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [react](ui/react) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [ring](ui/ring) +> +> +> **Maturity**: EXPERIMENTAL +
+ +* ### [visionforge-threejs-server](visionforge-threejs/visionforge-threejs-server) +> +> +> **Maturity**: EXPERIMENTAL +
+ **Class diagram:** diff --git a/cern-root-loader/README.md b/cern-root-loader/README.md new file mode 100644 index 00000000..b032852d --- /dev/null +++ b/cern-root-loader/README.md @@ -0,0 +1,4 @@ +# Module cern-root-loader + + + diff --git a/demo/README.md b/demo/README.md new file mode 100644 index 00000000..e2a13c47 --- /dev/null +++ b/demo/README.md @@ -0,0 +1,4 @@ +# Module demo + + + diff --git a/demo/gdml/README.md b/demo/gdml/README.md index 5c2a5abe..b9de634c 100644 --- a/demo/gdml/README.md +++ b/demo/gdml/README.md @@ -1,13 +1,4 @@ -### GDML Example +# Module gdml -Visualization example for geometry defined as GDML file. -##### Building project -To build the app, run `demo/gdml/Tasks/kotlin browser/jsBrowserDistribution` Gradle task, then -drag-and-drop GDML file to the window to see visualization. For an example file, you can use -`demo/gdml/src/jsMain/resources/cubes.gdml`. - -##### Example view: - -![](../../docs/images/gdml-demo.png) diff --git a/demo/js-playground/README.md b/demo/js-playground/README.md new file mode 100644 index 00000000..6b899a57 --- /dev/null +++ b/demo/js-playground/README.md @@ -0,0 +1,4 @@ +# Module js-playground + + + diff --git a/demo/muon-monitor/README.md b/demo/muon-monitor/README.md index df95c968..74c935e4 100644 --- a/demo/muon-monitor/README.md +++ b/demo/muon-monitor/README.md @@ -1,33 +1,4 @@ +# Module muon-monitor -### Muon Monitor Visualization -This directory contains a full-stack application example built with `visionforge`. -It is visualizing the -[Muon Monitor](http://npm.mipt.ru/projects/physics.html#mounMonitor) experiment set-up, -including experiment's geometry and events (particle tracks). -#### Reusing code and going Full-Stack with Kotlin Multiplatform - -The application includes both server back-end generating events, as well as client -visualization front-end. - -As is common for Kotlin multiplatform projects, the code base of this simple application -is put in the following main directories: -* `commonMain` - common code, used by both JS client and JVM server. For example, the `Monitor` -object describes general geometry definitions needed in all parts of the application. -* `jsMain` - JavaScript client code. It performs visualization and reads events from the server. -* `jvmMain` - JVM server code. It runs `ktor` HTTP server, responding with event data when -client requests them. - -Note that in a more traditional approach when client and server are developed separately -and possibly using different languages, there would be no common code and benefits associated -with it. - -##### Building project - -To run full-stack Muon Monitor Visualization application (both JVM server and Web browser front-end), -run `demo/muon-monitor/Tasks/application/run` task. - -##### Example view: - -![](../../docs/images/muon-monitor.png) diff --git a/demo/playground/README.md b/demo/playground/README.md new file mode 100644 index 00000000..d2c8bc02 --- /dev/null +++ b/demo/playground/README.md @@ -0,0 +1,4 @@ +# Module playground + + + diff --git a/demo/playground/src/jvmMain/kotlin/gdmlCurve.kt b/demo/playground/src/jvmMain/kotlin/gdmlCurve.kt index 81facd71..70827a2d 100644 --- a/demo/playground/src/jvmMain/kotlin/gdmlCurve.kt +++ b/demo/playground/src/jvmMain/kotlin/gdmlCurve.kt @@ -1,3 +1,5 @@ +@file:Suppress("UNUSED_VARIABLE") + package space.kscience.visionforge.examples import space.kscience.gdml.* diff --git a/demo/plotly-fx/README.md b/demo/plotly-fx/README.md new file mode 100644 index 00000000..d8679f77 --- /dev/null +++ b/demo/plotly-fx/README.md @@ -0,0 +1,4 @@ +# Module plotly-fx + + + diff --git a/demo/sat-demo/README.md b/demo/sat-demo/README.md new file mode 100644 index 00000000..ea15abe0 --- /dev/null +++ b/demo/sat-demo/README.md @@ -0,0 +1,4 @@ +# Module sat-demo + + + diff --git a/demo/solid-showcase/README.md b/demo/solid-showcase/README.md index f8771e13..059597ef 100644 --- a/demo/solid-showcase/README.md +++ b/demo/solid-showcase/README.md @@ -1,19 +1,4 @@ -### Spatial Showcase +# Module solid-showcase -Contains a simple demonstration with a grid including a few shapes that you can rotate, move camera, and so on. -Some shapes will also periodically change their color and visibility. -##### Building project - -To see the JS demo: run `demo/solid-showcase/Tasks/kotlin browser/jsBrowserRun` Gradle task, then open -`build/distribuions/solid-showcase-js-0.1.3-dev/index.html` file in your browser. -To see Java FX demo, run `demo/spatial-showcase/Tasks/application/run` Gradle task, or `main()` from `FXDemoApp.kt`. - -##### Example view for JS: - -![](../../docs/images/spatial-showcase.png) - -##### Example view for Java FX: - -![](../../docs/images/spatial-showcase-FX.png) diff --git a/docs/templates/ARTIFACT-TEMPLATE.md b/docs/templates/ARTIFACT-TEMPLATE.md index 91e09096..5d397423 100644 --- a/docs/templates/ARTIFACT-TEMPLATE.md +++ b/docs/templates/ARTIFACT-TEMPLATE.md @@ -2,17 +2,6 @@ The Maven coordinates of this project are `${group}:${name}:${version}`. -**Gradle Groovy:** -```gradle -repositories { - maven { url 'https://repo.kotlin.link' } - mavenCentral() -} - -dependencies { - implementation '${group}:${name}:${version}' -} -``` **Gradle Kotlin DSL:** ```kotlin repositories { diff --git a/docs/templates/README-TEMPLATE.md b/docs/templates/README-TEMPLATE.md index 775c2b12..04ab1752 100644 --- a/docs/templates/README-TEMPLATE.md +++ b/docs/templates/README-TEMPLATE.md @@ -61,7 +61,7 @@ To learn more about DataForge, please consult the following URLs: ## Modules contained in this repository -$modules +${modules} **Class diagram:** @@ -132,6 +132,21 @@ Visualization example for geometry defined as GDML file. ![](docs/images/gdml-demo.png) +## Stability and documentation + +VisionForge is a modular library. Different modules provide different features with different API stability guarantees. All core modules are released with the same version, but with different API change policy. The features are described in module definitions below. The module stability could have the following levels: + +* **PROTOTYPE**. On this level there are no compatibility guarantees. All methods and classes form those modules could break any moment. You can still use it, but be sure to fix the specific version. +* **EXPERIMENTAL**. The general API is decided, but some changes could be made. Volatile API is marked + with `@DFExperimental` or other stability warning annotations. +* **DEVELOPMENT**. API breaking generally follows semantic versioning ideology. There could be changes in minor + versions, but not in patch versions. API is protected with [binary-compatibility-validator](https://github.com/Kotlin/binary-compatibility-validator) tool. +* **STABLE**. The API stabilized. Breaking changes are allowed only in major releases. + +Additionally, one should note that the VisionForge Json format impacts the reproducibility of stored vision fragments. There should not be any breaks of the format between major releases. All problems should be reported. + +The documentation for the project is a work in progress. Please report any issues with missing, vague or wrong information. The contributions into documentation are quite welcome. + ## Thanks and references The original three.js bindings were made by [Lars Ivar Hatledal](https://github.com/markaren), but the project is discontinued right now. diff --git a/gradle.properties b/gradle.properties index fbaacb05..e89e285b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,4 +9,4 @@ org.gradle.parallel=true publishing.github=false publishing.sonatype=false -toolsVersion=0.10.9-kotlin-1.6.10 \ No newline at end of file +toolsVersion=0.11.0-kotlin-1.6.10 \ No newline at end of file diff --git a/jupyter/README.md b/jupyter/README.md new file mode 100644 index 00000000..433d3042 --- /dev/null +++ b/jupyter/README.md @@ -0,0 +1,4 @@ +# Module jupyter + +Common visionforge jupyter module + diff --git a/jupyter/visionforge-jupyter-gdml/README.md b/jupyter/visionforge-jupyter-gdml/README.md new file mode 100644 index 00000000..cae8af86 --- /dev/null +++ b/jupyter/visionforge-jupyter-gdml/README.md @@ -0,0 +1,32 @@ +# Module visionforge-jupyter-gdml + +Jupyter api artifact for GDML rendering + +## Usage + +## Artifact: + +The Maven coordinates of this project are `space.kscience:visionforge-jupyter-gdml:0.2.0`. + +**Gradle Groovy:** +```groovy +repositories { + maven { url 'https://repo.kotlin.link' } + mavenCentral() +} + +dependencies { + implementation 'space.kscience:visionforge-jupyter-gdml:0.2.0' +} +``` +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("space.kscience:visionforge-jupyter-gdml:0.2.0") +} +``` diff --git a/settings.gradle.kts b/settings.gradle.kts index 3ae9f6f9..9fe0138c 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -8,7 +8,7 @@ pluginManagement { val toolsVersion: String by extra repositories { - mavenLocal() + //mavenLocal() maven("https://repo.kotlin.link") mavenCentral() gradlePluginPortal() diff --git a/ui/README.md b/ui/README.md new file mode 100644 index 00000000..ec08d176 --- /dev/null +++ b/ui/README.md @@ -0,0 +1,4 @@ +# Module ui + + + diff --git a/ui/bootstrap/README.md b/ui/bootstrap/README.md new file mode 100644 index 00000000..0cc57002 --- /dev/null +++ b/ui/bootstrap/README.md @@ -0,0 +1,4 @@ +# Module bootstrap + + + diff --git a/ui/react/README.md b/ui/react/README.md new file mode 100644 index 00000000..9f862213 --- /dev/null +++ b/ui/react/README.md @@ -0,0 +1,4 @@ +# Module react + + + diff --git a/ui/ring/README.md b/ui/ring/README.md new file mode 100644 index 00000000..6cdcbb60 --- /dev/null +++ b/ui/ring/README.md @@ -0,0 +1,4 @@ +# Module ring + + + diff --git a/visionforge-core/README.md b/visionforge-core/README.md new file mode 100644 index 00000000..2f9e6889 --- /dev/null +++ b/visionforge-core/README.md @@ -0,0 +1,32 @@ +# Module visionforge-core + + + +## Usage + +## Artifact: + +The Maven coordinates of this project are `space.kscience:visionforge-core:0.2.0`. + +**Gradle Groovy:** +```groovy +repositories { + maven { url 'https://repo.kotlin.link' } + mavenCentral() +} + +dependencies { + implementation 'space.kscience:visionforge-core:0.2.0' +} +``` +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("space.kscience:visionforge-core:0.2.0") +} +``` diff --git a/visionforge-fx/README.md b/visionforge-fx/README.md new file mode 100644 index 00000000..2cef5e81 --- /dev/null +++ b/visionforge-fx/README.md @@ -0,0 +1,32 @@ +# Module visionforge-fx + + + +## Usage + +## Artifact: + +The Maven coordinates of this project are `space.kscience:visionforge-fx:0.2.0`. + +**Gradle Groovy:** +```groovy +repositories { + maven { url 'https://repo.kotlin.link' } + mavenCentral() +} + +dependencies { + implementation 'space.kscience:visionforge-fx:0.2.0' +} +``` +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("space.kscience:visionforge-fx:0.2.0") +} +``` diff --git a/visionforge-gdml/README.md b/visionforge-gdml/README.md new file mode 100644 index 00000000..135a369e --- /dev/null +++ b/visionforge-gdml/README.md @@ -0,0 +1,32 @@ +# Module visionforge-gdml + + + +## Usage + +## Artifact: + +The Maven coordinates of this project are `space.kscience:visionforge-gdml:0.2.0`. + +**Gradle Groovy:** +```groovy +repositories { + maven { url 'https://repo.kotlin.link' } + mavenCentral() +} + +dependencies { + implementation 'space.kscience:visionforge-gdml:0.2.0' +} +``` +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("space.kscience:visionforge-gdml:0.2.0") +} +``` diff --git a/visionforge-markdown/README.md b/visionforge-markdown/README.md new file mode 100644 index 00000000..f43c742b --- /dev/null +++ b/visionforge-markdown/README.md @@ -0,0 +1,32 @@ +# Module visionforge-markdown + + + +## Usage + +## Artifact: + +The Maven coordinates of this project are `space.kscience:visionforge-markdown:0.2.0`. + +**Gradle Groovy:** +```groovy +repositories { + maven { url 'https://repo.kotlin.link' } + mavenCentral() +} + +dependencies { + implementation 'space.kscience:visionforge-markdown:0.2.0' +} +``` +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("space.kscience:visionforge-markdown:0.2.0") +} +``` diff --git a/visionforge-plotly/README.md b/visionforge-plotly/README.md new file mode 100644 index 00000000..f8a03891 --- /dev/null +++ b/visionforge-plotly/README.md @@ -0,0 +1,32 @@ +# Module visionforge-plotly + + + +## Usage + +## Artifact: + +The Maven coordinates of this project are `space.kscience:visionforge-plotly:0.2.0`. + +**Gradle Groovy:** +```groovy +repositories { + maven { url 'https://repo.kotlin.link' } + mavenCentral() +} + +dependencies { + implementation 'space.kscience:visionforge-plotly:0.2.0' +} +``` +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("space.kscience:visionforge-plotly:0.2.0") +} +``` diff --git a/visionforge-server/README.md b/visionforge-server/README.md new file mode 100644 index 00000000..0ac4c198 --- /dev/null +++ b/visionforge-server/README.md @@ -0,0 +1,32 @@ +# Module visionforge-server + + + +## Usage + +## Artifact: + +The Maven coordinates of this project are `space.kscience:visionforge-server:0.2.0`. + +**Gradle Groovy:** +```groovy +repositories { + maven { url 'https://repo.kotlin.link' } + mavenCentral() +} + +dependencies { + implementation 'space.kscience:visionforge-server:0.2.0' +} +``` +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("space.kscience:visionforge-server:0.2.0") +} +``` diff --git a/visionforge-solid/README.md b/visionforge-solid/README.md new file mode 100644 index 00000000..cbf4073b --- /dev/null +++ b/visionforge-solid/README.md @@ -0,0 +1,32 @@ +# Module visionforge-solid + + + +## Usage + +## Artifact: + +The Maven coordinates of this project are `space.kscience:visionforge-solid:0.2.0`. + +**Gradle Groovy:** +```groovy +repositories { + maven { url 'https://repo.kotlin.link' } + mavenCentral() +} + +dependencies { + implementation 'space.kscience:visionforge-solid:0.2.0' +} +``` +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("space.kscience:visionforge-solid:0.2.0") +} +``` diff --git a/visionforge-tables/README.md b/visionforge-tables/README.md new file mode 100644 index 00000000..6cdbd356 --- /dev/null +++ b/visionforge-tables/README.md @@ -0,0 +1,32 @@ +# Module visionforge-tables + + + +## Usage + +## Artifact: + +The Maven coordinates of this project are `space.kscience:visionforge-tables:0.2.0`. + +**Gradle Groovy:** +```groovy +repositories { + maven { url 'https://repo.kotlin.link' } + mavenCentral() +} + +dependencies { + implementation 'space.kscience:visionforge-tables:0.2.0' +} +``` +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("space.kscience:visionforge-tables:0.2.0") +} +``` diff --git a/visionforge-threejs/README.md b/visionforge-threejs/README.md new file mode 100644 index 00000000..98c13b7a --- /dev/null +++ b/visionforge-threejs/README.md @@ -0,0 +1,32 @@ +# Module visionforge-threejs + + + +## Usage + +## Artifact: + +The Maven coordinates of this project are `space.kscience:visionforge-threejs:0.2.0`. + +**Gradle Groovy:** +```groovy +repositories { + maven { url 'https://repo.kotlin.link' } + mavenCentral() +} + +dependencies { + implementation 'space.kscience:visionforge-threejs:0.2.0' +} +``` +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("space.kscience:visionforge-threejs:0.2.0") +} +``` diff --git a/visionforge-threejs/visionforge-threejs-server/README.md b/visionforge-threejs/visionforge-threejs-server/README.md new file mode 100644 index 00000000..0b9d9e4e --- /dev/null +++ b/visionforge-threejs/visionforge-threejs-server/README.md @@ -0,0 +1,32 @@ +# Module visionforge-threejs-server + + + +## Usage + +## Artifact: + +The Maven coordinates of this project are `space.kscience:visionforge-threejs-server:0.2.0`. + +**Gradle Groovy:** +```groovy +repositories { + maven { url 'https://repo.kotlin.link' } + mavenCentral() +} + +dependencies { + implementation 'space.kscience:visionforge-threejs-server:0.2.0' +} +``` +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("space.kscience:visionforge-threejs-server:0.2.0") +} +``` From db5064f6ed15e713a2502c9d8f9a27d16a80f569 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 23 Jan 2022 15:56:46 +0300 Subject: [PATCH 109/109] 0.2.0 release --- gradle.properties | 2 +- settings.gradle.kts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index e89e285b..e029eef4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,4 +9,4 @@ org.gradle.parallel=true publishing.github=false publishing.sonatype=false -toolsVersion=0.11.0-kotlin-1.6.10 \ No newline at end of file +toolsVersion=0.11.1-kotlin-1.6.10 \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 9fe0138c..3ae9f6f9 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -8,7 +8,7 @@ pluginManagement { val toolsVersion: String by extra repositories { - //mavenLocal() + mavenLocal() maven("https://repo.kotlin.link") mavenCentral() gradlePluginPortal()

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 literal 0 HcmV?d00001 diff --git a/docs/images/inheritance-2-1-2.png b/docs/images/inheritance-2-1-2.png new file mode 100644 index 0000000000000000000000000000000000000000..42f05ff2c6c04d7f457d83f0de905039f0926f58 GIT binary patch literal 26080 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 literal 0 HcmV?d00001 diff --git a/docs/images/inheritance-2-2-2.png b/docs/images/inheritance-2-2-2.png new file mode 100644 index 0000000000000000000000000000000000000000..f63f703657b855f8a372bbd82e035089e87f57ac GIT binary patch literal 77517 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 UBB5>8T<~MI&(b)5ul=R}17wr|jsO4v literal 0 HcmV?d00001 diff --git a/docs/images/inheritance-2-2-3.png b/docs/images/inheritance-2-2-3.png new file mode 100644 index 0000000000000000000000000000000000000000..7c89ecdeab6446d74723ff40ca98f8a29ef474fb GIT binary patch literal 102370 zcmbq)c|25q_;0016jJsjOO`AXLbe&ABt^)+lO=~{z$BrF4t8-h+@Yu0a z_l_Mqp>+BL@DncP7)#*GabH928^=ofc~*gMPP%B^(>QjlB94J%e+u}X{>g1~-($zl zwI2OD-sx5F@YpeGo{pBrgCLuY8M>zzM&=pYi_K3KKr*JPQkp|J`1KmR4q`B1(FyDeRT(+v@vb*IfElx{vwm zM4aQjPWTm#4QU*43*MNgOR6C55=d3E(Dmsk16YO@FS{?8#lYpm*y=03aE>$ax0jMQ z%U;J%nBfOIlah?Zc+@H{$gv1T!Qt?NMTdS-!8Kv&rkxW8L90oeAMf8zOux4I0~Xan zK)!!qZ7tP(^pV5ff41g4dj>44&+TUOvQMKt(L+YI>Y{`x1;3~-=C^Kg?NLjRcM=#_ zCX2u8pLM<%bj`T-=(*TH(5AmZ*G9!7{nss**{#LStQJ%4BSHehoE~uHX9OgtO8S;< ze7x^ETfYbT8sxJoBU<2li_?)UY}b6{;I!LCCNQahqbjF(Ba%Cx5u|1k!yoWae5J~J zNCe}?U^m}hyu<7W1w%fo9O4b!F4j&5ga!w{3^IP1q`a5mtr^KHF2XH;=-0roZEVwj z`mr|-MTxB~@Y2@kJq{9Q&3o7IW&CLw62q4K@aH^|c~J%-O2uw7aw`NE-5_Q31Z-Up zqC%%0_zUx`f?bQT44_8nRvW4S!N52E6rY<6ZG7-v?5ux?jIX2un@um>p z=<$X%QTVHI5%X~6&r5_4F)}|?BCZ5aNn19Zu%r!*=ZMok6B-+&^ODnn-w1ihp{#>D zDMfA)vCR(b--*AGCIxHI*?&)6jDwVzeKU-?>q0!>MM3KsPc#^X%o(C?uE8$3p^c1o(_(l>jsW5+%G zdLxzD@qm@hxoxmhjk?eyFE8)F_&Jr>UoV;&($NwJW^?>p^!O?~X|lm7IxQz)dp08Q zjq>srDa+c|GU5V*nSssiX3=9dFd8odRP6Iq8k@R#>P(`Os;2en7`*(s|%P3!TKI|SBDxVlzlxjb*1NW^K?I_3LgV#B|_fK z)zwBnA(iGt)zKE7?pEOR@5VhIyOJZ@0^Jc89-woIY38!`>@L{9n$S~9nt7RG6)Ba& z=kQ(hrJ4&Vmtp5K#~#8ZtCg`LuF#gb!gTS?y{!?t1L92}HCT>P10A29?mPNEKe{rc z6rAaTfEiqnZu)(q!60$!m;;c_ZrQgZ3C(}z6f6J>QPA(B^Dpl#(J%`9>T#cXb@kYI{44U|`B zPZRPp<(dImi*^^9fqm$dAJCZghBKhJ_-O6Hze#@(D zU=L`U>x3ogYepuJ%7M$>#@$as#>f;V%UTa3+BAJhrV~}Nk{~9qw*Ow8Rp}2?k~FwB z{{_L0SoF%joT-3V!V!VJ*&pY1HvYT`y6CcP&QnE)bUXXDpzm2v784=aPv5I5Y$8$x z+?stH9xdWdZj6-mzTJwC|MiR<&cb3q*PfxTHC$-rzr38i(^uP5(m~~ylQu<9RZUi=b=+T)(zo(-J*P1)^E{uaPk_-$1J93TbPa z>hMUhl(-c;<#n-4FowKHp`-4jrH*av^;Qgf`3ndoce(fu;R-2I2vkW;~wPxa2xt4Q;ANk#USsR&w zsMfW)s_zbSZ^lK;INY--&Hn_(pmy!_B9(S6~C?>3c)(wbP` z+e8QJYVA`)eYjQ%8GA~b)@m`Y9&T;?Uo=qySgfbkAHi#HMQ8>($SEaN)? zxw5@%+!_tSJcfqP-&^g~qh2=y0Q9Mz&*r;AbDKUDm4Mmg^6|-_hV9Aw>)5~+?-^X5 zqwMwiE;umb*R2EXWJ31E*dk6OpIN`|av&+ch6*9_F61Sy^ag9Yk5~0yw|3`j8!HM= z-;5XE@aY=Kj_G?Y6?IR5_N7qd*>*}~s#MdtRlCNvmsb}Y>y`wUXW5?PKa6DV#CIZ? zUp^d9i3IQ#9F1@PE^=dzJ=3)XwHQKP8}iYb#62O<@FNdv>w%90~+5 zm9GG*!7mCtNZM8QTc0Z;+;zXTKvn z4>h|l6Fe5@j|o39xG#`eC{)o+bBJSKerQDXkx)nzD`L0GeZdhGmGta-SJ0SESdy5K z$JT74b|TZI4b!zs0hiB2`$}6L@3u@Ms$h55JSSJyrJtXO@G8tORZZ&5c!;o8*O;56$|9^o=HUMO7%{jyLW1lBKeL%APj8^T_twHziG4rt?neBO$Bp zh1=#&He|FV@^TBPTcO+0EkJZf7_%+=c@l;$7O`<^JH(A^($F&-p(#%XIpu` zH^3^C(7w$SjkFLvLk|RnS>1|Ue#W&s;y-Z6+hDd!JW3??><>0Em%eoT$+yy)9>T&W z*?R~2IW4Faf!0`_;EgCOwr|}e1r8sUs};9&h2UCrv!4+1Qs6hZ?=b_gd91SJBx&ms$#lnsu7GoUtqW?i-Y2dMa47kSsmzzG>-_{!cC- zzSqpa0JUJf^@a^MNJ1M?U&)NkKFP7zx_jf}&k5uq_CqTSGfU(b%MsII@TJ67$_gJC z{~r_cydS$iiZ;~Vu>jIX&r z2CkdkjiTwT`{Is#a8Q0_N^iYx099Zio#Z_Bc&{pY%p;=rTc`G_aT>@_g20rj&pl2 zJ;@t}_DwFIFP(}L^|U$W)gW(4TG7GXC!V++81aa4TY#`#R)H%T%sp;1)KmB5&V@+**3H&;FvrJ zEwogm7`Hi7KSrkFr>J1d7iy0PzuLW!^6QBS+V;NDDhr=Y+p5PwvDY0I>$Xjx^|@!a z)<{c8O4y3hqAboX4os?bl#DHz)<6@o!2zfWg-I2c5QnY-^ z{Z64#`P5YVT7i9i!Tr^EZwLS;&o`Eq$xu_0LdQ0Hb>!Mwnn8Ysh~W3P%@H?GerLk^ zqe`^qe>{rgQ>z@dbFEutt$v4NhjK(|?e6Wd*6l#IR$)SgWbbaOQKU**Su!-Nxjn%P z4~ycZ<$lxglD`4B$b_PXY?LJ$B<2PyQR`4t4IWCe>5Qs=RqMo&S?owlJG=EyT5W?x ztgE~4mXC{nH7QH&PI>?~dtdKUAZV4T;J&GCS)%OZ)c7SiMcjw>F2>=aq4g@u%w3;6 zHR#GZ$f9@kzH^a6!@wn;J5!(3J#NVm-bDi(E2GbGGKVR;_6uh?vH%N6$P9UBD-Ubl zmJ!_nNR=H$Meu~(Pq*q1JL}$#s5JS#QA@*V;pdZ)cvHomo&e>y?6z4=(DrWiOCK1G ze6INtDgH1LeR#qA zv*#Rp^%7N$G{KdQ!H3E?G;b?K$>013H``QO8w)dIte$ga_ z8?1lB9u%G?;Df0sMO*H$*S{i!sx@gfdq95K{rQ|q)Iu1QZeZ23x9G5)Mce8!O5!?j zB2n;yYV2lc*AY0}5I!I5)KL@!m$)J$JJZ+r>qoT8vyAy(F4fBDOHW;*yDPWa1yx>utQ@(#W_Y`-hs;bDFDtj5lI z9_pcQSw_2V6WdF?B@>^zHjm8R3pJioqf1Qh;@HDJC%!AN#uPD3pTiJumYl3l_}#PF zUkGcCgUY;vPa@rY!A(m?YMwOT!QGb17!D)*XTRNw{VHKv0uEg8($dZZlrLebsBGq| zc*Xi07UIqv7IdZ68>qYq)WbkPWW(trQ}{xAJZg#1@a5$&`vrEJ5Tz#D`-$ym^Uw`) z`Y|j<6hcj*!%pH*|9QuE@`PkOeYs(NR`9v*0*i(#*B%pkdU`6tB6-cPh;+0dDIJ#G zkF~V!ecRprk$u%=tAPppz%!AIPG<%AKQ=r#5X00eh%|8*I)aK6Pc*>Jh& zA9Eezuok=@@>hjvwBlzv?9OcPc7G>hynLJPYWU3}dyTu1tC&)Kut&#PWU`d)GuIr7 zRc8wd&`U2`GtZutE?ybzj5|MciT4BBFgG&x1~g4w{k!u8-ww)nt&f1kGlu74)lZzD?7 zerLZbyy-32-pDQ@-x4&KtQy`pEbZQ&#fr@MeAyOsk8=H8s|cLF?QXeOLEvSrkE|z4 z-F+#5fz>HTvB?TpbCnUHAyIy#^y`r8yBEb{#UO`x2+Vi>^5d}*#rH9(0s&i~CM#7> zQm{BA{~?}k0dJf2+$$U~8Vptf>d{SmTbLX@oh>vBkeaFZXRr7!lAkLt>0f%7nAz$TgLifOs6H^B*SB-TyGmaM&*eWE8}%Y{~fNM=&YX3YInWU60XBFm=Y ztKW*xUD(e3nT#iAk6ucvxQ5#@1vRRM?XS8l;z|yE*&$Ath=atT0X^KQ=0G|fAApN4 zu!D|*sj{xD#VN%m#)Twh6ld5Timf&eiuEdqL`}gC_dHSs!sR-tul0TppGBRPmxSMJ z-wztA?aAF35-uJKX19XQUrrI2{NP?~u~T-9EquN+I$(3Q&tE{lF z`J@?NF3s@ska*J}e>V}SsRE<6lEoeAhEvs-Y&T#qG~5xee$)+HWgV0Jm3i4{k4yDj zPtL>5QjZ}X85_%YuZ0&K6v~U ze`)qi-=MbQ_V23>=bK~|$@3i}JxCTvAf}$Zo+sc2>4u5O>#E-g12!Q}9bqsk_op_H z4QcBlxd29KPbq5zB<~7-G4|pcla)qX6Gu*qJMyhQsY6lu`}U?L-MRZh$5x<&r_hch zz%Pu2817I#4_QC8A#dU}q}eW3Lje8P{)RW&`DsY!8^jmD=Q1;wY)JD=23bQ7%w4Xq z{t#`)yj~Ap-^x=AH-(=HhOND?s&=bBNH6bXcn62_|6;K1rHZLur_*Q zoO*rU%KdWj1rv`SDF_Fmqwpv8p{HgH7%vM_h!dVc41DgSy1TKz?Tw3O)wWqdCq#nW zCm}|BU3eTU%eunn;*Df8KFRX0TBoR4`KkrO1`pHsZsJNN`1g5#+8)XwpxV;_zjAZ1CVY1n%9-F-MQ51!6P&tP1ff4&GSp10yYPs6c>kA3 zS2xr)J|}Y76vwJs9$=>3d%SFc>6%FYE=i-uj@k?s?=H9inFRPpjx^(e;zsTG20lvF zv)JeC%{zEi)I$&P%6F>YMSW@v+)#?KI!SmUBr^tKyRY_qg{e%xeVP@;@A?EqpkD6EM@ zBH{hsY-0gus)*&7Z}?nOXuB$ee0LRbqOH-{i$wNciwhVAQ>ML5$u+CG7CZXKlX)5wYEQ$ zOM8=F@_s2-`z&bk)RDbP&szKDaaq%qkF(BF5K41PQ>>b?M`V7Bm)}M(9=*{+l`^@- z!jhLy;by?ce}PbioAA>^Zm*BkPFV}JBE9gqwX(n&8K4!kTz&1n3gy@$n*9?y(49f1 z(!=p|c&CF^Z3f!?Z4j-BBI#--WZT0VVWBa>BQHPR;=oulrHP}`Kn&aGG-N8j_yKld z(zCBGA4GD`gC<4!rQp=+k}c5>G4I9>TXE=Wjs7;U65tw-%&bO0)j=B2sUr>|V38VFT&vq9e3 zR{;FbEGwO|ZXRL_ALzRn*GHSO^(hdY{ZX*lYMJP zv1ju8W1OpRYMoK!TBPk0%o0!z<-^|%yMyx*xPbmM_x1bA7cQc-MZ!m-)4LkD$Ncyw zG%^zOw;udL?|}#*tI;5&4|$t<)op*ZRX6S;xvrhnWfE}VCvCUM+L{r=lb3aG=PqPN z?hT|1cjO9(|BAc5+m#4eod*)EX~2;3S${$*&DHYbY|58!O*V&TvxcPfd+N4zemGY< zr&`{-*B82ng6+&}mwjF1+ThlVBv0?wIhAw6t(Q&F8B!g>-}{9ue2cBHnH)LF%ee-3 z#PwhVt}h#{UMjh7+8yr52tgSKka$^&G6mpQ-32jvkabg_Oh)!rZqbtPd5W+$$&ju)Muv76Va-hqpw8BLnBy(WZRNV2AOaQ(nZqDAC(! zA30r{cZqHKhtbm4A=VMajPasM_td+kMBV|wPM>{%k4lfZ{ex4x;d1cGTOWh=mV%EW z8o|MY_7v;)KgHAQyo4VXF&am2e$XrP>@e<0{-l!ou0dY*;rHIhgOvGt#3lji?PUoy zeg}%uF|kEGeH(X!VGGU;i(VnS3_KJX@d=F({^v0>#(w8jx3aL+YSz3aGd`BXA;fGuivMGNMR zVW!xIEw=}vDY(RhJQeR!>)P<$i>8_6BHR3R8pyMW>}&5=&9veoJ(w)98x@NzfJe3K zdD!{}u+kp?pn_YQDx94d>bXBKR`wA@5!dcmHSMjR>i4?djgfpx6ri`-?V&i#M_;|GFnYA)TG z2|yoOmKcl53fiRtDjeV#a6fWA%H~MBVN!%PMca0LVQS}I2BLLwc9zsuV9CQ^&XTU8;{qXw(JhSlMSvww@ZMYx4y){Py{F=WyTraD=^!p#A2$;byHr zq%i+=U}9clSi0*AM5wy{m0FjH6)03O9MGaIK&385vo*_)j7+DTlq$rZwBv3YHrUI)<$4peFqJp1lssDg(XW&-8^| zUi?_1j4y0ILiD;-TZN5yQT4Zo*2>S{R%{1iTKQx}g$C=CG=&LELjxF6v~BL@kL~YV ze!nlN!ibxdiHH@_gTQk3S68g0^K8e1vT@HgqV9$CPq>Ki1U%ZEUAwn7Qk3tSdzHBP z&Ef8e2LjS_kgaj&TE*=T02@HbBZ(!y-_G?TDVs^0a_wCwB}_}xpzYhtPMLb>MqKXK z9V#{h-pB)6+bIxDL&@YhgdgZ5Z@|?PbXy2nsY^cFpeb*6uns zWFz)Hb@S4n=(vn09O6Q$uUi043v}|E8XBx(ybOa0VBRDlWAN@cYxj2wr@4hP5GXc? z?M56Vh#J8pBl3+7Tu`dlFtD5vxIzY$f46!_Cx8C5rSzWnS$9tFq8e>Jn4qQ*%o|bc z7q4|z!_?M4k7H<38vn+RMWtreafl+`QBdBbPbNaT)p@)RSOla6-Z++^!nV=%e9j~f*9)R`lK&35X`2|8A~)>1)997+s~tK!j3;Td*GyQBDgi6 zwB6W?LI+6&F#v8_dsz8V$NL2Z(j#$&4~idzfw8det49^aU>%UUBza`Q*6TNjAz(mb zMXGkD2@q5Z`QllDo0H^O5)K%h+0BWQ_+~I&zcqojy)ZM^3N%zmlVx|#%u0zIK0tsM zt0yNX7h}~#=C>>sXv5)^isaP+FoNHSWTkzG?-{OVHeAvPk3^u%c%9U@vTdgw8ZB!D z2NgAFF`~ zJph4XXnll9Cti+&pW69!KXOspfS`1=F8718pNzmych(htfEu^OyAMW+Rw2q@@hXxKWim=K%7_fe7*m;hcX&_C-0@X3G!eJrFFY z_VxCB@0hdwbB$Nj8Kj64^+G$b{_8SeGX&Pod_$vhCGSg zZ+Ln#pl{{^mBS&9oNvM5{{0g|30u>#q~{~eb#`2LV>-FL`a05@cHCdfP0_!Nan^&e z7$9p(&qdwpJ&qi&Xu_zaMBjdX>XvY`?t-YANJkv(#RotQw^UIHDYB2!@i-&u1p?=@ z8^yA0^v%M|rwhFA?t?Eat*lIo*)}!$Pbo-3l6jc!#>v3yR+)B%Cyq|e-q#*fw_G!2 zApW^SdLIZ(@a|k#_XT1dpwud68o;P1QAFgM$l8ZrN#+>|TQl|SHJ`Z@+B-2L@5(T1 zKtm#7cl0pRc+UrHR+3zcO2Y#49U{|rE^H z1_KR}Ykk^Hmyd*EU0VszJ6y+9*o%yjwraN<6UN)f068HNL>We+41|)YzvJ`b)OJ6l zs(*io$LVI;BfyRAct(pIwvXmL)afB=2VXES)00YTOD_qTec23*r)crC{4IMPz(m~a z+A?ZRoA~`W&5o}HrvwfbDTC)FPDx0!Ix<&bECC$Xo<|p5&wst!f785 z1Vk+B%+?Ig$u)ntt`>Xt`Ps{rU!Kl=pitN$t2c#%_pqh_d${Q?=2WNfY>m0I{KcBA zWyxq1Yri$AJ>QLIT^yBXi|rJrGR2=r-zO>*4N8BaFJ6QK(@xrxDd=4***cp79bu4+G?bPwQNj zjj-@3%fr6f6e|(y!ph4dB|=ekBC`+#Flbo$g^C-TzdvW8V%2u5V&>akE1TTll0(SDAQ#R{zgR z{63I2%K~jee%x$as%M1Dm=xWd9#{u_N{6oPYm;6uqE=!I8kqlpi|MK&^oQl=>jyIQ zhvUC!^ut_@lYl8$!R&yQgPhlihHSu?NSz22H+A$!f3IPyqandRS0)`W*7kRE(9OUI z)}L!Q`0CNqA6@=@|6jj)`Ij4EE+Q`CU|j#-=Oo^c?4aX^^1SGzI06Htf37vv%5H+3 zOaHI}>Z|u+BJSV44bp#hRJyV~&45iv;T}nc=y3LTd{*pOaeohiHOb!AqH6(^gqxdN z;y@*B+XEGDm?8m1Q~|ka>?BD z3cKyQ3`?4Kmqf^nHbg2Ret$ojXBAxQKIhPn`sSN&=!R18nDm=`lrK)B#XCenlloy{ zl+Tq{HvI?Y%{gbsQuEp7J~A>NZIZ#Omv5Q6j~TF!+W1iR%M>r?V~z**-#I;B+iUas z2QXfIbh&BvAG{Gj+;#;iQD3vtE(Z7YBe;cy_Pk1b!oHT?7ILNRcOs8bJ1YCSpWc%5UDYQ?XNcXU9->=);AD1Qx%-@d zN(*rIVb#KDSWSDqLkeUdI}SD+ltTsjP<7i}lX4Ks2Ki8}npJyWd)QQeH~KrMpVazP z#pO|1sGjOV+$p&37UnzN(ivpj(P4mUmpBTtqfAJ6WM5A%LP_IJ=5#;Zu+?=-GSs~X zrrcL8O8G6c=g62%nI5rh=QtVe9m)Up*Q*QY_N+#>xTL^)b-PIei$aapH{(+HAk-kI z2SN>)6}iZ0MG+qJf6u%2+ah(ZXH8SiR9=jRt1rc}kxKeJfjhkOyX z;OHKsS5i(>Pm|zeu}i-kyH6Q)d|*sv9JE&BITmEBw#l#GU~rZyw&Mo-v*m(ocP(a_ zP}uE6uR{8d%u#Mzlpv(VM$vE;&P#Gi^8DA+)W-p%a8E*;5^ONnHbhg%`?@;kPuIu` zXz{$T%gFe@Cs82xD7c?)(1cn&g0=O;zLp{CsD&acvh_B-m_G7W*jnYqje~CeEio(x zmE>*$@bu0HxYByC@>S72jW+yyUD%CDQ|?)z9T;%bYOPF~p(~xWzv!xcDI%8}yd7_5 z9%U?WZYy0=V=vil3L4b4=tjbqpPA@|fsMqM7)w{z zl8l{2(r5U8wgO>hl< zpor#wa(b_8mfmzQdYm6sZL=})IG)tLiMg|#UbS1QBd#*5d$jqVGHP7k1POJN^Mn7} z(k~Tecf~&``mXf$c>Z5m-K?;Ki5Dw}9Ki<@E=A}mnV_M2 ziZh|xjSiJM2_n{kGyV&C?a}P~!2D!3W2&L}Ch-@XMW`c=AL2EuT0CfMYK{G+3yQ+L zy-zGQuiAkEG$L9f``nfJsWB`3r-xx+2-j%P<220auStr3PRtYPc zi@zUnDDf%$fc0Oc=e>=a_8kCj32e1_bx&g=o3xdf-lF5e(W2u|(6Z`LSPc#=-tFD= z;{1yT^s~^tK2Zd8cdLH8X{UvOh+SugT~vEcR>MsTbvrZ!b+lnXQO;BjaoPm?8ejke z06;MvU7v8$4Crt1=&9SPTi;zMwytM$^sHMIVc~S{&*0>r8vqkG&T=cj#bugGE26=7 z8-g$kz>N$WghRG_n3X^2WnK}9-Oh-EKQPDE>T7MDBu@P)(vy}jVxOSiOs$)&3ye6d z1av5gC8>J@D%+}g!#rL{a*d&2w(uXwvF7v*ckU$&D}5OZ!&*3>b3ffb;oN`lEDE<7 z9`QH9;c0o7(R*X1*6Dqh4=qYed|L(Yd3rg0)xp+Z(?>L~pN7lM{XI?qbLAEZ&^4Y( zEP*ttKwiH$xt?VNz&&sk@M^YrjR5$4r!#5)cHDDY;NQ2Im<01$H2X;0c}t14cp+c+?+ePLZ2{I=eN~d%ziuL_JrOS zftshr5Z|i1Ut+qS+&WDtvr@8n0cGaoqqk*z&OuWkV}D=r*q`WU8PxFpc{o+}C1UHa(2+XjJFo7x>gk{cB~^>hUu>AN~^yU#|7L-D2cSlf^9$Pz%^(9`MakEDr28; zBad&$Z5L?|pTabS0IRV!x12SNgDZ0z7BZY8_3=;N!|P;Pf=SmitJ|rC+rBsS@z?1rm=JGpH#@(sDc+HM|co z0I1*S}bb2Dt! zZEidR$^f0gIxv{7Ja;rQ4X=}3A=P~OL)!I2Hsa|-?{SpH2(F#pneiH;9Q>s_4}f_Z z^3!I`5jxr=cDO6#%PRRV5h_@$%f5yy)(CK#JH`o^7M2Pn>~Vlyv3uzj8SulouLc#! zei&p_BVCm|ufJlXJ^U^M(RUAfbRYnSQp$csh>*}-xw~ckF5TZ{st@RMGYPIq&}a=C z0zCdGD6}SitzTn(r8Gt@J`|mkVg_9K8z?1YZ791=u?Vs!SZJe*G$YOJnkG z3^3KUhtE?vn6Spnr_4z~{w6{792XXWS4s{cD20oQ?H`n%SwwSOh{NBaTjM$3!OE+3 zR4E^`EcgAn-LTDasy|c4jK{hM4Tv{BCq|iB!F?Kz{`iVtgcg`4T?RbnL|0Xi!@-dg z=sHgYo;a2pqH}ihX%t4%h8Ng_RI?cEF6xu{P6rYx*q3=_5rthcqOyUGx`L^q9dHfI z=QGtg$_>^Hb-{aVEUPknat}JAqoU5$ne-BT?KGeCEBMv`5$6)S>-;CH+)#(h+*G-b zow@dUPC-<7Z;WsmV^7Lf(R*seBWl~+Fmn0|Z9GZlIxyeszzjgAYiCv0-h$mTRSUor z-6>7~G+mG=dt=k=s=xh?w0D?B%QJcd(4fZHy9`te$7CVp@Gy8|p**=gU_ zt+Z7u{QH$tWIx|zPQ95E=*_AkU)1_RlkUppH^3aP)M7`h0qsMMw%bm2sHl&*`Un8Z zOHwRn9Q(7+sGcvSvYVc{Mt||>g{ZZ=S`4tG36m==sepET5F_BmRM&PiF#yxbwVr`h<$W8Rfjt*P!NDK#MHhH{|jVsXBz5^;?!eAbply zRUOM=@xDD|c9d-B>X)03hc$w4tjdO}f>N{hr#|Y@ENn__r};h5iRZ{^+)^^Q?qU`t z23I`y)pxXwh0G7g9+~rdq$k$z#X6Ch1;#)FtmMG1ASh09x|q`!A)E2$RNzd&!S`4E;bxrf62SY9qe?CaPSh)YgOr!s z;S#u7L(h^saffN=HixnUD8B=rrN>O7~Of6&vv%uZ|tED~-qx{?~1k>fD-6 zGNiGlPJ?q~5J36Yw}@++9;ej*{IOCDkJ9eiN^5;0uJ$7cOop?gSqmqxp|u^-m=x+> zLB9C|Db!sMVShN5o@luEBiQ(c5%tYQ|2yLSJK$56MOF=${(vkTKKb$gKsVFE%=OqS z;>s>&I#5(7W|>Zej};Zle@2{p$x#Fl>u9yT3fbv#slUV=pe9EJX@PRU6$K-@Eh{=f}*0Wb_$ zK&LR2BU8uPoEruBX3E)Yvk>aj{r{M#7M+!DKiWk{8G#tm%#pj&dhd1QwX@3r<|H2f z$Gwj5=Uz)7@}e(=0o3pzF>P_JsLTYA5-A*pBfGsXg?7DQ%S4#XqEaIH>{|Cg^7P_@K5-&ei=?Ur;J ztoc7Ahbza$hJkHEXMBNl&i!lH01pxD5x=L;YgbekdVf%L7%v7y0F9e?!0?!L_qTp8$m6g;MD99=_`E$llSwaO@4AkU4+9L$g6w)g-CH z$oo$f|KhHY-m`2-3om&5y_OF}PF^AvA5NjhM!Zr&pBp%-ACz6LzEgO!^t$~MKzbVl zEq4!!*)cl_6COp6+TB-GFd07k)i+u7+Y-RSj?4<1Izr5R9!Y}*4EXf z86XPQzvFmOApq<0p+c8Pz1A2V+yD|Q(3eCtj&vHh``dfQJ2;!PY_csru*vMyzRT&@ z_c$$-3I&WT0d(}+xSz4Vn*hbHog|h*(-y}Gtfq}3g|n5kc@CIZY1gxJA*!lN6- ztF}uIG{L}I%p4%vR~IC-IZrZ{qN;2?&ivs-Kmw&FXAF25cJC2(I&IlhWlD)LNm$d~ z*_;@|O&o!=YU@=ONO_HyJ2=8lTnu*$Y>{p|5S3sdGV8|!(iKRhyL8MhtIjjcu9+2U06naq}->>#ckWqY&D zv;tFHl+aq%wEoXKgx5Vc`BrArlMy%@e5X)pHk{~@r!{Jjpjcc4`z`se5nN6oUHDvTLSm2=4HVCZ>650 zZ++&-h7Ie_qB`d|5A%gn*nOf@Rf=bEfu z0CW&B&A7_JB*W);mCqQiadarau|#Ay+9GT>uJ$&RkGFG?rxT*Q@@YY5m*o_f_&HH+E9@){?5)M>9^(`0=VS z!2+Q*(Ofd+ruoblNb3(0P*+;+Rw|kOfnos3LjbcW-G2}2y0tHE{D0`c*F4~^IiJF+ zr&Oy4NQ{7UazO`7cz9&O_qyHow&`9c{Hy$vhIIcA=2xTM9(aKr@r`??A5;OgpT#n^ zZ2Bv$K4cwWWJ%9%WiwGtOL?R`tN!(l{GL>=|35;Wr!CZ*i(2q5n{u;XWks5G(a6Hs zZ2_(yjxxOEQjg?@w`faf9GjwZPGRoc|QU8`}cA)1Qq5t5&U*Pm(kESk3;g_{&zvR zH})hx-%kkG|JMTmR-XQS|8xH{Q&-uQCTw)@2Y_h?AhBWQHeVU1i6kR_77(XQA`e(D z`_d+tshDgx)F?1JdJpZ#O|ArMf(a(9_wPQo<_(*mKSLc&cbL&8x&!}@OuZV%+$40Y zLj&X09Qnie1PaGi41NV=0~)yA)FLQ5;HP@7gV5mf<{j&8K~vM~@DToOdB$kP?>sG* zYL~N6>$BN=0)xG2|b8j+V7J>&e!VB)#FwzMjZ<H@P21Im~?@I`N$GebHNJk7ca|GEp>7Nbd-m=n#o$uehYA{)6dUp&) z5?5IZ6Mc@+5U*AMdD3XIF3UMUm=5(v+z-xY=#AuJ^{!CW( zvV{A_q{DU{H-v|KsiB^LgeR?1k?)d`Ha# zR{GUm`5qgFVWmEzd$%3=U zbZOku?%e-ABy!r#$SeG`W`v9Oo6#HB1#he&+(B}Bq(#rW$NpYxXU%gSVMLkrOV`KG zkFe*PuNO_gQw3Zujp&-Vo!wvvJw?!9w3$CKhiQea2Ew zCv7N`lKve*ooRqU=GFLXQo?(@1g?s>8=PZjNcvOHONbuJH6sY}DYnRo4Z^jX^sLN% zS`WLZ^1?U|@0r@hPoq&LO3uA+GvicJZXHwu29j%oTlzaA1*Jr($?}LBRj6MkbYtF4TzWS9d63n{)J5=gVw^w zdvUkMtvrV`9j5)NXzjWy(kr_rwD(U{S<~^Jm3Ie=8^H1o-!}|+mn&iH%1WL~!oL82 z+Xtpc>Hw=37W&Lvw0X?>_b2)$E^#>T=e*+&lbgr6kqO`T$QVF_t>&?q0#d_J5l>bM z1_t)-=ktdJZf{?;UjX-86q@BWc^`6df4O1Sj3ihE1zuobFz??brmwo#6cirUaEm{= z)_i`8Y>&87Q^9*k7}&EnU7n39Nr={tOy5TV#Js5i8{jpMl0K+f*3rxt%KmldR6 zAEwT@YYjR`&;{qCXVn%I!GSthG5b&H>A>~gxC0;@I9F%M_K6+f&j}XZP28PBOzimi z*zd$hlLu^m6re@|zaFR&jU9VP1TJQINnQS(HQ^akkNV|-r7uWSZHgW4vtVL79?;jg zX$|jz|<{r-&e7FV4x1(+o$~NX0YK7 zENWTtY-KLZa{~qJ4l#De*v86b7JOpeXtOyO&#W23*(%4b=mUncRtt3->~5~mL?xC_ zRHef>B~ssdLefjQ;MIxY-R>T5fL^8s28N^(;rs?;rdjY`S;ow@ScDb3H&Dd6HkvAX=C+T)le zpBV0Cv!)q2%HBh6+WQ9x|00!;;IgfO7b0=L<-rTf>oCppauGOM{eW#HiI94?<R?BuHcp{HqRU#-J2z1Lc0dAk0x_12EAjo?^ zuW>*H$de5l?$)z^`!&4)5}WoH%GOggwtzdYZ17}>7j7OH5ifL`MF9uG1%8&vbz>m^ z8L-@!ryvr`>-+86tY14D)y_j{zFWycl@S_&oOzd;f}1a6hTxUAW>0b!~jQ zG_S_7|8oDZl^e!EM@-DVLv+Kso^hb@GdZQk_!+{ct^^nFyZdB$(5lT__%KOl z1_SHgg1BMd-~Sws8N4qymp(Rx>&$e;t$x1uHv{I2v>_nstb|dHaR*a$Rcn6^R(EU{ zq6Ey5M2sm%l3Yk`5aQnJk!mqvco4X>2UTSU4$o%onO|nGeZDyWOWCaV5I<|6s?PIB zm5f7XPDCdJel3At)cB^*Jqk4%h7QlS93xwg{g|0MfX#QcOp`$eY@xxubcj<*=Zacj z@|x?1iJ{G#M|pA}rGfv*NpNW}8DYYs9yWTRw2d_uKy$0bLfy=8LshBksl^iDkt#@l zw#uHNU>$9!!f}8b^ZQ=TSs4!+Hn`YUvegYacrb1*mdV7<>Vo9xpIytbshZdd5Gd?? zDj&mgrS4Um)4R8_n{T=OGFG zVA74yDHg>+y?9(rw1qWMKllD;S(lj;{FESe*qCpf1j8k>#hgQnGuy57x5kZxzO-)I z&_9kz$PI8zJZ=X@@0X0)T2owRJ^)flcw%8_6J*ADahU$VV0jY`@>$xfPyfU#Ro<%l z;a9idL!gblu4N8OfQw0EfDa-Isx=T)Nk}+!H+!u-Q(W=Kc+a+i3@!X`148qO14 z_?lQ?YG%CkId8sx`p}|d*H0qXzAH~d-T5Ekp_Bc`2$`dMSSJ0q<~(rT0b*1O?pv-D z3iB_U{;`P1dnvqG0#N{(z_@>AL1plg{cB&VVXj5XvSnY6(nh*IuRsVztCzqIS|CZ| zEmNYWbYx|E+XQJ31TR4ckm%;HL7P9xxEok`Uo0*{gwksu>HALR^KZ|5`K%{cUPY1e zV-6vI;(SuhF=^-nBcin$0>a;m!G*}&V9L4&!y9YcTt#XZ+20*(q5#&x9JgH-S9F?y zefmePJKzXmAF&IW|KNHD8sDk05j(lNqxC(Q9J6&(sjF>q@uJ%P%*fKh^64%{px&^h z%)6YlW#kw{?9efqPVt~+6?mXwM?q(QU8=@ah{6JHe66BtGg_)Ku;Rpx?K##uuh&Jd z-HAactE>r}WH67elO313p^(1gFJ5GA2fv#MfXO=G4r!X%-zPbRdiSkdAgTPFj+L)t z2dcaw;=kG!!Gg8Twmi3eU`^mC?Bil9Px=c)IPF%QvavC-_6w6C=8VcZO*ot9@}Yj7 z4Z)Y3`8}{-nQ0PFpob}JyJ&Q#k;GW4CG#_F#@ipb)}a^c<0xl8%W^@*u)T>2zOmb9 zOK)bvbCAw7K4k0HHiIHT!K=cS(RT8`as^3~A%n0Vk$LISXIF&p$DcDS-)sGXdk$h* z2oPQH@6WR&H72(QP?iG_;+`&$5)S*kd7YwB;`y|Bk1bhGQ-+;WxAR}Hb(vLPBXL@s z=k|nSRq13G)jF^iBi`=B2S1)AS6^MF%QxAya^bz9!rE9pid$Yj)Bu&jxulq4k;3N( z9o`u&GBgI!A#;CAd;MR|#I4I!ol!3l?`{}3qO7|2{M`d>PHeKbsbCO!-ia(w6dI6!L*xh!8x8$y_ zjq4pXpbv9i3BK+9Om=nX1wyW{iHE>{e#)5!@^KXGuiQ1YQB()X@`7}+qc*+wRkQVD@^>D%t#yB?44snFm$^JYS>FJ4AnST23bm6c4gz;?H8Z2)ss$t2 zSv_o>ZD{c0ROV!|d?(p8dANi)pB#Ve@CS~mcJkA>eA19A_EsOEi$3rwwP71_tc6JV zsmS?i^_w}6U|{Bl%5Xd{5_k51y)EVL(ZtQl3-CV0tybKzzcVrhjFE5E`R&<|n{n5a zrb`YcVu0Q*B=_E!b_|RUJ_5en?MHp$k*5FdNq!E4JKy=es$4^H!#TagUm4oyqhQC4 z(f!Y~>51GwvNn5Qo+)ZcuD`}rvPQpU41WYK3WcF03&Hr-3HV6y&iva%hwUjh7!{hs z1hWbs85`tsQ;*NGNMh=iUeCRD>(_QGF|d$0DlNJC*`lhUU)xmRqA!0#H*9aH1g}-B zBYY6deZ4~4%oPe60HH{i`Ndmb*$bxOPJ>r;k$)+D9zg(FBp!Nw5l{&3bGIU9E4T_kSY$n#>KT z*-0xNyCFMJSi!06s~p`fZ1<#Byr8Sgg#MQ6aZG4!8e|Zu3e;Q_B)}zAj;a2Yw}cW@ zOy6l;?V%PCZMZ+PajO0c*05fE(Cd4*nf7Rm?xz1*VvOpA$J+Y(?j1&RuuxS()oj;f z&VO1lhlU%v9m59ijL6{Kvk*)+v-v(c7PLS;XAB6!&pAfs_m5g4bd5?*O?!@Hd3Pk3 zb}9Gv30*OgvNvV$iWQe4Jq|{|n-WWwjLC0rjIrMQa=H-1y>dImAPm>Xi+G~U_qSMP zD`OmXR3k;bOF#CtVnK_ABm^m|VGo(q>lQASxA0-xmTTRzTBumcf=9?n2&Q2DXA6CF zGp@5)U#$gPy~us9?Q5e@A~x&mg*X`+5gW;q`mXw|-8YkF4L6>9b(=l(>1s$k-;)6d zx8S)ic|yc%HMY_bh9zUT#8fkziAJ7vIzV5gaRQLlwnip zf+hV}rq6C@uRgHY*GQz*(Q*-Y^+(S7n&UnbY|w~n!zj&MwWMvL@P(@kbnk`#^>LTi z+F`=vn0-;F%Z)6ZwhXa&!!v(OQrU)lfBwN0?A6MX#a z7^`oHIBPWd4OQ)sA%27;b&MDfiTi1)DefE5V5X^p^t`YJ00YL4_(mrto^K@EGdGYS$-+ zW7ZMG&dDx*hUE5ono;js1uU0p6dOwQ#v zg{4h8jM&Z(f!k=Sn9>O%X)y)Nz&T$deI6327g*BQbeW@etZA^N9XaR?gx0Z=QS%#5 ze4H<2y<3Kd2=j_M<^lW&*~-tjR@vTBNcKdC=Jp3a64XzlP;=o=UXSTBhs{SSBa>Fn z@)YDULB8pE)zv{MQSX|dHy#q+yi@d>Uhn9hX?-3q)Xe-$)ckSzjWY?l-Q2HF@UeWi zOrpoAA0YaJLta``f}8a0=)pY_g3!kL2U!4T1yZy?!qw97UB$RmGtjDdEv9 zB0M9NbOe%RT>`~YxpL0<-bhxg@|{PPJmJy%phTM*Z}Bub!Msrf7tI+*wpn%ZVH6Gx z8iUs%@~Gca++%T3K(|sjo=L41Q$c_P&3Igry5{A-j7=kjPRu1yRjY`yaJacCnMTN{ zBZ8W4eCf93(3GU2mdZl4nX5|_H!j#-iq=W9OwW$xDC+#;Vy|}lpLoH%@4wYnOLWA% z@B`dr>SV@(Pdrkmjmo}PVL^%SBXZV*Raz~^V@M#zzw z)^%Q?);?BZU)_wqmPj1}Xm3nVY}*+iTOIESWGVz;UZvKae=-8kI%D>gzt@uwh*JWg zowBw#6)9o@I%rQ<6lK(PDSCJAIe0OYgGRpsMIkX(N0nGow~1_~`DDYth>h!G{d2Zc z-ch%JSFMnhT87+JtTF#qJKAGQJVCE?0++)NdUz{6{5||YSyhgGFie}DX#2okt`o{8 z;`)|{q@ZMW=~#1u_qwXq+*xv*iSgj7APeo8(r}Zqo<2G6a^b1@(%Bwr5bS3(A@>QQ zaGSJ-=a*~a?H+@V*o?_a@6-1qojOFIz5PZ5=G1bM?LzIH*=?rE9wH#6F*AG=&(mV+ zIk`kVYu_d4@4eR|`pp%5c$j+D1|Z=$9OWP|h_E;(%8F@2Nd(&e;%C|?nwh!#1zIWw zb&U(v7~du~OJ(<_4H&bBuH_3HZCm=Y2aml~Y$7GT$Xq#;x=kZN8F#EtSH5`F$@>l) zl~L~!5|YQK3s0G_{n>u!qKifAGq!TN>+J4=^r-r0H0d@q|BhxbQ@dkqq2D@BvV*)- zP>0G=)j1z=ss{`lhMUVO?RehB-GYmP0vGbH&0V?_(RSVYs?4p|hek{EaGpKb`9fT7 zQ_S7=S$3x{%TSv|;J5a4=n%_#Yf=1ud6Z@c(K{MCIyjHpy>t54V*9Sic13&t1rE&* zYIJb+{ja}Y$~$A|Ui*@K$`KN!5)ULxd*^KrvrcxBhdGfLTK~~C8F_#6Q)$X?Ey|4y zz3wcRIeEXRMMkiMQn%$mR77!bh}=JDT*Y6I1|CEsis*iWQf(9n?@un0 zEafN0;4|}t4Vv+-8>h{qMd8&x_>C?}>8k}zbk%g;y_^Z8Ea$xOow*o)jqjFMdyHJ@p09{b8ALDSrct3u1M>ok;>-B=My^nxK;V{x040Ybc$qD;{0{t-mxuu0Y ztg$D47+3CQuTcVE7<=T^7?AOaJFWc%1NDZcg=$tJ7ue-s`O(d>2GeNA2PNemY&y! zU3|Ve3k!P=9TGWbXmdDrQwBF^oPcBG<^|GS@Z6#Fv+w@0=>Tr;r)o+7Tt8hci%czt zco1fX8>bYR_w)A|3Yn?%5TCyS5!oSf#6BDU&zxvkqy?DC7)dn8_yHMK2oK&FklSpE z-#YY+YEQ+yPOq#vRC2ksS)U3OFQ1+(e04k$eRxx%vpK+7e;|&4Oe3C|2qaGie^zZ)a=d7ya;eVAjnt%9{N++Rh3O30XQPWvTr8xV zCQsl6);kc&9>H5#x8YNfoY&egZ~g0~WQX%B2HJi>z+^BDpBcPl!l^F2+0E4>!c!V< z4M0==O-BNOUN^cQk3laEQ@je&Z+2CYzwDdJIfyo~u58C-v*ad1f6e`$9t#QI9Q{qg zz=M`4!n{Z+aU>Z25RiCVbS_AwU++=^n$un_C-?IYSu-8%(~up~L}Yf#(1Q9E&`J@` zlYHa|K7vzcAwNuILyw8-rS3QH>JjNDe8o<&*CU{n8{ImY4!U;JE{Suxelz1_3|k0~ zpd;@-P=B$UEMEt7g%Ip5GcRknaW)5zTy|qIww3V`eW>dnN2sn9*Jka@4KKLZ!Tjba zphCu+^KCmMt>kHP#;s!HiW8_~dp?xotqCEo30=(=cc36l72NZCgx6@$3*7~pGUDRF z;cKW48eQnxV(1wnUnx5;m#H17l+G|tZys5n#z&cu&it9@WP3NHiGgAzndDgT%~a$> zD8EaTan@8ebue1KTUs_T5}Rk!3~^(xppWJZ+L4MoW$gGnYiT;vZI}1 z19fd!P7ADU)4q}Bf$k}A-*&-DFuUgXq0LgJLME7fB%p}rygCp5G5<0i)&Gk=j8l#n zB-W?^A`}m4PSDyqUM}1pgxTJJU5|g5p>fYCAS-$4di$$a1E!sjO=h!`S0|OvR3Wm1 z+96MYw&GJPZ${|H_D!s@j31N9lCBR>`YRWNw<<#VoOH5I=(6-motQ}_4Rm1ZBv{ zK8?x^nE1*U^!XoCj1#5%pc~OEM)Qe9EEP59e%#62(~2APW5~UMSG_B58s3=6bf^4Y zeQe7^Fq|!W#FU@k7&nwXJI|bX7SBl`Cyje>mm~!bQY2G#11&7Opz9}&wUWX+M!Z9~ zvpHT=GxYE&@7g_E+8J7Z5slSDMfqQl2mIa2J$|Dc z#8F)}3vZYNE*h$4?Ih67qs^&%qM9EQy-B8I#3E8shQ%L*C>eAY?7Lf-HU{j&~XcAFCme7^7)1?h9H`&_%FUt#7pR#7<00jt@pN|z-734CV@BU3LVL%P=V*%79& zPrvkO2`h!+Q>Nk~1k|--lGmBEvFVx555B5>^LJWf{m#A$7Che^%H|~&k&*oHtu?{* z$h!E5<9VL=V6#nYEy{Hd>2v2pE@0(Qs{^XRXNWxL>?2b#nRv|9&c1%FkCwIuC61}i zNAISy`ptusj|&D>n~Fr=M((Fkwe`MXp-vtjuXtHKwy9ODf=tXe5W5rQ3zMB~IngCo zCuM^({UzRvU zD=x_mJo!R}Rr7KKF@bEM$Fp~A)UB>sJ8ZX2rEV)GIrSMd>m8oz8EiH1+`-(4*)Jfx#W)kokF*Xwr~G2DtW=}JdI=zE%<+C|GxdAsnLRz*3fZ(N zP0>i+BuN#j!e!kWv`W#LUm7~SxQR&geEFx7XXNH7HMWoXZoOEU!rqaXpT9jXp{)Kn zaaP|&hxxlY4C0IYQOmxRyRF>xnjj|;w}T}YoFiYsbRmC&jcbjsf|~%eu5D~SuO7!R zQL3OkA0qr<*nY$^w0U23fUnL?hH2^WDC4FJgeZ>=sSIBRtXRqjG47VSc)EfVM8Pv; z*vQ%Q{Dn9*Q8GFvVxhghrVhm-V!;=NN>A3^u)5v3_z{qx62yAu>g zEl;-+PV=zGL(aS8@|YdR^BBkuO>c#Y4KNX+K0ioI4{FH^L+Tfje0tyGCS>ce_Y)6k z+lz1g2pKY5k14^+TldHxK*Uz}+Y-Sn(hT5{lpSq6t=FG0PQ$}2ZoSzve(Cga2uC1d>I3H0Pe?u3l zvuIiKL(|sCYUM)@x|s?Gb&rk_--`df z+lDtEwt1bZigjZbb(e5{ZkIQgOJmq^yMBE!deMCVtimz0{n+=8EH9Sf-T;M6QH+D- zJNVehuXk$UAvj3hSV|B?NckBUzBGZTl#d!5?a>paILy)LL=2kmnpZl-mLesxJ(XtC zSRj{<$fu?VtkRy6l_go|9IQ49yv{@Klfx2jtHTFO>g03()SJ%+!h8bQTDP9BCIr{pnAMBBP*e#jSvW(hCM1R);#f79o)J zy2~v?In8GwXh-heqSY81UKuPMwd3|enZ4)f*66j}ZMUFt7dR|(cTha?MH(Eg0ofjs;Wtvqh9mbUcvFFp3L*K&htvL4mYAVH_F{ zvnfTlo5-n?P0Cx^55DIgQ|aP<6yc>P<0KkxZAsUFN0 zi>x<>=CL!$CI=;l=Xd7?pIk(}!rh9RDcmRX1UGa*Yufi2$}h&X1{PARd6@B_uVmcK z6~bT(hF55hCXFRf;bC4yM`Rb6mV2DnD0RQ*BwQ1??7`n!KODi1MwjM^^QA>C%_tEo zTUaeTa61>+eR=c}M;*jNVyOcvYffa;wRC^1v#aIi4IiX&tI^+4MAy?t*HZBj{mmJQ zxjpS`B>x&xpM=Qw2FoEb=$wl|ZA1mTG2ZimX6$M6rB*5ba%rg7gvhS^QN<8cg(!jT zkt_0-YMD;9eYWImUFe>XUklE&I!>SL;)c0$F9$MPt{;3jK7(#*+rI=Km^}Ckdmm8URpH(eqfC%u@cFC1T2t8g-jpG_ zZp1~aGAx%qY{^eTwp=Dn5`J;wf%fLtbR7RSEOy;seKhT+lY1lTO})-ngV2CBXlXMS zk%O^5h+EsCutBnCo=1+DlGh2CoZYrN*ddbHJ=QTlg~ZAd)8a;#Oq94C7Y+&UF6Gjj z3+nA2XVfUzbNwwoD!%aSMkdVaL*_!h?T>%vu!OaA{Iz5^O7d|_y;8R+mr!aXPWj6Y zguA3T&L`7QpUmDxOk(i+&!Q+}FTsvsaoCm6& z|A7g71R=RWbmNNUV;NNP;_g@4&BfHRj1 zi<+a;gR6_a*XuVBSiyP%k0u((nN#YHSlT_>5fgBlkvnok{=i#r$&xkNJKxB^z;EDg zkzyWT{JN?+B7hf5GF%D^J-YA8yFAO-S7e_%qK6ZPqCpSm2+PipNg{;YeXGHF)20l#QDA6 z3Py5CQuC!8>c4g>1IHRb?VA4wn6 zrJ!c$nA?oJ@`rTlKHT@~B$V(Gp7{KKEd?K35= z#Ce*dqWNhXlf#-q#mZW&7~?efNcf0~fa)RJq?+np5p~a#fyyNFKr!J$p)GN1s(&w7 zad1O)Znde4bJ&&i)hqdMFnTN|d68i1qD_DF3luD5YF#qUY~c8>7DTYOG|&k82|U9f zN`AYJ^A9?5>5Jg&}5JuT=73@ zFZ`TQqUqN6PI~cAdy~)bDK(P)L+GOnLof98&;5QSQ95s(n#Z;n^KE{UuamhQ$+s6g zVBQa*S;_dLmVJ?lG5oPTcl_^jY30N*ZJ5U0r6>LJx?%d6lx6*8VjX*W+-0FocUJZm)Qnkyt5a+y6+HE1*J`n{rIsOIj;i0uG873 zyt{lZvfu#xjP249tExH$GyLK{)j(NCN2DJ@Hpb;|N6E!~ZLHdlGTAa0LL;_7>T-D= z*ai(M&K*@Y;h9pQke3N00llW}zw-hv1l@eF8st7)h>;bENLOGXKn;8~@^sgO`;ji~ z%K1~PH&m_+JCX-Ax?zh30+_Kqnq%T{fk`tVb$YSeaGBc0QZXS(ios8D{xlEUjSA}? zJOq-eOxM#AyN-8c{A%k7GnDxliYg6+-GWlHa(=AXdOD zcfrTN-Kpf1wo;9z!|~G!pqo^Swio~Ng5PNpWaJxY(^qUKR%D zWVVq4pkYo(uQ%=lQG`p84#N&xzc4@@-XbeyosL*#VI-HQLCXXuB_}@P0v`!A=ptcBOvf$pX8C zM8Wj=&z@-Z*g;g9T&iH%#L*xaxYkRXalQeEsOJ+Ipg<_XByA>4GFu{lF}O}z$hfl! zWjk$QA4@DrJGU5#a20^WKLRQ2C`t@}xeUvF+=>m4SW6){U(tJ&n0ts!>8Z2H6Sb&X zJu5FZ=VZ$AS&yGPXFC!bU6(V!*Fa?J_U3-rV|ymA5v0aaO@nfkwXr8;3J?+*o8SB! zQB7-e9p#q4DmJc?=n__=*$N14cd|E6Y)Pi9r|BLc;Z6$N(Uzt(90p&xw>TXx2qJffckTaHT(_EI=bihjRMqp0v#3vJtDdNQhv>zFFEvCw*+oU(JCXoEt`kxCf?oNmB4)hTRSK|`0o9Q`7 zsxtqI(qh5Eyt-*2skNx>t5hZ1D$}laWhS!Y5*!c7!dGyX5ciTozjpfZ@1+4%1oIJS z6A9$pNg(PI1GFR&Pu^5xl#m%IbfXAzQBj7U{`0 zOO97^wE&*Wp51Bbmk zrUH%2$JLm+?7%9Uj-#jig>8F%@yg%Dys#>bFddhk|Q zsd)C>@BV7ssptcXydubjUGCQiiQ#N`S=E9krGrFucNEg69Q{}~r*d(ty-UV_B-rcb z)t9{CzY;u>XHt8%ANRZa1bHThHFLR*nGjT|mkA5(VWrtUB+6kY{@-LOW4<)M(jkoq zeDw3OV8*$7S;~+66tq&9y7q!dxgz_;Y(BB4ogqE*-ILVYAZWzXORMevROVx}FR94FDjaJ-{R@)6 z>5;3$i`0@0H8`W_`^*QmZRiADwKqDuYiQrDL?h>#alu}3)Y zNE#(`*7B^UB%^2d`mE!Tj7reN7Z1ZoGhx^cdH8@aayM%X!bwUH9epQ%97+AOn zT_(x9ul$ngEoRb)_D!$&@A?B-x;c0&csCKmqj{?dR*3wYeFY_n29zYLg#7Gz5U++n zw3rv=MJzctY2b3_eEc)(7iKbv)8FG|V&>l%gL%OaVmL;ECC}QiW>6N}BDLFq@wVW3 zCMxJmnA3CP6-Fq6Nn-N+n#8JSD{;5is}f(FnTC(+Egh-@DFTjA77dB)-F4pHCQ0tD z+Z()R2_nwx?z+m|dexQ+Kaf5YjfK}q8w%`=!ql0)Z%M`?5xN5bGOKlwAm`|@V@(*W z<*z9x+z+K6`H;XIW=OIe?1T$tttlQPihR;e3{B2XPVqeSz>{O(W9iH)!X7C$?F|U& zY(0YEZe|s~LY}>-bd>M0bvIRTagp_y`Fm0y zEVBk0d;Mh$|BHe}Z+YUBt%#D?Od`dHy|V7#iudXugAQmw@+bG=4otq;tZ+3q*JoJ0 zSF`%CFa5ouJ8@KaM}^rnMrPf5OLeo&X_+G=jt_VrGHUP?2-(?NetRsnOlrRtl_XE1 z92Dv6k$^>&>jd~$-L%~9plIi89LDudYQVHo=Ai}X8Te$swrA~!ka1&m^IuC-B(Tj- zS{bH#qMH{6df|_VreR-H7HOuUqXJh2^$8rVr^~9+^$@0)M&1%F-FrQ36q#9Ssr|xU z>ssdmA@(@<+Y<454pT=>M`?tmz)r^;2U&>!TH0Oq5L(}o%l@1$OlWeN@~u`Kv9AKp zj=lD^LSg+La&k5(W2$5zb&maW+)9y2%H-B`~u#XXe&w3T-kKB$Rg zw5Z7|ctg>AN%(z;aK2(BH(dFY{PxVWyervcx6&C+1dLfKQ1z~tLt(6@j`&O)HGjz zU9e*79w4^lTklPjliB6vP=PK&TXIA6QDP{V@k5Z5F#|*{;>wL7+Fa`+hjJ%EjvJ}; z$H?Cu(2QV>x4mLN*zgV~8fr3x{1(1Q+YLV0se)55*Dy_p8q;M+AwfeYi&E})q!*6E zo%j}rz694lNbFlbM%1ee8eW~cQ@YdXd31siccYGTtm{9Uk)0`b>$CeJb+ErV$%@hS z+wo&fm#u+KnuUH5S!#x#z6izoyW_kECTZSV)zLW$N=`G5Ok7 z8hI&tgHVab1gcGB-=3#rjb%03LS9(vi+=hB(K1v&_7>QY)(MmP0_1pvlm+J|)pwy? zZ{VhwAa2ta62E&%(;S_yVE~QvkW`!SY3d*kXg2!jOMcm3t!~4r5lD{wnH@jk6_81J zQSR~|H)|vZ$yOHCE2GB;wu!z{x~I`PC=BZ$N`w&sS%m|;u;*V5V->th@w7#>xvkrU zOyjp*soU%eB+iT;jbSvBQo z1?RV_Mv5JdS!MWC=W6_%GP`Y}&yJOkWcSE|$$mpkSjABjSN+P*85jtl{(19G3jQ{$ zLKffim<0JK@&pNK&8OyoF}NvWGqHlCDX%3R@~3iGcuE%VhZOd22T*)M=JOppK+5+ z+Um{cJ07T*%41K)>mcuVUTe%P=kKp7h{xVr78u}Lp?iActE8ilq>i0tHlU+6zu4z! zsJ;LiIOWwXDW~@8WlocWuWvK6wZ5k#c8NJcb8h?58Oy9Zosj7XH5DXtWrMn5HCu5en|fINuo! z2)DoSlQ(NG8IQZNma>Nb?$nt0d-=EB_t+j>-N`gT9Wz^m=$ zCiMLu-4%X1x;CS;#8Ljb2S)^F$l`WhzZ}?a1e5A!8yW_y$3JZEI-R`cfP!rI-alz8 z58TmI6+1{Md4@W6nXNz!aOz=TK_XihZ&2^3X~-F`%0K7Qe;qBKeYDTE18V|}@t@>! z8p#Z*oji|Je;r*1=_w-HT~E6@{W#B0kXr3gMeqX zL5qM^EvV8dM)jd7Ch&W`2w*9sn**?Z$LCjF^Zd#2P%va*@oK1aWkp`DWGM0I`kB1f zs@FHbd&dfJ#d|AmFk?JnD=@fTbK#`^Fes4^G(t9>4+$iUAsAwC0r_e~V#^#zm&POkr!QkoB(OVT7?pK1{l z4*r?9ya_1&{ge9zywCPw*;hslRlVQrkD7^M6d>rB^8NaD5K@nK?cF={DeHFq)1Ub9AoCI{C8X%QT90#71nby&WU`O9 z>S6(XF3feIsh2>#^bauDVNKAmt@6AH=Csr{n97x|NsqRJ&4UxZKsALbn zpm4}mfjAzHjlZkQF){PnzoaY1bZ;6na58v(hZCFm+la!Zr{mGiGY_TCLamb2*NV;p zpX1Rxsh72Q3PM6`*vH7YpGLtm*?rb`Z%uBu__)kTeX<@{1A?mD3Qz>@zjC0X8|25e zyVpds#HhriwC>)kwIAzcSAW_etPl$qX0{W1^Uoq#n20o@g`cEffcVzbeeLb{i6Yt8 zrQFlDB7j{X8@b}ScW3v4KqS5__=11Y62SaL+NzUf+D)j`XXRo5(b6T@$?TCObv0U- zeS&vD0LE%Kw2mE-H#fzSwwKxv7O@6OS1Xp<_ z3K17o*7UO%xgU3kT{e$nb+#tK zZNB1qge$zTPqXnhjsk$iFG21gd=OqmgA_}}lHbBe?))7{bM(6GL4-H(O}aj?bCQtr zIzuE(vGa#s!N!fZvnP{r*s=&$n5`;Q5LkI9zf-D7$TJ8-QEX&>CZ;rK!KIpHLw)$< zVy07~{#x=(t?5mM^F8gU{Sy|1z8@x4bE&VA#GmANLZ?ali+-)6yCAx`eTT@>WyT2! zhDVb<`ztrRgLSvO6m>aRQAc|{19dEA{4(duK+&yI%R3Y9jYx^D2W(ccV3>zjC_fXb z3zU5`@PDbyS8)wb#v@|8d|3A-M(blhC41QCk0i|fh=g)aJ2+=Mz_GQ6aw?(GGGOMN-eRWvmk zfqj z5@s@(HziGz#NSNdybs6o>seExf6tmakvG1TeU(jYgMvs@)C<%((iSt< z0hZ+yLl+3^7#T4;)fZ1CIVth2!VN$7Q&B!Y+7W7_G7nPEEsc8eco;=$h2EQkr2Ov* zK9#*VEncu>?FFe`Of)}9=ac0u*^VvmG5oOckobYJUdFe`8ecH9s)Z&K;4`Pde#>vT zP0Go!6L+4+lIb3{d@@Qq#0T{r)hw_vLr}%z)~J{>CM)Mv=&9}~C`gBZ_=Bj30KpaA zDIz_yG?myIV+3dtt!Y4k&TCmUQNhN-KgKsofw>)%!F>&mMvGcgPbc9V%|ld4gftO` zOX|dr$!}$MMwEpmvr79j;83oSv|$xluH>RSzeYz$=;MN;FSL1gT=*TVSlzqKQy*kI zW3I3!nHyouS`npRyI9aJ(lblf=@={}EutrDQmlYv{VB+|y{P*Mm26XpsLo2}0(|Z_ zsj z57-G3s4rY$eiihFVk`g>r1?(g6QaF+V)DnJpy~6Qx)9-v@Xi%^ya1?k9ZiBaFDnST=emyU@!*lD~@>|IN-r z90&%udg4~A&U+j&8Tu(hi^);OP07n`#i?9hXa$X@fO`Y9)JhA{vIMhrTQA?z@zx}I z5JYpiJ1q6&s6@NGEXGD%{83ASPS8+HU*US*ioH^Db%74>-s>NE))yZDsAJN6bX6#B zoZiSC7KTt&Vz#YtX}<#JSlM)+A`^5trs=5uBw4dZ$lHf+fys68`W!xIYJ&YiQDZ?0 z%=YOv3?e?ZZ2w!>`1=-dw0mKFWNoOglf5-7XIGf+GdAp_o$>E(|K&d>(?JDehXh$|IWhlsx;469aC>OEGijmJ(rc2Wq$9@ zv(}15@oXrzb7y&HtI*o6+2XZVpD>uATqi{+?3pjpp4XO6S~ZXs)9eID&o*FG3AjF) z!>96LASgyfc0qcU(@Wz~Zy@Zm=056skk^%=-V> zddJ|*qONT)?(Wz|$4SSwZFOw3W7|o`wr!`Qj&0kv?K%Ct?=v&?&HPDKs#2-@-e;e^ z*SfU4tQ?+i6J;;SCkuwV=mEa{pR9XSHws zT=2Yv8S>LzPJLXSyY~3Wx{8$uX#UOyN~n;(rA2Z8` zV1;r&Z|DTZH=T93+Z~>TOQBpAX6yS0WFvwfigw_Q29-hnh zSL-jGmtMcq0lMeVZxshbdr3fZ4!mRbhEF6zB1B}RK@nF?v}9?VICmzc;T>j(-())C zQ+a=6B2^0fs86{Co&n&!DbWsWg$NCX!&_{kHcPKG^?8c2`IoyBmy?%^hS>? z2VdD%v^>=QeVN?3EO`a=dr7YPJL+FX*XvW`DVi@^Bkd>Lr4E)0_s<^XrwPbNP7K-< zhbWCGKumWc>0Nnr1#-M>6RU8(K(Z+Y5thBH^7+f(jE^8UA%;-fC<Z|W3n zjwC#z#z-LrN=MUXbNlP+3N2v91@4qw{dpWwLO1sCEZBI8bIJaxI%RJlp@gddJ?x|b zt}>2M^5E)xdVg>cB$g^IJIDBb?$YrpfeKz%rorkDt`5y6o^O4Xgx}K&`@SJ6J{HV zb3w|Qdj9ZH!XuS=VSiO(yCaSOXAUadYXHlARiz)l7s(IpkR3-{#RNXsdjnOm`OtTJ zrxO*qz|>uiwn$hF=}G*jR(Jp*9}#Ukw)sqYWyWYPfHgIo$1!yH1GwGAfCgDxCHU2w z@GY>1x7x=B0C0=*`>fCXQt-ac5xo(UrAEO2qnd35Io$!#?(vPB^RYOgJ+@-%qU!d& z>Ie-CHnrm56Aw}j@Tkoip^TWy3&o3>hMFwoVn_O<>#9^aQK;@`(XVk}|JVY`l$Nm~ zt@eq#l{RuwA{M8?cZJj%r>#pKA|9|$6QACV7@L&JoVITN#+Ttuc^r6D%rOyBDZh;f z29Zr}WtTSsB@=nOgj|-^BMij2!t)Hrj`mb1iFEAG-@*Yml~ByvHLAEe0vyyIqETZ|I*6yq-+gFSy*iGO*) zxrqKe^1v-@4UlgYm9wFk!Sob`j4c@y4$M8}u2I?i7C#Xm07Y#8Vbl5oc(?RLUZ<&c zubg{(VY6+Zj!lxK@XgPx>#9ACvL8=o&{azk>wk6Ed7*c1F80yuq$pD!@%Ljt<}3SHVgl;QmiW? z6E<+b3uw)7sH7SY6MaZctWI$jB@6~I6_Ym{&P|R?fK>YoVIs};fXm~77GM|;+2Lbv zQyfo}GlG>(VhUQ2PzmW#AE5l5czqH95}gABBT|?iCJ=iqYdzFoMJg9}px`Q1e`0wt zoYJti^-QTXK|Rrc2NxR>gk-ReDdMGH20~8%V@uY0i8)>3XG1|VG59bk)X9m=v&Akg?F6K7%0bY`o+WiYc$D0nCNkRqBc?zaI7Zv~& zPxvSO`U3T zw7VO1dYC;e7W&Dz-$Zd)-jJk8zF{tX-2XrP^Av34(7t*wiCruAsLs$-CBjc5Y zdz9$Pe;EYgPs6{Zq1`~vVbAvMY4}vJeI$6Z7C$20i-0n9YxUG(8UVNPI8#c#{pXu* z%a65b`P}ZEDI9m~U*OaniZ2OdNnjU9yq{isvo|m5 z!-*pl@Gv<0!f#6{iK$y z$0&k+SkB&1)t^w1VaANCy88JGrkQ>K?Hk9vD3gDa%HkvdIp2AW!~ZP9SYIyumJL8s z(a|ip4@AqN`MI`Brc;_aK9>cfWS*}8^!Q;i<`0a5`7PSZ0r=e?kmDUOpg7Jg`<@?A z({9zJ3Zj{@A6!QR2$L6ef4l0Yc%<|zB8H3puv_&_NRY4#CX5FL zEGFu4>l#WfMjB2MVhAE+dq+D^B?4e@J!SDkBii+bnIo{cdxx+ilXxW7Jt1Sk$4nXS z<3tc)MGJ^%5{k6qNK)8nFaYp=x%^6FkOJ798c~-3ao*`LQt$WKQq@MCg!*sKxoVCc zUFVU(Ft8?V6NsTAE?;==V{^EW1t$p1oF7=1+q`a#*1!4m^o4HjXn(7NeY>s%$xBlc zB55E$qJe2W?d|SfSkr1h)^yni%9GCJQ7q;uud(!6G`pNvX*;6X7q1RIM{1kdDD9QKdgGi>m4!py#zM4xDUIs z7k_GinS;v1ICx_K7pm~`Q3K#A=LB3t7N7r8YJi}VLVdRZkl@2J%8xG%?xOBy#8_N+ z$WRT0gn=7lAC3jH0-(uDHRjTR!;@6yZ;R6>HH`y5!F0 z?I#=sC6|2VpOk#XI{Qx~+27ZtV$~`*&&0|qA|aficvj!4R>W(XhMmLeO>?LH@4pTj zn6wafCh*RVk@H>wGFzc5pf&}(bTNJm2>H_{4Er9QXx7z^QawF?bKx}+0yc_fjV;#T z$JfWTfPOnvx0oqN@B)y$O9FbGi+^%lH==2I86f$GgKkiV$ZHLYj?~P$-S>x}el$+D z!xG?R{r+iqS*HeF5!~xDVQ)r0KVa}((c_OMK^1S?h zN4SZxzhkB_hin$9PM&>72ptHyQE>oebOyw14=_RP;$md^OpD8#RwJ3u6Lwz@?cccc zz9A}q@psbM)B)-p`aM85W6+4IvS@AVHu6tmxNLDuwvM2CqN`o;IH?@os^iwi*JB$z zmkFZJg&K~%Poj?XP<<=;`Sp%|IZEp$JCS_t%D5LlUUqSCkAh)YN*caghmPf7a_JX- z)^54Ay~LFe=%_r7=$wnqw`Qo6%$xm})@p4JD!~n6E6De8*|rV&r*kEsbPW7G`^)m@ zTwO!7NT?_=ua9x2Ww`8r(iya){Q>*uWWHEa{;fTf#XbyHUv%1&vfPtr{cH2}uJ{{g zT$af5yh~In_x7q8^W4^oibDGg(5u3+o|&^+*3K&A6}^LFKNV^s4804ByFkDOaqlaS zMnG{{P>*rFMLy?W>gv!grdWF@9sXzk{&%@~G~EtIZpzR;_#1UhSuw4||2kVDv{i~3 zu883eqxxM%*gvR?XB^)T&#RBQ*%SSEd;-FZXal;lvbiW0m*sfJD|!p;(IwkJVhDo^ zJtcUnafDYEPi4O9eelE0Bm;%+=v4h`t+Qoqf^+|8fqS7T1CaQi*is<5K0MbsOEf9M zqIgF4bn-h`cY`QX!iG|T#mKE0H0Gh{%le1eQpLP#@cZamB3Y$%bLAF=hr**xRvFiJ z^fbWU84SC0$+f$dyo}ub$&0aHHCaOG3%XmHu;+UwjBZ*pIoF9{>$4jBJwSx{JG$3k zB>92OEqxMj`tN&w?0?0*M> z?U`vJOF5EwjCcNY&FluwE}*H_`RD1mE%-QbyfI&pt|bxbk`m!O#*TUdiZNMJzz+LA zQZHhp`pwt7JgG_Tooi*Fe#=Z|qF-EI%u%&bpe5xu#($L=$rLy6vj75K==TI?>Q@Uo zSOI7SCU^~KQE~t1x9)TnYiV;4rbV1x*SA#)52GSl5i*egLoXJ#h zpZch;B?U~|HztbZvRQJh4oN=DeeaHl*`Ov=+9frUlH--j3#&$aV`-*|F9(yXS8OnO zEIof5t5&u27?%piFK7U9HoV6ruIXme2H!5AT}u3$8HDb61Vob@RznAC1MWQh6_>v^ z{?y2D0|rQEVK79THDgRShMge|=mGlDd z`)gHF?5_*ESfJEE5j#{}xmmE7?tzxA$Gk+3kI?7swv*i}XWxfxSQpO!t)SEDgWt(` zJWYNH5J1IrWj-M9@dRujM+V7=ngS&8vou{@@mec)qKOI~OvpRnUUuYS4!~m(%_9uw zm^7iu0#054on@#z8@8oB2@8}@^~}@Ma5`3Z^T>0IZ8IkHDfO_4+EBAcqB+SA%OR1wAFr>bDcIC zY24DMjUg_s8V)b1k68PLMTs8%1jeGHD*`0_eANJS)3lEdP?NGDl^BXu(`J*Cc+~C( zs&O{h>I<~W6z?L+A7yzD14%F%fp4(tOk|nca__C|)0LtZNkMOQIUX)k;ahkSBGejQ zKF`*k>z(ha=hr^Mm00N1=_hr%1#XS29_dyA)GhFtwRR4dDBTQHjmaGqO)cO5v@kMJ zzDVKdYP1YQ=a3>h7hC1%_~a}QRLlZXgNND$-JLXeocZc0#dHLXF%(qz-gk^k@aPy0 zU5xR7p@HuP6CB_|kC6|Qy>>dfmM^n|f5P~T+ZxX4e>OGk!V71T9LjyV&n8xTRux(9 z-2#IT6&*eRbE0Q+6*Z7JWPk|xm0>t^vCK#m+yALAOvnT~N{Bk79rb{=lPi{EuRL$M zX0;6_Rkxar`1$)GU>V%50X)%l>TPIy_z#;1gIcWmZiXwCL=RgnEiEwe9u#LtgLpCB z5rFsHC!n}O^$`VkCg@J1#m74&;qRUq1)AcpJE-?W22q*J>a{Ql`YP6)=XA{=23$V; z+jf7wY(7u7x@YLHer#H!lx5V5(qbm+Q@twMLx{n&_6^HhNy(2rK7i0^bax;B<`ZFV z;C@^LGSeeYMF+smFi~{EEQ+6RdC4Dm0+Z-ILfRy*%`7&KvU2I3!31>6cZ&7!3XLT@ z2SOht8&!%xu*r~UJ=p}m=TXf4T7e-fkluq2XqZcyf{AoI=g=KGmYVWwYX<9!7aBPh zr{yjRbzk-hX{Iu|q8Y}XwbjcH-Y$RKnYLee?nqyfia{hQV2=km;HFzTjruI+z_Jb8 zMAO>gspBe$8gGLfy!r6l_LQJR^I5n8>11sd<177ANgvxU<-jPi8V0^iT8#z?WEGBW z{zSv^e!QY!t*OwL-A%dA|MlcF*N5o_M-(jgHJ$P6 z53J?WWj7NQb@O7DRj3EF1Ic|jjwbPx#d6W{38jo-)$cWJFGIT};TGq&&%@?gdt*-^ zZi|Nt2y8gJ@jk5ZKPM)6e;N*>M5#B#QAcy>!N871cW?~TK*dhZ*Rl85k1K#Wz3Qb` zRL_vx(Ef#)Ji$RZkSLIR)hz23NKyU&#`-S<5y?maz;u!oU>cn9Q1-_?8Fx7$!GGt) zAtE`Ui$CF9tp2X?nW1i`SR=-j!jE6gfjz;5s8^*fL=Vk5eL0X|J3i<O+81>eysCY7Lf^vqmBYs|lCRrS$8UY>5mTeXv!0xrh_;tdJRyNZM}+_e!O-q#9+rq_S?6A; zp8e3EH1DQ$^KSCUQyXs+)sLh?PYp>R{)HzoI7+VSPU}b~3E)6r=!_mD-JtabTV8wpTeS@Y4 z04zowVmU+up^9~C%nju`<>zgD*H0rNOY!*TNdnZOBamHEl#_cn4Xqz0hf8m9`RD6^ z#!9!|(3h0lUn76IgDga+{9d%zvc0h_K!@^X#GKEeWa6rs5}~iuVVFC=lnriAX@yDQWZDmLBXbehSwS7=k}ZwM{dZpb431X zZqizoXu60g#oI%v^{8$;;B#1Y_HJm~vCMWf?E@yFYd(7kfn zXp8~J0gyQ?{-X5ovAI8ia!LLBtYiiHa}fP?ZY3C91W_!OynpNE$NN!-e&8^HWdZ|H zb(T-FeH^Yr{nKymYsBKTpvA>BdQooRl8s_yg(p+lEQuHa6TDBVT%F|gYGBL=F2M-m z^Rf~Wz^(LklnQ6W-_hR5we}H$UGo#zaaJpM+*gTc1R*OmJI~4o z*8!UCjbKjlnTMXsq=2f&m`gFglnK%8pfUs2(?`_S2^ z5&pQd-uXL@!l9+Ft3htPh^}EUQo#Ex8bGr+O~+>{515e}@6&%+E_^?K0%xHlRso|< z#BQongRRuD0j_I~^N^*A{^u4UfIU?ogZyVh+DAzyUP)A?Ew_B41QHKGW92Li5WkrT zugG!s|0sy?q!j9a&Rxu##lWc)s(g0EHK*e4Ue+#8Txp=I*lbx+{s1WAs2p}al=39G z+~QS48usp}wc|M)F%FM6&d(SW-1RS-_5k_V;;t0iy%QBU;(t-Cg_g~Bwv2WoY&hfQ zdd%E*qXJnb)NV2AZ)G7?$eNiOJ-o4bM$M=J4TrA1TX}97-F|%Yo67Qp)&1}O(v$JN zuED6PiVyjHMmE_67;BqrNxHTt#Lli6ZRW)Hbyz_ZnBaAw-v?~@sh7ARKl%@8lL((n zLexM|k$K<8YGy?9i5HhUf$snHj(ges^87z6o|-S9A6l$wDRZt|>{KmNA$I0IjvaUL zJMu*|chD}3v*%m05{~N=Y6sK$OOi)c$B<{zpMBD2=uk;ZI5W9w)bq55{^3eYhJN{S zgp4uMd?Tm?3}w>i|LhpycUOZM!wMpwxXb&l^5b^K0J48($8KD~uU^N+1na)ZYMs|} zX&d;nCE&hXKrPk5nx`0jK>9|0+rI;MimnhXLo%7#S_kCAA8g!JH5UIHOC~Dwx+BdC z#KQj;grd|uHsrMs@&)2J0-j55Nr+B3fv)%!5Zz$Q(HFtvs0WunVFowY)H{ofUFf*} zwA)q)-R$63j@pgE7a=ahi3?dXdA4w)JZ51%jEd$2roq}#okoyn8YG6AR$33NDgH&O zuX6e2lm|s05Q`N#jF$L8Ln_RMR-v&dC3|-rHTImQ zVe6UW*Hk<=_uD@?<=lHL=7qX3B@Ntr@l1!4%H`j5&FY*5RxVz71Jet65UfSYBldW~P*$SX3;?k8 zj`b-wS5CLjWq-~!ekwGAX@VyjOzdPm3s?Sf+@wdQgWj3ri7OZy-qB*#>4Df$?vpKW zObEglblX`4^Tn3j{mo`zzz_-&!Av_M^WywGGAoN;2+J%MF9l3zbpU^Q6@8`0^eGkO z1R5kyVCSei12?S!XqK+A?8Kf>c-jRw!YGOlqb{!P^SWmnJ1gNqMqN9IlMHZ#bU>Sb z0-e()mk;E~e*AprI40j=G`ac#lT+_~tesZE4LMs4{{*@TIY~K-=S0xI~ zJzO6)>EVhVL{?fqV}2j1`TmljoWM6{ej3@l-|%=m|Ng|EV{LO^R+e^&#J--TJtG>s zz{Z*6Dz;^sv$$$Dt)aRWE?R2wr{SU{~ zR&t&R@absn$w_WqH6j-P@(gqAeLSkS@>y&J2EKkz9~74pyzU*LqZP8zI9z*wej5bp zw$n?|O*0O*v6!R?iET`5ji+Go*vlh(BY&0QnIj-?T0AP>rpbSM>C{=(`*!xh4dBq6 zhH?1TlQ0N~veMhY^@2r9iTN|En z_j5m;FS0UN58H7`GwqY)`2~r@!6HDwCnup+pStUfZefpXaMB}U;r@KH$4s52T{|p8s;ew@PZ)2V*8yGL2?&M>nkup z(12cQ>K0V#Z};RY_yisIU$|e{iQ3)tMjuBaHrSK-XOJFu1t2^uB?UL;V7RZjx5;R# z^q8dg~p;P&t-VzeN`zr&ZK!$i9`3qErRHs=AuBYd$hdKy#l`4A%&ciD*E{0 z!pJ8`B1GT5H)Y6;DjU1Ewvf~xG=F~AtNE^hch&{jxR zx)VLalNNQI{6KKv7k$W8Iz!h?*a`90*;Qiq^R_H_Z-~d_IkxRmWU(ybq!&WAX~tos z9z%*!(6T#1p5+6%?zU1kdw0&lrPH_*)r!=&(WB5G0_nJt z=k*aL$OIH^Y~g)nU(27;`t(u*x6=u(WV-I2gK(#<3hq}_O?-CW)gGL^j!)h-qg0(& zJ|Di&f<1TMcGH;M{~_RpgPfQzLs-?P+Y=~1qM!=+)ThTBJ03n{W3l<{S&(;(E~3)o zs>^^vNG=d2Vu1)ok%LEHE7D6t3swqt8U_uRPG^oY>eGTS3MQeX=X@ej>K(qLNZ}J& zjo=>ed{S4#&Sp!`k|;IE1u=mGH!k<}MQOq1Va;78YxwF3GLbbQ>)fEV=ZwYEshC=O zeXP3sdlyl3`%Lr`Y)NNXd$ZMsc#)Z}7KRr_io(r@^<{Nws5)PW4-T)L&hc!2Zq8x& zx2n=C!eFqAQBRx+_pjQW)rBAetIk9uToQ1|CVD}(Q?>54$;K~w;g|Q9zH=jK4~_YwwLrA+l|{mZfg1evuXl}Np!_wL->zn=I}9Q)Lp1uknMU1@g|Ppqxk1Z2=Oivzh4-#ZinLFst)rLGPsV;K zkP3l0yoVZ{s?*4K|;BBv5 zUQ8`yx4GtZwq4Sey&Qfc6g&e)<=1{dNiDk=-K|GoOm3#-)i$-T>~3D}6TjF9RxoO9 zX#}S3yZi;GB3!?0~r(dpbWJ%#wT0+Xns&-$g+-5b9eYrj6 zSst4GUCXmgnQK9TR5ek+v+C*iiC@rT?O6vECvE@0EUfUpnkE$f;Tx@QZbGQOLAd_rX?g$Z_~(6R(tzxIpQeQ`ESF!bdHBj6 z{tS_8(r`6D=5p{^LXYZWzUxMcF80CZSFQdc`$6|m-yJ`T-t~KG$fwX|QK*&qvtkl& zs>_=K?wN410-Q*1LOS%sCvP0u)m2+)Kl9`bb1b#@>dKZGo2E+5WVVRYo6g%yHS(I8 zUMjs;7oVyKy6ZCZFDiI(AtfQP?0#Y3=roE9?s(X2W@WMf_8Rya)E&5YGAfYZh(K9y zS-@tKRI=jB;~<&qTvu+H75yS2Hg^UOH&Gz=QdVQ z2eJ5`Iv#{7Vq^x2Y#S!%bF=^5V<6$x9oMZwMEX&*9Nq6krZldco=%%IXH!Dtj{@_F zc61qtEc2;4_E!)zNCx4=HKpIz5kHh5kW@+7`e%YYSu+h`d=sls*J7}6ohB^hK_rR4 zM&FnF2JeFphgckP=<0--)+yD+O*5kfeir`HeOsd8LM|1cH%QKJyE-pl|5jwe=Ewxn zN>aT2p*rVD#`VqA{Na~xiJllmtEx&JVnFYLM9iEQ0@f~9p5c$u$3gvjZS8*4gNVb+ ziBeXxpIA(>P{nRgl#u5TaI~4}cxM>WH>C*0k}~+egw3a99Y$QHWaX!hdvYE_Z@tf2 z^;4}(e3cQk#U0xkxM;@`jcLIPUOF${pR>K+h@ILqq78ieI(3poW_VQ_#Lqw-Y!dYl z`99}u^qyl8HiA_w{mUAf6?4u|l^Juijaj0bPu;pbB^fQD#;~M_vwX;eeo7bk^tN7{ z$h>2Yf%)?gIGj*q;&+1KRX}M`C1M4TiZK2fKXe#~+0vl4LuDR2+MIaq_8_$Eu023) zcfW_?XDm9lAYwt4!ku+OOVFG(D$d984q|A4`x}19?LC<$2-1j$AX&}_tF260mb1KN z&)koLw-Z{F{ocyw+-<4=-xom*WrpvJ^;xcn599ICc z@a}e4f=j}t<{8QrW63-5mZ)OYTRkJK3ddxVqJ()aCAx}wMF(a#8m;+gfOO&BiZ($S zuJ_#ZZ}-L7a^ZIEm$)u{_Ijc>TODZ2 zQwaukgDcqMCn8)LbhOr3xvt79ML~*m2{(msD#69(SL67o7QEV!<-Pn0Zd#q`ad46u zE#kfNi#;HtvF9si)Ij7r?MV5E3f=s{&I!gy<@VyRWb72j)LB1+qR{WC^%m%Vc$~30 zfBPxppMFk!xz32@4!mXxjoc|bKn!`+RYp_459{PJjGU2$%N<40397fYYQGkHIt&U# zDTM(ej{%0pFTwQHWtYv~!yY-mqSC8;!eR4byv6}d_pd=JQr(fyDT+0R+0ZqIhDrEK zw+t!$5D%VXr8yPV-e@EokZEuRbXTB=uNCZ>NaV&M1>(WqDXu)PQcupGjejEjZE-nH zD++!7Dlz3o89N@tzL1F4TRLVYHcFbK79*s5%N%)tUWWABE$K(>Pq0)e($DFougk&| zt$!4410DyI%`M%7NlRex#=SCTWv7F;aw{CP6zFOf1_-hKCmXo2cBVPL@TWTr7c1M)2;z6STI8Qct>PdT+n>!m2)!z*oG72crXr1 zUV1(J))@sT!yL-*Yq5m9J!mhUuj&#g5br>E%S)}MGc${MSy3R72f2_Y-XHjA%T$Jm zpecWY5@gu00%nl2|KH{8@lU%xt;1%9;uX1Wtum@pVwzrOCSCe<4zEf6kQdy+uQhKM>^~HHn8#Awy)d`EtNGB%g4N_p*sr3q0V5V^<`4*?> z=M#-2FHv!6?=xzsm+v;DKkxT}ESU%wy9et9yWISK2?qJJ#Kjvbnngx;6@e~#+fXr)%UB5)4^*+|7`GE}&>$tZV!Lot3awT9H?hA{7ag7{^#AUI7PFcd z-LTUAbK|7aR`U9WpM?5;0}mF=7ap2dOFL!7K%j5V)rJr@DPSs+RN#roj?+FcrtXhbS$OoSt|-Z z4E;utJBb}CZQMb}&j#IaXSK_K#Q0GfR9mI5f?XT4LD9s_;|Eh3nyHl_ z)u1~?7>w&8n#quu{$EN=3OKd{!;!8mpvtW9eLer*ulsCRh~>konu>SIaavdv$07q2 z#A>3VdRtahL#}DbA|qiuFj%A$c+NYCeZ`6RBg#p=!3!0HMDN>i_IpvM4h>(HR4XO= z-^U!xRn3&s4G9L-))g*w94S;&r$0TbAHsTBpifPkkKHajOboZ!N3?I-0!rKxj5*D` zlNQyMSZSrXoCnJM=BJOrDdC~d^dfc4G>9?Sn;aaA z@70AzSAt4PV+f~$`BEaATYZzBa<6qe_u~mNSsFo3y0ggQW_VzROuXr3^14Me@oudu z7)z}^E?Z?kCNAEoGQ6?)=d&Vi?-Z_F)i8s^RRT@Sg+_bWmM?=0e)ut#~DlTlqZ z7EPczdy2*Mp zRh8$gg{3hK4wnm>gBU;lT0U7j;-Dmy`2Ev8;=6dZDa$A);gqWdeJVa0d*>iaSM7xd z!Ac;`Ekh!(8hZ39|26?N8L;KC4{p=b_?$4V{21s4;hp5A2Fh}7x>Mc z^cyyd0&(F{47EnAqP~!7gU?Qw zTlgN#lSLAjNM-)wmT;;~;>7+QWX*pQa$DN`V_8Du`*Fe#a^-Iy@R(Z}G~~sb0m`TL z>ZHDs!*rzSFn*KaE%F0L!__AJ^3-+}`S*Dj59NB*MU(~CQ@PwR0~hTr{Ds}?DHBn0 z(l(%jMU*;p(m%RuFMM4pS2_6O92p+ha_oUO+`V^HYFLXGOp4u5C#Mim`*eQr1a#$( ze1>>X{>yFZ9Ov&&;v^2wYF%vu`$qvw{I_5ISv@eArJcS(gfq38N>PS_;wr|?PCvy~ z{TcNPLVDFhi-2cFFlJ3{lwQK*xHR0VjjjH z*dB4Id=}MUEPET4A@~}yQO^_}iX68RF=RDnNP|#R9=l7%XUj$qOp&3WOV9GH3Np>PzYB^UpyCsN7I_*(NuhDQKWcHRQ}zrm{io6-mh)`+cLV|CCxK)j)RRjo$r3( zVN_@y04&;Fz2;Rd=Xk78xLR(z>%vz3>oF+{J3yTu_+J%D z996tCDQY(@%o$U}&^G+@~RF#-k z840s;w&vWlofNEuhchj0bo$$Pm|@EME0jxBZ$O)Iw!?hq9V*ffJ&)eqVtfn<1iofm z{>J#cdvNLeiZP*JcGV=<+f$h{xlCfcldidUbS5Z>NCXa;4Lp&q?= z_~k#h$)|tNU-f_Kx(%ly7f`W5S5z^P$r;PFg+?}x#-vYygz(@UAPVW^R*_cDp-``+ zZ)JB)$O|J85ZMV?kLsBCBej(bc9c|hFyb!Bb|zJCU&qW7pNXI8icSr0Ff=L=WtUqF z>piKl1S8l_5AP`M6eBZ_mP=Axw@K&cU_4nOCoed>y_nIZj3#;1k&s5ygy#thp_1?~+egNDi?;s}beorZoyl%a15L zPJrkb4i+KTxz!{)I&;&Ju1$Dnd!Vs96R|M!zW*3(^}0x; zH6^g9ttch+P2{czLxx;{7|9$JgWR~Zqg7%tw?DX#V4pu*RXbYU9LQo^4UweqAnd#n zaqh7hs4Yzvoc5yL4J@-=;==s{AI^i96X@2_YQv~)woQ=Cs1%p-lhoe~>{FNAwY_0} z0-k?d4A#N;D^*Lc0dAmA<~WYR&7i~Yn2cTV5ebIFC9rZxHlD#NQ1KfnI^o`?FEOKo z`~~U@nd0!WL4WoO*k$ZcwOF(d*`qh>7l5M0i&H5mxOa*fOWUhiVS6t3C~Ld6cuQ>H zPKdcsT6v*m!jlI$on|GQz zeqUCTA8DotCZ`Z8{_Ug^6$_K6XkvZYPCf_8vtiIQgn~Cj##dI-~=HsaZ3ssNlm;GMI1W#~X>Y=B;!a>0Abvep9 zA*pW2d-C1ZmJ#YE`i~kVMA!LqiW0Q-xT-c zc+ky%XpNo}BTrAQ^=;*ST9;paFvFrVigLUWNBl%oF%wE!mAHLb{ytH1K8ACDJo$~{ z+Nn-ABW*$p8H*enMqOMac~oH?N*b8}+I0qkLChXRU(#5Fd&a0|mNL4Suh>NJ!L|@s z#GggTr?`X!Zh}x5`%CX;?Y)e(?3Ns#4$B6l|kKj zNvfA_(^rw8;`YcN7C)qYF;o+9M>(-pQXr7LrMIGhTP8x9d-ZG;=m4F$UZ)A?1zf($ z14{9>2tpA0l$Mfm9=_O-J<^tD|8BhrO!g#o&MbtS$16g8P7c?PWc*G2!ov27WM22> z57X@ClUgO;Q_USVKhAT!=N!(dOFtb0}nPD43PoVof{gh?zZ+e;HWIw)c% zYB{s@N1`wQ-a|}okZX#Eo2ov`j@N~Y6a6Cr>^3`NIZiyfCIZ}AK{@`HC(}~LVB^?` zC8WG8!~EP`V`i=abU)OpPI<;v0L#q}lH_m3|J9r5|upHnipM3OH48%Hu-xwt0@uf3Fxj zVvsQP>dO33x8uL4_%UyNocOB5C&|hAYcf$$R7t;>M@$y89$Sai#zrKYEJAM> zER->$LuK$3gz9rF4y@>eIk7kX0K%Resx+=>-%I|M0)Gx&3F55^vEl zi8}vZKzDoNyImi&NN1j=;h%+&vZ2Eo_@VW4#7&*e+xKaX2iR3MT)+?GpIEA$pysL3 zhd*;S47#gs6}ibtT^DGm)FosCuDH&$nfrwlf||a~4FjK82HJITIdEY|zZj8+j@04V zjGHAzI0fT-rUox(;HoCSgkK&pQR=@e6L1Z2T)f^ZqrtTnY(|>`?=h`v1nl{Ck78@ zPZ*JNY0^0@ak)**IDE-DBSyhUX9?z~U|98Bt* zyH|;IwWA?L&EV~q2<)9#SF8(Qq) zWlq{yR1rOcFe1`_dCH-gudQN3XPC4U^;fYJRKQ(o18VLhYtzonHYnV0k*Qzes?BeX z_HLP`+mFux2-Sx3FL5H4*cXjHcM@_!_64}uhNp=WtF}24OYq+0JtLj4a!Fa0y6$0& zC^()B>1aVK7MPF~e(?L}rp*vs9GXLeh4#vbn(2eKiS-r@dY!~<1>wrl(hvvf;TxZB@WFa!yjjZ*;EBoZYZVt{@-^?QM!i@#RfhR zWpEW(zTqhb)vZpxtbaX34g~34nprN5V5g)sk1J3gfH#<|lU0`;L>7xX1`x1*@G^s} z#gRhlBH11Xoo1W16V&xoSUS@^kFW9ADo#a@finN2&u^;>gMhz06o|}j!mY;D_*^Au{<`-$@uewee%1Sm z8P&||35X>O;3)Ln^Eo;=45v~CMe{?T5OxapZC_|Ci%`EWt>bU7&^8%sN|W#pW^w!; zdN+O`yQ1XF~+{}P-kfy8y@{S^~Ukgh26b6ypnu9(Npr2B|*vc ze{uGfQCY6hyDtsW(hVvN(%mT`Dc#*I-6bF>-QA6JBT@psbfN{-V)(EVw83?zAS;;#w5L5oGYK}t> zCj@{E)r5)yi??mX;{5B74Z@nMk{hJvzcUWFQ1)2K`LjodCRT{@uNXIKQH~zg0#Bc%w)}Ysj21IFIas@7O4I^N4G%XkF zufxl^`FO?JIn&{7W_w1JRzq0#m)}eASFJuVOT27vrfa@y-f0g+ZtOr?e-_CTEgOe} zKa~v6`8B4ri~`Ef(F1*WtFacKJ3nSk5C1~r%ALOZV{sXpTf$o{#Uc||u=W!ObgJeV zMV=?zpuZix4eQUAEs|Q)VG8(Y@-y8I4aqzU_7a-CmM23oR=%&=M?j{_;Tkx@HM-p& z*obZQ=Pc#MEYL2-x*~4HM{4KK)Z_;u`UKF!r&uJ}+;sS*nRROcu>hp%AGZR@`HM{T zT7;H3&BssWysh%(orSfqh>p~-W<*;= zK_ZqvWshAN|E(OCBk*qvdQ>~q3CCS0f340Y4Rx6yoE%~2*s>*s0;2g)QdCZIAZtNQ zautR5%sYdq7pA7kh4)GqsRUV1!~guZy#K>5yN$`JFL~aU0|*wyv{5@h(RF~tZt*yL zG7)%J#=Si{P>?{HIDsCqhGeZloiU!E{=w41mI1D*okdl@9bR1+?kLmdt>D;#gtfF9 zRaiTF;w#zD$P*Ft^bvEwKUmeX@I?~OS!;tA>ECZn8u≥YRo*q< zsmD;U(vG&m;^;P2fFb;I@33IGpoP>Ir&o-HQncz$3{e#8ButBy8-X1W+$BINPuk}3 zDMqggS^4dyB8p0=$ zF#MnjfQJ7Cnrm_1jc||$g{uME@5in@-yeTg_xEKtI*EEv8QO7^Wl70fF8Z=T%x1s$ zJk~uFcR2NvSvQeQDLONjNo0D8%aI?b^;iUhSq$grD(*e?A{izUGA=*qYC_C7d!?N9 zDwZT`lvFn#p7VF_0$&iMiq`^t6oOQ&?Ktvut##jHGmImez0fL$saBrZsJ}KbLH^KdeC0(L3fn`*-c=EC{u$c&_hCwCs>jD>Zmd`iQ@rIm)TRmHj ze7g3G{P+g$NuRJ&oX-7?H|$smB{q#d%~q515Et`qrg|KEJ*Lb|fZc_(f|kMi?;!k$ zL;Kl|bLzItd@1o)xGx=tqH|}X4KW-cFK^oa$P=J~UTn(;_Lxx(xoC_=a(S}Et?w&! z)UiaMHUulT(x^i=5J?-OqLRL8&Adv}7}EO|>Qg%B6Pfn*4RlDrX7C?)8UtyIe%={a zx8YiQN4?_qZ^rFcAz?yZ}J~8VA zhtgLQnZbAO3s@{kDWK0X{ut=^7EP_DHKD3GY(+1LdEyyXo}cWj-Q)|E$g2_kNRPvJ zQmnNAoovNd%MeRqO3*gjj%B|MLSIyK*Y0Lrr@d%k7&u5?k=#rlP4-pv_w^8>79sr4 zd-5WBy;w>XM2T?@d1artxZiJgpNux=ZFi493XKj#C4KzU4Q2Z&mz-am_?>q$TXICF zn}zX^+U0*)~vDYuhcb-)2sseSh&+qpUZ+9^j0nRj7SZiKnDO5 zw<7ZRN0yo)lx;nsXU6`b<&WH)?GFX-`4%&L%1}MS ziTD0UjA7wZyWAYgpqC=D)Y|JCmYM%$(7YIuc-V92qqJp;(HH@=5x3Ixf<%gFxL@3O z@ujV*WJs&%c>Y z>TK@@d8l4Nwf9L%#1zxjo0{B|XP;nrg%8D64%%m*_;_x`*5JeHjvBd2GP<1_Qp>ds zy-i#bUl;d`Kc-cB=nbyzpJenK_pn72)M#AGbLe5vwV1U0wkb`$v785D@DD(4E^N~-Ca`Zxz+B|uQJQQ*6`f~^V3y!n!NjIp&NHI#X>RIJ;R@(adnjWs-?dUL$-IczfN%E1?`=7I<`tBR{%T4Y;n7uNk zt8xZ?f=Rq`=!OouMi4Q&RbOG+mGdd}^k)L9(i4)^=b^n6*dy1PKxXhP6Vo5N()7`ecmpC6l<1$cJ z5x{8+a*zHv?@zRN`?wd}?<|v`Qfm211b&3-R{a-DP#zBl$~*Z}C5%F%Y-#kevaf7I z5^fj>{{FT%MkjXP+@m}T_gh60JJCqO$-lG}j&)F=3rkQ{Ws5XSS-ztaY`C-r&kl@` zxt*ZN0jG`qs4#ZPghmHeOiTvOsCh9iCx-dQIJvi+v@$Z)IO0DAZQw?p&sX%%0*SL# zrz(1uIkN*#WlMj}dNk)S^nGzogYo*HBF5n)q0T0Fq%m)I6eFtaOyNOWCzHswvtjFa z7-sKhZ~CAm6I!CGH~W@>N8^vWLha`?@M0|6aB0Nd`B7 zd{7Xv(q$2kuANiu{Iq7-%Gj99(6`pbTc$#ywt*3Z zBf9D8s>Ami(-dRJG8cX-l{~Y2z~&Yci;?)3rlaep)YZ+QgS4Uwt*5p1nNZ6^**6rS zxfY18hVzs z2uNdIJLisv@9@k_5(T7LiDy38z?kKIxim!Ht$iB@C$C(QXG*ofd6{ZzO;EqGwHp$X zlcXx2mg1LKWCt#_Z(UHB(N_0G=d%pYWtEDMc{(lIB2Vt&&v1$33F5}KJlSNc8RhWN z(c4NR2z|@t3R`B=9P=JtR3ma>?%kP(PVb!;_}|rt$LG$jRfg90%$PMbsG|$B;wKiD zgcp_fWx&H(2@p@1MyxBpaZEL(;>Y=$F&yGCvg2B{s>S>uS92-X;eY^Z_1B7Ah57$F z{b90KOutX6S0yFnm3f|E-vq=5Y=)U2c4`vzDX0jDDuMCoYrJbD9MKphHY+|CA3i}a zJP%#m@Jnkin&cKRA4D2hHm%cq`H;v<#Y?J47EKk!dC#>g?0^!HqMS5I*?U%jXbjatn(0F}lub#P?M*e<3MXWUzwkb)3q7{8w#M@YGp>^K z&j(5Q%Q0Ks*gRRGQrQ^&uHZpDscwhWhKDpYRVvuO0(*y)G82yM-&($w$=v#=sufNT z3aJh$)10^HBQ<|I0i>@I6ZzWrSPC|;_@dI=0EhgQy0o3gnc`L`M=*6m|BvzWa;*J# z&SNUY3$Zoz)x$+S?%wN1{{~vJyAq|!m~`*fE_BnTCjMY6p)6FfB-$aK)llr&C$=;m z)KH9_LOSRSa=%Lv?bUR`1$A2I;&E*4czW+Mja+jUynJ}0k3~{qHII*a#~0o+op>j9 zlEb)Z7K0&nm2AZ2gm8R#Ok;CXgQ`mZQaPnm+~O)89718P4qJNn)5YA@d}Uu~mgUfE;%$;gTsa{ba$t^;QK+G%lrv4KpHRLleL z9#Ij_XM%U8U)qgk!RMje%JG{rSiclGwBX2QlJ>X^SqmD^5pfkUqnm3>|Jlpcq~3}d z5jRx}kCV1OTQcs+)-uT2?h_b!rGrkJ5iA$_ob^u%Z(TTOb$)=boaBqy%qB8Gm!_Y-Mk)*n2ezB z#yzxcL$x4$Ue0gM_$wi>E8&xax1Uh9A|=+mt*>(?P`f6f(}%a++IXXavtQiY z|G%y+L(6qTe)i4$c`xpb&QVx4V-fHc;k}Q z5wbjDli{|3W`v0=A1^vhAJQ1HIW$??NdSIF=qiMCcsdw!)d5diH-#=z!Xb7VsSmTRH!1gw(#S>B3p+SyR^k zYQ2n*b+gwe;VrLxGBAgbI;lDC+Yh$S9$E$@x`r%F{VueHe#c9rNn%UkNPb~}$ERJ@ z$(D_dr4%GwK#p1h20*o|QUa@yzPz>ixGoMgbBclm&Fc5sIN74$)d_*)Yo7aYRrnBf zUs5(qc~ia7>N10beaqG|0$3)~bqF>u9YVv@;nLWWlbX?;h+uMbSGJDjchm&(k;`e) zNr&O{cSBhDOrwa9?2L?y`$q+frRNOe7ZFmG9yeTKVR6y9Mb|0bEa~gcyWwTe*&jPD z#LriO*()7e&3m`pe(vYkh(U$_1phCK*L4+VTLns*JT*!qDY|Qj9Ly!u>b5I+d7EeB zrd~KxUv~sT{$2Pf<*V``X~TGJf4*R=Z?9~;KwuGvZ;vhxok)G97Th6eg1T|hjPN~t z;1wUv65_9=WuISz6acm|(s(XdjdJ`@7PHQET8R|5nRV|4>ZhgId1(2NHi)_n#7 zj(8<+)#B;mcyDn&%yMwX5+N(J)5?TbUNMk}@sHjgL=6N;Vi^AXj|sO3@!y|Wlpiw|QO4^hNFz`0*EC-ukE z03LqBDYz1w^2q5b`17nS71R3`eQt){T}U=zaN3&YPL-ekTbFfSErps2l(G;b zl2t3P@#AF>dz4xc77JZb;SaBc}d=jnU2?4 z@2VGq@mGUMYSd>LvGkj%mug%*s$JMUWs(3{Bzd4(heafS+l*|&;vyC9V=%mhiv0G^ zd~WJ;tE#GA>@qx>libgk@SWVj&p2Ko_)QY}g&sLCnl#gq=p0Zy+p8kLCOChA<;;PUyRu+ND})8SZpy~o*?%2Fl^ z13mU6PCP6z_U-z?Vz#dEy;+e7k(TsFi$Kz@N>y_bRPcqedXyiSyaNs)ee0r9fviOn zqC5>{5uUv8<_G5$13M;gqR|RMQdlk)2UM%AAu=}#Z(1w23n^*K^CGx%ao1zFI8q8G zm*E>!kz9)_ZC0N#3p#I=SNs?{YpNyc{%IKdHu`*JiO-Y;3qkvHU+_u@g9=2>#K+q) z-}LZkF08q@h_`|!P|5JTB^Id1lvL}bZ<^iQbi(@QSEeLBV21_AGuPjYvTnET_y|}u zcox)naL5Nr)21QjhA~KEQnu=Q@Cgq20LL7x?)2#%-74ZV=ZZL~y!u!yNG|XY>bhij zFMT6_2b=U%Mr${O7$w(#>}P%)He!I#n-_=p>qf-MK<%IJQAsZu9B5P~2|#TW#(D(s zQee~|dGJf4%fG^b1nm_ zBo38_eb+`~5xflkolRLLOJ&rGA&tSTAB+*%=OI5crrx`AKn>B0m8%B~?b4QzN84yw z9Q1;HlisCcB#7rf@Mtl^jzA{^0_)C+tUl z`|Z!GB$Qk~1=(M$kA6(#{6cqgtGmb47L7R6@ZWJTDv?Q0viZH9h#D5}8-1JVL&(*F za4E#X+Oh2^wIG0gl~Ew{`{-0n`Y)pff)5&_UR{C-ybd1Zisnzkj_-JF0dl+#@IQgd ztx^}3bd;?E+Ap)~!aB;eK$Jj>7RFUXS5LjGT47w1VbW$7k%Z&)g#^EQ(AC?v^1$Zr~)B6JW)&0ccXH_g7@u|}Xd0mudX zADh>zxW3|o3l-{h9SlGxwCkp%g6!!E31QDCCa;G)J@^696(FDMs^l|NXww!>g;3J( zRF%C4;fXb#Q)k=Xf}3=DddZJUo{;oyr#W3*pg>IBKsvlxvHhx7Y=|>%9GotG+PY$> zwVWdG7vRj`%i)rVvoZo5Dre8iDIB5Oe!NfSb|JDx zuqUXp;kCuN**1Uvpt=0~C&V#N!kWc=$cX|EqYlbvl76;wfT=k-&6il?qJ0#M)(7A= zI&Vf0X))uCmy5)NgQiEHSLI~J|G>v+He>UJOFg<6*%8Nn2&e@FLjtTzez#{^h2@2e znO8p8)sOs@AYHfLUBt^I86&AJi1Y4^@K5huz(9RtfLCuIVrELy^i=j={f0r38g(H2 zK$;pv&TW9Z4>0(f6%? z$`~jONJu~QEMW;@!?(0BBqqi`D@z?nlFfdWPG6ZNfLDkYofxy0my;1MuVd4g!+{|C z1em;dXm(;cjGl68&Z$FRX50VT+k~Lj#)Z=$qQF)s3LAv7tCvQGGOs|`UP(fVCQOuY z9j7Uv;tX}8gkpS}qb6UU?DH*4gA*Hrl6-=;tkpQ5cE+6cQ46fEs%q3Z1e0Rn%r1Wp zWQ}_Z@i|N)J>5KwJr&L%@U%5H|H#J42!X73sReef!gdW2DJHf`;@pMv0BIU2+N9kP zMO4zYQO_EE5MMEifXJIIi3hncn#^47d7YL_dP+_BrJ}orvVZ6_y)Exp3nhNquX;ju zT?l($-Co`C2kXKI>Vk}OBlz<*Vupc-2l0XsLtBv1AF%QF-Qo?k&0;&nQEy_rBJ!9@ zuog7LV0ypn7+e4;O=Q)+HwkwiVE-AVVQFf0w%JRr+;^H=MYsdGb!2hYHFKp+VJIXz zS^&Whg*r8P`3CbVV&l6c0P<2##Zt@V|AO|4D&YO(2Qh=fVxNg!J$y(ZS- zB`r;r^z_3+&cDpskF_{Yx&qt<`@MKZhMlsW{t*K@E_`z}HW#s2Y*8hZRSSZHkpfGL z9Rxis6?toko8$@)tX=olsyK6;yBxX_(KdwQi~syD-pa=V^ILLQG*r&*GheNZ)Zm+*N?3`fUiMlf;g}TEa5M|dt4I|D=G;EDHyYm%cbI{1p$1IQ%|dX!he)y_2JRo|Crl{_0LBbx^QRy zfNdSyw-fdtLe419B@?7$=|AatK?}(0?8r+71?kTN;sTZ1GGT|GBFm^J6DYRd=KdkW z{IeY8-kG$zd0y&L-Krs8Q&cC{|0^`x^J2NqlhycYLrmcpk%KPMbmnD2aPE0vQHAt52Vy=VqE6mQjb~-;d*5|p9 zYK6|pla31&Tiws;Cznu(FCYlAYjUNG3kL3Q>K}U(%7=)N^J19hs#R*R%5u6H{+%bJ zFAJbn08-S$v~D+;sVLt^94SWs@4#kdT_RI%jL>|$aTL6h4!Z&CuG>~)%k)T3IL02N z^?r$D0)w(6qAy?h5n!vOen{Y+^!Vv3Cr@v&P~{>PPv3_5*~s+iX9Apfd;w2IpGvUb z=mJPakp4-X zvbs;yYv87smJ!j1~{~L!dKW(f`77?IK8B@voRA%#6Pfq3|90& zXK>+S&iB)q{%8KQf8*fzyOZJFZfH&$C^K3;Jol;a<$|4YT)F55&TPbOK<&iAWeyWQ zKUIIP%fEcvHm3i`Dxn1h&~Y#EAQV$S-{v$p(OhGrwz6%-??UL@!UZ}H7OeFk(*@?Z z>9fikS@9r_fA!H?m@gtDcw$)&u^$AU<%(=4grJ%h0fP_z`@ZoL`%!wpu=#H~EeKKu zxs@FdW)#urWoM2K-FfdTI6BphSjbFSDoz?7}0QXEFJ}D4Kk-G4<;&L9lzIR_} z>l~JgEib6u^i)rvEEdJ5ic5&ST`@^M%;s zls7W_vw(>Tj`C!p<~qS(>#9E3e%RE8<3q8?#ujbjY@0N%8~~xh?|H0z0ufJxkyz_x#de zFW9FFRs|c>adDvuDJUu&idb^MpGkW^xObKGjim9)c*e`}=0Nie&u!33UFe1Yj+L50 zV5s;`1t6xrV9|n(){(T((+2?HPCfET12Op_JgP3nE$hxGujorxuu0nZ*G3@cg@7@je{l(SWk)0gTwG& z;IdoR=`Jg^pa;SBZ+j(f^@ZmwQig$Yt)ao>8Y%RO7v*gkJ=J8_VLGB~l|Jll!R5>+ zD)v}G#Hh#X@!XX|!H0L6p?Th*;6`dH$00kx*rUYQEn4ZPBL#sm(m^og*WR;%J?9z4 zoQ_Ndo+DDqeJ36zp~^L`GD1pTR@*8Xm2u^738_M}G1#o-m4zFPRZq*sI z7;AH#ZJ@wHlqUspjJitk^H1MVM1s5vdkbM&V^)LAl*AbVPdfC=d|IvQE(xy`i*}q| z@xs##5ERf(dMr|vKRTdWY~LIqSLRcCbpM2VF>QHk(T=A3YeGV=Bt+&gH{x%Ueo48h z5nk}#i9*!n*OpZCmA?Nxx^HB>qP}_mDDhJLBXji;(ki>z5?_Hs zX?itl@X|aX}nNKvnDE5?3z# zmS_@^_eX=<#-Q6oMKmua@^?sB8I8?dFy|dUhQ;AiCpQ;^O0JY$on~jP8X^mGg|axk zZQnH}Bb5n|`?ZX-a0~a4jeatU;ZigH>4c9gMgWIw-S^49CQQmg8(B&}qIbz5%Z$GHy>+uZ=959pS-Nn;^4uG_cLLN_TZbsr{iSh5{m{JjT5s$;oZgGSjlY^coFBIlFyB34hp ztjnH1qY>KZTtR%qStK`Eu)2u?xsY~W#6|Z;9BdwA`o{Pb`xoJjp4@lEb~fDQHMc9* z20er~(~A-4gI@V%4{rgU