From f764537df911a0ba0bd52dd6312c83070e002cfc Mon Sep 17 00:00:00 2001 From: "lucuma-steward[bot]" <106720676+lucuma-steward[bot]@users.noreply.github.com> Date: Fri, 13 Sep 2024 12:36:20 +0000 Subject: [PATCH 01/37] Update munit to 1.0.2 --- project/Settings.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Settings.scala b/project/Settings.scala index 404cfc1e4..1cb7d546d 100644 --- a/project/Settings.scala +++ b/project/Settings.scala @@ -39,7 +39,7 @@ object Settings { // test libraries val jUnitInterface = "0.13.2" - val munitVersion = "1.0.1" + val munitVersion = "1.0.2" val munitDisciplineVersion = "2.0.0" val munitCatsEffectVersion = "2.0.0" From 7cfdae67ed763f9a455c4541a5a013b8f9906dce Mon Sep 17 00:00:00 2001 From: "lucuma-steward[bot]" <106720676+lucuma-steward[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 01:25:39 +0000 Subject: [PATCH 02/37] Update sbt to 1.10.2 --- project/build.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/build.properties b/project/build.properties index ee4c672cd..0b699c305 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.1 +sbt.version=1.10.2 From a6b7019632d024c0cdb3d8bf50032f2946b78649 Mon Sep 17 00:00:00 2001 From: "lucuma-steward[bot]" <106720676+lucuma-steward[bot]@users.noreply.github.com> Date: Wed, 18 Sep 2024 01:21:17 +0000 Subject: [PATCH 03/37] Update lucuma-odb-schema to 0.13.1 --- project/Settings.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Settings.scala b/project/Settings.scala index 1cb7d546d..849327b8b 100644 --- a/project/Settings.scala +++ b/project/Settings.scala @@ -53,7 +53,7 @@ object Settings { val lucumaUI = "0.117.0" val lucumaSchemas = "0.99.1" val lucumaSSO = "0.6.23" - val lucumaODBSchema = "0.13.0" + val lucumaODBSchema = "0.13.1" // Clue val clue = "0.40.0" From 6ffe498c02c549676f16581d5654f42610cc6369 Mon Sep 17 00:00:00 2001 From: "lucuma-steward[bot]" <106720676+lucuma-steward[bot]@users.noreply.github.com> Date: Fri, 20 Sep 2024 12:43:28 +0000 Subject: [PATCH 04/37] Update scala3-library, ... to 3.5.1 --- .github/workflows/ci.yml | 2 +- build.sbt | 4 ++-- modules/web/client/vite.config.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 044d78c0f..17df8fea3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -108,7 +108,7 @@ jobs: strategy: matrix: os: [ubuntu-latest] - scala: [3.5.0] + scala: [3.5.1] java: [temurin@17] runs-on: ${{ matrix.os }} steps: diff --git a/build.sbt b/build.sbt index 3fbc2a088..4bd35f698 100644 --- a/build.sbt +++ b/build.sbt @@ -111,8 +111,8 @@ ThisBuild / lucumaCssExts += "svg" Global / onChangedBuildSource := ReloadOnSourceChanges ThisBuild / scalafixDependencies += "edu.gemini" % "lucuma-schemas_3" % LibraryVersions.lucumaSchemas -ThisBuild / scalaVersion := "3.5.0" -ThisBuild / crossScalaVersions := Seq("3.5.0") +ThisBuild / scalaVersion := "3.5.1" +ThisBuild / crossScalaVersions := Seq("3.5.1") ThisBuild / scalacOptions ++= Seq("-language:implicitConversions") ThisBuild / scalafixResolvers += coursierapi.MavenRepository.of( "https://s01.oss.sonatype.org/content/repositories/snapshots/" diff --git a/modules/web/client/vite.config.js b/modules/web/client/vite.config.js index ee86d8e2b..f1080fc7c 100644 --- a/modules/web/client/vite.config.js +++ b/modules/web/client/vite.config.js @@ -46,7 +46,7 @@ const pathExists = async (path) => { // https://vitejs.dev/config/ export default defineConfig(async ({ mode }) => { - const scalaClassesDir = path.resolve(__dirname, 'target/scala-3.5.0'); + const scalaClassesDir = path.resolve(__dirname, 'target/scala-3.5.1'); const isProduction = mode == 'production'; const sjs = isProduction ? path.resolve(scalaClassesDir, 'observe_web_client-opt') From 57e7df6044f414a5ee6fd82175217bb5927baa98 Mon Sep 17 00:00:00 2001 From: "lucuma-steward[bot]" <106720676+lucuma-steward[bot]@users.noreply.github.com> Date: Sat, 28 Sep 2024 12:34:47 +0000 Subject: [PATCH 05/37] Update sbt-scalajs, scalajs-library_2.13, ... to 1.17.0 --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index a3f1073b9..d7f5066d1 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -2,7 +2,7 @@ val sbtLucumaVersion = "0.11.17" addSbtPlugin("edu.gemini" % "sbt-lucuma-app" % sbtLucumaVersion) addSbtPlugin("edu.gemini" % "sbt-lucuma-css" % sbtLucumaVersion) -addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.16.0") +addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.17.0") // sbt revolver lets launching applications from the sbt console addSbtPlugin("io.spray" % "sbt-revolver" % "0.10.0") From 19fccf8260bd20fb409d08b13182f4e43ee10d67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Piaggio?= Date: Fri, 4 Oct 2024 15:20:24 -0300 Subject: [PATCH 06/37] new schema visit query --- .../observe/ui/model/LoadedObservation.scala | 25 ++++--- .../scala/observe/ui/model/ObsSummary.scala | 7 +- .../ui/components/ObservationSequence.scala | 67 ++++++++++--------- .../ObservationExecutionDisplay.scala | 8 ++- .../observe/ui/services/ODBQueryApiImpl.scala | 8 +-- project/Settings.scala | 2 +- 6 files changed, 65 insertions(+), 52 deletions(-) diff --git a/modules/web/client-model/src/main/scala/observe/ui/model/LoadedObservation.scala b/modules/web/client-model/src/main/scala/observe/ui/model/LoadedObservation.scala index 1f9f11bc0..1927c943a 100644 --- a/modules/web/client-model/src/main/scala/observe/ui/model/LoadedObservation.scala +++ b/modules/web/client-model/src/main/scala/observe/ui/model/LoadedObservation.scala @@ -3,6 +3,7 @@ package observe.ui.model +import cats.syntax.option.* import crystal.Pot import crystal.Pot.Pending import crystal.Pot.Ready @@ -17,7 +18,7 @@ import monocle.Lens case class LoadedObservation private ( obsId: Observation.Id, config: Pot[InstrumentExecutionConfig] = Pot.pending, - visits: Pot[ExecutionVisits] = Pot.pending + visits: Pot[Option[ExecutionVisits]] = Pot.pending ): private def potFromEitherOption[A](e: Either[Throwable, Option[A]]): Pot[A] = e.toTry.toPot.flatMap(_.toPot) @@ -26,25 +27,26 @@ case class LoadedObservation private ( copy(config = potFromEitherOption(config)) def withVisits(visits: Either[Throwable, Option[ExecutionVisits]]): LoadedObservation = - copy(visits = potFromEitherOption(visits)) + copy(visits = potFromEitherOption(visits.map(_.some))) def addVisits(addedVisits: Either[Throwable, Option[ExecutionVisits]]): LoadedObservation = copy(visits = visits match case Ready(existing) => - potFromEitherOption(addedVisits) match - case Ready(added) => Ready(existing.extendWith(added)) - case Pending => visits - case error => error - case _ => potFromEitherOption(addedVisits) + potFromEitherOption(addedVisits.map(_.some)) match + case Ready(Some(added)) => Ready(existing.fold(added)(_.extendWith(added)).some) + case Ready(None) => Ready(existing) + case Pending => visits + case error => error + case _ => potFromEitherOption(addedVisits.map(_.some)) ) def reset: LoadedObservation = copy(config = Pot.pending, visits = Pot.pending) lazy val lastVisitId: Option[Visit.Id] = - visits.toOption.flatMap: - case ExecutionVisits.GmosNorth(_, visits) => visits.lastOption.map(_.id) - case ExecutionVisits.GmosSouth(_, visits) => visits.lastOption.map(_.id) + visits.toOption.flatten.map: + case ExecutionVisits.GmosNorth(visits) => visits.last.id + case ExecutionVisits.GmosSouth(visits) => visits.last.id object LoadedObservation: def apply(obsId: Observation.Id): LoadedObservation = new LoadedObservation(obsId) @@ -52,4 +54,5 @@ object LoadedObservation: val obsId: Lens[LoadedObservation, Observation.Id] = Focus[LoadedObservation](_.obsId) val config: Lens[LoadedObservation, Pot[InstrumentExecutionConfig]] = Focus[LoadedObservation](_.config) - val visits: Lens[LoadedObservation, Pot[ExecutionVisits]] = Focus[LoadedObservation](_.visits) + val visits: Lens[LoadedObservation, Pot[Option[ExecutionVisits]]] = + Focus[LoadedObservation](_.visits) diff --git a/modules/web/client-model/src/main/scala/observe/ui/model/ObsSummary.scala b/modules/web/client-model/src/main/scala/observe/ui/model/ObsSummary.scala index 90ce70922..2441c2f5a 100644 --- a/modules/web/client-model/src/main/scala/observe/ui/model/ObsSummary.scala +++ b/modules/web/client-model/src/main/scala/observe/ui/model/ObsSummary.scala @@ -10,6 +10,7 @@ import cats.syntax.all.* import eu.timepit.refined.cats.given import eu.timepit.refined.types.string.NonEmptyString import io.circe.Decoder +import io.circe.HCursor import io.circe.generic.semiauto.* import io.circe.refined.given import lucuma.core.enums.Instrument @@ -82,7 +83,11 @@ object ObsSummary: observingMode <- c.get[Option[ObservingMode]]("observingMode") observationTime <- c.get[Option[Timestamp]]("observationTime") posAngleConstraint <- c.get[PosAngleConstraint]("posAngleConstraint") - obsReference <- c.downField("reference").get[Option[ObservationReference]]("label") + obsReference <- + c.get[Option[HCursor]]("reference") + .map(_.map(_.get[Option[ObservationReference]]("label")).sequence.map(_.flatten)) + .sequence + .flatten yield ObsSummary( id, title, diff --git a/modules/web/client/src/main/scala/observe/ui/components/ObservationSequence.scala b/modules/web/client/src/main/scala/observe/ui/components/ObservationSequence.scala index 49ce2b0a5..9ae7811dc 100644 --- a/modules/web/client/src/main/scala/observe/ui/components/ObservationSequence.scala +++ b/modules/web/client/src/main/scala/observe/ui/components/ObservationSequence.scala @@ -7,7 +7,6 @@ import cats.effect.IO import cats.syntax.all.* import crystal.react.* import japgolly.scalajs.react.* -import japgolly.scalajs.react.vdom.html_<^.* import lucuma.core.enums.Breakpoint import lucuma.core.model.Observation import lucuma.core.model.sequence.InstrumentExecutionConfig @@ -19,14 +18,12 @@ import lucuma.schemas.model.Dataset import lucuma.schemas.model.ExecutionVisits import lucuma.schemas.model.StepRecord import lucuma.schemas.model.Visit -import lucuma.ui.DefaultErrorRender import lucuma.ui.syntax.toast.* import monocle.Optional import monocle.Traversal import observe.model.ExecutionState import observe.model.StepProgress import observe.model.odb.RecordedVisit -import observe.ui.ObserveStyles import observe.ui.components.sequence.GmosNorthSequenceTable import observe.ui.components.sequence.GmosSouthSequenceTable import observe.ui.model.AppContext @@ -41,7 +38,7 @@ import scala.collection.immutable.HashSet case class ObservationSequence( obsId: Observation.Id, config: InstrumentExecutionConfig, - visits: View[ExecutionVisits], + visits: View[Option[ExecutionVisits]], executionState: View[ExecutionState], currentRecordedVisit: Option[RecordedVisit], progress: Option[StepProgress], @@ -107,36 +104,41 @@ object ObservationSequence: .mod(set => if (set.contains(stepId)) set - stepId else set + stepId) >> sequenceApi.setBreakpoint(obsId, stepId, value).runAsync - def datasetQaView(datasetId: Dataset.Id): ViewList[EditableQaFields] = - props.visits.zoom: - datasetWithId(datasetId).andThen(EditableQaFields.fromDataset) - val onDatasetQAChange: Dataset.Id => EditableQaFields => Callback = datasetId => qaFields => - datasetIdsInFlight.modState(_ + datasetId) >> - odbQueryApi - .updateDatasetQa(datasetId, qaFields) - .flatMap: _ => - (datasetQaView(datasetId).set(qaFields) >> - datasetIdsInFlight.modState(_ - datasetId)) - .to[IO] - .handleErrorWith: e => - (datasetIdsInFlight.modState(_ - datasetId) >> - ctx.toast.show( - s"Error updating dataset QA state for $datasetId: ${e.getMessage}", - Message.Severity.Error, - sticky = true - )).to[IO] - .runAsync - - (props.config, props.visits.get) match - case (InstrumentExecutionConfig.GmosNorth(config), ExecutionVisits.GmosNorth(_, visits)) => + props.visits.toOptionView.map { visits => + def datasetQaView(datasetId: Dataset.Id): ViewList[EditableQaFields] = + visits.zoom: + datasetWithId(datasetId).andThen(EditableQaFields.fromDataset) + + datasetIdsInFlight.modState(_ + datasetId) >> + odbQueryApi + .updateDatasetQa(datasetId, qaFields) + .flatMap: _ => + (datasetQaView(datasetId).set(qaFields) >> + datasetIdsInFlight.modState(_ - datasetId)) + .to[IO] + .handleErrorWith: e => + (datasetIdsInFlight.modState(_ - datasetId) >> + ctx.toast.show( + s"Error updating dataset QA state for $datasetId: ${e.getMessage}", + Message.Severity.Error, + sticky = true + )).to[IO] + .runAsync + }.orEmpty // If there are no visits, there's nothing to change. + + props.config match // TODO Show visits even if sequence data is not available + case InstrumentExecutionConfig.GmosNorth(config) => GmosNorthSequenceTable( props.clientMode, props.obsId, config, - visits, + props.visits.get + .collect: + case ExecutionVisits.GmosNorth(visits) => visits.toList + .orEmpty, props.executionState.get, props.currentRecordedVisit, props.progress, @@ -148,12 +150,15 @@ object ObservationSequence: onDatasetQAChange, datasetIdsInFlight.value ) - case (InstrumentExecutionConfig.GmosSouth(config), ExecutionVisits.GmosSouth(_, visits)) => + case InstrumentExecutionConfig.GmosSouth(config) => GmosSouthSequenceTable( props.clientMode, props.obsId, config, - visits, + props.visits.get + .collect: + case ExecutionVisits.GmosSouth(visits) => visits.toList + .orEmpty, props.executionState.get, props.currentRecordedVisit, props.progress, @@ -165,7 +170,3 @@ object ObservationSequence: onDatasetQAChange, datasetIdsInFlight.value ) - case _ => - <.div(ObserveStyles.ObservationAreaError)( - DefaultErrorRender(new Exception("Sequence <-> Visits Instrument mismatch!")) - ) diff --git a/modules/web/client/src/main/scala/observe/ui/components/sequence/ObservationExecutionDisplay.scala b/modules/web/client/src/main/scala/observe/ui/components/sequence/ObservationExecutionDisplay.scala index 58044750b..8311e5eaa 100644 --- a/modules/web/client/src/main/scala/observe/ui/components/sequence/ObservationExecutionDisplay.scala +++ b/modules/web/client/src/main/scala/observe/ui/components/sequence/ObservationExecutionDisplay.scala @@ -43,7 +43,7 @@ object ObservationExecutionDisplay: props.rootModelData .zoom(RootModelData.executionState.index(selectedObsId)) - val visitsViewPot: Pot[View[ExecutionVisits]] = + val visitsViewPot: Pot[View[Option[ExecutionVisits]]] = props.rootModelData .zoom(RootModelData.nighttimeObservation) .toOptionView @@ -53,7 +53,11 @@ object ObservationExecutionDisplay: val executionStateAndConfig: Option[ Pot[ - (Observation.Id, InstrumentExecutionConfig, View[ExecutionVisits], View[ExecutionState]) + (Observation.Id, + InstrumentExecutionConfig, + View[Option[ExecutionVisits]], + View[ExecutionState] + ) ] ] = rootModelData.nighttimeObservation.map: lo => diff --git a/modules/web/client/src/main/scala/observe/ui/services/ODBQueryApiImpl.scala b/modules/web/client/src/main/scala/observe/ui/services/ODBQueryApiImpl.scala index ea2c2ef02..62a6be70c 100644 --- a/modules/web/client/src/main/scala/observe/ui/services/ODBQueryApiImpl.scala +++ b/modules/web/client/src/main/scala/observe/ui/services/ODBQueryApiImpl.scala @@ -25,9 +25,9 @@ case class ODBQueryApiImpl(nighttimeObservation: ViewF[IO, Option[LoadedObservat ) extends ODBQueryApi[IO]: private def lastVisitId(lo: LoadedObservation): Option[Visit.Id] = - lo.visits.toOption.flatMap: - case ExecutionVisits.GmosNorth(_, visits) => visits.lastOption.map(_.id) - case ExecutionVisits.GmosSouth(_, visits) => visits.lastOption.map(_.id) + lo.visits.toOption.flatten.map: + case ExecutionVisits.GmosNorth(visits) => visits.last.id + case ExecutionVisits.GmosSouth(visits) => visits.last.id override def refreshNighttimeVisits: IO[Unit] = nighttimeObservation.toOptionView.fold( @@ -35,7 +35,7 @@ case class ODBQueryApiImpl(nighttimeObservation: ViewF[IO, Option[LoadedObservat ): loadedObs => VisitQueriesGQL .ObservationVisits[IO] - .query(loadedObs.get.obsId, lastVisitId(loadedObs.get).orIgnore)(ErrorPolicy.IgnoreOnData) + .query(loadedObs.get.obsId, lastVisitId(loadedObs.get).orIgnore) .map(_.observation.flatMap(_.execution)) .attempt .flatMap: visits => diff --git a/project/Settings.scala b/project/Settings.scala index 1cb7d546d..f1120eb01 100644 --- a/project/Settings.scala +++ b/project/Settings.scala @@ -51,7 +51,7 @@ object Settings { // Gemini Libraries val lucumaCore = "0.104.0" val lucumaUI = "0.117.0" - val lucumaSchemas = "0.99.1" + val lucumaSchemas = "0.102.0" val lucumaSSO = "0.6.23" val lucumaODBSchema = "0.13.0" From 567f10769ddf195f3d7617f88b860c9a45494c5d Mon Sep 17 00:00:00 2001 From: "lucuma-steward[bot]" <106720676+lucuma-steward[bot]@users.noreply.github.com> Date: Mon, 7 Oct 2024 20:11:38 +0000 Subject: [PATCH 07/37] Update crystal, crystal-testkit to 0.45.3 --- project/Settings.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Settings.scala b/project/Settings.scala index f1120eb01..a17d83358 100644 --- a/project/Settings.scala +++ b/project/Settings.scala @@ -59,7 +59,7 @@ object Settings { val clue = "0.40.0" // ScalaJS libraries - val crystal = "0.45.1" + val crystal = "0.45.3" val javaTimeJS = "2.6.0" val lucumaReact = "0.71.1" val scalaDom = "2.3.0" From 208d7e9238979ae459d604bacc2b86de24faa098 Mon Sep 17 00:00:00 2001 From: "lucuma-steward[bot]" <106720676+lucuma-steward[bot]@users.noreply.github.com> Date: Tue, 8 Oct 2024 20:12:18 +0000 Subject: [PATCH 08/37] Update lucuma-react-common, ... to 0.71.2 --- project/Settings.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Settings.scala b/project/Settings.scala index f1120eb01..ee8df515f 100644 --- a/project/Settings.scala +++ b/project/Settings.scala @@ -61,7 +61,7 @@ object Settings { // ScalaJS libraries val crystal = "0.45.1" val javaTimeJS = "2.6.0" - val lucumaReact = "0.71.1" + val lucumaReact = "0.71.2" val scalaDom = "2.3.0" val scalajsReact = "3.0.0-beta6" } From 26612cccf9edf4fa83f040161d91edbbf3b93ddc Mon Sep 17 00:00:00 2001 From: "lucuma-steward[bot]" <106720676+lucuma-steward[bot]@users.noreply.github.com> Date: Wed, 9 Oct 2024 00:28:53 +0000 Subject: [PATCH 09/37] Update lucuma-core, lucuma-core-testkit to 0.105.1 --- project/Settings.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Settings.scala b/project/Settings.scala index f1120eb01..ce1ffb6ee 100644 --- a/project/Settings.scala +++ b/project/Settings.scala @@ -49,7 +49,7 @@ object Settings { val pprint = "0.9.0" // Gemini Libraries - val lucumaCore = "0.104.0" + val lucumaCore = "0.105.1" val lucumaUI = "0.117.0" val lucumaSchemas = "0.102.0" val lucumaSSO = "0.6.23" From ed74f4a9913c7e3a038953ebf6367fa588de40fc Mon Sep 17 00:00:00 2001 From: Carlos Quiroz Date: Mon, 14 Oct 2024 09:13:22 -0300 Subject: [PATCH 10/37] Tiny fixes to the dark theme --- .../web/client/src/main/webapp/styles/observe.scss | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/modules/web/client/src/main/webapp/styles/observe.scss b/modules/web/client/src/main/webapp/styles/observe.scss index c3a307dda..6744de4aa 100644 --- a/modules/web/client/src/main/webapp/styles/observe.scss +++ b/modules/web/client/src/main/webapp/styles/observe.scss @@ -5,6 +5,14 @@ html { overflow: hidden; // Avoid "spring" effect when scrolling tables beyond their top/bottom. } +body { + background-color: var(--color-background); +} + +.main-header { + color: var(--color-text-alt); +} + .OnlySmallScreens { @media screen and (min-width: lucumaUICommon.$tablet-responsive-cutoff) { display: none; @@ -1033,10 +1041,10 @@ html { .ObserveStyles-qaEditorPanelButtons { align-self: end; - + button { align-items: center; } } } -} \ No newline at end of file +} From 2d0852019034696fd800faa0438f431109b207d0 Mon Sep 17 00:00:00 2001 From: Carlos Quiroz Date: Mon, 14 Oct 2024 09:25:05 -0300 Subject: [PATCH 11/37] Update sbt-lucuma --- .github/workflows/ci.yml | 3 +-- project/plugins.sbt | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 044d78c0f..248e67429 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -36,8 +36,7 @@ jobs: timeout-minutes: 60 steps: - name: Install sbt - if: contains(runner.os, 'macos') - run: brew install sbt + uses: sbt/setup-sbt@v1 - name: Checkout current branch (full) uses: actions/checkout@v4 diff --git a/project/plugins.sbt b/project/plugins.sbt index a3f1073b9..69c67ad91 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,4 +1,4 @@ -val sbtLucumaVersion = "0.11.17" +val sbtLucumaVersion = "0.12.1" addSbtPlugin("edu.gemini" % "sbt-lucuma-app" % sbtLucumaVersion) addSbtPlugin("edu.gemini" % "sbt-lucuma-css" % sbtLucumaVersion) From b8c629276eab1899820e209f1ecefeed0dfe77d2 Mon Sep 17 00:00:00 2001 From: "lucuma-steward[bot]" <106720676+lucuma-steward[bot]@users.noreply.github.com> Date: Mon, 14 Oct 2024 16:13:04 +0000 Subject: [PATCH 12/37] Update lucuma-sso-backend-client to 0.6.25 --- project/Settings.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Settings.scala b/project/Settings.scala index 11ef1aab5..f87b01b07 100644 --- a/project/Settings.scala +++ b/project/Settings.scala @@ -52,7 +52,7 @@ object Settings { val lucumaCore = "0.105.1" val lucumaUI = "0.117.0" val lucumaSchemas = "0.102.0" - val lucumaSSO = "0.6.23" + val lucumaSSO = "0.6.25" val lucumaODBSchema = "0.13.0" // Clue From c55ef863d95c3312ef8dd7ea4dd76cc897a5f1af Mon Sep 17 00:00:00 2001 From: "lucuma-steward[bot]" <106720676+lucuma-steward[bot]@users.noreply.github.com> Date: Tue, 15 Oct 2024 12:13:57 +0000 Subject: [PATCH 13/37] Update logback-classic, logback-core to 1.5.11 --- project/Settings.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Settings.scala b/project/Settings.scala index 11ef1aab5..5209761e4 100644 --- a/project/Settings.scala +++ b/project/Settings.scala @@ -31,7 +31,7 @@ object Settings { val slf4j = "2.0.16" val log4cats = "2.7.0" val log4catsLogLevel = "0.3.1" - val logback = "1.5.8" + val logback = "1.5.11" val janino = "3.1.12" val pureConfig = "0.17.7" val monocleVersion = "3.3.0" From 32b96d3f8973cd7ce09686dbd2d8c3c90882a1e6 Mon Sep 17 00:00:00 2001 From: Carlos Quiroz Date: Tue, 15 Oct 2024 11:18:29 -0300 Subject: [PATCH 14/37] Remove skipped steps and startFrom --- .../main/scala/observe/engine/Engine.scala | 30 +- .../scala/observe/engine/EngineStep.scala | 70 ++-- .../src/main/scala/observe/engine/Event.scala | 6 - .../main/scala/observe/engine/Sequence.scala | 69 +--- .../main/scala/observe/engine/UserEvent.scala | 6 - .../{packageSpec.scala => PackageSuite.scala} | 335 +----------------- .../scala/observe/engine/SequenceSuite.scala | 1 - .../test/scala/observe/engine/StepSuite.scala | 41 +-- .../scala/observe/model/ObserveStep.scala | 27 +- .../main/scala/observe/model/StepState.scala | 12 +- .../model/arb/ArbNodAndShuffleStep.scala | 4 - .../observe/model/arb/ArbStandardStep.scala | 4 - .../observe/model/arb/ArbStepState.scala | 1 - .../observe/model/ModelLensesSuite.scala | 1 - .../scala/observe/server/ObserveEngine.scala | 48 +-- .../scala/observe/server/SequenceGen.scala | 10 - .../main/scala/observe/server/StepsView.scala | 1 - .../scala/observe/server/events/package.scala | 1 - .../observe/server/gmos/GmosStepsView.scala | 1 - .../observe/server/ObserveEngineSuite.scala | 164 --------- .../observe/server/SeqTranslateSuite.scala | 4 +- .../components/sequence/SequenceTable.scala | 10 +- .../server/http4s/ObserveCommandRoutes.scala | 11 - .../http4s/ObserveCommandRoutesSuite.scala | 12 - .../web/server/http4s/TestObserveEngine.scala | 16 - 25 files changed, 54 insertions(+), 831 deletions(-) rename modules/engine/src/test/scala/observe/engine/{packageSpec.scala => PackageSuite.scala} (54%) diff --git a/modules/engine/src/main/scala/observe/engine/Engine.scala b/modules/engine/src/main/scala/observe/engine/Engine.scala index dd570d73b..63f6204fb 100644 --- a/modules/engine/src/main/scala/observe/engine/Engine.scala +++ b/modules/engine/src/main/scala/observe/engine/Engine.scala @@ -51,7 +51,7 @@ class Engine[F[_]: MonadThrow: Logger, S, U] private ( { putS(id)( Sequence.State.status.replace(SequenceState.Running.Init)( - seq.skips.getOrElse(seq).rollback + seq.rollback ) ) *> send(Event.executing(id)) @@ -59,31 +59,6 @@ class Engine[F[_]: MonadThrow: Logger, S, U] private ( case None => unit } - /** - * startFrom starts a sequence from an arbitrary step. It does it by marking all previous steps to - * be skipped and then modifying the state sequence as if it was run. If the requested step is - * already run or marked to be skipped, the sequence will start from the next runnable step - */ - def startFrom(id: Observation.Id, step: Step.Id): HandleType[Unit] = - getS(id).flatMap { - case Some(seq) - if (seq.status.isIdle || seq.status.isError) && seq.toSequence.steps.exists( - _.id === step - ) => - val steps = seq.toSequence.steps - .takeWhile(_.id =!= step) - .mapFilter(p => (!p.status.isFinished).option(p.id)) - val withSkips = steps.foldLeft[Sequence.State[F]](seq) { case (s, i) => - s.setSkipMark(i, v = true) - } - putS(id)( - Sequence.State.status.replace(SequenceState.Running.Init)( - withSkips.skips.getOrElse(withSkips).rollback - ) - ) *> send(Event.executing(id)) - case _ => unit - } - def pause(id: Observation.Id): HandleType[Unit] = modifyS(id)(Sequence.State.userStopSet(true)) @@ -405,9 +380,6 @@ class Engine[F[_]: MonadThrow: Logger, S, U] private ( case Breakpoints(id, _, step, v) => debug(s"Engine: breakpoints changed for sequence $id and step $step to $v") *> modifyS(id)(_.setBreakpoints(step, v)) *> pure(UserCommandResponse(ue, Outcome.Ok, None)) - case SkipMark(id, _, step, v) => - debug(s"Engine: skip mark changed for sequence $id and step $step to $v") *> - modifyS(id)(_.setSkipMark(step, v)) *> pure(UserCommandResponse(ue, Outcome.Ok, None)) case Poll(_) => debug("Engine: Polling current state") *> pure(UserCommandResponse(ue, Outcome.Ok, None)) case GetState(f) => getState(f) *> pure(UserCommandResponse(ue, Outcome.Ok, None)) diff --git a/modules/engine/src/main/scala/observe/engine/EngineStep.scala b/modules/engine/src/main/scala/observe/engine/EngineStep.scala index 3b39025ab..bee48ce2a 100644 --- a/modules/engine/src/main/scala/observe/engine/EngineStep.scala +++ b/modules/engine/src/main/scala/observe/engine/EngineStep.scala @@ -6,7 +6,6 @@ package observe.engine import cats.syntax.all.* import lucuma.core.enums.Breakpoint import lucuma.core.model.sequence.Step -import lucuma.core.util.NewType import monocle.Focus import monocle.Iso import monocle.Lens @@ -20,18 +19,11 @@ import observe.model.StepState case class EngineStep[F[_]]( id: Step.Id, breakpoint: Breakpoint, - skipped: EngineStep.Skipped, - skipMark: EngineStep.SkipMark, executions: List[ParallelActions[F]] ) object EngineStep { - object SkipMark extends NewType[Boolean] - type SkipMark = SkipMark.Type - object Skipped extends NewType[Boolean] - type Skipped = Skipped.Type - def isoBool: Iso[Breakpoint, Boolean] = Iso[Breakpoint, Boolean](_ === Breakpoint.Enabled)(b => if (b) Breakpoint.Enabled else Breakpoint.Disabled @@ -40,44 +32,34 @@ object EngineStep { def breakpointL[F[_]]: Lens[EngineStep[F], Boolean] = Focus[EngineStep[F]](_.breakpoint).andThen(isoBool) - def skippedL[F[_]]: Lens[EngineStep[F], Boolean] = - Focus[EngineStep[F]](_.skipped).andThen(Skipped.value) - def init[F[_]](id: Step.Id, executions: List[ParallelActions[F]]): EngineStep[F] = - EngineStep(id = id, - breakpoint = Breakpoint.Disabled, - skipped = Skipped(false), - skipMark = SkipMark(false), - executions = executions - ) + EngineStep(id = id, breakpoint = Breakpoint.Disabled, executions = executions) /** * Calculate the `Step` `Status` based on the underlying `Action`s. */ private def status_[F[_]](step: EngineStep[F]): StepState = - if (step.skipped.value) StepState.Skipped - else - // Find an error in the Step - step.executions - .flatMap(_.toList) - .find(Action.errored) - .flatMap { x => - x.state.runState match { - case ActionState.Failed(Result.Error(msg)) => msg.some - case _ => None - // Return error or continue with the rest of the checks - } + // Find an error in the Step + step.executions + .flatMap(_.toList) + .find(Action.errored) + .flatMap { x => + x.state.runState match { + case ActionState.Failed(Result.Error(msg)) => msg.some + case _ => None + // Return error or continue with the rest of the checks } - .map[StepState](StepState.Failed.apply) - .getOrElse( - // All actions in this Step were completed successfully, or the Step is empty. - if (step.executions.flatMap(_.toList).exists(Action.aborted)) StepState.Aborted - else if (step.executions.flatMap(_.toList).forall(Action.completed)) StepState.Completed - else if (step.executions.flatMap(_.toList).forall(_.state.runState.isIdle)) - StepState.Pending - // Not all actions are completed or pending. - else StepState.Running - ) + } + .map[StepState](StepState.Failed.apply) + .getOrElse( + // All actions in this Step were completed successfully, or the Step is empty. + if (step.executions.flatMap(_.toList).exists(Action.aborted)) StepState.Aborted + else if (step.executions.flatMap(_.toList).forall(Action.completed)) StepState.Completed + else if (step.executions.flatMap(_.toList).forall(_.state.runState.isIdle)) + StepState.Pending + // Not all actions are completed or pending. + else StepState.Running + ) extension [F[_]](s: EngineStep[F]) { def status: StepState = EngineStep.status_(s) @@ -89,7 +71,6 @@ object EngineStep { case class Zipper[F[_]]( id: Step.Id, breakpoint: Breakpoint, - skipMark: SkipMark, pending: List[ParallelActions[F]], focus: Execution[F], done: List[ParallelActions[F]], @@ -121,9 +102,7 @@ object EngineStep { */ val uncurrentify: Option[EngineStep[F]] = if (pending.isEmpty) - focus.uncurrentify.map(x => - EngineStep(id, breakpoint, Skipped(false), skipMark, x.prepend(done)) - ) + focus.uncurrentify.map(x => EngineStep(id, breakpoint, x.prepend(done))) else None /** @@ -134,13 +113,9 @@ object EngineStep { EngineStep( id = id, breakpoint = breakpoint, - skipped = Skipped(false), - skipMark = skipMark, executions = done ++ focus.toParallelActionsList ++ pending ) - val skip: EngineStep[F] = toStep.copy(skipped = Skipped(true)) - def update(executions: List[ParallelActions[F]]): Zipper[F] = Zipper .calcRolledback(executions) @@ -175,7 +150,6 @@ object EngineStep { Zipper( step.id, step.breakpoint, - step.skipMark, exes, x, Nil, diff --git a/modules/engine/src/main/scala/observe/engine/Event.scala b/modules/engine/src/main/scala/observe/engine/Event.scala index c7479c825..d51acc017 100644 --- a/modules/engine/src/main/scala/observe/engine/Event.scala +++ b/modules/engine/src/main/scala/observe/engine/Event.scala @@ -38,12 +38,6 @@ object Event { steps: List[Step.Id], v: Breakpoint ): Event[F, S, U] = EventUser[F, S, U](Breakpoints(id, user.some, steps, v)) - def skip[F[_], S, U]( - id: Observation.Id, - user: User, - step: Step.Id, - v: Boolean - ): Event[F, S, U] = EventUser[F, S, U](SkipMark(id, user.some, step, v)) def poll[F[_], S, U](clientId: ClientId): Event[F, S, U] = EventUser[F, S, U](Poll(clientId)) def getState[F[_], S, U](f: S => Option[Stream[F, Event[F, S, U]]]): Event[F, S, U] = diff --git a/modules/engine/src/main/scala/observe/engine/Sequence.scala b/modules/engine/src/main/scala/observe/engine/Sequence.scala index 85f25cf70..92f218582 100644 --- a/modules/engine/src/main/scala/observe/engine/Sequence.scala +++ b/modules/engine/src/main/scala/observe/engine/Sequence.scala @@ -43,9 +43,6 @@ object Sequence { done: List[EngineStep[F]] ) { - private val (toSkip, remaining): (List[EngineStep[F]], List[EngineStep[F]]) = - pending.span(st => st.skipMark.value) - /** * Runs the next execution. If the current `Step` is completed it adds the `StepZ` under focus * to the list of completed `Step`s and makes the next pending `Step` the current one. @@ -59,9 +56,7 @@ object Sequence { focus.next match { // Step completed case None => - val (toSkip, remaining): (List[EngineStep[F]], List[EngineStep[F]]) = - pending.span(st => st.skipMark.value && !(st.breakpoint === Breakpoint.Enabled)) - remaining match { + pending match { case Nil => None case stepp :: stepps => (EngineStep.Zipper.currentify(stepp), focus.uncurrentify).mapN((curr, stepd) => @@ -70,7 +65,7 @@ object Sequence { atomId, stepps, curr, - (done :+ stepd) ::: toSkip.map(_.copy(skipped = EngineStep.Skipped(true))) + done :+ stepd ) ) } @@ -80,42 +75,13 @@ object Sequence { def rollback: Zipper[F] = this.copy(focus = focus.rollback) - // Skips steps before starting a sequence. - def skips: Option[Zipper[F]] = - if (focus.skipMark.value) { - remaining match { - case Nil => None - case stepp :: stepps => - (EngineStep.Zipper.currentify(stepp), focus.skip.some).mapN((curr, stepd) => - Zipper( - id, - atomId, - stepps, - curr, - (done :+ stepd) ::: toSkip.map(_.copy(skipped = EngineStep.Skipped(true))) - ) - ) - } - } else this.some - /** * Obtain the resulting `Sequence` only if all `Step`s have been completed. This is a special * way of *unzipping* a `Zipper`. */ val uncurrentify: Option[Sequence[F]] = - if (remaining.isEmpty) - if (focus.skipMark.value) - Sequence(id, - atomId, - (done :+ focus.skip) ::: toSkip.map(_.copy(skipped = EngineStep.Skipped(true))) - ).some - else - focus.uncurrentify.map(x => - Sequence(id, - atomId, - (done :+ x) ::: toSkip.map(_.copy(skipped = EngineStep.Skipped(true))) - ) - ) + if (pending.isEmpty) + focus.uncurrentify.map(x => Sequence(id, atomId, done :+ x)) else None /** @@ -195,12 +161,8 @@ object Sequence { def rollback: State[F] - def skips: Option[State[F]] - def setBreakpoints(stepId: List[Step.Id], v: Breakpoint): State[F] - def setSkipMark(stepId: Step.Id, v: Boolean): State[F] - def getCurrentBreakpoint: Boolean /** @@ -307,7 +269,7 @@ object Sequence { else { val oldSeq = st.toSequence val updSteps = oldSeq.steps.zip(steps).map { case (o, n) => - n.copy(breakpoint = o.breakpoint, skipMark = o.skipMark) + n.copy(breakpoint = o.breakpoint) } ++ steps.drop(oldSeq.steps.length) init(oldSeq.copy(steps = updSteps)) } @@ -344,12 +306,6 @@ object Sequence { override def rollback: Zipper[F] = self.copy(zipper = zipper.rollback) - override def skips: Option[State[F]] = zipper.skips match { - // Last execution - case None => zipper.uncurrentify.map(Final[F](_, status)) - case Some(x) => Zipper(x, status, singleRuns).some - } - override def setBreakpoints(stepId: List[Step.Id], v: Breakpoint): State[F] = self.copy(zipper = zipper.copy(pending = @@ -357,17 +313,6 @@ object Sequence { ) ) - override def setSkipMark(stepId: Step.Id, v: Boolean): State[F] = self.copy(zipper = - if (zipper.focus.id == stepId) - zipper.copy(focus = zipper.focus.copy(skipMark = EngineStep.SkipMark(v))) - else - zipper.copy(pending = - zipper.pending.map(s => - if (s.id == stepId) s.copy(skipMark = EngineStep.SkipMark(v)) else s - ) - ) - ) - override def getCurrentBreakpoint: Boolean = (zipper.focus.breakpoint === Breakpoint.Enabled) && zipper.focus.done.isEmpty @@ -458,12 +403,8 @@ object Sequence { override def rollback: Final[F] = self - override def skips: Option[State[F]] = self.some - override def setBreakpoints(stepId: List[Step.Id], v: Breakpoint): State[F] = self - override def setSkipMark(stepId: Step.Id, v: Boolean): State[F] = self - override def getCurrentBreakpoint: Boolean = false override val done: List[EngineStep[F]] = seq.steps diff --git a/modules/engine/src/main/scala/observe/engine/UserEvent.scala b/modules/engine/src/main/scala/observe/engine/UserEvent.scala index c75840db4..1db2ddf31 100644 --- a/modules/engine/src/main/scala/observe/engine/UserEvent.scala +++ b/modules/engine/src/main/scala/observe/engine/UserEvent.scala @@ -37,12 +37,6 @@ object UserEvent { steps: List[Step.Id], v: Breakpoint ) extends UserEvent[F, S, U] - case class SkipMark[F[_], S, U]( - id: Observation.Id, - user: Option[User], - step: Step.Id, - v: Boolean - ) extends UserEvent[F, S, U] case class Poll[F[_], S, U](clientId: ClientId) extends UserEvent[F, S, U] { val user: Option[User] = None } diff --git a/modules/engine/src/test/scala/observe/engine/packageSpec.scala b/modules/engine/src/test/scala/observe/engine/PackageSuite.scala similarity index 54% rename from modules/engine/src/test/scala/observe/engine/packageSpec.scala rename to modules/engine/src/test/scala/observe/engine/PackageSuite.scala index f8a81efa8..31f4b37bc 100644 --- a/modules/engine/src/test/scala/observe/engine/packageSpec.scala +++ b/modules/engine/src/test/scala/observe/engine/PackageSuite.scala @@ -10,7 +10,6 @@ import cats.effect.std.Semaphore import cats.syntax.all.* import eu.timepit.refined.types.numeric.PosLong import fs2.Stream -import lucuma.core.enums.Breakpoint import lucuma.core.enums.Instrument.GmosSouth import lucuma.core.model.OrcidId import lucuma.core.model.OrcidProfile @@ -21,13 +20,11 @@ import lucuma.core.model.sequence.Atom import lucuma.refined.* import observe.common.test.observationId import observe.common.test.stepId -import observe.engine.Sequence.State.Final import observe.engine.TestUtil.TestState import observe.model.ActionType import observe.model.ClientId import observe.model.Observation import observe.model.SequenceState -import observe.model.StepState import observe.model.enums.Resource import observe.model.enums.Resource.TCS import org.typelevel.log4cats.Logger @@ -51,7 +48,7 @@ def user = ) ) -class packageSpec extends munit.CatsEffectSuite { +class PackageSuite extends munit.CatsEffectSuite { private given Logger[IO] = Slf4jLogger.getLoggerFromName[IO]("observe-engine") @@ -336,308 +333,6 @@ class packageSpec extends munit.CatsEffectSuite { }.assert } - test("engine should skip steps marked to be skipped at the beginning of the sequence.") { - val s0: TestState = TestState( - Map( - (seqId, - Sequence.State.init( - Sequence.sequence( - id = lucuma.core.model.Observation.Id(PosLong.unsafeFrom(6)), - atomId = atomId, - steps = List( - EngineStep - .init(id = stepId(1), executions = executions) - .copy(skipMark = EngineStep.SkipMark(true)), - EngineStep.init(id = stepId(2), executions = executions), - EngineStep.init(id = stepId(3), executions = executions) - ) - ) - ) - ) - ) - ) - (for { - sf <- OptionT(runToCompletion(s0)) - r <- OptionT.fromOption( - sf.sequences - .get(seqId) - .map( - _.done.map(_.status) === List(StepState.Skipped, - StepState.Completed, - StepState.Completed - ) - ) - ) - } yield r).value.map(_.getOrElse(fail("Cannot read the sequence"))).assert - } - - test("engine should skip steps marked to be skipped in the middle of the sequence.") { - val s0: TestState = TestState( - Map( - (seqId, - Sequence.State.init( - Sequence.sequence( - id = lucuma.core.model.Observation.Id(PosLong.unsafeFrom(7)), - atomId = atomId, - steps = List( - EngineStep.init(id = stepId(1), executions = executions), - EngineStep - .init(id = stepId(2), executions = executions) - .copy(skipMark = EngineStep.SkipMark(true)), - EngineStep.init(id = stepId(3), executions = executions) - ) - ) - ) - ) - ) - ) - - (for { - sf <- OptionT(runToCompletion(s0)) - r <- OptionT.fromOption( - sf.sequences - .get(seqId) - .map( - _.done.map(_.status) === List(StepState.Completed, - StepState.Skipped, - StepState.Completed - ) - ) - ) - } yield r).value.map(_.getOrElse(fail("Cannot read the sequence"))).assert - } - - test("engine should skip several steps marked to be skipped.") { - val s0: TestState = TestState( - Map( - (seqId, - Sequence.State.init( - Sequence.sequence( - id = lucuma.core.model.Observation.Id(PosLong.unsafeFrom(8)), - atomId = atomId, - steps = List( - EngineStep.init(id = stepId(1), executions = executions), - EngineStep - .init(id = stepId(2), executions = executions) - .copy(skipMark = EngineStep.SkipMark(true)), - EngineStep - .init(id = stepId(3), executions = executions) - .copy(skipMark = EngineStep.SkipMark(true)), - EngineStep - .init(id = stepId(4), executions = executions) - .copy(skipMark = EngineStep.SkipMark(true)), - EngineStep.init(id = stepId(5), executions = executions) - ) - ) - ) - ) - ) - ) - - (for { - sf <- OptionT(runToCompletion(s0)) - r <- OptionT.fromOption( - sf.sequences - .get(seqId) - .map( - _.done.map(_.status) === List(StepState.Completed, - StepState.Skipped, - StepState.Skipped, - StepState.Skipped, - StepState.Completed - ) - ) - ) - } yield r).value.map(_.getOrElse(fail("Cannot read the sequence"))).assert - } - - test("engine should skip steps marked to be skipped at the end of the sequence.") { - val s0: TestState = TestState( - Map( - (seqId, - Sequence.State.init( - Sequence.sequence( - id = lucuma.core.model.Observation.Id(PosLong.unsafeFrom(1)), - atomId = atomId, - steps = List( - EngineStep.init(id = stepId(1), executions = executions), - EngineStep.init(id = stepId(2), executions = executions), - EngineStep - .init(id = stepId(3), executions = executions) - .copy(skipMark = EngineStep.SkipMark(true)) - ) - ) - ) - ) - ) - ) - - (for { - sf <- OptionT(runToCompletion(s0)) - r <- OptionT.fromOption( - sf.sequences - .get(seqId) - .map( - _.done.map(_.status) === List(StepState.Completed, - StepState.Completed, - StepState.Skipped - ) - ) - ) - } yield r).value.map(_.getOrElse(fail("Cannot read the sequence"))).assert - } - - test("engine should skip a step marked to be skipped even if it is the only one.") { - val s0: TestState = TestState( - Map( - (seqId, - Sequence.State.init( - Sequence.sequence( - id = lucuma.core.model.Observation.Id(PosLong.unsafeFrom(1)), - atomId = atomId, - steps = List( - EngineStep - .init(id = stepId(1), executions = executions) - .copy(skipMark = EngineStep.SkipMark(true)) - ) - ) - ) - ) - ) - ) - - (for { - sf <- OptionT(runToCompletion(s0)) - r <- OptionT.fromOption( - sf.sequences - .get(seqId) - .map(_.done.map(_.status) === List(StepState.Skipped)) - ) - } yield r).value.map(_.getOrElse(fail("Cannot read the sequence"))).assert - } - - test( - "engine should skip steps marked to be skipped at the beginning of the sequence, even if they have breakpoints." - ) { - val s0: TestState = TestState( - Map( - (seqId, - Sequence.State.init( - Sequence.sequence( - id = lucuma.core.model.Observation.Id(PosLong.unsafeFrom(1)), - atomId = atomId, - steps = List( - EngineStep - .init(id = stepId(1), executions = executions) - .copy(skipMark = EngineStep.SkipMark(true)), - EngineStep - .init(id = stepId(2), executions = executions) - .copy(skipMark = EngineStep.SkipMark(true), breakpoint = Breakpoint.Enabled), - EngineStep.init(id = stepId(3), executions = executions) - ) - ) - ) - ) - ) - ) - - (for { - sf <- OptionT(runToCompletion(s0)) - r <- OptionT.fromOption( - sf.sequences - .get(seqId) - .map( - _.done.map(_.status) === List(StepState.Skipped, - StepState.Skipped, - StepState.Completed - ) - ) - ) - } yield r).value.map(_.getOrElse(fail("Cannot read the sequence"))).assert - } - - test( - "engine should skip the leading steps if marked to be skipped, even if they have breakpoints and are the last ones." - ) { - val s0: TestState = TestState( - Map( - (seqId, - Sequence.State.init( - Sequence.sequence( - lucuma.core.model.Observation.Id(PosLong.unsafeFrom(1)), - atomId = atomId, - steps = List( - EngineStep - .init(id = stepId(1), executions = executions) - .copy(skipped = EngineStep.Skipped(true)), - EngineStep - .init(id = stepId(2), executions = executions) - .copy(skipMark = EngineStep.SkipMark(true), breakpoint = Breakpoint.Enabled), - EngineStep - .init(id = stepId(3), executions = executions) - .copy(skipMark = EngineStep.SkipMark(true), breakpoint = Breakpoint.Enabled) - ) - ) - ) - ) - ) - ) - - (for { - sf <- OptionT(runToCompletion(s0)) - r <- - OptionT.fromOption( - sf.sequences - .get(seqId) - .collect { case s @ Final(_, SequenceState.Completed) => - s - } - .map( - _.done.map(_.status) === List(StepState.Skipped, StepState.Skipped, StepState.Skipped) - ) - ) - } yield r).value.map(_.getOrElse(fail("Cannot read the sequence"))).assert - } - - test( - "engine should skip steps marked to be skipped in the middle of the sequence, but honoring breakpoints." - ) { - val s0: TestState = TestState( - Map( - (seqId, - Sequence.State.init( - Sequence.sequence( - id = lucuma.core.model.Observation.Id(PosLong.unsafeFrom(1)), - atomId = atomId, - steps = List( - EngineStep.init(id = stepId(1), executions = executions), - EngineStep - .init(id = stepId(2), executions = executions) - .copy(skipMark = EngineStep.SkipMark(true)), - EngineStep - .init(id = stepId(3), executions = executions) - .copy(skipMark = EngineStep.SkipMark(true), breakpoint = Breakpoint.Enabled), - EngineStep.init(id = stepId(4), executions = executions) - ) - ) - ) - ) - ) - ) - - (for { - sf <- OptionT(runToCompletion(s0)) - r <- - OptionT.fromOption( - sf.sequences - .get(seqId) - .map( - _.done.map(_.status) === List(StepState.Completed, StepState.Skipped) - ) - ) - } yield r).value.map(_.getOrElse(fail("Cannot read the sequence"))).assert - } - test("engine should run single Action") { val dummy = new AtomicInteger(0) val markVal = 1 @@ -739,32 +434,4 @@ class packageSpec extends munit.CatsEffectSuite { ) ) - test("engine should be able to start sequence from arbitrary step") { - def event(eng: Engine[IO, TestState, Unit]) = Event.modifyState[IO, TestState, Unit]( - eng - .startFrom(seqId, stepId(3)) - .void - ) - - val sf = - for { - eng <- executionEngine - _ <- eng.offer(event(eng)) - r <- eng - .process(PartialFunction.empty)(qs2) - .drop(1) - .takeThrough(a => !isFinished(a._2.sequences(seqId).status)) - .compile - .last - } yield r.map(_._2) - - sf.map(_.flatMap(_.sequences.get(seqId).map(_.toSequence).map { seq => - Some(StepState.Completed) == seq.steps.get(0).map(_.status) && - Some(StepState.Skipped) == seq.steps.get(1).map(_.status) && - Some(StepState.Completed) == seq.steps.get(2).map(_.status) && - Some(StepState.Completed) == seq.steps.get(3).map(_.status) - }).getOrElse(fail("Cannot read the sequence"))) - .assert - } - } diff --git a/modules/engine/src/test/scala/observe/engine/SequenceSuite.scala b/modules/engine/src/test/scala/observe/engine/SequenceSuite.scala index 650e3cb0e..1c208ceff 100644 --- a/modules/engine/src/test/scala/observe/engine/SequenceSuite.scala +++ b/modules/engine/src/test/scala/observe/engine/SequenceSuite.scala @@ -171,7 +171,6 @@ class SequenceSuite extends munit.CatsEffectSuite { EngineStep.Zipper( id = stepId(1), breakpoint = Breakpoint.Disabled, - EngineStep.SkipMark(false), pending = pending, focus = focus, done = done.map(_.map { r => diff --git a/modules/engine/src/test/scala/observe/engine/StepSuite.scala b/modules/engine/src/test/scala/observe/engine/StepSuite.scala index 7c8242734..19438d8b3 100644 --- a/modules/engine/src/test/scala/observe/engine/StepSuite.scala +++ b/modules/engine/src/test/scala/observe/engine/StepSuite.scala @@ -67,7 +67,6 @@ class StepSuite extends CatsEffectSuite { EngineStep.Zipper( id = stepId(1), breakpoint = Breakpoint.Disabled, - skipMark = EngineStep.SkipMark(false), pending = pending, focus = focus, done = done.map(_.map { r => @@ -250,9 +249,9 @@ class StepSuite extends CatsEffectSuite { _.exists { case Sequence.State.Zipper(zipper, status, _) => (zipper.focus.toStep match { - case EngineStep(_, _, _, _, List(ex1, ex2)) => + case EngineStep(_, _, List(ex1, ex2)) => Execution(ex1.toList).results.length == 3 && Execution(ex2.toList).actions.length == 1 - case _ => false + case _ => false }) && status === SequenceState.Idle case _ => false } @@ -276,7 +275,6 @@ class StepSuite extends CatsEffectSuite { focus = EngineStep.Zipper( id = stepId(2), breakpoint = Breakpoint.Disabled, - skipMark = EngineStep.SkipMark(false), pending = Nil, focus = Execution(List(observe)), done = List(NonEmptyList.of(actionCompleted, actionCompleted)), @@ -307,9 +305,9 @@ class StepSuite extends CatsEffectSuite { _.exists { case Sequence.State.Zipper(zipper, status, _) => (zipper.focus.toStep match { - case EngineStep(_, _, _, _, List(ex1, ex2)) => + case EngineStep(_, _, List(ex1, ex2)) => Execution(ex1.toList).actions.length == 2 && Execution(ex2.toList).actions.length == 1 - case _ => false + case _ => false }) && status.isRunning case _ => false } @@ -330,7 +328,6 @@ class StepSuite extends CatsEffectSuite { focus = EngineStep.Zipper( id = stepId(2), breakpoint = Breakpoint.Disabled, - skipMark = EngineStep.SkipMark(false), pending = Nil, focus = Execution(List(observe)), done = List(NonEmptyList.of(actionCompleted, actionCompleted)), @@ -407,9 +404,9 @@ class StepSuite extends CatsEffectSuite { x.flatMap(_.sequences.get(seqId)).exists { case Sequence.State.Zipper(zipper, status, _) => zipper.focus.toStep.match { - case EngineStep(_, _, _, _, List(ex1, ex2)) => + case EngineStep(_, _, List(ex1, ex2)) => Execution(ex1.toList).actions.length == 2 && Execution(ex2.toList).actions.length == 1 - case _ => false + case _ => false } && (status === SequenceState.Idle) case _ => false } @@ -507,11 +504,11 @@ class StepSuite extends CatsEffectSuite { case Sequence.State.Zipper(zipper, status, _) => (zipper.focus.toStep match { // Check that the sequence stopped midway - case EngineStep(_, _, _, _, List(ex1, ex2, ex3)) => + case EngineStep(_, _, List(ex1, ex2, ex3)) => Execution(ex1.toList).results.length == 2 && Execution( ex2.toList ).results.length == 1 && Execution(ex3.toList).actions.length == 1 - case _ => false + case _ => false }) && (status == SequenceState.Failed(errMsg)) // And that it ended in error case _ => false @@ -767,7 +764,6 @@ class StepSuite extends CatsEffectSuite { .Zipper( id = stepId(1), breakpoint = Breakpoint.Disabled, - skipMark = EngineStep.SkipMark(false), pending = Nil, focus = Execution(List(action, actionFailed, actionCompleted)), done = Nil, @@ -784,7 +780,6 @@ class StepSuite extends CatsEffectSuite { .Zipper( id = stepId(1), breakpoint = Breakpoint.Disabled, - skipMark = EngineStep.SkipMark(false), pending = Nil, focus = Execution(List(actionCompleted, actionCompleted, actionCompleted)), done = Nil, @@ -801,7 +796,6 @@ class StepSuite extends CatsEffectSuite { .Zipper( id = stepId(1), breakpoint = Breakpoint.Disabled, - skipMark = EngineStep.SkipMark(false), pending = Nil, focus = Execution(List(actionCompleted, action, actionCompleted)), done = Nil, @@ -818,7 +812,6 @@ class StepSuite extends CatsEffectSuite { .Zipper( id = stepId(1), breakpoint = Breakpoint.Disabled, - skipMark = EngineStep.SkipMark(false), pending = Nil, focus = Execution(List(action, action, action)), done = Nil, @@ -829,22 +822,4 @@ class StepSuite extends CatsEffectSuite { ) } - test("status should be Skipped if the EngineStep was skipped") { - assert( - EngineStep - .Zipper( - id = stepId(1), - breakpoint = Breakpoint.Disabled, - skipMark = EngineStep.SkipMark(false), - pending = Nil, - focus = Execution(List(action, action, action)), - done = Nil, - rolledback = (Execution(List(action, action, action)), Nil) - ) - .toStep - .copy(skipped = EngineStep.Skipped(true)) - .status === StepState.Skipped - ) - } - } diff --git a/modules/model/shared/src/main/scala/observe/model/ObserveStep.scala b/modules/model/shared/src/main/scala/observe/model/ObserveStep.scala index 4c69cab29..6080729af 100644 --- a/modules/model/shared/src/main/scala/observe/model/ObserveStep.scala +++ b/modules/model/shared/src/main/scala/observe/model/ObserveStep.scala @@ -30,7 +30,6 @@ enum ObserveStep( val stepConfig: StepConfig, val status: StepState, val breakpoint: Breakpoint, - val skip: Boolean, val fileId: Option[ImageFileId], val configStatus: List[(Resource | Instrument, ActionStatus)] ) derives Eq, @@ -42,11 +41,10 @@ enum ObserveStep( override val stepConfig: StepConfig, override val status: StepState, override val breakpoint: Breakpoint, - override val skip: Boolean, override val fileId: Option[ImageFileId], override val configStatus: List[(Resource | Instrument, ActionStatus)], val observeStatus: ActionStatus - ) extends ObserveStep(id, instConfig, stepConfig, status, breakpoint, skip, fileId, configStatus) + ) extends ObserveStep(id, instConfig, stepConfig, status, breakpoint, fileId, configStatus) case NodAndShuffle( override val id: Step.Id, @@ -54,24 +52,22 @@ enum ObserveStep( override val stepConfig: StepConfig, override val status: StepState, override val breakpoint: Breakpoint, - override val skip: Boolean, override val fileId: Option[ImageFileId], override val configStatus: List[(Resource | Instrument, ActionStatus)], val nsStatus: NodAndShuffleStatus, val pendingObserveCmd: Option[PendingObserveCmd] - ) extends ObserveStep(id, instConfig, stepConfig, status, breakpoint, skip, fileId, configStatus) + ) extends ObserveStep(id, instConfig, stepConfig, status, breakpoint, fileId, configStatus) object ObserveStep: // Derivation doesn't generate instances for subtypes. given Eq[Standard] = Eq.by: x => - (x.id, x.instConfig, x.stepConfig, x.status, x.breakpoint, x.skip, x.fileId, x.configStatus) + (x.id, x.instConfig, x.stepConfig, x.status, x.breakpoint, x.fileId, x.configStatus) given Eq[NodAndShuffle] = Eq.by: x => (x.id, x.instConfig, x.stepConfig, x.status, x.breakpoint, - x.skip, x.fileId, x.configStatus, x.nsStatus, @@ -133,16 +129,6 @@ object ObserveStep: } } - def skip: Lens[ObserveStep, Boolean] = - Lens[ObserveStep, Boolean] { - _.skip - } { n => - { - case s: Standard => s.focus(_.skip).replace(n) - case s: NodAndShuffle => s.focus(_.skip).replace(n) - } - } - def breakpoint: Lens[ObserveStep, Breakpoint] = Lens[ObserveStep, Breakpoint] { _.breakpoint @@ -181,11 +167,6 @@ object ObserveStep: case st: Standard => Focus[Standard](_.breakpoint).flip(st) case st: NodAndShuffle => Focus[NodAndShuffle](_.breakpoint).flip(st) - def flipSkip: ObserveStep = - s match - case st: Standard => Focus[Standard](_.skip).negate(st) - case st: NodAndShuffle => Focus[NodAndShuffle](_.skip).negate(st) - def file: Option[String] = None def canSetBreakpoint(steps: List[ObserveStep]): Boolean = @@ -217,8 +198,6 @@ object ObserveStep: def isFinished: Boolean = s.status.isFinished - def wasSkipped: Boolean = s.status.wasSkipped - def canConfigure: Boolean = s.status.canConfigure def isMultiLevel: Boolean = diff --git a/modules/model/shared/src/main/scala/observe/model/StepState.scala b/modules/model/shared/src/main/scala/observe/model/StepState.scala index 10edd8597..0e72b6c27 100644 --- a/modules/model/shared/src/main/scala/observe/model/StepState.scala +++ b/modules/model/shared/src/main/scala/observe/model/StepState.scala @@ -11,17 +11,15 @@ import io.circe.* enum StepState derives Eq, Decoder, Encoder.AsObject: case Pending extends StepState case Completed extends StepState - case Skipped extends StepState case Aborted extends StepState case Failed(msg: String) extends StepState case Running extends StepState case Paused extends StepState lazy val canSetBreakpoint: Boolean = this match - case StepState.Pending | StepState.Skipped | StepState.Paused | StepState.Running | - StepState.Aborted => + case StepState.Pending | StepState.Paused | StepState.Running | StepState.Aborted => true - case _ => false + case _ => false lazy val hasError: Boolean = this match case StepState.Failed(_) => true @@ -36,10 +34,8 @@ enum StepState derives Eq, Decoder, Encoder.AsObject: case _ => false lazy val isFinished: Boolean = this match - case StepState.Completed | StepState.Skipped => true - case _ => false - - lazy val wasSkipped: Boolean = this === StepState.Skipped + case StepState.Completed => true + case _ => false lazy val canConfigure: Boolean = this match case StepState.Pending | StepState.Paused | StepState.Failed(_) | StepState.Aborted => true diff --git a/modules/model/shared/src/main/scala/observe/model/arb/ArbNodAndShuffleStep.scala b/modules/model/shared/src/main/scala/observe/model/arb/ArbNodAndShuffleStep.scala index 57e4ea4da..4c2b4a040 100644 --- a/modules/model/shared/src/main/scala/observe/model/arb/ArbNodAndShuffleStep.scala +++ b/modules/model/shared/src/main/scala/observe/model/arb/ArbNodAndShuffleStep.scala @@ -60,7 +60,6 @@ trait ArbNodAndShuffleStep { t <- arbitrary[StepConfig] s <- arbitrary[StepState] b <- arbitrary[Breakpoint] - k <- arbitrary[Boolean] f <- arbitrary[Option[dhs.ImageFileId]] cs <- arbitrary[List[(Resource, ActionStatus)]] os <- arbitrary[NodAndShuffleStatus] @@ -71,7 +70,6 @@ trait ArbNodAndShuffleStep { stepConfig = t, status = s, breakpoint = b, - skip = k, fileId = f, configStatus = cs, nsStatus = os, @@ -87,7 +85,6 @@ trait ArbNodAndShuffleStep { StepConfig, StepState, Breakpoint, - Boolean, Option[dhs.ImageFileId], List[(Resource | Instrument, ActionStatus)], NodAndShuffleStatus @@ -98,7 +95,6 @@ trait ArbNodAndShuffleStep { s.stepConfig, s.status, s.breakpoint, - s.skip, s.fileId, s.configStatus, s.nsStatus diff --git a/modules/model/shared/src/main/scala/observe/model/arb/ArbStandardStep.scala b/modules/model/shared/src/main/scala/observe/model/arb/ArbStandardStep.scala index 6b1d9ca14..0f2e0aa11 100644 --- a/modules/model/shared/src/main/scala/observe/model/arb/ArbStandardStep.scala +++ b/modules/model/shared/src/main/scala/observe/model/arb/ArbStandardStep.scala @@ -30,7 +30,6 @@ trait ArbStandardStep { t <- arbitrary[StepConfig] s <- arbitrary[StepState] b <- arbitrary[Breakpoint] - k <- arbitrary[Boolean] f <- arbitrary[Option[dhs.ImageFileId]] cs <- arbitrary[List[(Resource, ActionStatus)]] os <- arbitrary[ActionStatus] @@ -40,7 +39,6 @@ trait ArbStandardStep { stepConfig = t, status = s, breakpoint = b, - skip = k, fileId = f, configStatus = cs, observeStatus = os @@ -55,7 +53,6 @@ trait ArbStandardStep { StepConfig, StepState, Breakpoint, - Boolean, Option[dhs.ImageFileId], List[(Resource | Instrument, ActionStatus)], ActionStatus @@ -66,7 +63,6 @@ trait ArbStandardStep { s.stepConfig, s.status, s.breakpoint, - s.skip, s.fileId, s.configStatus, s.observeStatus diff --git a/modules/model/shared/src/main/scala/observe/model/arb/ArbStepState.scala b/modules/model/shared/src/main/scala/observe/model/arb/ArbStepState.scala index 5cc24dd69..70cfdaf6b 100644 --- a/modules/model/shared/src/main/scala/observe/model/arb/ArbStepState.scala +++ b/modules/model/shared/src/main/scala/observe/model/arb/ArbStepState.scala @@ -14,7 +14,6 @@ trait ArbStepState { v1 <- Gen.oneOf(StepState.Pending, StepState.Completed, StepState.Aborted, - StepState.Skipped, StepState.Running, StepState.Paused ) diff --git a/modules/model/shared/src/test/scala/observe/model/ModelLensesSuite.scala b/modules/model/shared/src/test/scala/observe/model/ModelLensesSuite.scala index 1e3205c75..54dd38038 100644 --- a/modules/model/shared/src/test/scala/observe/model/ModelLensesSuite.scala +++ b/modules/model/shared/src/test/scala/observe/model/ModelLensesSuite.scala @@ -38,7 +38,6 @@ class ModelLensesSuite extends munit.DisciplineSuite with ModelLenses { checkAll("NodAndShuffleStep", PrismTests(ObserveStep.nsStepP)) checkAll("ObserveStep.status", LensTests(ObserveStep.status)) checkAll("ObserveStep.id", LensTests(ObserveStep.id)) - checkAll("ObserveStep.skip", LensTests(ObserveStep.skip)) checkAll("ObserveStep.breakpoint", LensTests(ObserveStep.breakpoint)) checkAll("ObserveStep.observeStatus", OptionalTests(ObserveStep.observeStatus)) checkAll("ObserveStep.configStatus", OptionalTests(ObserveStep.configStatus)) diff --git a/modules/server_new/src/main/scala/observe/server/ObserveEngine.scala b/modules/server_new/src/main/scala/observe/server/ObserveEngine.scala index bc666df3d..4dba96c1d 100644 --- a/modules/server_new/src/main/scala/observe/server/ObserveEngine.scala +++ b/modules/server_new/src/main/scala/observe/server/ObserveEngine.scala @@ -80,14 +80,6 @@ trait ObserveEngine[F[_]] { runOverride: RunOverride ): F[Unit] - def startFrom( - id: Observation.Id, - observer: Observer, - stp: Step.Id, - clientId: ClientId, - runOverride: RunOverride - ): F[Unit] - def loadNextAtom( id: Observation.Id, user: User, @@ -174,14 +166,6 @@ trait ObserveEngine[F[_]] { def setCloudExtinction(cc: CloudExtinction, user: User, clientId: ClientId): F[Unit] - def setSkipMark( - seqId: Observation.Id, - user: User, - observer: Observer, - stepId: Step.Id, - v: Boolean - ): F[Unit] - def requestRefresh(clientId: ClientId): F[Unit] def stopObserve( @@ -562,22 +546,6 @@ object ObserveEngine { ) ) - // Stars a sequence from an arbitrary step. All previous non executed steps are skipped. - // The method checks for resources conflict. - override def startFrom( - id: Observation.Id, - observer: Observer, - stp: Step.Id, - clientId: ClientId, - runOverride: RunOverride - ): F[Unit] = executeEngine.offer( - Event.modifyState[F, EngineState[F], SeqEvent]( - setObserver(id, observer) *> - clearObsCmd(id) *> - startChecks(executeEngine.startFrom(id, stp), id, clientId, stp.some, runOverride) - ) - ) - override def loadNextAtom( id: Observation.Id, user: User, @@ -877,17 +845,7 @@ object ObserveEngine { ) ) - override def setSkipMark( - seqId: Observation.Id, - user: User, - observer: Observer, - stepId: Step.Id, - v: Boolean - ): F[Unit] = Applicative[F].unit -// setObserver(seqId, user, observer) *> -// executeEngine.offer(Event.skip[F, EngineState[F], SeqEvent](seqId, user, stepId, v)) -// - override def requestRefresh(clientId: ClientId): F[Unit] = + override def requestRefresh(clientId: ClientId): F[Unit] = executeEngine.offer(Event.poll(clientId)) @unused @@ -1788,8 +1746,8 @@ object ObserveEngine { val engSteps = engineSteps(seq) val stepResources = engSteps.map { - case ObserveStep.Standard(id, _, _, _, _, _, _, configStatus, _) => id -> configStatus.toMap - case ObserveStep.NodAndShuffle(id, _, _, _, _, _, _, configStatus, _, _) => + case ObserveStep.Standard(id, _, _, _, _, _, configStatus, _) => id -> configStatus.toMap + case ObserveStep.NodAndShuffle(id, _, _, _, _, _, configStatus, _, _) => id -> configStatus.toMap }.toMap diff --git a/modules/server_new/src/main/scala/observe/server/SequenceGen.scala b/modules/server_new/src/main/scala/observe/server/SequenceGen.scala index 5455df836..4aa6d92fe 100644 --- a/modules/server_new/src/main/scala/observe/server/SequenceGen.scala +++ b/modules/server_new/src/main/scala/observe/server/SequenceGen.scala @@ -90,8 +90,6 @@ object SequenceGen { stepGen match { case p: PendingStepGen[F] => EngineStep.init[F](stepGen.id, p.generator.generate(ctx, systemOverrides)) - case SkippedStepGen(id, _, _, _, _) => - EngineStep.skippedL[F].replace(true)(EngineStep.init[F](id, Nil)) case CompletedStepGen(id, _, _, _, _, _) => EngineStep.init[F](id, Nil) } } @@ -148,14 +146,6 @@ object SequenceGen { breakpoint: Breakpoint ) extends StepGen[F] - case class SkippedStepGen[F[_]]( - id: Step.Id, - dataId: DataId, - genData: StepStatusGen = StepStatusGen.Null, - instConfig: DynamicConfig, - config: StepConfig - ) extends StepGen[F] - // Receiving a sequence from the ODB with a completed step without an image file id would be // weird, but I still use an Option just in case case class CompletedStepGen[F[_]]( diff --git a/modules/server_new/src/main/scala/observe/server/StepsView.scala b/modules/server_new/src/main/scala/observe/server/StepsView.scala index ea62d10be..a2935fc4d 100644 --- a/modules/server_new/src/main/scala/observe/server/StepsView.scala +++ b/modules/server_new/src/main/scala/observe/server/StepsView.scala @@ -154,7 +154,6 @@ object StepsView { stepConfig = stepg.config, status = status, breakpoint = step.breakpoint, - skip = step.skipMark.value, configStatus = configStatus, observeStatus = observeStatus(step.executions), fileId = fileId(step.executions).orElse(stepg.some.collect { diff --git a/modules/server_new/src/main/scala/observe/server/events/package.scala b/modules/server_new/src/main/scala/observe/server/events/package.scala index dd813ebd9..cd6816757 100644 --- a/modules/server_new/src/main/scala/observe/server/events/package.scala +++ b/modules/server_new/src/main/scala/observe/server/events/package.scala @@ -46,7 +46,6 @@ extension [F[_], S, U](e: UserEvent[F, S, U]) case UserEvent.Pause(_, _) => true case UserEvent.CancelPause(id, _) => true case UserEvent.Breakpoints(_, _, _, _) => true - case UserEvent.SkipMark(_, _, _, _) => true case UserEvent.Poll(_) => true case UserEvent.ActionStop(_, _) => true case UserEvent.ActionResume(_, _, _) => true diff --git a/modules/server_new/src/main/scala/observe/server/gmos/GmosStepsView.scala b/modules/server_new/src/main/scala/observe/server/gmos/GmosStepsView.scala index 6b05e6a74..44129dc2e 100644 --- a/modules/server_new/src/main/scala/observe/server/gmos/GmosStepsView.scala +++ b/modules/server_new/src/main/scala/observe/server/gmos/GmosStepsView.scala @@ -55,7 +55,6 @@ class GmosStepsView[F[_]] extends StepsView[F] { stepConfig = stepg.config, status = status, breakpoint = step.breakpoint, - skip = step.skipMark.value, configStatus = configStatus, nsStatus = NodAndShuffleStatus( observeStatus(step.executions), diff --git a/modules/server_new/src/test/scala/observe/server/ObserveEngineSuite.scala b/modules/server_new/src/test/scala/observe/server/ObserveEngineSuite.scala index e057cabe4..359626864 100644 --- a/modules/server_new/src/test/scala/observe/server/ObserveEngineSuite.scala +++ b/modules/server_new/src/test/scala/observe/server/ObserveEngineSuite.scala @@ -44,7 +44,6 @@ import observe.model.Observer import observe.model.Operator import observe.model.SequenceState import observe.model.SequenceState.Running -import observe.model.StepState import observe.model.SystemOverrides import observe.model.UserPrompt import observe.model.dhs.DataId @@ -359,79 +358,6 @@ class ObserveEngineSuite extends TestCommon { .exists(_.started)).assert } - test("ObserveEngine startFrom should start a sequence from an arbitrary step") { - val s0 = ODBSequencesLoader - .loadSequenceEndo[IO]( - None, - sequenceNSteps(seqObsId1, 5), - EngineState.instrumentLoaded(Instrument.GmosNorth) - ) - .apply(EngineState.default[IO]) - val runStepId = stepId(3) - - (for { - db <- TestOdbProxy.build[IO](staticCfg1.some, none, List.empty) - oe <- observeEngineWithODB(db) - _ <- oe.startFrom( - seqObsId1, - Observer("Joe".refined), - runStepId, - clientId, - RunOverride.Default - ) - sf <- oe - .stream(s0) - .map(_._2) - .takeThrough(_.sequences.values.exists(_.seq.status.isRunning)) - .compile - .last - } yield sf - .flatMap(EngineState.sequenceStateIndex[IO](seqObsId1).getOption) - .map(_.toSequence.steps)).map { s => - assert(s.flatMap(_.get(0)).exists(_.status === StepState.Skipped)) - assert(s.flatMap(_.get(1)).exists(_.status === StepState.Skipped)) - assert(s.flatMap(_.get(2)).exists(_.status === StepState.Completed)) - } - } - - test("ObserveEngine startFrom should not start the sequence if there is a resource conflict") { - val s0 = (ODBSequencesLoader.loadSequenceEndo[IO]( - None, - sequenceWithResources(seqObsId1, Instrument.GmosNorth, Set(Instrument.GmosNorth, TCS)), - EngineState.instrumentLoaded(Instrument.GmosNorth) - ) >>> - ODBSequencesLoader.loadSequenceEndo[IO]( - None, - sequenceWithResources(seqObsId2, Instrument.GmosSouth, Set(Instrument.GmosSouth, TCS)), - EngineState.instrumentLoaded(Instrument.GmosSouth) - ) >>> - EngineState - .sequenceStateIndex[IO](seqObsId1) - .andThen(Sequence.State.status[IO]) - .replace(SequenceState.Running.Init)).apply(EngineState.default[IO]) - - val runStepId = stepId(2) - - (for { - oe <- observeEngine - _ <- oe.startFrom( - seqObsId2, - Observer("Joe".refined), - runStepId, - clientId, - RunOverride.Default - ) - sf <- oe - .stream(s0) - .map(_._2) - .takeThrough(_.sequences.get(seqObsId2).exists(_.seq.status.isRunning)) - .compile - .last - } yield sf - .flatMap(EngineState.sequenceStateIndex[IO](seqObsId2).getOption) - .exists(_.status.isIdle)).assert - } - private def testTargetSequence(targetName: NonEmptyString): SequenceGen[IO] = { val resources: Set[Resource | Instrument] = Set(Instrument.GmosNorth, TCS) @@ -625,96 +551,6 @@ class ObserveEngineSuite extends TestCommon { .exists(_.status.isRunning)).assert } - test("ObserveEngine start should startFrom the sequence if it passes the target check") { - val seq = testTargetSequence("proof".refined) - - val s0 = ODBSequencesLoader - .loadSequenceEndo[IO]( - None, - seq, - EngineState.instrumentLoaded(Instrument.GmosNorth) - ) - .apply(EngineState.default[IO]) - - (for { - systems <- systemsWithTargetName("proof") - oe <- ObserveEngine.build(Site.GN, systems, defaultSettings) - sf <- advanceOne(oe, - s0, - oe.startFrom( - seqObsId1, - Observer("Joe".refined), - stepId(2), - clientId, - RunOverride.Default - ) - ) - } yield sf - .flatMap(EngineState.sequenceStateIndex[IO](seqObsId1).getOption) - .exists(_.status.isRunning)).assert - } - - test( - "ObserveEngine start should not startFrom the sequence if it doesn't pass the target check" - ) { - val seq = testTargetSequence("proof".refined) - - val s0 = ODBSequencesLoader - .loadSequenceEndo[IO]( - None, - seq, - EngineState.instrumentLoaded(Instrument.GmosNorth) - ) - .apply(EngineState.default[IO]) - - (for { - systems <- systemsWithTargetName("proof1") - oe <- ObserveEngine.build(Site.GN, systems, defaultSettings) - sf <- advanceOne(oe, - s0, - oe.startFrom( - seqObsId1, - Observer("Joe".refined), - stepId(2), - clientId, - RunOverride.Default - ) - ) - } yield sf - .flatMap(EngineState.sequenceStateIndex[IO](seqObsId1).getOption) - .exists(_.status.isIdle)).assert - } - - test( - "ObserveEngine start should startFrom the sequence if it doesn't pass the target check but forced" - ) { - val seq = testTargetSequence("proof".refined) - - val s0 = ODBSequencesLoader - .loadSequenceEndo[IO]( - None, - seq, - EngineState.instrumentLoaded(Instrument.GmosNorth) - ) - .apply(EngineState.default[IO]) - - (for { - systems <- systemsWithTargetName("proof1") - oe <- ObserveEngine.build(Site.GN, systems, defaultSettings) - sf <- advanceOne(oe, - s0, - oe.startFrom( - seqObsId1, - Observer("Joe".refined), - stepId(2), - clientId, - RunOverride.Override - ) - ) - } yield sf - .flatMap(EngineState.sequenceStateIndex[IO](seqObsId1).getOption) - .exists(_.status.isRunning)).assert - } // test( // it should "not check target for calibrations" in { // val systems = systemsWithTargetName("other") diff --git a/modules/server_new/src/test/scala/observe/server/SeqTranslateSuite.scala b/modules/server_new/src/test/scala/observe/server/SeqTranslateSuite.scala index af6358191..3bd8f4a9c 100644 --- a/modules/server_new/src/test/scala/observe/server/SeqTranslateSuite.scala +++ b/modules/server_new/src/test/scala/observe/server/SeqTranslateSuite.scala @@ -80,7 +80,7 @@ class SeqTranslateSuite extends TestCommon { if (cond(st)) st else st match { - case EngineStep.Zipper(_, _, _, p :: ps, f, d, _) => + case EngineStep.Zipper(_, _, p :: ps, f, d, _) => advanceStepUntil( st.copy( pending = ps, @@ -118,7 +118,7 @@ class SeqTranslateSuite extends TestCommon { ), cond ) - case _ => st + case _ => st } val baseState: EngineState[IO] = diff --git a/modules/web/client/src/main/scala/observe/ui/components/sequence/SequenceTable.scala b/modules/web/client/src/main/scala/observe/ui/components/sequence/SequenceTable.scala index 5763919f4..4baf15e90 100644 --- a/modules/web/client/src/main/scala/observe/ui/components/sequence/SequenceTable.scala +++ b/modules/web/client/src/main/scala/observe/ui/components/sequence/SequenceTable.scala @@ -371,11 +371,11 @@ private sealed trait SequenceTableBuilder[S: Eq, D <: DynamicConfig: Eq] ObserveStyles.StepRowFirstInAtom.when_(step.isFirstInAtom), ObserveStyles.StepRowPossibleFuture.when_(step.stepTime === StepTime.Future), step.stepState match - case s if s.hasError => ObserveStyles.StepRowError - case StepState.Paused | StepState.Skipped => ObserveStyles.StepRowWarning - case StepState.Completed => ObserveStyles.StepRowDone - case StepState.Aborted => ObserveStyles.StepRowError - case _ => TagMod.empty + case s if s.hasError => ObserveStyles.StepRowError + case StepState.Paused => ObserveStyles.StepRowWarning + case StepState.Completed => ObserveStyles.StepRowDone + case StepState.Aborted => ObserveStyles.StepRowError + case _ => TagMod.empty ) .orEmpty diff --git a/modules/web/server/src/main/scala/observe/web/server/http4s/ObserveCommandRoutes.scala b/modules/web/server/src/main/scala/observe/web/server/http4s/ObserveCommandRoutes.scala index 9b189c1be..b7084e9dd 100644 --- a/modules/web/server/src/main/scala/observe/web/server/http4s/ObserveCommandRoutes.scala +++ b/modules/web/server/src/main/scala/observe/web/server/http4s/ObserveCommandRoutes.scala @@ -47,17 +47,6 @@ class ObserveCommandRoutes[F[_]: Async: Compression]( ssoClient.require(req): user => oe.configSystem(obsId, obs, user, stepId, resource, clientId) *> NoContent() - case req @ POST -> Root / ObsIdVar(obsId) / StepIdVar(stepId) / ClientIDVar(clientId) / - "startFrom" / ObserverVar(obs) :? OptionalRunOverride(runOverride) => - ssoClient.require(req): _ => - oe.startFrom( - obsId, - obs, - stepId, - clientId, - runOverride.getOrElse(RunOverride.Default) - ) *> NoContent() - // In a number of endpoints, clientId is not used but we keep it anyway so that it's logged. case req @ POST -> Root / ObsIdVar(obsId) / ClientIDVar(clientId) / "pause" / ObserverVar(obs) => diff --git a/modules/web/server/src/test/scala/observe/web/server/http4s/ObserveCommandRoutesSuite.scala b/modules/web/server/src/test/scala/observe/web/server/http4s/ObserveCommandRoutesSuite.scala index 2ee60254d..1d51fe5d3 100644 --- a/modules/web/server/src/test/scala/observe/web/server/http4s/ObserveCommandRoutesSuite.scala +++ b/modules/web/server/src/test/scala/observe/web/server/http4s/ObserveCommandRoutesSuite.scala @@ -273,18 +273,6 @@ class ObserveCommandRoutesSuite extends munit.CatsEffectSuite with TestRoutes: yield l.map(_.status) assertIO(r, Some(Status.NoContent)) - test("start sequence from"): - val uri = Uri.unsafeFromString( - s"/${obsId.show}/${stepId.show}/${clientId.value}/startFrom/observer" - ) - val r = for - engine <- TestObserveEngine.build[IO] - s <- commandRoutes(engine) - wsb <- WebSocketBuilder2[IO] - l <- s(Request[IO](method = Method.POST, uri = uri)).value - yield l.map(_.status) - assertIO(r, Some(Status.NoContent)) - test("pause sequence"): val uri = Uri.unsafeFromString(s"/${obsId.show}/${clientId.value}/pause/observer") val r = for diff --git a/modules/web/server/src/test/scala/observe/web/server/http4s/TestObserveEngine.scala b/modules/web/server/src/test/scala/observe/web/server/http4s/TestObserveEngine.scala index f3ad2645f..7a6cb1176 100644 --- a/modules/web/server/src/test/scala/observe/web/server/http4s/TestObserveEngine.scala +++ b/modules/web/server/src/test/scala/observe/web/server/http4s/TestObserveEngine.scala @@ -42,14 +42,6 @@ class TestObserveEngine[F[_]: Sync: Logger](sys: Systems[F]) extends ObserveEngi runOverride: RunOverride ): F[Unit] = Applicative[F].unit - override def startFrom( - id: Id, - observer: Observer, - stp: Step.Id, - clientId: ClientId, - runOverride: RunOverride - ): F[Unit] = Applicative[F].unit - override def requestPause( id: Id, observer: Observer, @@ -135,14 +127,6 @@ class TestObserveEngine[F[_]: Sync: Logger](sys: Systems[F]) extends ObserveEngi override def setCloudExtinction(cc: CloudExtinction, user: User, clientId: ClientId): F[Unit] = Applicative[F].unit - override def setSkipMark( - seqId: Id, - user: User, - observer: Observer, - stepId: Step.Id, - v: Boolean - ): F[Unit] = Applicative[F].unit - override def requestRefresh(clientId: ClientId): F[Unit] = Applicative[F].unit override def stopObserve( From 656f42456a25e114ef40d92653aedb13ec82a33f Mon Sep 17 00:00:00 2001 From: Todd Burnside Date: Wed, 16 Oct 2024 14:59:43 -0700 Subject: [PATCH 15/37] And a step to install sbt to the docker CI workflow --- .github/workflows/ci.yml | 3 +++ build.sbt | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 248e67429..b5da3cc1f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -114,6 +114,9 @@ jobs: - name: Checkout current branch (fast) uses: actions/checkout@v4 + - name: Setup SBT + uses: sbt/setup-sbt@v1 + - name: Setup Java (temurin@17) id: setup-java-temurin-17 if: matrix.java == 'temurin@17' diff --git a/build.sbt b/build.sbt index 3fbc2a088..91272445a 100644 --- a/build.sbt +++ b/build.sbt @@ -74,6 +74,11 @@ lazy val dockerHubLogin = name = Some("Login to Docker Hub") ) +lazy val setupSbt = WorkflowStep.Use( + UseRef.Public("sbt", "setup-sbt", "v1"), + name = Some("Setup SBT") +) + lazy val sbtDockerPublish = WorkflowStep.Sbt( List("deploy/docker:publish"), @@ -96,6 +101,7 @@ ThisBuild / githubWorkflowAddedJobs += "deploy", "Build and publish Docker image / Deploy to Heroku", WorkflowStep.Checkout :: + setupSbt :: WorkflowStep.SetupJava(githubWorkflowJavaVersions.value.toList.take(1)) ::: setupNodeNpmInstall ::: dockerHubLogin :: From 14bfc0caf557906a812e34d7ef7333d7a45b5cbc Mon Sep 17 00:00:00 2001 From: "lucuma-steward[bot]" <106720676+lucuma-steward[bot]@users.noreply.github.com> Date: Thu, 17 Oct 2024 12:17:26 +0000 Subject: [PATCH 16/37] Update lucuma-ui, lucuma-ui-testkit to 0.118.1 --- project/Settings.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Settings.scala b/project/Settings.scala index 11ef1aab5..7ec2fee82 100644 --- a/project/Settings.scala +++ b/project/Settings.scala @@ -50,7 +50,7 @@ object Settings { // Gemini Libraries val lucumaCore = "0.105.1" - val lucumaUI = "0.117.0" + val lucumaUI = "0.118.1" val lucumaSchemas = "0.102.0" val lucumaSSO = "0.6.23" val lucumaODBSchema = "0.13.0" From db051f2987d7753583fad23f2d95be0ef8693342 Mon Sep 17 00:00:00 2001 From: "lucuma-steward[bot]" <106720676+lucuma-steward[bot]@users.noreply.github.com> Date: Sun, 20 Oct 2024 01:00:18 +0000 Subject: [PATCH 17/37] Update sbt to 1.10.3 --- project/build.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/build.properties b/project/build.properties index 0b699c305..bc7390601 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.2 +sbt.version=1.10.3 From 37809ef0001737d8474849da3e8799942ac07475 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <106720676+lucuma-steward[bot]@users.noreply.github.com> Date: Tue, 22 Oct 2024 07:46:47 +0000 Subject: [PATCH 18/37] flake.lock: Update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flake lock file updates: • Updated input 'typelevel-nix': 'github:typelevel/typelevel-nix/8cfcc7d06402b98fed90ee4cbb4e10afc2c22bc0' (2024-09-03) → 'github:typelevel/typelevel-nix/51e89c0ef21bcddf215263f6a70580aa43dff015' (2024-10-14) • Updated input 'typelevel-nix/devshell': 'github:numtide/devshell/67cce7359e4cd3c45296fb4aaf6a19e2a9c757ae' (2024-07-27) → 'github:numtide/devshell/dd6b80932022cea34a019e2bb32f6fa9e494dfef' (2024-10-07) • Updated input 'typelevel-nix/flake-utils': 'github:numtide/flake-utils/b1d9ab70662946ef0850d488da1c9019f3a9752a' (2024-03-11) → 'github:numtide/flake-utils/c1dfcf08411b08f6b8615f7d8971a2bfa81d5e8a' (2024-09-17) • Updated input 'typelevel-nix/nixpkgs': 'github:nixos/nixpkgs/b833ff01a0d694b910daca6e2ff4a3f26dee478c' (2024-09-01) → 'github:nixos/nixpkgs/b69de56fac8c2b6f8fd27f2eca01dcda8e0a4221' (2024-10-10) --- flake.lock | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/flake.lock b/flake.lock index 3c05181b6..2d73e4ea9 100644 --- a/flake.lock +++ b/flake.lock @@ -8,11 +8,11 @@ ] }, "locked": { - "lastModified": 1722113426, - "narHash": "sha256-Yo/3loq572A8Su6aY5GP56knpuKYRvM2a1meP9oJZCw=", + "lastModified": 1728330715, + "narHash": "sha256-xRJ2nPOXb//u1jaBnDP56M7v5ldavjbtR6lfGqSvcKg=", "owner": "numtide", "repo": "devshell", - "rev": "67cce7359e4cd3c45296fb4aaf6a19e2a9c757ae", + "rev": "dd6b80932022cea34a019e2bb32f6fa9e494dfef", "type": "github" }, "original": { @@ -26,11 +26,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1710146030, - "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", + "lastModified": 1726560853, + "narHash": "sha256-X6rJYSESBVr3hBoH0WbKE5KvhPU5bloyZ2L4K60/fPQ=", "owner": "numtide", "repo": "flake-utils", - "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", + "rev": "c1dfcf08411b08f6b8615f7d8971a2bfa81d5e8a", "type": "github" }, "original": { @@ -41,11 +41,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1725194671, - "narHash": "sha256-tLGCFEFTB5TaOKkpfw3iYT9dnk4awTP/q4w+ROpMfuw=", + "lastModified": 1728538411, + "narHash": "sha256-f0SBJz1eZ2yOuKUr5CA9BHULGXVSn6miBuUWdTyhUhU=", "owner": "nixos", "repo": "nixpkgs", - "rev": "b833ff01a0d694b910daca6e2ff4a3f26dee478c", + "rev": "b69de56fac8c2b6f8fd27f2eca01dcda8e0a4221", "type": "github" }, "original": { @@ -90,11 +90,11 @@ "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1725377366, - "narHash": "sha256-MhIqd8DyUBLrNfAVC/sBhKdfLHCnLWIRbhNIrCf5/lo=", + "lastModified": 1728921068, + "narHash": "sha256-EThEbbbXhfBgsiOEhdeqPKx9+GWRMc5iM4VqY/aDS6k=", "owner": "typelevel", "repo": "typelevel-nix", - "rev": "8cfcc7d06402b98fed90ee4cbb4e10afc2c22bc0", + "rev": "51e89c0ef21bcddf215263f6a70580aa43dff015", "type": "github" }, "original": { From fcb6572df07784d220735f3e218dc2804ecea75b Mon Sep 17 00:00:00 2001 From: "lucuma-steward[bot]" <106720676+lucuma-steward[bot]@users.noreply.github.com> Date: Tue, 22 Oct 2024 16:13:33 +0000 Subject: [PATCH 19/37] Update lucuma-core, lucuma-core-testkit to 0.105.5 --- project/Settings.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Settings.scala b/project/Settings.scala index 2aa28e43d..3fc32aa33 100644 --- a/project/Settings.scala +++ b/project/Settings.scala @@ -49,7 +49,7 @@ object Settings { val pprint = "0.9.0" // Gemini Libraries - val lucumaCore = "0.105.1" + val lucumaCore = "0.105.5" val lucumaUI = "0.118.1" val lucumaSchemas = "0.102.0" val lucumaSSO = "0.6.25" From 2645aa5c7d44e28ce2c9043de8886e0179a7fe65 Mon Sep 17 00:00:00 2001 From: "lucuma-steward[bot]" <106720676+lucuma-steward[bot]@users.noreply.github.com> Date: Tue, 22 Oct 2024 16:13:46 +0000 Subject: [PATCH 20/37] Update lucuma-odb-schema to 0.14.0 --- project/Settings.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Settings.scala b/project/Settings.scala index 2aa28e43d..d20662370 100644 --- a/project/Settings.scala +++ b/project/Settings.scala @@ -53,7 +53,7 @@ object Settings { val lucumaUI = "0.118.1" val lucumaSchemas = "0.102.0" val lucumaSSO = "0.6.25" - val lucumaODBSchema = "0.13.1" + val lucumaODBSchema = "0.14.0" // Clue val clue = "0.40.0" From 3067797ae79f8657b1180632772c1b8542609ceb Mon Sep 17 00:00:00 2001 From: "lucuma-steward[bot]" <106720676+lucuma-steward[bot]@users.noreply.github.com> Date: Tue, 22 Oct 2024 20:14:00 +0000 Subject: [PATCH 21/37] Update scala3-library, ... to 3.5.2 --- .github/workflows/ci.yml | 2 +- build.sbt | 4 ++-- modules/web/client/vite.config.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a9891d2fb..676fd05ad 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -107,7 +107,7 @@ jobs: strategy: matrix: os: [ubuntu-latest] - scala: [3.5.1] + scala: [3.5.2] java: [temurin@17] runs-on: ${{ matrix.os }} steps: diff --git a/build.sbt b/build.sbt index 02e9794d7..07e5cbe4c 100644 --- a/build.sbt +++ b/build.sbt @@ -117,8 +117,8 @@ ThisBuild / lucumaCssExts += "svg" Global / onChangedBuildSource := ReloadOnSourceChanges ThisBuild / scalafixDependencies += "edu.gemini" % "lucuma-schemas_3" % LibraryVersions.lucumaSchemas -ThisBuild / scalaVersion := "3.5.1" -ThisBuild / crossScalaVersions := Seq("3.5.1") +ThisBuild / scalaVersion := "3.5.2" +ThisBuild / crossScalaVersions := Seq("3.5.2") ThisBuild / scalacOptions ++= Seq("-language:implicitConversions") ThisBuild / scalafixResolvers += coursierapi.MavenRepository.of( "https://s01.oss.sonatype.org/content/repositories/snapshots/" diff --git a/modules/web/client/vite.config.js b/modules/web/client/vite.config.js index f1080fc7c..4248caad9 100644 --- a/modules/web/client/vite.config.js +++ b/modules/web/client/vite.config.js @@ -46,7 +46,7 @@ const pathExists = async (path) => { // https://vitejs.dev/config/ export default defineConfig(async ({ mode }) => { - const scalaClassesDir = path.resolve(__dirname, 'target/scala-3.5.1'); + const scalaClassesDir = path.resolve(__dirname, 'target/scala-3.5.2'); const isProduction = mode == 'production'; const sjs = isProduction ? path.resolve(scalaClassesDir, 'observe_web_client-opt') From 5ff72a559993dc267fa23547e4684cba71bafd45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20L=C3=BChrs?= Date: Wed, 23 Oct 2024 16:40:22 -0300 Subject: [PATCH 22/37] Added new conditions keywords. --- .../observe/model/enums/KeywordName.scala | 2697 ++++++----------- .../scala/observe/server/SeqTranslate.scala | 5 +- .../server/keywords/ConditionOps.scala | 56 + .../server/keywords/ObsKeywordReader.scala | 13 +- .../server/keywords/StandardHeader.scala | 55 +- modules/web/client/package-lock.json | 1182 +++++--- 6 files changed, 1712 insertions(+), 2296 deletions(-) create mode 100644 modules/server_new/src/main/scala/observe/server/keywords/ConditionOps.scala diff --git a/modules/model/shared/src/main/scala/observe/model/enums/KeywordName.scala b/modules/model/shared/src/main/scala/observe/model/enums/KeywordName.scala index 2a4cd1516..86c0761f7 100644 --- a/modules/model/shared/src/main/scala/observe/model/enums/KeywordName.scala +++ b/modules/model/shared/src/main/scala/observe/model/enums/KeywordName.scala @@ -3,3568 +3,2695 @@ package observe.model.enums -import cats.syntax.eq.* import lucuma.core.util.Enumerated /** * Enumerated type for Fits Keyword names. * @group Enumerations (Generated) */ -sealed abstract class KeywordName( +enum KeywordName( val tag: String, val name: String -) extends Product - with Serializable +) derives Enumerated { -object KeywordName { + /** @group Constructors */ + case INSTRUMENT extends KeywordName("INSTRUMENT", "INSTRUME") + + /** @group Constructors */ + case SW_NAME extends KeywordName("SW_NAME", "SW_NAME") + + case SW_VER extends KeywordName("SW_VER", "SW_VER") /** @group Constructors */ - case object INSTRUMENT extends KeywordName("INSTRUMENT", "INSTRUME") + case OBJECT extends KeywordName("OBJECT", "OBJECT") /** @group Constructors */ - case object SW_NAME extends KeywordName("SW_NAME", "SW_NAME") + case OBSTYPE extends KeywordName("OBSTYPE", "OBSTYPE") - case object SW_VER extends KeywordName("SW_VER", "SW_VER") + /** @group Constructors */ + case OBSCLASS extends KeywordName("OBSCLASS", "OBSCLASS") /** @group Constructors */ - case object OBJECT extends KeywordName("OBJECT", "OBJECT") + case GEMPRGID extends KeywordName("GEMPRGID", "GEMPRGID") /** @group Constructors */ - case object OBSTYPE extends KeywordName("OBSTYPE", "OBSTYPE") + case OBSID extends KeywordName("OBSID", "OBSID") /** @group Constructors */ - case object OBSCLASS extends KeywordName("OBSCLASS", "OBSCLASS") + case DATALAB extends KeywordName("DATALAB", "DATALAB") /** @group Constructors */ - case object GEMPRGID extends KeywordName("GEMPRGID", "GEMPRGID") + case OBSERVER extends KeywordName("OBSERVER", "OBSERVER") /** @group Constructors */ - case object OBSID extends KeywordName("OBSID", "OBSID") + case OBSERVAT extends KeywordName("OBSERVAT", "OBSERVAT") /** @group Constructors */ - case object DATALAB extends KeywordName("DATALAB", "DATALAB") + case TELESCOP extends KeywordName("TELESCOP", "TELESCOP") /** @group Constructors */ - case object OBSERVER extends KeywordName("OBSERVER", "OBSERVER") + case PARALLAX extends KeywordName("PARALLAX", "PARALLAX") /** @group Constructors */ - case object OBSERVAT extends KeywordName("OBSERVAT", "OBSERVAT") + case RADVEL extends KeywordName("RADVEL", "RADVEL") /** @group Constructors */ - case object TELESCOP extends KeywordName("TELESCOP", "TELESCOP") + case EPOCH extends KeywordName("EPOCH", "EPOCH") /** @group Constructors */ - case object PARALLAX extends KeywordName("PARALLAX", "PARALLAX") + case EQUINOX extends KeywordName("EQUINOX", "EQUINOX") /** @group Constructors */ - case object RADVEL extends KeywordName("RADVEL", "RADVEL") + case TRKEQUIN extends KeywordName("TRKEQUIN", "TRKEQUIN") /** @group Constructors */ - case object EPOCH extends KeywordName("EPOCH", "EPOCH") + case SSA extends KeywordName("SSA", "SSA") /** @group Constructors */ - case object EQUINOX extends KeywordName("EQUINOX", "EQUINOX") + case RA extends KeywordName("RA", "RA") /** @group Constructors */ - case object TRKEQUIN extends KeywordName("TRKEQUIN", "TRKEQUIN") + case DEC extends KeywordName("DEC", "DEC") /** @group Constructors */ - case object SSA extends KeywordName("SSA", "SSA") + case ELEVATIO extends KeywordName("ELEVATIO", "ELEVATIO") /** @group Constructors */ - case object RA extends KeywordName("RA", "RA") + case AZIMUTH extends KeywordName("AZIMUTH", "AZIMUTH") /** @group Constructors */ - case object DEC extends KeywordName("DEC", "DEC") + case CRPA extends KeywordName("CRPA", "CRPA") /** @group Constructors */ - case object ELEVATIO extends KeywordName("ELEVATIO", "ELEVATIO") + case HA extends KeywordName("HA", "HA") /** @group Constructors */ - case object AZIMUTH extends KeywordName("AZIMUTH", "AZIMUTH") + case LT extends KeywordName("LT", "LT") /** @group Constructors */ - case object CRPA extends KeywordName("CRPA", "CRPA") + case TRKFRAME extends KeywordName("TRKFRAME", "TRKFRAME") /** @group Constructors */ - case object HA extends KeywordName("HA", "HA") + case DECTRACK extends KeywordName("DECTRACK", "DECTRACK") /** @group Constructors */ - case object LT extends KeywordName("LT", "LT") + case TRKEPOCH extends KeywordName("TRKEPOCH", "TRKEPOCH") /** @group Constructors */ - case object TRKFRAME extends KeywordName("TRKFRAME", "TRKFRAME") + case RATRACK extends KeywordName("RATRACK", "RATRACK") /** @group Constructors */ - case object DECTRACK extends KeywordName("DECTRACK", "DECTRACK") + case FRAME extends KeywordName("FRAME", "FRAME") /** @group Constructors */ - case object TRKEPOCH extends KeywordName("TRKEPOCH", "TRKEPOCH") + case PMDEC extends KeywordName("PMDEC", "PMDEC") /** @group Constructors */ - case object RATRACK extends KeywordName("RATRACK", "RATRACK") + case PMRA extends KeywordName("PMRA", "PMRA") /** @group Constructors */ - case object FRAME extends KeywordName("FRAME", "FRAME") + case WAVELENG extends KeywordName("WAVELENG", "WAVELENG") /** @group Constructors */ - case object PMDEC extends KeywordName("PMDEC", "PMDEC") + case RAWIQ extends KeywordName("RAWIQ", "RAWIQ") /** @group Constructors */ - case object PMRA extends KeywordName("PMRA", "PMRA") + case RAWCC extends KeywordName("RAWCC", "RAWCC") /** @group Constructors */ - case object WAVELENG extends KeywordName("WAVELENG", "WAVELENG") + case RAWWV extends KeywordName("RAWWV", "RAWWV") /** @group Constructors */ - case object RAWIQ extends KeywordName("RAWIQ", "RAWIQ") + case RAWBG extends KeywordName("RAWBG", "RAWBG") /** @group Constructors */ - case object RAWCC extends KeywordName("RAWCC", "RAWCC") + case RAWDIQ extends KeywordName("RAWDIQ", "RAWDIQ") /** @group Constructors */ - case object RAWWV extends KeywordName("RAWWV", "RAWWV") + case RAWDCC extends KeywordName("RAWDCC", "RAWDCC") /** @group Constructors */ - case object RAWBG extends KeywordName("RAWBG", "RAWBG") + case RAWDWV extends KeywordName("RAWDWV", "RAWDWV") /** @group Constructors */ - case object RAWPIREQ extends KeywordName("RAWPIREQ", "RAWPIREQ") + case RAWDBG extends KeywordName("RAWDBG", "RAWDBG") /** @group Constructors */ - case object RAWGEMQA extends KeywordName("RAWGEMQA", "RAWGEMQA") + case RAWPIREQ extends KeywordName("RAWPIREQ", "RAWPIREQ") /** @group Constructors */ - case object CGUIDMOD extends KeywordName("CGUIDMOD", "CGUIDMOD") + case RAWGEMQA extends KeywordName("RAWGEMQA", "RAWGEMQA") /** @group Constructors */ - case object UT extends KeywordName("UT", "UT") + case CGUIDMOD extends KeywordName("CGUIDMOD", "CGUIDMOD") /** @group Constructors */ - case object DATE extends KeywordName("DATE", "DATE") + case UT extends KeywordName("UT", "UT") /** @group Constructors */ - case object M2BAFFLE extends KeywordName("M2BAFFLE", "M2BAFFLE") + case DATE extends KeywordName("DATE", "DATE") /** @group Constructors */ - case object M2CENBAF extends KeywordName("M2CENBAF", "M2CENBAF") + case M2BAFFLE extends KeywordName("M2BAFFLE", "M2BAFFLE") /** @group Constructors */ - case object ST extends KeywordName("ST", "ST") + case M2CENBAF extends KeywordName("M2CENBAF", "M2CENBAF") /** @group Constructors */ - case object XOFFSET extends KeywordName("XOFFSET", "XOFFSET") + case ST extends KeywordName("ST", "ST") /** @group Constructors */ - case object YOFFSET extends KeywordName("YOFFSET", "YOFFSET") + case XOFFSET extends KeywordName("XOFFSET", "XOFFSET") /** @group Constructors */ - case object POFFSET extends KeywordName("POFFSET", "POFFSET") + case YOFFSET extends KeywordName("YOFFSET", "YOFFSET") /** @group Constructors */ - case object QOFFSET extends KeywordName("QOFFSET", "QOFFSET") + case POFFSET extends KeywordName("POFFSET", "POFFSET") /** @group Constructors */ - case object RAOFFSET extends KeywordName("RAOFFSET", "RAOFFSET") + case QOFFSET extends KeywordName("QOFFSET", "QOFFSET") /** @group Constructors */ - case object DECOFFSE extends KeywordName("DECOFFSE", "DECOFFSE") + case RAOFFSET extends KeywordName("RAOFFSET", "RAOFFSET") /** @group Constructors */ - case object RATRGOFF extends KeywordName("RATRGOFF", "RATRGOFF") + case DECOFFSE extends KeywordName("DECOFFSE", "DECOFFSE") /** @group Constructors */ - case object DECTRGOF extends KeywordName("DECTRGOF", "DECTRGOF") + case RATRGOFF extends KeywordName("RATRGOFF", "RATRGOFF") /** @group Constructors */ - case object PA extends KeywordName("PA", "PA") + case DECTRGOF extends KeywordName("DECTRGOF", "DECTRGOF") /** @group Constructors */ - case object IAA extends KeywordName("IAA", "IAA") + case PA extends KeywordName("PA", "PA") /** @group Constructors */ - case object SFRT2 extends KeywordName("SFRT2", "SFRT2") + case IAA extends KeywordName("IAA", "IAA") /** @group Constructors */ - case object SFTILT extends KeywordName("SFTILT", "SFTILT") + case SFRT2 extends KeywordName("SFRT2", "SFRT2") /** @group Constructors */ - case object SFLINEAR extends KeywordName("SFLINEAR", "SFLINEAR") + case SFTILT extends KeywordName("SFTILT", "SFTILT") /** @group Constructors */ - case object AOFOLD extends KeywordName("AOFOLD", "AOFOLD") + case SFLINEAR extends KeywordName("SFLINEAR", "SFLINEAR") /** @group Constructors */ - case object PWFS1_ST extends KeywordName("PWFS1_ST", "PWFS1_ST") + case AOFOLD extends KeywordName("AOFOLD", "AOFOLD") /** @group Constructors */ - case object PWFS2_ST extends KeywordName("PWFS2_ST", "PWFS2_ST") + case PWFS1_ST extends KeywordName("PWFS1_ST", "PWFS1_ST") /** @group Constructors */ - case object OIWFS_ST extends KeywordName("OIWFS_ST", "OIWFS_ST") + case PWFS2_ST extends KeywordName("PWFS2_ST", "PWFS2_ST") /** @group Constructors */ - case object AOWFS_ST extends KeywordName("AOWFS_ST", "AOWFS_ST") + case OIWFS_ST extends KeywordName("OIWFS_ST", "OIWFS_ST") /** @group Constructors */ - case object SCIBAND extends KeywordName("SCIBAND", "SCIBAND") + case AOWFS_ST extends KeywordName("AOWFS_ST", "AOWFS_ST") /** @group Constructors */ - case object NUMREQTW extends KeywordName("NUMREQTW", "NUMREQTW") + case SCIBAND extends KeywordName("SCIBAND", "SCIBAND") /** @group Constructors */ - case object REQIQ extends KeywordName("REQIQ", "REQIQ") + case NUMREQTW extends KeywordName("NUMREQTW", "NUMREQTW") /** @group Constructors */ - case object REQCC extends KeywordName("REQCC", "REQCC") + case REQIQ extends KeywordName("REQIQ", "REQIQ") /** @group Constructors */ - case object REQBG extends KeywordName("REQBG", "REQBG") + case REQCC extends KeywordName("REQCC", "REQCC") /** @group Constructors */ - case object REQWV extends KeywordName("REQWV", "REQWV") + case REQBG extends KeywordName("REQBG", "REQBG") /** @group Constructors */ - case object REQMAXAM extends KeywordName("REQMAXAM", "REQMAXAM") + case REQWV extends KeywordName("REQWV", "REQWV") /** @group Constructors */ - case object REQMAXHA extends KeywordName("REQMAXHA", "REQMAXHA") + case REQDIQ extends KeywordName("REQDIQ", "REQDIQ") /** @group Constructors */ - case object REQMINAM extends KeywordName("REQMINAM", "REQMINAM") + case REQDCC extends KeywordName("REQDCC", "REQDCC") /** @group Constructors */ - case object REQMINHA extends KeywordName("REQMINHA", "REQMINHA") + case REQDBG extends KeywordName("REQDBG", "REQDBG") /** @group Constructors */ - case object OIARA extends KeywordName("OIARA", "OIARA") + case REQDWV extends KeywordName("REQDWV", "REQDWV") /** @group Constructors */ - case object OIADEC extends KeywordName("OIADEC", "OIADEC") + case REQMAXAM extends KeywordName("REQMAXAM", "REQMAXAM") /** @group Constructors */ - case object OIARV extends KeywordName("OIARV", "OIARV") + case REQMAXHA extends KeywordName("REQMAXHA", "REQMAXHA") /** @group Constructors */ - case object OIAWAVEL extends KeywordName("OIAWAVEL", "OIAWAVEL") + case REQMINAM extends KeywordName("REQMINAM", "REQMINAM") /** @group Constructors */ - case object OIAEPOCH extends KeywordName("OIAEPOCH", "OIAEPOCH") + case REQMINHA extends KeywordName("REQMINHA", "REQMINHA") /** @group Constructors */ - case object OIAEQUIN extends KeywordName("OIAEQUIN", "OIAEQUIN") + case OIARA extends KeywordName("OIARA", "OIARA") /** @group Constructors */ - case object OIAFRAME extends KeywordName("OIAFRAME", "OIAFRAME") + case OIADEC extends KeywordName("OIADEC", "OIADEC") /** @group Constructors */ - case object OIAOBJEC extends KeywordName("OIAOBJEC", "OIAOBJEC") + case OIARV extends KeywordName("OIARV", "OIARV") /** @group Constructors */ - case object OIAPMDEC extends KeywordName("OIAPMDEC", "OIAPMDEC") + case OIAWAVEL extends KeywordName("OIAWAVEL", "OIAWAVEL") /** @group Constructors */ - case object OIAPMRA extends KeywordName("OIAPMRA", "OIAPMRA") + case OIAEPOCH extends KeywordName("OIAEPOCH", "OIAEPOCH") /** @group Constructors */ - case object OIAPARAL extends KeywordName("OIAPARAL", "OIAPARAL") + case OIAEQUIN extends KeywordName("OIAEQUIN", "OIAEQUIN") /** @group Constructors */ - case object OIFOCUS extends KeywordName("OIFOCUS", "OIFOCUS") + case OIAFRAME extends KeywordName("OIAFRAME", "OIAFRAME") /** @group Constructors */ - case object P1ARA extends KeywordName("P1ARA", "P1ARA") + case OIAOBJEC extends KeywordName("OIAOBJEC", "OIAOBJEC") /** @group Constructors */ - case object P1ADEC extends KeywordName("P1ADEC", "P1ADEC") + case OIAPMDEC extends KeywordName("OIAPMDEC", "OIAPMDEC") /** @group Constructors */ - case object P1ARV extends KeywordName("P1ARV", "P1ARV") + case OIAPMRA extends KeywordName("OIAPMRA", "OIAPMRA") /** @group Constructors */ - case object P1AWAVEL extends KeywordName("P1AWAVEL", "P1AWAVEL") + case OIAPARAL extends KeywordName("OIAPARAL", "OIAPARAL") /** @group Constructors */ - case object P1AEPOCH extends KeywordName("P1AEPOCH", "P1AEPOCH") + case OIFOCUS extends KeywordName("OIFOCUS", "OIFOCUS") /** @group Constructors */ - case object P1AEQUIN extends KeywordName("P1AEQUIN", "P1AEQUIN") + case P1ARA extends KeywordName("P1ARA", "P1ARA") /** @group Constructors */ - case object P1AFRAME extends KeywordName("P1AFRAME", "P1AFRAME") + case P1ADEC extends KeywordName("P1ADEC", "P1ADEC") /** @group Constructors */ - case object P1AOBJEC extends KeywordName("P1AOBJEC", "P1AOBJEC") + case P1ARV extends KeywordName("P1ARV", "P1ARV") /** @group Constructors */ - case object P1APMDEC extends KeywordName("P1APMDEC", "P1APMDEC") + case P1AWAVEL extends KeywordName("P1AWAVEL", "P1AWAVEL") /** @group Constructors */ - case object P1APMRA extends KeywordName("P1APMRA", "P1APMRA") + case P1AEPOCH extends KeywordName("P1AEPOCH", "P1AEPOCH") /** @group Constructors */ - case object P1APARAL extends KeywordName("P1APARAL", "P1APARAL") + case P1AEQUIN extends KeywordName("P1AEQUIN", "P1AEQUIN") /** @group Constructors */ - case object P1FOCUS extends KeywordName("P1FOCUS", "P1FOCUS") + case P1AFRAME extends KeywordName("P1AFRAME", "P1AFRAME") /** @group Constructors */ - case object P2ARA extends KeywordName("P2ARA", "P2ARA") + case P1AOBJEC extends KeywordName("P1AOBJEC", "P1AOBJEC") /** @group Constructors */ - case object P2ADEC extends KeywordName("P2ADEC", "P2ADEC") + case P1APMDEC extends KeywordName("P1APMDEC", "P1APMDEC") /** @group Constructors */ - case object P2ARV extends KeywordName("P2ARV", "P2ARV") + case P1APMRA extends KeywordName("P1APMRA", "P1APMRA") /** @group Constructors */ - case object P2AWAVEL extends KeywordName("P2AWAVEL", "P2AWAVEL") + case P1APARAL extends KeywordName("P1APARAL", "P1APARAL") /** @group Constructors */ - case object P2AEPOCH extends KeywordName("P2AEPOCH", "P2AEPOCH") + case P1FOCUS extends KeywordName("P1FOCUS", "P1FOCUS") /** @group Constructors */ - case object P2AEQUIN extends KeywordName("P2AEQUIN", "P2AEQUIN") + case P2ARA extends KeywordName("P2ARA", "P2ARA") /** @group Constructors */ - case object P2AFRAME extends KeywordName("P2AFRAME", "P2AFRAME") + case P2ADEC extends KeywordName("P2ADEC", "P2ADEC") /** @group Constructors */ - case object P2AOBJEC extends KeywordName("P2AOBJEC", "P2AOBJEC") + case P2ARV extends KeywordName("P2ARV", "P2ARV") /** @group Constructors */ - case object P2APMDEC extends KeywordName("P2APMDEC", "P2APMDEC") + case P2AWAVEL extends KeywordName("P2AWAVEL", "P2AWAVEL") /** @group Constructors */ - case object P2APMRA extends KeywordName("P2APMRA", "P2APMRA") + case P2AEPOCH extends KeywordName("P2AEPOCH", "P2AEPOCH") /** @group Constructors */ - case object P2APARAL extends KeywordName("P2APARAL", "P2APARAL") + case P2AEQUIN extends KeywordName("P2AEQUIN", "P2AEQUIN") /** @group Constructors */ - case object P2FOCUS extends KeywordName("P2FOCUS", "P2FOCUS") + case P2AFRAME extends KeywordName("P2AFRAME", "P2AFRAME") /** @group Constructors */ - case object AOARA extends KeywordName("AOARA", "AOARA") + case P2AOBJEC extends KeywordName("P2AOBJEC", "P2AOBJEC") /** @group Constructors */ - case object AOADEC extends KeywordName("AOADEC", "AOADEC") + case P2APMDEC extends KeywordName("P2APMDEC", "P2APMDEC") /** @group Constructors */ - case object AOARV extends KeywordName("AOARV", "AOARV") + case P2APMRA extends KeywordName("P2APMRA", "P2APMRA") /** @group Constructors */ - case object AOAWAVEL extends KeywordName("AOAWAVEL", "AOAWAVEL") + case P2APARAL extends KeywordName("P2APARAL", "P2APARAL") /** @group Constructors */ - case object AOAEPOCH extends KeywordName("AOAEPOCH", "AOAEPOCH") + case P2FOCUS extends KeywordName("P2FOCUS", "P2FOCUS") /** @group Constructors */ - case object AOAEQUIN extends KeywordName("AOAEQUIN", "AOAEQUIN") + case AOARA extends KeywordName("AOARA", "AOARA") /** @group Constructors */ - case object AOAFRAME extends KeywordName("AOAFRAME", "AOAFRAME") + case AOADEC extends KeywordName("AOADEC", "AOADEC") /** @group Constructors */ - case object AOAOBJEC extends KeywordName("AOAOBJEC", "AOAOBJEC") + case AOARV extends KeywordName("AOARV", "AOARV") /** @group Constructors */ - case object AOAPMDEC extends KeywordName("AOAPMDEC", "AOAPMDEC") + case AOAWAVEL extends KeywordName("AOAWAVEL", "AOAWAVEL") /** @group Constructors */ - case object AOAPMRA extends KeywordName("AOAPMRA", "AOAPMRA") + case AOAEPOCH extends KeywordName("AOAEPOCH", "AOAEPOCH") /** @group Constructors */ - case object AOAPARAL extends KeywordName("AOAPARAL", "AOAPARAL") + case AOAEQUIN extends KeywordName("AOAEQUIN", "AOAEQUIN") /** @group Constructors */ - case object AOFOCUS extends KeywordName("AOFOCUS", "AOFOCUS") + case AOAFRAME extends KeywordName("AOAFRAME", "AOAFRAME") /** @group Constructors */ - case object OIFREQ extends KeywordName("OIFREQ", "OIFREQ") + case AOAOBJEC extends KeywordName("AOAOBJEC", "AOAOBJEC") /** @group Constructors */ - case object P1FREQ extends KeywordName("P1FREQ", "P1FREQ") + case AOAPMDEC extends KeywordName("AOAPMDEC", "AOAPMDEC") /** @group Constructors */ - case object P2FREQ extends KeywordName("P2FREQ", "P2FREQ") + case AOAPMRA extends KeywordName("AOAPMRA", "AOAPMRA") /** @group Constructors */ - case object AIRMASS extends KeywordName("AIRMASS", "AIRMASS") + case AOAPARAL extends KeywordName("AOAPARAL", "AOAPARAL") /** @group Constructors */ - case object AMSTART extends KeywordName("AMSTART", "AMSTART") + case AOFOCUS extends KeywordName("AOFOCUS", "AOFOCUS") /** @group Constructors */ - case object AMEND extends KeywordName("AMEND", "AMEND") + case OIFREQ extends KeywordName("OIFREQ", "OIFREQ") /** @group Constructors */ - case object PROP_MD extends KeywordName("PROP_MD", "PROP_MD") + case P1FREQ extends KeywordName("P1FREQ", "P1FREQ") /** @group Constructors */ - case object RELEASE extends KeywordName("RELEASE", "RELEASE") + case P2FREQ extends KeywordName("P2FREQ", "P2FREQ") /** @group Constructors */ - case object PREIMAGE extends KeywordName("PREIMAGE", "PREIMAGE") + case AIRMASS extends KeywordName("AIRMASS", "AIRMASS") /** @group Constructors */ - case object DATE_OBS extends KeywordName("DATE_OBS", "DATE-OBS") + case AMSTART extends KeywordName("AMSTART", "AMSTART") /** @group Constructors */ - case object TIME_OBS extends KeywordName("TIME_OBS", "TIME-OBS") + case AMEND extends KeywordName("AMEND", "AMEND") /** @group Constructors */ - case object READMODE extends KeywordName("READMODE", "READMODE") + case PROP_MD extends KeywordName("PROP_MD", "PROP_MD") /** @group Constructors */ - case object NREADS extends KeywordName("NREADS", "NREADS") + case RELEASE extends KeywordName("RELEASE", "RELEASE") /** @group Constructors */ - case object GCALLAMP extends KeywordName("GCALLAMP", "GCALLAMP") + case PREIMAGE extends KeywordName("PREIMAGE", "PREIMAGE") /** @group Constructors */ - case object GCALFILT extends KeywordName("GCALFILT", "GCALFILT") + case DATE_OBS extends KeywordName("DATE_OBS", "DATE-OBS") /** @group Constructors */ - case object GCALDIFF extends KeywordName("GCALDIFF", "GCALDIFF") + case TIME_OBS extends KeywordName("TIME_OBS", "TIME-OBS") /** @group Constructors */ - case object GCALSHUT extends KeywordName("GCALSHUT", "GCALSHUT") + case READMODE extends KeywordName("READMODE", "READMODE") /** @group Constructors */ - case object PAR_ANG extends KeywordName("PAR_ANG", "PAR_ANG") + case NREADS extends KeywordName("NREADS", "NREADS") /** @group Constructors */ - case object INPORT extends KeywordName("INPORT", "INPORT") + case GCALLAMP extends KeywordName("GCALLAMP", "GCALLAMP") /** @group Constructors */ - case object ASTROMTC extends KeywordName("ASTROMTC", "ASTROMTC") + case GCALFILT extends KeywordName("GCALFILT", "GCALFILT") /** @group Constructors */ - case object CRFOLLOW extends KeywordName("CRFOLLOW", "CRFOLLOW") + case GCALDIFF extends KeywordName("GCALDIFF", "GCALDIFF") /** @group Constructors */ - case object HUMIDITY extends KeywordName("HUMIDITY", "HUMIDITY") + case GCALSHUT extends KeywordName("GCALSHUT", "GCALSHUT") /** @group Constructors */ - case object TAMBIENT extends KeywordName("TAMBIENT", "TAMBIENT") + case PAR_ANG extends KeywordName("PAR_ANG", "PAR_ANG") /** @group Constructors */ - case object TAMBIEN2 extends KeywordName("TAMBIEN2", "TAMBIEN2") + case INPORT extends KeywordName("INPORT", "INPORT") /** @group Constructors */ - case object PRESSURE extends KeywordName("PRESSURE", "PRESSURE") + case ASTROMTC extends KeywordName("ASTROMTC", "ASTROMTC") /** @group Constructors */ - case object PRESSUR2 extends KeywordName("PRESSUR2", "PRESSUR2") + case CRFOLLOW extends KeywordName("CRFOLLOW", "CRFOLLOW") /** @group Constructors */ - case object DEWPOINT extends KeywordName("DEWPOINT", "DEWPOINT") + case HUMIDITY extends KeywordName("HUMIDITY", "HUMIDITY") /** @group Constructors */ - case object DEWPOIN2 extends KeywordName("DEWPOIN2", "DEWPOIN2") + case TAMBIENT extends KeywordName("TAMBIENT", "TAMBIENT") /** @group Constructors */ - case object WINDSPEE extends KeywordName("WINDSPEE", "WINDSPEE") + case TAMBIEN2 extends KeywordName("TAMBIEN2", "TAMBIEN2") /** @group Constructors */ - case object WINDSPE2 extends KeywordName("WINDSPE2", "WINDSPE2") + case PRESSURE extends KeywordName("PRESSURE", "PRESSURE") /** @group Constructors */ - case object WINDDIRE extends KeywordName("WINDDIRE", "WINDDIRE") + case PRESSUR2 extends KeywordName("PRESSUR2", "PRESSUR2") /** @group Constructors */ - case object ARRAYID extends KeywordName("ARRAYID", "ARRAYID") + case DEWPOINT extends KeywordName("DEWPOINT", "DEWPOINT") /** @group Constructors */ - case object ARRAYTYP extends KeywordName("ARRAYTYP", "ARRAYTYP") + case DEWPOIN2 extends KeywordName("DEWPOIN2", "DEWPOIN2") /** @group Constructors */ - case object UTSTART extends KeywordName("UTSTART", "UTSTART") + case WINDSPEE extends KeywordName("WINDSPEE", "WINDSPEE") /** @group Constructors */ - case object FILTER1 extends KeywordName("FILTER1", "FILTER1") + case WINDSPE2 extends KeywordName("WINDSPE2", "WINDSPE2") /** @group Constructors */ - case object FW1_ENG extends KeywordName("FW1_ENG", "FW1_ENG") + case WINDDIRE extends KeywordName("WINDDIRE", "WINDDIRE") /** @group Constructors */ - case object FILTER2 extends KeywordName("FILTER2", "FILTER2") + case ARRAYID extends KeywordName("ARRAYID", "ARRAYID") /** @group Constructors */ - case object FW2_ENG extends KeywordName("FW2_ENG", "FW2_ENG") + case ARRAYTYP extends KeywordName("ARRAYTYP", "ARRAYTYP") /** @group Constructors */ - case object CAMERA extends KeywordName("CAMERA", "CAMERA") + case UTSTART extends KeywordName("UTSTART", "UTSTART") /** @group Constructors */ - case object CAM_ENG extends KeywordName("CAM_ENG", "CAM_ENG") + case FILTER1 extends KeywordName("FILTER1", "FILTER1") /** @group Constructors */ - case object SLIT extends KeywordName("SLIT", "SLIT") + case FW1_ENG extends KeywordName("FW1_ENG", "FW1_ENG") /** @group Constructors */ - case object SLIT_ENG extends KeywordName("SLIT_ENG", "SLIT_ENG") + case FILTER2 extends KeywordName("FILTER2", "FILTER2") /** @group Constructors */ - case object DECKER extends KeywordName("DECKER", "DECKER") + case FW2_ENG extends KeywordName("FW2_ENG", "FW2_ENG") /** @group Constructors */ - case object DKR_ENG extends KeywordName("DKR_ENG", "DKR_ENG") + case CAMERA extends KeywordName("CAMERA", "CAMERA") /** @group Constructors */ - case object GRATING extends KeywordName("GRATING", "GRATING") + case CAM_ENG extends KeywordName("CAM_ENG", "CAM_ENG") /** @group Constructors */ - case object GR_ENG extends KeywordName("GR_ENG", "GR_ENG") + case SLIT extends KeywordName("SLIT", "SLIT") /** @group Constructors */ - case object GRATWAVE extends KeywordName("GRATWAVE", "GRATWAVE") + case SLIT_ENG extends KeywordName("SLIT_ENG", "SLIT_ENG") /** @group Constructors */ - case object GRATORD extends KeywordName("GRATORD", "GRATORD") + case DECKER extends KeywordName("DECKER", "DECKER") /** @group Constructors */ - case object GRATTILT extends KeywordName("GRATTILT", "GRATTILT") + case DKR_ENG extends KeywordName("DKR_ENG", "DKR_ENG") /** @group Constructors */ - case object PRISM extends KeywordName("PRISM", "PRISM") + case GRATING extends KeywordName("GRATING", "GRATING") /** @group Constructors */ - case object PRSM_ENG extends KeywordName("PRSM_ENG", "PRSM_ENG") + case GR_ENG extends KeywordName("GR_ENG", "GR_ENG") /** @group Constructors */ - case object ACQMIR extends KeywordName("ACQMIR", "ACQMIR") + case GRATWAVE extends KeywordName("GRATWAVE", "GRATWAVE") /** @group Constructors */ - case object COVER extends KeywordName("COVER", "COVER") + case GRATORD extends KeywordName("GRATORD", "GRATORD") /** @group Constructors */ - case object FOCUS extends KeywordName("FOCUS", "FOCUS") + case GRATTILT extends KeywordName("GRATTILT", "GRATTILT") /** @group Constructors */ - case object FCS_ENG extends KeywordName("FCS_ENG", "FCS_ENG") + case PRISM extends KeywordName("PRISM", "PRISM") /** @group Constructors */ - case object DETBIAS extends KeywordName("DETBIAS", "DETBIAS") + case PRSM_ENG extends KeywordName("PRSM_ENG", "PRSM_ENG") /** @group Constructors */ - case object UTEND extends KeywordName("UTEND", "UTEND") + case ACQMIR extends KeywordName("ACQMIR", "ACQMIR") /** @group Constructors */ - case object OBSEPOCH extends KeywordName("OBSEPOCH", "OBSEPOCH") + case COVER extends KeywordName("COVER", "COVER") /** @group Constructors */ - case object GMOSCC extends KeywordName("GMOSCC", "GMOSCC") + case FOCUS extends KeywordName("FOCUS", "FOCUS") /** @group Constructors */ - case object ADCENPST extends KeywordName("ADCENPST", "ADCENPST") + case FCS_ENG extends KeywordName("FCS_ENG", "FCS_ENG") /** @group Constructors */ - case object ADCENPEN extends KeywordName("ADCENPEN", "ADCENPEN") + case DETBIAS extends KeywordName("DETBIAS", "DETBIAS") /** @group Constructors */ - case object ADCENPME extends KeywordName("ADCENPME", "ADCENPME") + case UTEND extends KeywordName("UTEND", "UTEND") /** @group Constructors */ - case object ADCEXPST extends KeywordName("ADCEXPST", "ADCEXPST") + case OBSEPOCH extends KeywordName("OBSEPOCH", "OBSEPOCH") /** @group Constructors */ - case object ADCEXPEN extends KeywordName("ADCEXPEN", "ADCEXPEN") + case GMOSCC extends KeywordName("GMOSCC", "GMOSCC") /** @group Constructors */ - case object ADCEXPME extends KeywordName("ADCEXPME", "ADCEXPME") + case ADCENPST extends KeywordName("ADCENPST", "ADCENPST") /** @group Constructors */ - case object ADCWLEN1 extends KeywordName("ADCWLEN1", "ADCWLEN1") + case ADCENPEN extends KeywordName("ADCENPEN", "ADCENPEN") /** @group Constructors */ - case object ADCWLEN2 extends KeywordName("ADCWLEN2", "ADCWLEN2") + case ADCENPME extends KeywordName("ADCENPME", "ADCENPME") /** @group Constructors */ - case object MASKID extends KeywordName("MASKID", "MASKID") + case ADCEXPST extends KeywordName("ADCEXPST", "ADCEXPST") /** @group Constructors */ - case object MASKNAME extends KeywordName("MASKNAME", "MASKNAME") + case ADCEXPEN extends KeywordName("ADCEXPEN", "ADCEXPEN") /** @group Constructors */ - case object MASKTYP extends KeywordName("MASKTYP", "MASKTYP") + case ADCEXPME extends KeywordName("ADCEXPME", "ADCEXPME") /** @group Constructors */ - case object MASKLOC extends KeywordName("MASKLOC", "MASKLOC") + case ADCWLEN1 extends KeywordName("ADCWLEN1", "ADCWLEN1") /** @group Constructors */ - case object FILTID1 extends KeywordName("FILTID1", "FILTID1") + case ADCWLEN2 extends KeywordName("ADCWLEN2", "ADCWLEN2") /** @group Constructors */ - case object FILTID2 extends KeywordName("FILTID2", "FILTID2") + case MASKID extends KeywordName("MASKID", "MASKID") /** @group Constructors */ - case object GRATID extends KeywordName("GRATID", "GRATID") + case MASKNAME extends KeywordName("MASKNAME", "MASKNAME") /** @group Constructors */ - case object GRWLEN extends KeywordName("GRWLEN", "GRWLEN") + case MASKTYP extends KeywordName("MASKTYP", "MASKTYP") /** @group Constructors */ - case object CENTWAVE extends KeywordName("CENTWAVE", "CENTWAVE") + case MASKLOC extends KeywordName("MASKLOC", "MASKLOC") /** @group Constructors */ - case object GRORDER extends KeywordName("GRORDER", "GRORDER") + case FILTID1 extends KeywordName("FILTID1", "FILTID1") /** @group Constructors */ - case object GRTILT extends KeywordName("GRTILT", "GRTILT") + case FILTID2 extends KeywordName("FILTID2", "FILTID2") /** @group Constructors */ - case object GRSTEP extends KeywordName("GRSTEP", "GRSTEP") + case GRATID extends KeywordName("GRATID", "GRATID") /** @group Constructors */ - case object DTAX extends KeywordName("DTAX", "DTAX") + case GRWLEN extends KeywordName("GRWLEN", "GRWLEN") /** @group Constructors */ - case object DTAY extends KeywordName("DTAY", "DTAY") + case CENTWAVE extends KeywordName("CENTWAVE", "CENTWAVE") /** @group Constructors */ - case object DTAZ extends KeywordName("DTAZ", "DTAZ") + case GRORDER extends KeywordName("GRORDER", "GRORDER") /** @group Constructors */ - case object DTAZST extends KeywordName("DTAZST", "DTAZST") + case GRTILT extends KeywordName("GRTILT", "GRTILT") /** @group Constructors */ - case object DTAZEN extends KeywordName("DTAZEN", "DTAZEN") + case GRSTEP extends KeywordName("GRSTEP", "GRSTEP") /** @group Constructors */ - case object DTAZME extends KeywordName("DTAZME", "DTAZME") + case DTAX extends KeywordName("DTAX", "DTAX") /** @group Constructors */ - case object DTMODE extends KeywordName("DTMODE", "DTMODE") + case DTAY extends KeywordName("DTAY", "DTAY") /** @group Constructors */ - case object ADCMODE extends KeywordName("ADCMODE", "ADCMODE") + case DTAZ extends KeywordName("DTAZ", "DTAZ") /** @group Constructors */ - case object GMOSDC extends KeywordName("GMOSDC", "GMOSDC") + case DTAZST extends KeywordName("DTAZST", "DTAZST") /** @group Constructors */ - case object DETTYPE extends KeywordName("DETTYPE", "DETTYPE") + case DTAZEN extends KeywordName("DTAZEN", "DTAZEN") /** @group Constructors */ - case object DETID extends KeywordName("DETID", "DETID") + case DTAZME extends KeywordName("DTAZME", "DTAZME") /** @group Constructors */ - case object EXPOSURE extends KeywordName("EXPOSURE", "EXPOSURE") + case DTMODE extends KeywordName("DTMODE", "DTMODE") /** @group Constructors */ - case object ADCUSED extends KeywordName("ADCUSED", "ADCUSED") + case ADCMODE extends KeywordName("ADCMODE", "ADCMODE") /** @group Constructors */ - case object DETNROI extends KeywordName("DETNROI", "DETNROI") + case GMOSDC extends KeywordName("GMOSDC", "GMOSDC") /** @group Constructors */ - case object DETRO0X extends KeywordName("DETRO0X", "DETRO0X") + case DETTYPE extends KeywordName("DETTYPE", "DETTYPE") /** @group Constructors */ - case object DETRO0XS extends KeywordName("DETRO0XS", "DETRO0XS") + case DETID extends KeywordName("DETID", "DETID") /** @group Constructors */ - case object DETRO0Y extends KeywordName("DETRO0Y", "DETRO0Y") + case EXPOSURE extends KeywordName("EXPOSURE", "EXPOSURE") /** @group Constructors */ - case object DETRO0YS extends KeywordName("DETRO0YS", "DETRO0YS") + case ADCUSED extends KeywordName("ADCUSED", "ADCUSED") /** @group Constructors */ - case object DETRO1X extends KeywordName("DETRO1X", "DETRO1X") + case DETNROI extends KeywordName("DETNROI", "DETNROI") /** @group Constructors */ - case object DETRO1XS extends KeywordName("DETRO1XS", "DETRO1XS") + case DETRO0X extends KeywordName("DETRO0X", "DETRO0X") /** @group Constructors */ - case object DETRO1Y extends KeywordName("DETRO1Y", "DETRO1Y") + case DETRO0XS extends KeywordName("DETRO0XS", "DETRO0XS") /** @group Constructors */ - case object DETRO1YS extends KeywordName("DETRO1YS", "DETRO1YS") + case DETRO0Y extends KeywordName("DETRO0Y", "DETRO0Y") /** @group Constructors */ - case object DETRO2X extends KeywordName("DETRO2X", "DETRO2X") + case DETRO0YS extends KeywordName("DETRO0YS", "DETRO0YS") /** @group Constructors */ - case object DETRO2XS extends KeywordName("DETRO2XS", "DETRO2XS") + case DETRO1X extends KeywordName("DETRO1X", "DETRO1X") /** @group Constructors */ - case object DETRO2Y extends KeywordName("DETRO2Y", "DETRO2Y") + case DETRO1XS extends KeywordName("DETRO1XS", "DETRO1XS") /** @group Constructors */ - case object DETRO2YS extends KeywordName("DETRO2YS", "DETRO2YS") + case DETRO1Y extends KeywordName("DETRO1Y", "DETRO1Y") /** @group Constructors */ - case object DETRO3X extends KeywordName("DETRO3X", "DETRO3X") + case DETRO1YS extends KeywordName("DETRO1YS", "DETRO1YS") /** @group Constructors */ - case object DETRO3XS extends KeywordName("DETRO3XS", "DETRO3XS") + case DETRO2X extends KeywordName("DETRO2X", "DETRO2X") /** @group Constructors */ - case object DETRO3Y extends KeywordName("DETRO3Y", "DETRO3Y") + case DETRO2XS extends KeywordName("DETRO2XS", "DETRO2XS") /** @group Constructors */ - case object DETRO3YS extends KeywordName("DETRO3YS", "DETRO3YS") + case DETRO2Y extends KeywordName("DETRO2Y", "DETRO2Y") /** @group Constructors */ - case object DETRO4X extends KeywordName("DETRO4X", "DETRO4X") + case DETRO2YS extends KeywordName("DETRO2YS", "DETRO2YS") /** @group Constructors */ - case object DETRO4XS extends KeywordName("DETRO4XS", "DETRO4XS") + case DETRO3X extends KeywordName("DETRO3X", "DETRO3X") /** @group Constructors */ - case object DETRO4Y extends KeywordName("DETRO4Y", "DETRO4Y") + case DETRO3XS extends KeywordName("DETRO3XS", "DETRO3XS") /** @group Constructors */ - case object DETRO4YS extends KeywordName("DETRO4YS", "DETRO4YS") + case DETRO3Y extends KeywordName("DETRO3Y", "DETRO3Y") /** @group Constructors */ - case object DETRO5X extends KeywordName("DETRO5X", "DETRO5X") + case DETRO3YS extends KeywordName("DETRO3YS", "DETRO3YS") /** @group Constructors */ - case object DETRO5XS extends KeywordName("DETRO5XS", "DETRO5XS") + case DETRO4X extends KeywordName("DETRO4X", "DETRO4X") /** @group Constructors */ - case object DETRO5Y extends KeywordName("DETRO5Y", "DETRO5Y") + case DETRO4XS extends KeywordName("DETRO4XS", "DETRO4XS") /** @group Constructors */ - case object DETRO5YS extends KeywordName("DETRO5YS", "DETRO5YS") + case DETRO4Y extends KeywordName("DETRO4Y", "DETRO4Y") /** @group Constructors */ - case object DETRO6X extends KeywordName("DETRO6X", "DETRO6X") + case DETRO4YS extends KeywordName("DETRO4YS", "DETRO4YS") /** @group Constructors */ - case object DETRO6XS extends KeywordName("DETRO6XS", "DETRO6XS") + case DETRO5X extends KeywordName("DETRO5X", "DETRO5X") /** @group Constructors */ - case object DETRO6Y extends KeywordName("DETRO6Y", "DETRO6Y") + case DETRO5XS extends KeywordName("DETRO5XS", "DETRO5XS") /** @group Constructors */ - case object DETRO6YS extends KeywordName("DETRO6YS", "DETRO6YS") + case DETRO5Y extends KeywordName("DETRO5Y", "DETRO5Y") /** @group Constructors */ - case object DETRO7X extends KeywordName("DETRO7X", "DETRO7X") + case DETRO5YS extends KeywordName("DETRO5YS", "DETRO5YS") /** @group Constructors */ - case object DETRO7XS extends KeywordName("DETRO7XS", "DETRO7XS") + case DETRO6X extends KeywordName("DETRO6X", "DETRO6X") /** @group Constructors */ - case object DETRO7Y extends KeywordName("DETRO7Y", "DETRO7Y") + case DETRO6XS extends KeywordName("DETRO6XS", "DETRO6XS") /** @group Constructors */ - case object DETRO7YS extends KeywordName("DETRO7YS", "DETRO7YS") + case DETRO6Y extends KeywordName("DETRO6Y", "DETRO6Y") /** @group Constructors */ - case object DETRO8X extends KeywordName("DETRO8X", "DETRO8X") + case DETRO6YS extends KeywordName("DETRO6YS", "DETRO6YS") /** @group Constructors */ - case object DETRO8XS extends KeywordName("DETRO8XS", "DETRO8XS") + case DETRO7X extends KeywordName("DETRO7X", "DETRO7X") /** @group Constructors */ - case object DETRO8Y extends KeywordName("DETRO8Y", "DETRO8Y") + case DETRO7XS extends KeywordName("DETRO7XS", "DETRO7XS") /** @group Constructors */ - case object DETRO8YS extends KeywordName("DETRO8YS", "DETRO8YS") + case DETRO7Y extends KeywordName("DETRO7Y", "DETRO7Y") /** @group Constructors */ - case object DETRO9X extends KeywordName("DETRO9X", "DETRO9X") + case DETRO7YS extends KeywordName("DETRO7YS", "DETRO7YS") /** @group Constructors */ - case object DETRO9XS extends KeywordName("DETRO9XS", "DETRO9XS") + case DETRO8X extends KeywordName("DETRO8X", "DETRO8X") /** @group Constructors */ - case object DETRO9Y extends KeywordName("DETRO9Y", "DETRO9Y") + case DETRO8XS extends KeywordName("DETRO8XS", "DETRO8XS") /** @group Constructors */ - case object DETRO9YS extends KeywordName("DETRO9YS", "DETRO9YS") + case DETRO8Y extends KeywordName("DETRO8Y", "DETRO8Y") /** @group Constructors */ - case object REQTWS01 extends KeywordName("REQTWS01", "REQTWS01") + case DETRO8YS extends KeywordName("DETRO8YS", "DETRO8YS") /** @group Constructors */ - case object REQTWD01 extends KeywordName("REQTWD01", "REQTWD01") + case DETRO9X extends KeywordName("DETRO9X", "DETRO9X") /** @group Constructors */ - case object REQTWN01 extends KeywordName("REQTWN01", "REQTWN01") + case DETRO9XS extends KeywordName("DETRO9XS", "DETRO9XS") /** @group Constructors */ - case object REQTWP01 extends KeywordName("REQTWP01", "REQTWP01") + case DETRO9Y extends KeywordName("DETRO9Y", "DETRO9Y") /** @group Constructors */ - case object REQTWS02 extends KeywordName("REQTWS02", "REQTWS02") + case DETRO9YS extends KeywordName("DETRO9YS", "DETRO9YS") /** @group Constructors */ - case object REQTWD02 extends KeywordName("REQTWD02", "REQTWD02") + case REQTWS01 extends KeywordName("REQTWS01", "REQTWS01") /** @group Constructors */ - case object REQTWN02 extends KeywordName("REQTWN02", "REQTWN02") + case REQTWD01 extends KeywordName("REQTWD01", "REQTWD01") /** @group Constructors */ - case object REQTWP02 extends KeywordName("REQTWP02", "REQTWP02") + case REQTWN01 extends KeywordName("REQTWN01", "REQTWN01") /** @group Constructors */ - case object REQTWS03 extends KeywordName("REQTWS03", "REQTWS03") + case REQTWP01 extends KeywordName("REQTWP01", "REQTWP01") /** @group Constructors */ - case object REQTWD03 extends KeywordName("REQTWD03", "REQTWD03") + case REQTWS02 extends KeywordName("REQTWS02", "REQTWS02") /** @group Constructors */ - case object REQTWN03 extends KeywordName("REQTWN03", "REQTWN03") + case REQTWD02 extends KeywordName("REQTWD02", "REQTWD02") /** @group Constructors */ - case object REQTWP03 extends KeywordName("REQTWP03", "REQTWP03") + case REQTWN02 extends KeywordName("REQTWN02", "REQTWN02") /** @group Constructors */ - case object REQTWS04 extends KeywordName("REQTWS04", "REQTWS04") + case REQTWP02 extends KeywordName("REQTWP02", "REQTWP02") /** @group Constructors */ - case object REQTWD04 extends KeywordName("REQTWD04", "REQTWD04") + case REQTWS03 extends KeywordName("REQTWS03", "REQTWS03") /** @group Constructors */ - case object REQTWN04 extends KeywordName("REQTWN04", "REQTWN04") + case REQTWD03 extends KeywordName("REQTWD03", "REQTWD03") /** @group Constructors */ - case object REQTWP04 extends KeywordName("REQTWP04", "REQTWP04") + case REQTWN03 extends KeywordName("REQTWN03", "REQTWN03") /** @group Constructors */ - case object REQTWS05 extends KeywordName("REQTWS05", "REQTWS05") + case REQTWP03 extends KeywordName("REQTWP03", "REQTWP03") /** @group Constructors */ - case object REQTWD05 extends KeywordName("REQTWD05", "REQTWD05") + case REQTWS04 extends KeywordName("REQTWS04", "REQTWS04") /** @group Constructors */ - case object REQTWN05 extends KeywordName("REQTWN05", "REQTWN05") + case REQTWD04 extends KeywordName("REQTWD04", "REQTWD04") /** @group Constructors */ - case object REQTWP05 extends KeywordName("REQTWP05", "REQTWP05") + case REQTWN04 extends KeywordName("REQTWN04", "REQTWN04") /** @group Constructors */ - case object REQTWS06 extends KeywordName("REQTWS06", "REQTWS06") + case REQTWP04 extends KeywordName("REQTWP04", "REQTWP04") /** @group Constructors */ - case object REQTWD06 extends KeywordName("REQTWD06", "REQTWD06") + case REQTWS05 extends KeywordName("REQTWS05", "REQTWS05") /** @group Constructors */ - case object REQTWN06 extends KeywordName("REQTWN06", "REQTWN06") + case REQTWD05 extends KeywordName("REQTWD05", "REQTWD05") /** @group Constructors */ - case object REQTWP06 extends KeywordName("REQTWP06", "REQTWP06") + case REQTWN05 extends KeywordName("REQTWN05", "REQTWN05") /** @group Constructors */ - case object REQTWS07 extends KeywordName("REQTWS07", "REQTWS07") + case REQTWP05 extends KeywordName("REQTWP05", "REQTWP05") /** @group Constructors */ - case object REQTWD07 extends KeywordName("REQTWD07", "REQTWD07") + case REQTWS06 extends KeywordName("REQTWS06", "REQTWS06") /** @group Constructors */ - case object REQTWN07 extends KeywordName("REQTWN07", "REQTWN07") + case REQTWD06 extends KeywordName("REQTWD06", "REQTWD06") /** @group Constructors */ - case object REQTWP07 extends KeywordName("REQTWP07", "REQTWP07") + case REQTWN06 extends KeywordName("REQTWN06", "REQTWN06") /** @group Constructors */ - case object REQTWS08 extends KeywordName("REQTWS08", "REQTWS08") + case REQTWP06 extends KeywordName("REQTWP06", "REQTWP06") /** @group Constructors */ - case object REQTWD08 extends KeywordName("REQTWD08", "REQTWD08") + case REQTWS07 extends KeywordName("REQTWS07", "REQTWS07") /** @group Constructors */ - case object REQTWN08 extends KeywordName("REQTWN08", "REQTWN08") + case REQTWD07 extends KeywordName("REQTWD07", "REQTWD07") /** @group Constructors */ - case object REQTWP08 extends KeywordName("REQTWP08", "REQTWP08") + case REQTWN07 extends KeywordName("REQTWN07", "REQTWN07") /** @group Constructors */ - case object REQTWS09 extends KeywordName("REQTWS09", "REQTWS09") + case REQTWP07 extends KeywordName("REQTWP07", "REQTWP07") /** @group Constructors */ - case object REQTWD09 extends KeywordName("REQTWD09", "REQTWD09") + case REQTWS08 extends KeywordName("REQTWS08", "REQTWS08") /** @group Constructors */ - case object REQTWN09 extends KeywordName("REQTWN09", "REQTWN09") + case REQTWD08 extends KeywordName("REQTWD08", "REQTWD08") /** @group Constructors */ - case object REQTWP09 extends KeywordName("REQTWP09", "REQTWP09") + case REQTWN08 extends KeywordName("REQTWN08", "REQTWN08") /** @group Constructors */ - case object REQTWS10 extends KeywordName("REQTWS10", "REQTWS10") + case REQTWP08 extends KeywordName("REQTWP08", "REQTWP08") /** @group Constructors */ - case object REQTWD10 extends KeywordName("REQTWD10", "REQTWD10") + case REQTWS09 extends KeywordName("REQTWS09", "REQTWS09") /** @group Constructors */ - case object REQTWN10 extends KeywordName("REQTWN10", "REQTWN10") + case REQTWD09 extends KeywordName("REQTWD09", "REQTWD09") /** @group Constructors */ - case object REQTWP10 extends KeywordName("REQTWP10", "REQTWP10") + case REQTWN09 extends KeywordName("REQTWN09", "REQTWN09") /** @group Constructors */ - case object REQTWS11 extends KeywordName("REQTWS11", "REQTWS11") + case REQTWP09 extends KeywordName("REQTWP09", "REQTWP09") /** @group Constructors */ - case object REQTWD11 extends KeywordName("REQTWD11", "REQTWD11") + case REQTWS10 extends KeywordName("REQTWS10", "REQTWS10") /** @group Constructors */ - case object REQTWN11 extends KeywordName("REQTWN11", "REQTWN11") + case REQTWD10 extends KeywordName("REQTWD10", "REQTWD10") /** @group Constructors */ - case object REQTWP11 extends KeywordName("REQTWP11", "REQTWP11") + case REQTWN10 extends KeywordName("REQTWN10", "REQTWN10") /** @group Constructors */ - case object REQTWS12 extends KeywordName("REQTWS12", "REQTWS12") + case REQTWP10 extends KeywordName("REQTWP10", "REQTWP10") /** @group Constructors */ - case object REQTWD12 extends KeywordName("REQTWD12", "REQTWD12") + case REQTWS11 extends KeywordName("REQTWS11", "REQTWS11") /** @group Constructors */ - case object REQTWN12 extends KeywordName("REQTWN12", "REQTWN12") + case REQTWD11 extends KeywordName("REQTWD11", "REQTWD11") /** @group Constructors */ - case object REQTWP12 extends KeywordName("REQTWP12", "REQTWP12") + case REQTWN11 extends KeywordName("REQTWN11", "REQTWN11") /** @group Constructors */ - case object REQTWS13 extends KeywordName("REQTWS13", "REQTWS13") + case REQTWP11 extends KeywordName("REQTWP11", "REQTWP11") /** @group Constructors */ - case object REQTWD13 extends KeywordName("REQTWD13", "REQTWD13") + case REQTWS12 extends KeywordName("REQTWS12", "REQTWS12") /** @group Constructors */ - case object REQTWN13 extends KeywordName("REQTWN13", "REQTWN13") + case REQTWD12 extends KeywordName("REQTWD12", "REQTWD12") /** @group Constructors */ - case object REQTWP13 extends KeywordName("REQTWP13", "REQTWP13") + case REQTWN12 extends KeywordName("REQTWN12", "REQTWN12") /** @group Constructors */ - case object REQTWS14 extends KeywordName("REQTWS14", "REQTWS14") + case REQTWP12 extends KeywordName("REQTWP12", "REQTWP12") /** @group Constructors */ - case object REQTWD14 extends KeywordName("REQTWD14", "REQTWD14") + case REQTWS13 extends KeywordName("REQTWS13", "REQTWS13") /** @group Constructors */ - case object REQTWN14 extends KeywordName("REQTWN14", "REQTWN14") + case REQTWD13 extends KeywordName("REQTWD13", "REQTWD13") /** @group Constructors */ - case object REQTWP14 extends KeywordName("REQTWP14", "REQTWP14") + case REQTWN13 extends KeywordName("REQTWN13", "REQTWN13") /** @group Constructors */ - case object REQTWS15 extends KeywordName("REQTWS15", "REQTWS15") + case REQTWP13 extends KeywordName("REQTWP13", "REQTWP13") /** @group Constructors */ - case object REQTWD15 extends KeywordName("REQTWD15", "REQTWD15") + case REQTWS14 extends KeywordName("REQTWS14", "REQTWS14") /** @group Constructors */ - case object REQTWN15 extends KeywordName("REQTWN15", "REQTWN15") + case REQTWD14 extends KeywordName("REQTWD14", "REQTWD14") /** @group Constructors */ - case object REQTWP15 extends KeywordName("REQTWP15", "REQTWP15") + case REQTWN14 extends KeywordName("REQTWN14", "REQTWN14") /** @group Constructors */ - case object REQTWS16 extends KeywordName("REQTWS16", "REQTWS16") + case REQTWP14 extends KeywordName("REQTWP14", "REQTWP14") /** @group Constructors */ - case object REQTWD16 extends KeywordName("REQTWD16", "REQTWD16") + case REQTWS15 extends KeywordName("REQTWS15", "REQTWS15") /** @group Constructors */ - case object REQTWN16 extends KeywordName("REQTWN16", "REQTWN16") + case REQTWD15 extends KeywordName("REQTWD15", "REQTWD15") /** @group Constructors */ - case object REQTWP16 extends KeywordName("REQTWP16", "REQTWP16") + case REQTWN15 extends KeywordName("REQTWN15", "REQTWN15") /** @group Constructors */ - case object REQTWS17 extends KeywordName("REQTWS17", "REQTWS17") + case REQTWP15 extends KeywordName("REQTWP15", "REQTWP15") /** @group Constructors */ - case object REQTWD17 extends KeywordName("REQTWD17", "REQTWD17") + case REQTWS16 extends KeywordName("REQTWS16", "REQTWS16") /** @group Constructors */ - case object REQTWN17 extends KeywordName("REQTWN17", "REQTWN17") + case REQTWD16 extends KeywordName("REQTWD16", "REQTWD16") /** @group Constructors */ - case object REQTWP17 extends KeywordName("REQTWP17", "REQTWP17") + case REQTWN16 extends KeywordName("REQTWN16", "REQTWN16") /** @group Constructors */ - case object REQTWS18 extends KeywordName("REQTWS18", "REQTWS18") + case REQTWP16 extends KeywordName("REQTWP16", "REQTWP16") /** @group Constructors */ - case object REQTWD18 extends KeywordName("REQTWD18", "REQTWD18") + case REQTWS17 extends KeywordName("REQTWS17", "REQTWS17") /** @group Constructors */ - case object REQTWN18 extends KeywordName("REQTWN18", "REQTWN18") + case REQTWD17 extends KeywordName("REQTWD17", "REQTWD17") /** @group Constructors */ - case object REQTWP18 extends KeywordName("REQTWP18", "REQTWP18") + case REQTWN17 extends KeywordName("REQTWN17", "REQTWN17") /** @group Constructors */ - case object REQTWS19 extends KeywordName("REQTWS19", "REQTWS19") + case REQTWP17 extends KeywordName("REQTWP17", "REQTWP17") /** @group Constructors */ - case object REQTWD19 extends KeywordName("REQTWD19", "REQTWD19") + case REQTWS18 extends KeywordName("REQTWS18", "REQTWS18") /** @group Constructors */ - case object REQTWN19 extends KeywordName("REQTWN19", "REQTWN19") + case REQTWD18 extends KeywordName("REQTWD18", "REQTWD18") /** @group Constructors */ - case object REQTWP19 extends KeywordName("REQTWP19", "REQTWP19") + case REQTWN18 extends KeywordName("REQTWN18", "REQTWN18") /** @group Constructors */ - case object REQTWS20 extends KeywordName("REQTWS20", "REQTWS20") + case REQTWP18 extends KeywordName("REQTWP18", "REQTWP18") /** @group Constructors */ - case object REQTWD20 extends KeywordName("REQTWD20", "REQTWD20") + case REQTWS19 extends KeywordName("REQTWS19", "REQTWS19") /** @group Constructors */ - case object REQTWN20 extends KeywordName("REQTWN20", "REQTWN20") + case REQTWD19 extends KeywordName("REQTWD19", "REQTWD19") /** @group Constructors */ - case object REQTWP20 extends KeywordName("REQTWP20", "REQTWP20") + case REQTWN19 extends KeywordName("REQTWN19", "REQTWN19") /** @group Constructors */ - case object REQTWS21 extends KeywordName("REQTWS21", "REQTWS21") + case REQTWP19 extends KeywordName("REQTWP19", "REQTWP19") /** @group Constructors */ - case object REQTWD21 extends KeywordName("REQTWD21", "REQTWD21") + case REQTWS20 extends KeywordName("REQTWS20", "REQTWS20") /** @group Constructors */ - case object REQTWN21 extends KeywordName("REQTWN21", "REQTWN21") + case REQTWD20 extends KeywordName("REQTWD20", "REQTWD20") /** @group Constructors */ - case object REQTWP21 extends KeywordName("REQTWP21", "REQTWP21") + case REQTWN20 extends KeywordName("REQTWN20", "REQTWN20") /** @group Constructors */ - case object REQTWS22 extends KeywordName("REQTWS22", "REQTWS22") + case REQTWP20 extends KeywordName("REQTWP20", "REQTWP20") /** @group Constructors */ - case object REQTWD22 extends KeywordName("REQTWD22", "REQTWD22") + case REQTWS21 extends KeywordName("REQTWS21", "REQTWS21") /** @group Constructors */ - case object REQTWN22 extends KeywordName("REQTWN22", "REQTWN22") + case REQTWD21 extends KeywordName("REQTWD21", "REQTWD21") /** @group Constructors */ - case object REQTWP22 extends KeywordName("REQTWP22", "REQTWP22") + case REQTWN21 extends KeywordName("REQTWN21", "REQTWN21") /** @group Constructors */ - case object REQTWS23 extends KeywordName("REQTWS23", "REQTWS23") + case REQTWP21 extends KeywordName("REQTWP21", "REQTWP21") /** @group Constructors */ - case object REQTWD23 extends KeywordName("REQTWD23", "REQTWD23") + case REQTWS22 extends KeywordName("REQTWS22", "REQTWS22") /** @group Constructors */ - case object REQTWN23 extends KeywordName("REQTWN23", "REQTWN23") + case REQTWD22 extends KeywordName("REQTWD22", "REQTWD22") /** @group Constructors */ - case object REQTWP23 extends KeywordName("REQTWP23", "REQTWP23") + case REQTWN22 extends KeywordName("REQTWN22", "REQTWN22") /** @group Constructors */ - case object REQTWS24 extends KeywordName("REQTWS24", "REQTWS24") + case REQTWP22 extends KeywordName("REQTWP22", "REQTWP22") /** @group Constructors */ - case object REQTWD24 extends KeywordName("REQTWD24", "REQTWD24") + case REQTWS23 extends KeywordName("REQTWS23", "REQTWS23") /** @group Constructors */ - case object REQTWN24 extends KeywordName("REQTWN24", "REQTWN24") + case REQTWD23 extends KeywordName("REQTWD23", "REQTWD23") /** @group Constructors */ - case object REQTWP24 extends KeywordName("REQTWP24", "REQTWP24") + case REQTWN23 extends KeywordName("REQTWN23", "REQTWN23") /** @group Constructors */ - case object REQTWS25 extends KeywordName("REQTWS25", "REQTWS25") + case REQTWP23 extends KeywordName("REQTWP23", "REQTWP23") /** @group Constructors */ - case object REQTWD25 extends KeywordName("REQTWD25", "REQTWD25") + case REQTWS24 extends KeywordName("REQTWS24", "REQTWS24") /** @group Constructors */ - case object REQTWN25 extends KeywordName("REQTWN25", "REQTWN25") + case REQTWD24 extends KeywordName("REQTWD24", "REQTWD24") /** @group Constructors */ - case object REQTWP25 extends KeywordName("REQTWP25", "REQTWP25") + case REQTWN24 extends KeywordName("REQTWN24", "REQTWN24") /** @group Constructors */ - case object REQTWS26 extends KeywordName("REQTWS26", "REQTWS26") + case REQTWP24 extends KeywordName("REQTWP24", "REQTWP24") /** @group Constructors */ - case object REQTWD26 extends KeywordName("REQTWD26", "REQTWD26") + case REQTWS25 extends KeywordName("REQTWS25", "REQTWS25") /** @group Constructors */ - case object REQTWN26 extends KeywordName("REQTWN26", "REQTWN26") + case REQTWD25 extends KeywordName("REQTWD25", "REQTWD25") /** @group Constructors */ - case object REQTWP26 extends KeywordName("REQTWP26", "REQTWP26") + case REQTWN25 extends KeywordName("REQTWN25", "REQTWN25") /** @group Constructors */ - case object REQTWS27 extends KeywordName("REQTWS27", "REQTWS27") + case REQTWP25 extends KeywordName("REQTWP25", "REQTWP25") /** @group Constructors */ - case object REQTWD27 extends KeywordName("REQTWD27", "REQTWD27") + case REQTWS26 extends KeywordName("REQTWS26", "REQTWS26") /** @group Constructors */ - case object REQTWN27 extends KeywordName("REQTWN27", "REQTWN27") + case REQTWD26 extends KeywordName("REQTWD26", "REQTWD26") /** @group Constructors */ - case object REQTWP27 extends KeywordName("REQTWP27", "REQTWP27") + case REQTWN26 extends KeywordName("REQTWN26", "REQTWN26") /** @group Constructors */ - case object REQTWS28 extends KeywordName("REQTWS28", "REQTWS28") + case REQTWP26 extends KeywordName("REQTWP26", "REQTWP26") /** @group Constructors */ - case object REQTWD28 extends KeywordName("REQTWD28", "REQTWD28") + case REQTWS27 extends KeywordName("REQTWS27", "REQTWS27") /** @group Constructors */ - case object REQTWN28 extends KeywordName("REQTWN28", "REQTWN28") + case REQTWD27 extends KeywordName("REQTWD27", "REQTWD27") /** @group Constructors */ - case object REQTWP28 extends KeywordName("REQTWP28", "REQTWP28") + case REQTWN27 extends KeywordName("REQTWN27", "REQTWN27") /** @group Constructors */ - case object REQTWS29 extends KeywordName("REQTWS29", "REQTWS29") + case REQTWP27 extends KeywordName("REQTWP27", "REQTWP27") /** @group Constructors */ - case object REQTWD29 extends KeywordName("REQTWD29", "REQTWD29") + case REQTWS28 extends KeywordName("REQTWS28", "REQTWS28") /** @group Constructors */ - case object REQTWN29 extends KeywordName("REQTWN29", "REQTWN29") + case REQTWD28 extends KeywordName("REQTWD28", "REQTWD28") /** @group Constructors */ - case object REQTWP29 extends KeywordName("REQTWP29", "REQTWP29") + case REQTWN28 extends KeywordName("REQTWN28", "REQTWN28") /** @group Constructors */ - case object REQTWS30 extends KeywordName("REQTWS30", "REQTWS30") + case REQTWP28 extends KeywordName("REQTWP28", "REQTWP28") /** @group Constructors */ - case object REQTWD30 extends KeywordName("REQTWD30", "REQTWD30") + case REQTWS29 extends KeywordName("REQTWS29", "REQTWS29") /** @group Constructors */ - case object REQTWN30 extends KeywordName("REQTWN30", "REQTWN30") + case REQTWD29 extends KeywordName("REQTWD29", "REQTWD29") /** @group Constructors */ - case object REQTWP30 extends KeywordName("REQTWP30", "REQTWP30") + case REQTWN29 extends KeywordName("REQTWN29", "REQTWN29") /** @group Constructors */ - case object REQTWS31 extends KeywordName("REQTWS31", "REQTWS31") + case REQTWP29 extends KeywordName("REQTWP29", "REQTWP29") /** @group Constructors */ - case object REQTWD31 extends KeywordName("REQTWD31", "REQTWD31") + case REQTWS30 extends KeywordName("REQTWS30", "REQTWS30") /** @group Constructors */ - case object REQTWN31 extends KeywordName("REQTWN31", "REQTWN31") + case REQTWD30 extends KeywordName("REQTWD30", "REQTWD30") /** @group Constructors */ - case object REQTWP31 extends KeywordName("REQTWP31", "REQTWP31") + case REQTWN30 extends KeywordName("REQTWN30", "REQTWN30") /** @group Constructors */ - case object REQTWS32 extends KeywordName("REQTWS32", "REQTWS32") + case REQTWP30 extends KeywordName("REQTWP30", "REQTWP30") /** @group Constructors */ - case object REQTWD32 extends KeywordName("REQTWD32", "REQTWD32") + case REQTWS31 extends KeywordName("REQTWS31", "REQTWS31") /** @group Constructors */ - case object REQTWN32 extends KeywordName("REQTWN32", "REQTWN32") + case REQTWD31 extends KeywordName("REQTWD31", "REQTWD31") /** @group Constructors */ - case object REQTWP32 extends KeywordName("REQTWP32", "REQTWP32") + case REQTWN31 extends KeywordName("REQTWN31", "REQTWN31") /** @group Constructors */ - case object REQTWS33 extends KeywordName("REQTWS33", "REQTWS33") + case REQTWP31 extends KeywordName("REQTWP31", "REQTWP31") /** @group Constructors */ - case object REQTWD33 extends KeywordName("REQTWD33", "REQTWD33") + case REQTWS32 extends KeywordName("REQTWS32", "REQTWS32") /** @group Constructors */ - case object REQTWN33 extends KeywordName("REQTWN33", "REQTWN33") + case REQTWD32 extends KeywordName("REQTWD32", "REQTWD32") /** @group Constructors */ - case object REQTWP33 extends KeywordName("REQTWP33", "REQTWP33") + case REQTWN32 extends KeywordName("REQTWN32", "REQTWN32") /** @group Constructors */ - case object REQTWS34 extends KeywordName("REQTWS34", "REQTWS34") + case REQTWP32 extends KeywordName("REQTWP32", "REQTWP32") /** @group Constructors */ - case object REQTWD34 extends KeywordName("REQTWD34", "REQTWD34") + case REQTWS33 extends KeywordName("REQTWS33", "REQTWS33") /** @group Constructors */ - case object REQTWN34 extends KeywordName("REQTWN34", "REQTWN34") + case REQTWD33 extends KeywordName("REQTWD33", "REQTWD33") /** @group Constructors */ - case object REQTWP34 extends KeywordName("REQTWP34", "REQTWP34") + case REQTWN33 extends KeywordName("REQTWN33", "REQTWN33") /** @group Constructors */ - case object REQTWS35 extends KeywordName("REQTWS35", "REQTWS35") + case REQTWP33 extends KeywordName("REQTWP33", "REQTWP33") /** @group Constructors */ - case object REQTWD35 extends KeywordName("REQTWD35", "REQTWD35") + case REQTWS34 extends KeywordName("REQTWS34", "REQTWS34") /** @group Constructors */ - case object REQTWN35 extends KeywordName("REQTWN35", "REQTWN35") + case REQTWD34 extends KeywordName("REQTWD34", "REQTWD34") /** @group Constructors */ - case object REQTWP35 extends KeywordName("REQTWP35", "REQTWP35") + case REQTWN34 extends KeywordName("REQTWN34", "REQTWN34") /** @group Constructors */ - case object REQTWS36 extends KeywordName("REQTWS36", "REQTWS36") + case REQTWP34 extends KeywordName("REQTWP34", "REQTWP34") /** @group Constructors */ - case object REQTWD36 extends KeywordName("REQTWD36", "REQTWD36") + case REQTWS35 extends KeywordName("REQTWS35", "REQTWS35") /** @group Constructors */ - case object REQTWN36 extends KeywordName("REQTWN36", "REQTWN36") + case REQTWD35 extends KeywordName("REQTWD35", "REQTWD35") /** @group Constructors */ - case object REQTWP36 extends KeywordName("REQTWP36", "REQTWP36") + case REQTWN35 extends KeywordName("REQTWN35", "REQTWN35") /** @group Constructors */ - case object REQTWS37 extends KeywordName("REQTWS37", "REQTWS37") + case REQTWP35 extends KeywordName("REQTWP35", "REQTWP35") /** @group Constructors */ - case object REQTWD37 extends KeywordName("REQTWD37", "REQTWD37") + case REQTWS36 extends KeywordName("REQTWS36", "REQTWS36") /** @group Constructors */ - case object REQTWN37 extends KeywordName("REQTWN37", "REQTWN37") + case REQTWD36 extends KeywordName("REQTWD36", "REQTWD36") /** @group Constructors */ - case object REQTWP37 extends KeywordName("REQTWP37", "REQTWP37") + case REQTWN36 extends KeywordName("REQTWN36", "REQTWN36") /** @group Constructors */ - case object REQTWS38 extends KeywordName("REQTWS38", "REQTWS38") + case REQTWP36 extends KeywordName("REQTWP36", "REQTWP36") /** @group Constructors */ - case object REQTWD38 extends KeywordName("REQTWD38", "REQTWD38") + case REQTWS37 extends KeywordName("REQTWS37", "REQTWS37") /** @group Constructors */ - case object REQTWN38 extends KeywordName("REQTWN38", "REQTWN38") + case REQTWD37 extends KeywordName("REQTWD37", "REQTWD37") /** @group Constructors */ - case object REQTWP38 extends KeywordName("REQTWP38", "REQTWP38") + case REQTWN37 extends KeywordName("REQTWN37", "REQTWN37") /** @group Constructors */ - case object REQTWS39 extends KeywordName("REQTWS39", "REQTWS39") + case REQTWP37 extends KeywordName("REQTWP37", "REQTWP37") /** @group Constructors */ - case object REQTWD39 extends KeywordName("REQTWD39", "REQTWD39") + case REQTWS38 extends KeywordName("REQTWS38", "REQTWS38") /** @group Constructors */ - case object REQTWN39 extends KeywordName("REQTWN39", "REQTWN39") + case REQTWD38 extends KeywordName("REQTWD38", "REQTWD38") /** @group Constructors */ - case object REQTWP39 extends KeywordName("REQTWP39", "REQTWP39") + case REQTWN38 extends KeywordName("REQTWN38", "REQTWN38") /** @group Constructors */ - case object REQTWS40 extends KeywordName("REQTWS40", "REQTWS40") + case REQTWP38 extends KeywordName("REQTWP38", "REQTWP38") /** @group Constructors */ - case object REQTWD40 extends KeywordName("REQTWD40", "REQTWD40") + case REQTWS39 extends KeywordName("REQTWS39", "REQTWS39") /** @group Constructors */ - case object REQTWN40 extends KeywordName("REQTWN40", "REQTWN40") + case REQTWD39 extends KeywordName("REQTWD39", "REQTWD39") /** @group Constructors */ - case object REQTWP40 extends KeywordName("REQTWP40", "REQTWP40") + case REQTWN39 extends KeywordName("REQTWN39", "REQTWN39") /** @group Constructors */ - case object REQTWS41 extends KeywordName("REQTWS41", "REQTWS41") + case REQTWP39 extends KeywordName("REQTWP39", "REQTWP39") /** @group Constructors */ - case object REQTWD41 extends KeywordName("REQTWD41", "REQTWD41") + case REQTWS40 extends KeywordName("REQTWS40", "REQTWS40") /** @group Constructors */ - case object REQTWN41 extends KeywordName("REQTWN41", "REQTWN41") + case REQTWD40 extends KeywordName("REQTWD40", "REQTWD40") /** @group Constructors */ - case object REQTWP41 extends KeywordName("REQTWP41", "REQTWP41") + case REQTWN40 extends KeywordName("REQTWN40", "REQTWN40") /** @group Constructors */ - case object REQTWS42 extends KeywordName("REQTWS42", "REQTWS42") + case REQTWP40 extends KeywordName("REQTWP40", "REQTWP40") /** @group Constructors */ - case object REQTWD42 extends KeywordName("REQTWD42", "REQTWD42") + case REQTWS41 extends KeywordName("REQTWS41", "REQTWS41") /** @group Constructors */ - case object REQTWN42 extends KeywordName("REQTWN42", "REQTWN42") + case REQTWD41 extends KeywordName("REQTWD41", "REQTWD41") /** @group Constructors */ - case object REQTWP42 extends KeywordName("REQTWP42", "REQTWP42") + case REQTWN41 extends KeywordName("REQTWN41", "REQTWN41") /** @group Constructors */ - case object REQTWS43 extends KeywordName("REQTWS43", "REQTWS43") + case REQTWP41 extends KeywordName("REQTWP41", "REQTWP41") /** @group Constructors */ - case object REQTWD43 extends KeywordName("REQTWD43", "REQTWD43") + case REQTWS42 extends KeywordName("REQTWS42", "REQTWS42") /** @group Constructors */ - case object REQTWN43 extends KeywordName("REQTWN43", "REQTWN43") + case REQTWD42 extends KeywordName("REQTWD42", "REQTWD42") /** @group Constructors */ - case object REQTWP43 extends KeywordName("REQTWP43", "REQTWP43") + case REQTWN42 extends KeywordName("REQTWN42", "REQTWN42") /** @group Constructors */ - case object REQTWS44 extends KeywordName("REQTWS44", "REQTWS44") + case REQTWP42 extends KeywordName("REQTWP42", "REQTWP42") /** @group Constructors */ - case object REQTWD44 extends KeywordName("REQTWD44", "REQTWD44") + case REQTWS43 extends KeywordName("REQTWS43", "REQTWS43") /** @group Constructors */ - case object REQTWN44 extends KeywordName("REQTWN44", "REQTWN44") + case REQTWD43 extends KeywordName("REQTWD43", "REQTWD43") /** @group Constructors */ - case object REQTWP44 extends KeywordName("REQTWP44", "REQTWP44") + case REQTWN43 extends KeywordName("REQTWN43", "REQTWN43") /** @group Constructors */ - case object REQTWS45 extends KeywordName("REQTWS45", "REQTWS45") + case REQTWP43 extends KeywordName("REQTWP43", "REQTWP43") /** @group Constructors */ - case object REQTWD45 extends KeywordName("REQTWD45", "REQTWD45") + case REQTWS44 extends KeywordName("REQTWS44", "REQTWS44") /** @group Constructors */ - case object REQTWN45 extends KeywordName("REQTWN45", "REQTWN45") + case REQTWD44 extends KeywordName("REQTWD44", "REQTWD44") /** @group Constructors */ - case object REQTWP45 extends KeywordName("REQTWP45", "REQTWP45") + case REQTWN44 extends KeywordName("REQTWN44", "REQTWN44") /** @group Constructors */ - case object REQTWS46 extends KeywordName("REQTWS46", "REQTWS46") + case REQTWP44 extends KeywordName("REQTWP44", "REQTWP44") /** @group Constructors */ - case object REQTWD46 extends KeywordName("REQTWD46", "REQTWD46") + case REQTWS45 extends KeywordName("REQTWS45", "REQTWS45") /** @group Constructors */ - case object REQTWN46 extends KeywordName("REQTWN46", "REQTWN46") + case REQTWD45 extends KeywordName("REQTWD45", "REQTWD45") /** @group Constructors */ - case object REQTWP46 extends KeywordName("REQTWP46", "REQTWP46") + case REQTWN45 extends KeywordName("REQTWN45", "REQTWN45") /** @group Constructors */ - case object REQTWS47 extends KeywordName("REQTWS47", "REQTWS47") + case REQTWP45 extends KeywordName("REQTWP45", "REQTWP45") /** @group Constructors */ - case object REQTWD47 extends KeywordName("REQTWD47", "REQTWD47") + case REQTWS46 extends KeywordName("REQTWS46", "REQTWS46") /** @group Constructors */ - case object REQTWN47 extends KeywordName("REQTWN47", "REQTWN47") + case REQTWD46 extends KeywordName("REQTWD46", "REQTWD46") /** @group Constructors */ - case object REQTWP47 extends KeywordName("REQTWP47", "REQTWP47") + case REQTWN46 extends KeywordName("REQTWN46", "REQTWN46") /** @group Constructors */ - case object REQTWS48 extends KeywordName("REQTWS48", "REQTWS48") + case REQTWP46 extends KeywordName("REQTWP46", "REQTWP46") /** @group Constructors */ - case object REQTWD48 extends KeywordName("REQTWD48", "REQTWD48") + case REQTWS47 extends KeywordName("REQTWS47", "REQTWS47") /** @group Constructors */ - case object REQTWN48 extends KeywordName("REQTWN48", "REQTWN48") + case REQTWD47 extends KeywordName("REQTWD47", "REQTWD47") /** @group Constructors */ - case object REQTWP48 extends KeywordName("REQTWP48", "REQTWP48") + case REQTWN47 extends KeywordName("REQTWN47", "REQTWN47") /** @group Constructors */ - case object REQTWS49 extends KeywordName("REQTWS49", "REQTWS49") + case REQTWP47 extends KeywordName("REQTWP47", "REQTWP47") /** @group Constructors */ - case object REQTWD49 extends KeywordName("REQTWD49", "REQTWD49") + case REQTWS48 extends KeywordName("REQTWS48", "REQTWS48") /** @group Constructors */ - case object REQTWN49 extends KeywordName("REQTWN49", "REQTWN49") + case REQTWD48 extends KeywordName("REQTWD48", "REQTWD48") /** @group Constructors */ - case object REQTWP49 extends KeywordName("REQTWP49", "REQTWP49") + case REQTWN48 extends KeywordName("REQTWN48", "REQTWN48") /** @group Constructors */ - case object REQTWS50 extends KeywordName("REQTWS50", "REQTWS50") + case REQTWP48 extends KeywordName("REQTWP48", "REQTWP48") /** @group Constructors */ - case object REQTWD50 extends KeywordName("REQTWD50", "REQTWD50") + case REQTWS49 extends KeywordName("REQTWS49", "REQTWS49") /** @group Constructors */ - case object REQTWN50 extends KeywordName("REQTWN50", "REQTWN50") + case REQTWD49 extends KeywordName("REQTWD49", "REQTWD49") /** @group Constructors */ - case object REQTWP50 extends KeywordName("REQTWP50", "REQTWP50") + case REQTWN49 extends KeywordName("REQTWN49", "REQTWN49") /** @group Constructors */ - case object REQTWS51 extends KeywordName("REQTWS51", "REQTWS51") + case REQTWP49 extends KeywordName("REQTWP49", "REQTWP49") /** @group Constructors */ - case object REQTWD51 extends KeywordName("REQTWD51", "REQTWD51") + case REQTWS50 extends KeywordName("REQTWS50", "REQTWS50") /** @group Constructors */ - case object REQTWN51 extends KeywordName("REQTWN51", "REQTWN51") + case REQTWD50 extends KeywordName("REQTWD50", "REQTWD50") /** @group Constructors */ - case object REQTWP51 extends KeywordName("REQTWP51", "REQTWP51") + case REQTWN50 extends KeywordName("REQTWN50", "REQTWN50") /** @group Constructors */ - case object REQTWS52 extends KeywordName("REQTWS52", "REQTWS52") + case REQTWP50 extends KeywordName("REQTWP50", "REQTWP50") /** @group Constructors */ - case object REQTWD52 extends KeywordName("REQTWD52", "REQTWD52") + case REQTWS51 extends KeywordName("REQTWS51", "REQTWS51") /** @group Constructors */ - case object REQTWN52 extends KeywordName("REQTWN52", "REQTWN52") + case REQTWD51 extends KeywordName("REQTWD51", "REQTWD51") /** @group Constructors */ - case object REQTWP52 extends KeywordName("REQTWP52", "REQTWP52") + case REQTWN51 extends KeywordName("REQTWN51", "REQTWN51") /** @group Constructors */ - case object REQTWS53 extends KeywordName("REQTWS53", "REQTWS53") + case REQTWP51 extends KeywordName("REQTWP51", "REQTWP51") /** @group Constructors */ - case object REQTWD53 extends KeywordName("REQTWD53", "REQTWD53") + case REQTWS52 extends KeywordName("REQTWS52", "REQTWS52") /** @group Constructors */ - case object REQTWN53 extends KeywordName("REQTWN53", "REQTWN53") + case REQTWD52 extends KeywordName("REQTWD52", "REQTWD52") /** @group Constructors */ - case object REQTWP53 extends KeywordName("REQTWP53", "REQTWP53") + case REQTWN52 extends KeywordName("REQTWN52", "REQTWN52") /** @group Constructors */ - case object REQTWS54 extends KeywordName("REQTWS54", "REQTWS54") + case REQTWP52 extends KeywordName("REQTWP52", "REQTWP52") /** @group Constructors */ - case object REQTWD54 extends KeywordName("REQTWD54", "REQTWD54") + case REQTWS53 extends KeywordName("REQTWS53", "REQTWS53") /** @group Constructors */ - case object REQTWN54 extends KeywordName("REQTWN54", "REQTWN54") + case REQTWD53 extends KeywordName("REQTWD53", "REQTWD53") /** @group Constructors */ - case object REQTWP54 extends KeywordName("REQTWP54", "REQTWP54") + case REQTWN53 extends KeywordName("REQTWN53", "REQTWN53") /** @group Constructors */ - case object REQTWS55 extends KeywordName("REQTWS55", "REQTWS55") + case REQTWP53 extends KeywordName("REQTWP53", "REQTWP53") /** @group Constructors */ - case object REQTWD55 extends KeywordName("REQTWD55", "REQTWD55") + case REQTWS54 extends KeywordName("REQTWS54", "REQTWS54") /** @group Constructors */ - case object REQTWN55 extends KeywordName("REQTWN55", "REQTWN55") + case REQTWD54 extends KeywordName("REQTWD54", "REQTWD54") /** @group Constructors */ - case object REQTWP55 extends KeywordName("REQTWP55", "REQTWP55") + case REQTWN54 extends KeywordName("REQTWN54", "REQTWN54") /** @group Constructors */ - case object REQTWS56 extends KeywordName("REQTWS56", "REQTWS56") + case REQTWP54 extends KeywordName("REQTWP54", "REQTWP54") /** @group Constructors */ - case object REQTWD56 extends KeywordName("REQTWD56", "REQTWD56") + case REQTWS55 extends KeywordName("REQTWS55", "REQTWS55") /** @group Constructors */ - case object REQTWN56 extends KeywordName("REQTWN56", "REQTWN56") + case REQTWD55 extends KeywordName("REQTWD55", "REQTWD55") /** @group Constructors */ - case object REQTWP56 extends KeywordName("REQTWP56", "REQTWP56") + case REQTWN55 extends KeywordName("REQTWN55", "REQTWN55") /** @group Constructors */ - case object REQTWS57 extends KeywordName("REQTWS57", "REQTWS57") + case REQTWP55 extends KeywordName("REQTWP55", "REQTWP55") /** @group Constructors */ - case object REQTWD57 extends KeywordName("REQTWD57", "REQTWD57") + case REQTWS56 extends KeywordName("REQTWS56", "REQTWS56") /** @group Constructors */ - case object REQTWN57 extends KeywordName("REQTWN57", "REQTWN57") + case REQTWD56 extends KeywordName("REQTWD56", "REQTWD56") /** @group Constructors */ - case object REQTWP57 extends KeywordName("REQTWP57", "REQTWP57") + case REQTWN56 extends KeywordName("REQTWN56", "REQTWN56") /** @group Constructors */ - case object REQTWS58 extends KeywordName("REQTWS58", "REQTWS58") + case REQTWP56 extends KeywordName("REQTWP56", "REQTWP56") /** @group Constructors */ - case object REQTWD58 extends KeywordName("REQTWD58", "REQTWD58") + case REQTWS57 extends KeywordName("REQTWS57", "REQTWS57") /** @group Constructors */ - case object REQTWN58 extends KeywordName("REQTWN58", "REQTWN58") + case REQTWD57 extends KeywordName("REQTWD57", "REQTWD57") /** @group Constructors */ - case object REQTWP58 extends KeywordName("REQTWP58", "REQTWP58") + case REQTWN57 extends KeywordName("REQTWN57", "REQTWN57") /** @group Constructors */ - case object REQTWS59 extends KeywordName("REQTWS59", "REQTWS59") + case REQTWP57 extends KeywordName("REQTWP57", "REQTWP57") /** @group Constructors */ - case object REQTWD59 extends KeywordName("REQTWD59", "REQTWD59") + case REQTWS58 extends KeywordName("REQTWS58", "REQTWS58") /** @group Constructors */ - case object REQTWN59 extends KeywordName("REQTWN59", "REQTWN59") + case REQTWD58 extends KeywordName("REQTWD58", "REQTWD58") /** @group Constructors */ - case object REQTWP59 extends KeywordName("REQTWP59", "REQTWP59") + case REQTWN58 extends KeywordName("REQTWN58", "REQTWN58") /** @group Constructors */ - case object REQTWS60 extends KeywordName("REQTWS60", "REQTWS60") + case REQTWP58 extends KeywordName("REQTWP58", "REQTWP58") /** @group Constructors */ - case object REQTWD60 extends KeywordName("REQTWD60", "REQTWD60") + case REQTWS59 extends KeywordName("REQTWS59", "REQTWS59") /** @group Constructors */ - case object REQTWN60 extends KeywordName("REQTWN60", "REQTWN60") + case REQTWD59 extends KeywordName("REQTWD59", "REQTWD59") /** @group Constructors */ - case object REQTWP60 extends KeywordName("REQTWP60", "REQTWP60") + case REQTWN59 extends KeywordName("REQTWN59", "REQTWN59") /** @group Constructors */ - case object REQTWS61 extends KeywordName("REQTWS61", "REQTWS61") + case REQTWP59 extends KeywordName("REQTWP59", "REQTWP59") /** @group Constructors */ - case object REQTWD61 extends KeywordName("REQTWD61", "REQTWD61") + case REQTWS60 extends KeywordName("REQTWS60", "REQTWS60") /** @group Constructors */ - case object REQTWN61 extends KeywordName("REQTWN61", "REQTWN61") + case REQTWD60 extends KeywordName("REQTWD60", "REQTWD60") /** @group Constructors */ - case object REQTWP61 extends KeywordName("REQTWP61", "REQTWP61") + case REQTWN60 extends KeywordName("REQTWN60", "REQTWN60") /** @group Constructors */ - case object REQTWS62 extends KeywordName("REQTWS62", "REQTWS62") + case REQTWP60 extends KeywordName("REQTWP60", "REQTWP60") /** @group Constructors */ - case object REQTWD62 extends KeywordName("REQTWD62", "REQTWD62") + case REQTWS61 extends KeywordName("REQTWS61", "REQTWS61") /** @group Constructors */ - case object REQTWN62 extends KeywordName("REQTWN62", "REQTWN62") + case REQTWD61 extends KeywordName("REQTWD61", "REQTWD61") /** @group Constructors */ - case object REQTWP62 extends KeywordName("REQTWP62", "REQTWP62") + case REQTWN61 extends KeywordName("REQTWN61", "REQTWN61") /** @group Constructors */ - case object REQTWS63 extends KeywordName("REQTWS63", "REQTWS63") + case REQTWP61 extends KeywordName("REQTWP61", "REQTWP61") /** @group Constructors */ - case object REQTWD63 extends KeywordName("REQTWD63", "REQTWD63") + case REQTWS62 extends KeywordName("REQTWS62", "REQTWS62") /** @group Constructors */ - case object REQTWN63 extends KeywordName("REQTWN63", "REQTWN63") + case REQTWD62 extends KeywordName("REQTWD62", "REQTWD62") /** @group Constructors */ - case object REQTWP63 extends KeywordName("REQTWP63", "REQTWP63") + case REQTWN62 extends KeywordName("REQTWN62", "REQTWN62") /** @group Constructors */ - case object REQTWS64 extends KeywordName("REQTWS64", "REQTWS64") + case REQTWP62 extends KeywordName("REQTWP62", "REQTWP62") /** @group Constructors */ - case object REQTWD64 extends KeywordName("REQTWD64", "REQTWD64") + case REQTWS63 extends KeywordName("REQTWS63", "REQTWS63") /** @group Constructors */ - case object REQTWN64 extends KeywordName("REQTWN64", "REQTWN64") + case REQTWD63 extends KeywordName("REQTWD63", "REQTWD63") /** @group Constructors */ - case object REQTWP64 extends KeywordName("REQTWP64", "REQTWP64") + case REQTWN63 extends KeywordName("REQTWN63", "REQTWN63") /** @group Constructors */ - case object REQTWS65 extends KeywordName("REQTWS65", "REQTWS65") + case REQTWP63 extends KeywordName("REQTWP63", "REQTWP63") /** @group Constructors */ - case object REQTWD65 extends KeywordName("REQTWD65", "REQTWD65") + case REQTWS64 extends KeywordName("REQTWS64", "REQTWS64") /** @group Constructors */ - case object REQTWN65 extends KeywordName("REQTWN65", "REQTWN65") + case REQTWD64 extends KeywordName("REQTWD64", "REQTWD64") /** @group Constructors */ - case object REQTWP65 extends KeywordName("REQTWP65", "REQTWP65") + case REQTWN64 extends KeywordName("REQTWN64", "REQTWN64") /** @group Constructors */ - case object REQTWS66 extends KeywordName("REQTWS66", "REQTWS66") + case REQTWP64 extends KeywordName("REQTWP64", "REQTWP64") /** @group Constructors */ - case object REQTWD66 extends KeywordName("REQTWD66", "REQTWD66") + case REQTWS65 extends KeywordName("REQTWS65", "REQTWS65") /** @group Constructors */ - case object REQTWN66 extends KeywordName("REQTWN66", "REQTWN66") + case REQTWD65 extends KeywordName("REQTWD65", "REQTWD65") /** @group Constructors */ - case object REQTWP66 extends KeywordName("REQTWP66", "REQTWP66") + case REQTWN65 extends KeywordName("REQTWN65", "REQTWN65") /** @group Constructors */ - case object REQTWS67 extends KeywordName("REQTWS67", "REQTWS67") + case REQTWP65 extends KeywordName("REQTWP65", "REQTWP65") /** @group Constructors */ - case object REQTWD67 extends KeywordName("REQTWD67", "REQTWD67") + case REQTWS66 extends KeywordName("REQTWS66", "REQTWS66") /** @group Constructors */ - case object REQTWN67 extends KeywordName("REQTWN67", "REQTWN67") + case REQTWD66 extends KeywordName("REQTWD66", "REQTWD66") /** @group Constructors */ - case object REQTWP67 extends KeywordName("REQTWP67", "REQTWP67") + case REQTWN66 extends KeywordName("REQTWN66", "REQTWN66") /** @group Constructors */ - case object REQTWS68 extends KeywordName("REQTWS68", "REQTWS68") + case REQTWP66 extends KeywordName("REQTWP66", "REQTWP66") /** @group Constructors */ - case object REQTWD68 extends KeywordName("REQTWD68", "REQTWD68") + case REQTWS67 extends KeywordName("REQTWS67", "REQTWS67") /** @group Constructors */ - case object REQTWN68 extends KeywordName("REQTWN68", "REQTWN68") + case REQTWD67 extends KeywordName("REQTWD67", "REQTWD67") /** @group Constructors */ - case object REQTWP68 extends KeywordName("REQTWP68", "REQTWP68") + case REQTWN67 extends KeywordName("REQTWN67", "REQTWN67") /** @group Constructors */ - case object REQTWS69 extends KeywordName("REQTWS69", "REQTWS69") + case REQTWP67 extends KeywordName("REQTWP67", "REQTWP67") /** @group Constructors */ - case object REQTWD69 extends KeywordName("REQTWD69", "REQTWD69") + case REQTWS68 extends KeywordName("REQTWS68", "REQTWS68") /** @group Constructors */ - case object REQTWN69 extends KeywordName("REQTWN69", "REQTWN69") + case REQTWD68 extends KeywordName("REQTWD68", "REQTWD68") /** @group Constructors */ - case object REQTWP69 extends KeywordName("REQTWP69", "REQTWP69") + case REQTWN68 extends KeywordName("REQTWN68", "REQTWN68") /** @group Constructors */ - case object REQTWS70 extends KeywordName("REQTWS70", "REQTWS70") + case REQTWP68 extends KeywordName("REQTWP68", "REQTWP68") /** @group Constructors */ - case object REQTWD70 extends KeywordName("REQTWD70", "REQTWD70") + case REQTWS69 extends KeywordName("REQTWS69", "REQTWS69") /** @group Constructors */ - case object REQTWN70 extends KeywordName("REQTWN70", "REQTWN70") + case REQTWD69 extends KeywordName("REQTWD69", "REQTWD69") /** @group Constructors */ - case object REQTWP70 extends KeywordName("REQTWP70", "REQTWP70") + case REQTWN69 extends KeywordName("REQTWN69", "REQTWN69") /** @group Constructors */ - case object REQTWS71 extends KeywordName("REQTWS71", "REQTWS71") + case REQTWP69 extends KeywordName("REQTWP69", "REQTWP69") /** @group Constructors */ - case object REQTWD71 extends KeywordName("REQTWD71", "REQTWD71") + case REQTWS70 extends KeywordName("REQTWS70", "REQTWS70") /** @group Constructors */ - case object REQTWN71 extends KeywordName("REQTWN71", "REQTWN71") + case REQTWD70 extends KeywordName("REQTWD70", "REQTWD70") /** @group Constructors */ - case object REQTWP71 extends KeywordName("REQTWP71", "REQTWP71") + case REQTWN70 extends KeywordName("REQTWN70", "REQTWN70") /** @group Constructors */ - case object REQTWS72 extends KeywordName("REQTWS72", "REQTWS72") + case REQTWP70 extends KeywordName("REQTWP70", "REQTWP70") /** @group Constructors */ - case object REQTWD72 extends KeywordName("REQTWD72", "REQTWD72") + case REQTWS71 extends KeywordName("REQTWS71", "REQTWS71") /** @group Constructors */ - case object REQTWN72 extends KeywordName("REQTWN72", "REQTWN72") + case REQTWD71 extends KeywordName("REQTWD71", "REQTWD71") /** @group Constructors */ - case object REQTWP72 extends KeywordName("REQTWP72", "REQTWP72") + case REQTWN71 extends KeywordName("REQTWN71", "REQTWN71") /** @group Constructors */ - case object REQTWS73 extends KeywordName("REQTWS73", "REQTWS73") + case REQTWP71 extends KeywordName("REQTWP71", "REQTWP71") /** @group Constructors */ - case object REQTWD73 extends KeywordName("REQTWD73", "REQTWD73") + case REQTWS72 extends KeywordName("REQTWS72", "REQTWS72") /** @group Constructors */ - case object REQTWN73 extends KeywordName("REQTWN73", "REQTWN73") + case REQTWD72 extends KeywordName("REQTWD72", "REQTWD72") /** @group Constructors */ - case object REQTWP73 extends KeywordName("REQTWP73", "REQTWP73") + case REQTWN72 extends KeywordName("REQTWN72", "REQTWN72") /** @group Constructors */ - case object REQTWS74 extends KeywordName("REQTWS74", "REQTWS74") + case REQTWP72 extends KeywordName("REQTWP72", "REQTWP72") /** @group Constructors */ - case object REQTWD74 extends KeywordName("REQTWD74", "REQTWD74") + case REQTWS73 extends KeywordName("REQTWS73", "REQTWS73") /** @group Constructors */ - case object REQTWN74 extends KeywordName("REQTWN74", "REQTWN74") + case REQTWD73 extends KeywordName("REQTWD73", "REQTWD73") /** @group Constructors */ - case object REQTWP74 extends KeywordName("REQTWP74", "REQTWP74") + case REQTWN73 extends KeywordName("REQTWN73", "REQTWN73") /** @group Constructors */ - case object REQTWS75 extends KeywordName("REQTWS75", "REQTWS75") + case REQTWP73 extends KeywordName("REQTWP73", "REQTWP73") /** @group Constructors */ - case object REQTWD75 extends KeywordName("REQTWD75", "REQTWD75") + case REQTWS74 extends KeywordName("REQTWS74", "REQTWS74") /** @group Constructors */ - case object REQTWN75 extends KeywordName("REQTWN75", "REQTWN75") + case REQTWD74 extends KeywordName("REQTWD74", "REQTWD74") /** @group Constructors */ - case object REQTWP75 extends KeywordName("REQTWP75", "REQTWP75") + case REQTWN74 extends KeywordName("REQTWN74", "REQTWN74") /** @group Constructors */ - case object REQTWS76 extends KeywordName("REQTWS76", "REQTWS76") + case REQTWP74 extends KeywordName("REQTWP74", "REQTWP74") /** @group Constructors */ - case object REQTWD76 extends KeywordName("REQTWD76", "REQTWD76") + case REQTWS75 extends KeywordName("REQTWS75", "REQTWS75") /** @group Constructors */ - case object REQTWN76 extends KeywordName("REQTWN76", "REQTWN76") + case REQTWD75 extends KeywordName("REQTWD75", "REQTWD75") /** @group Constructors */ - case object REQTWP76 extends KeywordName("REQTWP76", "REQTWP76") + case REQTWN75 extends KeywordName("REQTWN75", "REQTWN75") /** @group Constructors */ - case object REQTWS77 extends KeywordName("REQTWS77", "REQTWS77") + case REQTWP75 extends KeywordName("REQTWP75", "REQTWP75") /** @group Constructors */ - case object REQTWD77 extends KeywordName("REQTWD77", "REQTWD77") + case REQTWS76 extends KeywordName("REQTWS76", "REQTWS76") /** @group Constructors */ - case object REQTWN77 extends KeywordName("REQTWN77", "REQTWN77") + case REQTWD76 extends KeywordName("REQTWD76", "REQTWD76") /** @group Constructors */ - case object REQTWP77 extends KeywordName("REQTWP77", "REQTWP77") + case REQTWN76 extends KeywordName("REQTWN76", "REQTWN76") /** @group Constructors */ - case object REQTWS78 extends KeywordName("REQTWS78", "REQTWS78") + case REQTWP76 extends KeywordName("REQTWP76", "REQTWP76") /** @group Constructors */ - case object REQTWD78 extends KeywordName("REQTWD78", "REQTWD78") + case REQTWS77 extends KeywordName("REQTWS77", "REQTWS77") /** @group Constructors */ - case object REQTWN78 extends KeywordName("REQTWN78", "REQTWN78") + case REQTWD77 extends KeywordName("REQTWD77", "REQTWD77") /** @group Constructors */ - case object REQTWP78 extends KeywordName("REQTWP78", "REQTWP78") + case REQTWN77 extends KeywordName("REQTWN77", "REQTWN77") /** @group Constructors */ - case object REQTWS79 extends KeywordName("REQTWS79", "REQTWS79") + case REQTWP77 extends KeywordName("REQTWP77", "REQTWP77") /** @group Constructors */ - case object REQTWD79 extends KeywordName("REQTWD79", "REQTWD79") + case REQTWS78 extends KeywordName("REQTWS78", "REQTWS78") /** @group Constructors */ - case object REQTWN79 extends KeywordName("REQTWN79", "REQTWN79") + case REQTWD78 extends KeywordName("REQTWD78", "REQTWD78") /** @group Constructors */ - case object REQTWP79 extends KeywordName("REQTWP79", "REQTWP79") + case REQTWN78 extends KeywordName("REQTWN78", "REQTWN78") /** @group Constructors */ - case object REQTWS80 extends KeywordName("REQTWS80", "REQTWS80") + case REQTWP78 extends KeywordName("REQTWP78", "REQTWP78") /** @group Constructors */ - case object REQTWD80 extends KeywordName("REQTWD80", "REQTWD80") + case REQTWS79 extends KeywordName("REQTWS79", "REQTWS79") /** @group Constructors */ - case object REQTWN80 extends KeywordName("REQTWN80", "REQTWN80") + case REQTWD79 extends KeywordName("REQTWD79", "REQTWD79") /** @group Constructors */ - case object REQTWP80 extends KeywordName("REQTWP80", "REQTWP80") + case REQTWN79 extends KeywordName("REQTWN79", "REQTWN79") /** @group Constructors */ - case object REQTWS81 extends KeywordName("REQTWS81", "REQTWS81") + case REQTWP79 extends KeywordName("REQTWP79", "REQTWP79") /** @group Constructors */ - case object REQTWD81 extends KeywordName("REQTWD81", "REQTWD81") + case REQTWS80 extends KeywordName("REQTWS80", "REQTWS80") /** @group Constructors */ - case object REQTWN81 extends KeywordName("REQTWN81", "REQTWN81") + case REQTWD80 extends KeywordName("REQTWD80", "REQTWD80") /** @group Constructors */ - case object REQTWP81 extends KeywordName("REQTWP81", "REQTWP81") + case REQTWN80 extends KeywordName("REQTWN80", "REQTWN80") /** @group Constructors */ - case object REQTWS82 extends KeywordName("REQTWS82", "REQTWS82") + case REQTWP80 extends KeywordName("REQTWP80", "REQTWP80") /** @group Constructors */ - case object REQTWD82 extends KeywordName("REQTWD82", "REQTWD82") + case REQTWS81 extends KeywordName("REQTWS81", "REQTWS81") /** @group Constructors */ - case object REQTWN82 extends KeywordName("REQTWN82", "REQTWN82") + case REQTWD81 extends KeywordName("REQTWD81", "REQTWD81") /** @group Constructors */ - case object REQTWP82 extends KeywordName("REQTWP82", "REQTWP82") + case REQTWN81 extends KeywordName("REQTWN81", "REQTWN81") /** @group Constructors */ - case object REQTWS83 extends KeywordName("REQTWS83", "REQTWS83") + case REQTWP81 extends KeywordName("REQTWP81", "REQTWP81") /** @group Constructors */ - case object REQTWD83 extends KeywordName("REQTWD83", "REQTWD83") + case REQTWS82 extends KeywordName("REQTWS82", "REQTWS82") /** @group Constructors */ - case object REQTWN83 extends KeywordName("REQTWN83", "REQTWN83") + case REQTWD82 extends KeywordName("REQTWD82", "REQTWD82") /** @group Constructors */ - case object REQTWP83 extends KeywordName("REQTWP83", "REQTWP83") + case REQTWN82 extends KeywordName("REQTWN82", "REQTWN82") /** @group Constructors */ - case object REQTWS84 extends KeywordName("REQTWS84", "REQTWS84") + case REQTWP82 extends KeywordName("REQTWP82", "REQTWP82") /** @group Constructors */ - case object REQTWD84 extends KeywordName("REQTWD84", "REQTWD84") + case REQTWS83 extends KeywordName("REQTWS83", "REQTWS83") /** @group Constructors */ - case object REQTWN84 extends KeywordName("REQTWN84", "REQTWN84") + case REQTWD83 extends KeywordName("REQTWD83", "REQTWD83") /** @group Constructors */ - case object REQTWP84 extends KeywordName("REQTWP84", "REQTWP84") + case REQTWN83 extends KeywordName("REQTWN83", "REQTWN83") /** @group Constructors */ - case object REQTWS85 extends KeywordName("REQTWS85", "REQTWS85") + case REQTWP83 extends KeywordName("REQTWP83", "REQTWP83") /** @group Constructors */ - case object REQTWD85 extends KeywordName("REQTWD85", "REQTWD85") + case REQTWS84 extends KeywordName("REQTWS84", "REQTWS84") /** @group Constructors */ - case object REQTWN85 extends KeywordName("REQTWN85", "REQTWN85") + case REQTWD84 extends KeywordName("REQTWD84", "REQTWD84") /** @group Constructors */ - case object REQTWP85 extends KeywordName("REQTWP85", "REQTWP85") + case REQTWN84 extends KeywordName("REQTWN84", "REQTWN84") /** @group Constructors */ - case object REQTWS86 extends KeywordName("REQTWS86", "REQTWS86") + case REQTWP84 extends KeywordName("REQTWP84", "REQTWP84") /** @group Constructors */ - case object REQTWD86 extends KeywordName("REQTWD86", "REQTWD86") + case REQTWS85 extends KeywordName("REQTWS85", "REQTWS85") /** @group Constructors */ - case object REQTWN86 extends KeywordName("REQTWN86", "REQTWN86") + case REQTWD85 extends KeywordName("REQTWD85", "REQTWD85") /** @group Constructors */ - case object REQTWP86 extends KeywordName("REQTWP86", "REQTWP86") + case REQTWN85 extends KeywordName("REQTWN85", "REQTWN85") /** @group Constructors */ - case object REQTWS87 extends KeywordName("REQTWS87", "REQTWS87") + case REQTWP85 extends KeywordName("REQTWP85", "REQTWP85") /** @group Constructors */ - case object REQTWD87 extends KeywordName("REQTWD87", "REQTWD87") + case REQTWS86 extends KeywordName("REQTWS86", "REQTWS86") /** @group Constructors */ - case object REQTWN87 extends KeywordName("REQTWN87", "REQTWN87") + case REQTWD86 extends KeywordName("REQTWD86", "REQTWD86") /** @group Constructors */ - case object REQTWP87 extends KeywordName("REQTWP87", "REQTWP87") + case REQTWN86 extends KeywordName("REQTWN86", "REQTWN86") /** @group Constructors */ - case object REQTWS88 extends KeywordName("REQTWS88", "REQTWS88") + case REQTWP86 extends KeywordName("REQTWP86", "REQTWP86") /** @group Constructors */ - case object REQTWD88 extends KeywordName("REQTWD88", "REQTWD88") + case REQTWS87 extends KeywordName("REQTWS87", "REQTWS87") /** @group Constructors */ - case object REQTWN88 extends KeywordName("REQTWN88", "REQTWN88") + case REQTWD87 extends KeywordName("REQTWD87", "REQTWD87") /** @group Constructors */ - case object REQTWP88 extends KeywordName("REQTWP88", "REQTWP88") + case REQTWN87 extends KeywordName("REQTWN87", "REQTWN87") /** @group Constructors */ - case object REQTWS89 extends KeywordName("REQTWS89", "REQTWS89") + case REQTWP87 extends KeywordName("REQTWP87", "REQTWP87") /** @group Constructors */ - case object REQTWD89 extends KeywordName("REQTWD89", "REQTWD89") + case REQTWS88 extends KeywordName("REQTWS88", "REQTWS88") /** @group Constructors */ - case object REQTWN89 extends KeywordName("REQTWN89", "REQTWN89") + case REQTWD88 extends KeywordName("REQTWD88", "REQTWD88") /** @group Constructors */ - case object REQTWP89 extends KeywordName("REQTWP89", "REQTWP89") + case REQTWN88 extends KeywordName("REQTWN88", "REQTWN88") /** @group Constructors */ - case object REQTWS90 extends KeywordName("REQTWS90", "REQTWS90") + case REQTWP88 extends KeywordName("REQTWP88", "REQTWP88") /** @group Constructors */ - case object REQTWD90 extends KeywordName("REQTWD90", "REQTWD90") + case REQTWS89 extends KeywordName("REQTWS89", "REQTWS89") /** @group Constructors */ - case object REQTWN90 extends KeywordName("REQTWN90", "REQTWN90") + case REQTWD89 extends KeywordName("REQTWD89", "REQTWD89") /** @group Constructors */ - case object REQTWP90 extends KeywordName("REQTWP90", "REQTWP90") + case REQTWN89 extends KeywordName("REQTWN89", "REQTWN89") /** @group Constructors */ - case object REQTWS91 extends KeywordName("REQTWS91", "REQTWS91") + case REQTWP89 extends KeywordName("REQTWP89", "REQTWP89") /** @group Constructors */ - case object REQTWD91 extends KeywordName("REQTWD91", "REQTWD91") + case REQTWS90 extends KeywordName("REQTWS90", "REQTWS90") /** @group Constructors */ - case object REQTWN91 extends KeywordName("REQTWN91", "REQTWN91") + case REQTWD90 extends KeywordName("REQTWD90", "REQTWD90") /** @group Constructors */ - case object REQTWP91 extends KeywordName("REQTWP91", "REQTWP91") + case REQTWN90 extends KeywordName("REQTWN90", "REQTWN90") /** @group Constructors */ - case object REQTWS92 extends KeywordName("REQTWS92", "REQTWS92") + case REQTWP90 extends KeywordName("REQTWP90", "REQTWP90") /** @group Constructors */ - case object REQTWD92 extends KeywordName("REQTWD92", "REQTWD92") + case REQTWS91 extends KeywordName("REQTWS91", "REQTWS91") /** @group Constructors */ - case object REQTWN92 extends KeywordName("REQTWN92", "REQTWN92") + case REQTWD91 extends KeywordName("REQTWD91", "REQTWD91") /** @group Constructors */ - case object REQTWP92 extends KeywordName("REQTWP92", "REQTWP92") + case REQTWN91 extends KeywordName("REQTWN91", "REQTWN91") /** @group Constructors */ - case object REQTWS93 extends KeywordName("REQTWS93", "REQTWS93") + case REQTWP91 extends KeywordName("REQTWP91", "REQTWP91") /** @group Constructors */ - case object REQTWD93 extends KeywordName("REQTWD93", "REQTWD93") + case REQTWS92 extends KeywordName("REQTWS92", "REQTWS92") /** @group Constructors */ - case object REQTWN93 extends KeywordName("REQTWN93", "REQTWN93") + case REQTWD92 extends KeywordName("REQTWD92", "REQTWD92") /** @group Constructors */ - case object REQTWP93 extends KeywordName("REQTWP93", "REQTWP93") + case REQTWN92 extends KeywordName("REQTWN92", "REQTWN92") /** @group Constructors */ - case object REQTWS94 extends KeywordName("REQTWS94", "REQTWS94") + case REQTWP92 extends KeywordName("REQTWP92", "REQTWP92") /** @group Constructors */ - case object REQTWD94 extends KeywordName("REQTWD94", "REQTWD94") + case REQTWS93 extends KeywordName("REQTWS93", "REQTWS93") /** @group Constructors */ - case object REQTWN94 extends KeywordName("REQTWN94", "REQTWN94") + case REQTWD93 extends KeywordName("REQTWD93", "REQTWD93") /** @group Constructors */ - case object REQTWP94 extends KeywordName("REQTWP94", "REQTWP94") + case REQTWN93 extends KeywordName("REQTWN93", "REQTWN93") /** @group Constructors */ - case object REQTWS95 extends KeywordName("REQTWS95", "REQTWS95") + case REQTWP93 extends KeywordName("REQTWP93", "REQTWP93") /** @group Constructors */ - case object REQTWD95 extends KeywordName("REQTWD95", "REQTWD95") + case REQTWS94 extends KeywordName("REQTWS94", "REQTWS94") /** @group Constructors */ - case object REQTWN95 extends KeywordName("REQTWN95", "REQTWN95") + case REQTWD94 extends KeywordName("REQTWD94", "REQTWD94") /** @group Constructors */ - case object REQTWP95 extends KeywordName("REQTWP95", "REQTWP95") + case REQTWN94 extends KeywordName("REQTWN94", "REQTWN94") /** @group Constructors */ - case object REQTWS96 extends KeywordName("REQTWS96", "REQTWS96") + case REQTWP94 extends KeywordName("REQTWP94", "REQTWP94") /** @group Constructors */ - case object REQTWD96 extends KeywordName("REQTWD96", "REQTWD96") + case REQTWS95 extends KeywordName("REQTWS95", "REQTWS95") /** @group Constructors */ - case object REQTWN96 extends KeywordName("REQTWN96", "REQTWN96") + case REQTWD95 extends KeywordName("REQTWD95", "REQTWD95") /** @group Constructors */ - case object REQTWP96 extends KeywordName("REQTWP96", "REQTWP96") + case REQTWN95 extends KeywordName("REQTWN95", "REQTWN95") /** @group Constructors */ - case object REQTWS97 extends KeywordName("REQTWS97", "REQTWS97") + case REQTWP95 extends KeywordName("REQTWP95", "REQTWP95") /** @group Constructors */ - case object REQTWD97 extends KeywordName("REQTWD97", "REQTWD97") + case REQTWS96 extends KeywordName("REQTWS96", "REQTWS96") /** @group Constructors */ - case object REQTWN97 extends KeywordName("REQTWN97", "REQTWN97") + case REQTWD96 extends KeywordName("REQTWD96", "REQTWD96") /** @group Constructors */ - case object REQTWP97 extends KeywordName("REQTWP97", "REQTWP97") + case REQTWN96 extends KeywordName("REQTWN96", "REQTWN96") /** @group Constructors */ - case object REQTWS98 extends KeywordName("REQTWS98", "REQTWS98") + case REQTWP96 extends KeywordName("REQTWP96", "REQTWP96") /** @group Constructors */ - case object REQTWD98 extends KeywordName("REQTWD98", "REQTWD98") + case REQTWS97 extends KeywordName("REQTWS97", "REQTWS97") /** @group Constructors */ - case object REQTWN98 extends KeywordName("REQTWN98", "REQTWN98") + case REQTWD97 extends KeywordName("REQTWD97", "REQTWD97") /** @group Constructors */ - case object REQTWP98 extends KeywordName("REQTWP98", "REQTWP98") + case REQTWN97 extends KeywordName("REQTWN97", "REQTWN97") /** @group Constructors */ - case object REQTWS99 extends KeywordName("REQTWS99", "REQTWS99") + case REQTWP97 extends KeywordName("REQTWP97", "REQTWP97") /** @group Constructors */ - case object REQTWD99 extends KeywordName("REQTWD99", "REQTWD99") + case REQTWS98 extends KeywordName("REQTWS98", "REQTWS98") /** @group Constructors */ - case object REQTWN99 extends KeywordName("REQTWN99", "REQTWN99") + case REQTWD98 extends KeywordName("REQTWD98", "REQTWD98") /** @group Constructors */ - case object REQTWP99 extends KeywordName("REQTWP99", "REQTWP99") + case REQTWN98 extends KeywordName("REQTWN98", "REQTWN98") /** @group Constructors */ - case object COADDS extends KeywordName("COADDS", "COADDS") + case REQTWP98 extends KeywordName("REQTWP98", "REQTWP98") /** @group Constructors */ - case object EXPTIME extends KeywordName("EXPTIME", "EXPTIME") + case REQTWS99 extends KeywordName("REQTWS99", "REQTWS99") /** @group Constructors */ - case object FILTER3 extends KeywordName("FILTER3", "FILTER3") + case REQTWD99 extends KeywordName("REQTWD99", "REQTWD99") /** @group Constructors */ - case object FOCUSNAM extends KeywordName("FOCUSNAM", "FOCUSNAM") + case REQTWN99 extends KeywordName("REQTWN99", "REQTWN99") /** @group Constructors */ - case object FOCUSPOS extends KeywordName("FOCUSPOS", "FOCUSPOS") + case REQTWP99 extends KeywordName("REQTWP99", "REQTWP99") /** @group Constructors */ - case object FPMASK extends KeywordName("FPMASK", "FPMASK") + case COADDS extends KeywordName("COADDS", "COADDS") /** @group Constructors */ - case object BEAMSPLT extends KeywordName("BEAMSPLT", "BEAMSPLT") + case EXPTIME extends KeywordName("EXPTIME", "EXPTIME") /** @group Constructors */ - case object WINDCOVR extends KeywordName("WINDCOVR", "WINDCOVR") + case FILTER3 extends KeywordName("FILTER3", "FILTER3") /** @group Constructors */ - case object FRMSPCYCL extends KeywordName("FRMSPCYCL", "FRMSPCYC") + case FOCUSNAM extends KeywordName("FOCUSNAM", "FOCUSNAM") /** @group Constructors */ - case object HDRTIMING extends KeywordName("HDRTIMING", "HDRTIMIN") + case FOCUSPOS extends KeywordName("FOCUSPOS", "FOCUSPOS") /** @group Constructors */ - case object LNRS extends KeywordName("LNRS", "LNRS") + case FPMASK extends KeywordName("FPMASK", "FPMASK") /** @group Constructors */ - case object MODE extends KeywordName("MODE", "MODE") + case BEAMSPLT extends KeywordName("BEAMSPLT", "BEAMSPLT") /** @group Constructors */ - case object NDAVGS extends KeywordName("NDAVGS", "NDAVGS") + case WINDCOVR extends KeywordName("WINDCOVR", "WINDCOVR") /** @group Constructors */ - case object PVIEW extends KeywordName("PVIEW", "PVIEW") + case FRMSPCYCL extends KeywordName("FRMSPCYCL", "FRMSPCYC") /** @group Constructors */ - case object TDETABS extends KeywordName("TDETABS", "TDETABS") + case HDRTIMING extends KeywordName("HDRTIMING", "HDRTIMIN") /** @group Constructors */ - case object TIME extends KeywordName("TIME", "TIME") + case LNRS extends KeywordName("LNRS", "LNRS") /** @group Constructors */ - case object TMOUNT extends KeywordName("TMOUNT", "TMOUNT") + case MODE extends KeywordName("MODE", "MODE") /** @group Constructors */ - case object UCODENAM extends KeywordName("UCODENAM", "UCODENAM") + case NDAVGS extends KeywordName("NDAVGS", "NDAVGS") /** @group Constructors */ - case object UCODETYP extends KeywordName("UCODETYP", "UCODETYP") + case PVIEW extends KeywordName("PVIEW", "PVIEW") /** @group Constructors */ - case object VDDCL1 extends KeywordName("VDDCL1", "VDDCL1") + case TDETABS extends KeywordName("TDETABS", "TDETABS") /** @group Constructors */ - case object VDDCL2 extends KeywordName("VDDCL2", "VDDCL2") + case TIME extends KeywordName("TIME", "TIME") /** @group Constructors */ - case object VDDUC extends KeywordName("VDDUC", "VDDUC") + case TMOUNT extends KeywordName("TMOUNT", "TMOUNT") /** @group Constructors */ - case object VDET extends KeywordName("VDET", "VDET") + case UCODENAM extends KeywordName("UCODENAM", "UCODENAM") /** @group Constructors */ - case object VGGCL1 extends KeywordName("VGGCL1", "VGGCL1") + case UCODETYP extends KeywordName("UCODETYP", "UCODETYP") /** @group Constructors */ - case object VGGCL2 extends KeywordName("VGGCL2", "VGGCL2") + case VDDCL1 extends KeywordName("VDDCL1", "VDDCL1") /** @group Constructors */ - case object VSET extends KeywordName("VSET", "VSET") + case VDDCL2 extends KeywordName("VDDCL2", "VDDCL2") /** @group Constructors */ - case object A_TDETABS extends KeywordName("A_TDETABS", "A_TDETAB") + case VDDUC extends KeywordName("VDDUC", "VDDUC") /** @group Constructors */ - case object A_TMOUNT extends KeywordName("A_TMOUNT", "A_TMOUNT") + case VDET extends KeywordName("VDET", "VDET") /** @group Constructors */ - case object A_VDDCL1 extends KeywordName("A_VDDCL1", "A_VDDCL1") + case VGGCL1 extends KeywordName("VGGCL1", "VGGCL1") /** @group Constructors */ - case object A_VDDCL2 extends KeywordName("A_VDDCL2", "A_VDDCL2") + case VGGCL2 extends KeywordName("VGGCL2", "VGGCL2") /** @group Constructors */ - case object A_VDDUC extends KeywordName("A_VDDUC", "A_VDDUC") + case VSET extends KeywordName("VSET", "VSET") /** @group Constructors */ - case object A_VDET extends KeywordName("A_VDET", "A_VDET") + case A_TDETABS extends KeywordName("A_TDETABS", "A_TDETAB") /** @group Constructors */ - case object A_VGGCL1 extends KeywordName("A_VGGCL1", "A_VGGCL1") + case A_TMOUNT extends KeywordName("A_TMOUNT", "A_TMOUNT") /** @group Constructors */ - case object A_VGGCL2 extends KeywordName("A_VGGCL2", "A_VGGCL2") + case A_VDDCL1 extends KeywordName("A_VDDCL1", "A_VDDCL1") /** @group Constructors */ - case object A_VSET extends KeywordName("A_VSET", "A_VSET") + case A_VDDCL2 extends KeywordName("A_VDDCL2", "A_VDDCL2") /** @group Constructors */ - case object APOFFSET extends KeywordName("APOFFSET", "APOFFSET") + case A_VDDUC extends KeywordName("A_VDDUC", "A_VDDUC") /** @group Constructors */ - case object FLIP extends KeywordName("FLIP", "FLIP") + case A_VDET extends KeywordName("A_VDET", "A_VDET") /** @group Constructors */ - case object EXPRQ extends KeywordName("EXPRQ", "EXPRQ") + case A_VGGCL1 extends KeywordName("A_VGGCL1", "A_VGGCL1") /** @group Constructors */ - case object DCNAME extends KeywordName("DCNAME", "DCNAME") + case A_VGGCL2 extends KeywordName("A_VGGCL2", "A_VGGCL2") /** @group Constructors */ - case object PERIOD extends KeywordName("PERIOD", "PERIOD") + case A_VSET extends KeywordName("A_VSET", "A_VSET") /** @group Constructors */ - case object NPERIODS extends KeywordName("NPERIODS", "NPERIODS") + case APOFFSET extends KeywordName("APOFFSET", "APOFFSET") /** @group Constructors */ - case object EXPMODE extends KeywordName("EXPMODE", "EXPMODE") + case FLIP extends KeywordName("FLIP", "FLIP") /** @group Constructors */ - case object BIASPWR extends KeywordName("BIASPWR", "BIASPWR") + case EXPRQ extends KeywordName("EXPRQ", "EXPRQ") /** @group Constructors */ - case object OBSMODE extends KeywordName("OBSMODE", "OBSMODE") + case DCNAME extends KeywordName("DCNAME", "DCNAME") /** @group Constructors */ - case object RDTIME extends KeywordName("RDTIME", "RDTIME") + case PERIOD extends KeywordName("PERIOD", "PERIOD") /** @group Constructors */ - case object CTYPE1 extends KeywordName("CTYPE1", "CTYPE1") + case NPERIODS extends KeywordName("NPERIODS", "NPERIODS") /** @group Constructors */ - case object CRPIX1 extends KeywordName("CRPIX1", "CRPIX1") + case EXPMODE extends KeywordName("EXPMODE", "EXPMODE") /** @group Constructors */ - case object CRVAL1 extends KeywordName("CRVAL1", "CRVAL1") + case BIASPWR extends KeywordName("BIASPWR", "BIASPWR") /** @group Constructors */ - case object CTYPE2 extends KeywordName("CTYPE2", "CTYPE2") + case OBSMODE extends KeywordName("OBSMODE", "OBSMODE") /** @group Constructors */ - case object CRPIX2 extends KeywordName("CRPIX2", "CRPIX2") + case RDTIME extends KeywordName("RDTIME", "RDTIME") /** @group Constructors */ - case object CRVAL2 extends KeywordName("CRVAL2", "CRVAL2") + case CTYPE1 extends KeywordName("CTYPE1", "CTYPE1") /** @group Constructors */ - case object CD1_1 extends KeywordName("CD1_1", "CD1_1") + case CRPIX1 extends KeywordName("CRPIX1", "CRPIX1") /** @group Constructors */ - case object CD1_2 extends KeywordName("CD1_2", "CD1_2") + case CRVAL1 extends KeywordName("CRVAL1", "CRVAL1") /** @group Constructors */ - case object CD2_1 extends KeywordName("CD2_1", "CD2_1") + case CTYPE2 extends KeywordName("CTYPE2", "CTYPE2") /** @group Constructors */ - case object CD2_2 extends KeywordName("CD2_2", "CD2_2") + case CRPIX2 extends KeywordName("CRPIX2", "CRPIX2") /** @group Constructors */ - case object RADECSYS extends KeywordName("RADECSYS", "RADECSYS") + case CRVAL2 extends KeywordName("CRVAL2", "CRVAL2") /** @group Constructors */ - case object MJD_OBS extends KeywordName("MJD_OBS", "MJD_OBS") + case CD1_1 extends KeywordName("CD1_1", "CD1_1") /** @group Constructors */ - case object APERTURE extends KeywordName("APERTURE", "APERTURE") + case CD1_2 extends KeywordName("CD1_2", "CD1_2") /** @group Constructors */ - case object FILTER extends KeywordName("FILTER", "FILTER") + case CD2_1 extends KeywordName("CD2_1", "CD2_1") /** @group Constructors */ - case object AOFREQ extends KeywordName("AOFREQ", "AOFREQ") + case CD2_2 extends KeywordName("CD2_2", "CD2_2") /** @group Constructors */ - case object AOCOUNTS extends KeywordName("AOCOUNTS", "AOCOUNTS") + case RADECSYS extends KeywordName("RADECSYS", "RADECSYS") /** @group Constructors */ - case object AOSEEING extends KeywordName("AOSEEING", "AOSEEING") + case MJD_OBS extends KeywordName("MJD_OBS", "MJD_OBS") /** @group Constructors */ - case object AOWFSX extends KeywordName("AOWFSX", "AOWFSX") + case APERTURE extends KeywordName("APERTURE", "APERTURE") /** @group Constructors */ - case object AOWFSY extends KeywordName("AOWFSY", "AOWFSY") + case FILTER extends KeywordName("FILTER", "FILTER") /** @group Constructors */ - case object AOWFSZ extends KeywordName("AOWFSZ", "AOWFSZ") + case AOFREQ extends KeywordName("AOFREQ", "AOFREQ") /** @group Constructors */ - case object AOGAIN extends KeywordName("AOGAIN", "AOGAIN") + case AOCOUNTS extends KeywordName("AOCOUNTS", "AOCOUNTS") /** @group Constructors */ - case object AONCPAF extends KeywordName("AONCPAF", "AONCPAF") + case AOSEEING extends KeywordName("AOSEEING", "AOSEEING") /** @group Constructors */ - case object AONDFILT extends KeywordName("AONDFILT", "AONDFILT") + case AOWFSX extends KeywordName("AOWFSX", "AOWFSX") /** @group Constructors */ - case object AOFLENS extends KeywordName("AOFLENS", "AOFLENS") + case AOWFSY extends KeywordName("AOWFSY", "AOWFSY") /** @group Constructors */ - case object AOFLEXF extends KeywordName("AOFLEXF", "AOFLEXF") + case AOWFSZ extends KeywordName("AOWFSZ", "AOWFSZ") /** @group Constructors */ - case object LGUSTAGE extends KeywordName("LGUSTAGE", "LGUSTAGE") + case AOGAIN extends KeywordName("AOGAIN", "AOGAIN") /** @group Constructors */ - case object AOBS extends KeywordName("AOBS", "AOBS") + case AONCPAF extends KeywordName("AONCPAF", "AONCPAF") /** @group Constructors */ - case object LGDFOCUS extends KeywordName("LGDFOCUS", "LGDFOCUS") + case AONDFILT extends KeywordName("AONDFILT", "AONDFILT") /** @group Constructors */ - case object LGTTCNTS extends KeywordName("LGTTCNTS", "LGTTCNTS") + case AOFLENS extends KeywordName("AOFLENS", "AOFLENS") /** @group Constructors */ - case object LGTTEXP extends KeywordName("LGTTEXP", "LGTTEXP") + case AOFLEXF extends KeywordName("AOFLEXF", "AOFLEXF") /** @group Constructors */ - case object LGSFCNTS extends KeywordName("LGSFCNTS", "LGSFCNTS") + case LGUSTAGE extends KeywordName("LGUSTAGE", "LGUSTAGE") /** @group Constructors */ - case object LGSFEXP extends KeywordName("LGSFEXP", "LGSFEXP") + case AOBS extends KeywordName("AOBS", "AOBS") /** @group Constructors */ - case object FSMTIP extends KeywordName("FSMTIP", "FSMTIP") + case LGDFOCUS extends KeywordName("LGDFOCUS", "LGDFOCUS") /** @group Constructors */ - case object FSMTILT extends KeywordName("FSMTILT", "FSMTILT") + case LGTTCNTS extends KeywordName("LGTTCNTS", "LGTTCNTS") /** @group Constructors */ - case object LGZMPOS extends KeywordName("LGZMPOS", "LGZMPOS") + case LGTTEXP extends KeywordName("LGTTEXP", "LGTTEXP") /** @group Constructors */ - case object NAALT extends KeywordName("NAALT", "NAALT") + case LGSFCNTS extends KeywordName("LGSFCNTS", "LGSFCNTS") /** @group Constructors */ - case object NATHICK extends KeywordName("NATHICK", "NATHICK") + case LGSFEXP extends KeywordName("LGSFEXP", "LGSFEXP") /** @group Constructors */ - case object LGNDFILT extends KeywordName("LGNDFILT", "LGNDFILT") + case FSMTIP extends KeywordName("FSMTIP", "FSMTIP") /** @group Constructors */ - case object LGTTIRIS extends KeywordName("LGTTIRIS", "LGTTIRIS") + case FSMTILT extends KeywordName("FSMTILT", "FSMTILT") /** @group Constructors */ - case object ELAPSED extends KeywordName("ELAPSED", "ELAPSED") + case LGZMPOS extends KeywordName("LGZMPOS", "LGZMPOS") /** @group Constructors */ - case object READDLAY extends KeywordName("READDLAY", "READDLAY") + case NAALT extends KeywordName("NAALT", "NAALT") /** @group Constructors */ - case object FILT1POS extends KeywordName("FILT1POS", "FILT1POS") + case NATHICK extends KeywordName("NATHICK", "NATHICK") /** @group Constructors */ - case object FILT1CAR extends KeywordName("FILT1CAR", "FILT1CAR") + case LGNDFILT extends KeywordName("LGNDFILT", "LGNDFILT") /** @group Constructors */ - case object FILT2POS extends KeywordName("FILT2POS", "FILT2POS") + case LGTTIRIS extends KeywordName("LGTTIRIS", "LGTTIRIS") /** @group Constructors */ - case object FILT2CAR extends KeywordName("FILT2CAR", "FILT2CAR") + case ELAPSED extends KeywordName("ELAPSED", "ELAPSED") /** @group Constructors */ - case object UTLWHEEL extends KeywordName("UTLWHEEL", "UTLWHEEL") + case READDLAY extends KeywordName("READDLAY", "READDLAY") /** @group Constructors */ - case object UTLWPOS extends KeywordName("UTLWPOS", "UTLWPOS") + case FILT1POS extends KeywordName("FILT1POS", "FILT1POS") /** @group Constructors */ - case object UTLWCAR extends KeywordName("UTLWCAR", "UTLWCAR") + case FILT1CAR extends KeywordName("FILT1CAR", "FILT1CAR") /** @group Constructors */ - case object CVERPOS extends KeywordName("CVERPOS", "CVERPOS") + case FILT2POS extends KeywordName("FILT2POS", "FILT2POS") /** @group Constructors */ - case object CVERCAR extends KeywordName("CVERCAR", "CVERCAR") + case FILT2CAR extends KeywordName("FILT2CAR", "FILT2CAR") /** @group Constructors */ - case object CWSTEMP extends KeywordName("CWSTEMP", "CWSTEMP") + case UTLWHEEL extends KeywordName("UTLWHEEL", "UTLWHEEL") /** @group Constructors */ - case object DETTEMP extends KeywordName("DETTEMP", "DETTEMP") + case UTLWPOS extends KeywordName("UTLWPOS", "UTLWPOS") /** @group Constructors */ - case object DETHTEMP extends KeywordName("DETHTEMP", "DETHTEMP") + case UTLWCAR extends KeywordName("UTLWCAR", "UTLWCAR") /** @group Constructors */ - case object DEWPRES extends KeywordName("DEWPRES", "DEWPRES") + case CVERPOS extends KeywordName("CVERPOS", "CVERPOS") /** @group Constructors */ - case object RDNOISE extends KeywordName("RDNOISE", "RDNOISE") + case CVERCAR extends KeywordName("CVERCAR", "CVERCAR") /** @group Constructors */ - case object GAIN extends KeywordName("GAIN", "GAIN") + case CWSTEMP extends KeywordName("CWSTEMP", "CWSTEMP") /** @group Constructors */ - case object SAMPMODE extends KeywordName("SAMPMODE", "SAMPMODE") + case DETTEMP extends KeywordName("DETTEMP", "DETTEMP") /** @group Constructors */ - case object NRESETS extends KeywordName("NRESETS", "NRESETS") + case DETHTEMP extends KeywordName("DETHTEMP", "DETHTEMP") /** @group Constructors */ - case object RSTDLAY extends KeywordName("RSTDLAY", "RSTDLAY") + case DEWPRES extends KeywordName("DEWPRES", "DEWPRES") /** @group Constructors */ - case object READTIME extends KeywordName("READTIME", "READTIME") + case RDNOISE extends KeywordName("RDNOISE", "RDNOISE") /** @group Constructors */ - case object BUNIT extends KeywordName("BUNIT", "BUNIT") + case GAIN extends KeywordName("GAIN", "GAIN") /** @group Constructors */ - case object DCHLTH extends KeywordName("DCHLTH", "DCHLTH") + case SAMPMODE extends KeywordName("SAMPMODE", "SAMPMODE") /** @group Constructors */ - case object DCSIM extends KeywordName("DCSIM", "DCSIM") + case NRESETS extends KeywordName("NRESETS", "NRESETS") /** @group Constructors */ - case object DSPTIMBN extends KeywordName("DSPTIMBN", "DSPTIMBN") + case RSTDLAY extends KeywordName("RSTDLAY", "RSTDLAY") /** @group Constructors */ - case object DSPTIMBV extends KeywordName("DSPTIMBV", "DSPTIMBV") + case READTIME extends KeywordName("READTIME", "READTIME") /** @group Constructors */ - case object DSPPCIN extends KeywordName("DSPPCIN", "DSPPCIN") + case BUNIT extends KeywordName("BUNIT", "BUNIT") /** @group Constructors */ - case object DSPPCIV extends KeywordName("DSPPCIV", "DSPPCIV") + case DCHLTH extends KeywordName("DCHLTH", "DCHLTH") /** @group Constructors */ - case object GSAOI_MJD_OBS extends KeywordName("GSAOI_MJD_OBS", "MJD-OBS") + case DCSIM extends KeywordName("DCSIM", "DCSIM") /** @group Constructors */ - case object GEMSSADC extends KeywordName("GEMSSADC", "GEMSSADC") + case DSPTIMBN extends KeywordName("DSPTIMBN", "DSPTIMBN") /** @group Constructors */ - case object GEMSDICH extends KeywordName("GEMSDICH", "GEMSDICH") + case DSPTIMBV extends KeywordName("DSPTIMBV", "DSPTIMBV") /** @group Constructors */ - case object GEMSASTR extends KeywordName("GEMSASTR", "GEMSASTR") + case DSPPCIN extends KeywordName("DSPPCIN", "DSPPCIN") /** @group Constructors */ - case object GEMSNADC extends KeywordName("GEMSNADC", "GEMSNADC") + case DSPPCIV extends KeywordName("DSPPCIV", "DSPPCIV") /** @group Constructors */ - case object LGWFS1CT extends KeywordName("LGWFS1CT", "LGWFS1CT") + case GSAOI_MJD_OBS extends KeywordName("GSAOI_MJD_OBS", "MJD-OBS") /** @group Constructors */ - case object LGWFS2CT extends KeywordName("LGWFS2CT", "LGWFS2CT") + case GEMSSADC extends KeywordName("GEMSSADC", "GEMSSADC") /** @group Constructors */ - case object LGWFS3CT extends KeywordName("LGWFS3CT", "LGWFS3CT") + case GEMSDICH extends KeywordName("GEMSDICH", "GEMSDICH") /** @group Constructors */ - case object LGWFS4CT extends KeywordName("LGWFS4CT", "LGWFS4CT") + case GEMSASTR extends KeywordName("GEMSASTR", "GEMSASTR") /** @group Constructors */ - case object LGWFS5CT extends KeywordName("LGWFS5CT", "LGWFS5CT") + case GEMSNADC extends KeywordName("GEMSNADC", "GEMSNADC") /** @group Constructors */ - case object LGSLOOP extends KeywordName("LGSLOOP", "LGSLOOP") + case LGWFS1CT extends KeywordName("LGWFS1CT", "LGWFS1CT") /** @group Constructors */ - case object TTLOOP extends KeywordName("TTLOOP", "TTLOOP") + case LGWFS2CT extends KeywordName("LGWFS2CT", "LGWFS2CT") /** @group Constructors */ - case object FOCLOOP extends KeywordName("FOCLOOP", "FOCLOOP") + case LGWFS3CT extends KeywordName("LGWFS3CT", "LGWFS3CT") /** @group Constructors */ - case object FLEXLOOP extends KeywordName("FLEXLOOP", "FLEXLOOP") + case LGWFS4CT extends KeywordName("LGWFS4CT", "LGWFS4CT") /** @group Constructors */ - case object LGSSTRHL extends KeywordName("LGSSTRHL", "LGSSTRHL") + case LGWFS5CT extends KeywordName("LGWFS5CT", "LGWFS5CT") /** @group Constructors */ - case object RZEROVAL extends KeywordName("RZEROVAL", "RZEROVAL") + case LGSLOOP extends KeywordName("LGSLOOP", "LGSLOOP") /** @group Constructors */ - case object CNSQARE1 extends KeywordName("CNSQARE1", "CNSQARE1") + case TTLOOP extends KeywordName("TTLOOP", "TTLOOP") /** @group Constructors */ - case object CNSQARE2 extends KeywordName("CNSQARE2", "CNSQARE2") + case FOCLOOP extends KeywordName("FOCLOOP", "FOCLOOP") /** @group Constructors */ - case object CNSQARE3 extends KeywordName("CNSQARE3", "CNSQARE3") + case FLEXLOOP extends KeywordName("FLEXLOOP", "FLEXLOOP") /** @group Constructors */ - case object CNSQARE4 extends KeywordName("CNSQARE4", "CNSQARE4") + case LGSSTRHL extends KeywordName("LGSSTRHL", "LGSSTRHL") /** @group Constructors */ - case object CNSQARE5 extends KeywordName("CNSQARE5", "CNSQARE5") + case RZEROVAL extends KeywordName("RZEROVAL", "RZEROVAL") /** @group Constructors */ - case object CNSQARE6 extends KeywordName("CNSQARE6", "CNSQARE6") + case CNSQARE1 extends KeywordName("CNSQARE1", "CNSQARE1") /** @group Constructors */ - case object GWFS1CFG extends KeywordName("GWFS1CFG", "GWFS1CFG") + case CNSQARE2 extends KeywordName("CNSQARE2", "CNSQARE2") /** @group Constructors */ - case object GWFS1OBJ extends KeywordName("GWFS1OBJ", "GWFS1OBJ") + case CNSQARE3 extends KeywordName("CNSQARE3", "CNSQARE3") /** @group Constructors */ - case object GWFS1RA extends KeywordName("GWFS1RA", "GWFS1RA") + case CNSQARE4 extends KeywordName("CNSQARE4", "CNSQARE4") /** @group Constructors */ - case object GWFS1DEC extends KeywordName("GWFS1DEC", "GWFS1DEC") + case CNSQARE5 extends KeywordName("CNSQARE5", "CNSQARE5") /** @group Constructors */ - case object GWFS1RV extends KeywordName("GWFS1RV", "GWFS1RV") + case CNSQARE6 extends KeywordName("CNSQARE6", "CNSQARE6") /** @group Constructors */ - case object GWFS1EPC extends KeywordName("GWFS1EPC", "GWFS1EPC") + case GWFS1CFG extends KeywordName("GWFS1CFG", "GWFS1CFG") /** @group Constructors */ - case object GWFS1EQN extends KeywordName("GWFS1EQN", "GWFS1EQN") + case GWFS1OBJ extends KeywordName("GWFS1OBJ", "GWFS1OBJ") /** @group Constructors */ - case object GWFS1FRM extends KeywordName("GWFS1FRM", "GWFS1FRM") + case GWFS1RA extends KeywordName("GWFS1RA", "GWFS1RA") /** @group Constructors */ - case object GWFS1PMD extends KeywordName("GWFS1PMD", "GWFS1PMD") + case GWFS1DEC extends KeywordName("GWFS1DEC", "GWFS1DEC") /** @group Constructors */ - case object GWFS1PMR extends KeywordName("GWFS1PMR", "GWFS1PMR") + case GWFS1RV extends KeywordName("GWFS1RV", "GWFS1RV") /** @group Constructors */ - case object GWFS1PAR extends KeywordName("GWFS1PAR", "GWFS1PAR") + case GWFS1EPC extends KeywordName("GWFS1EPC", "GWFS1EPC") /** @group Constructors */ - case object GWFS1WAV extends KeywordName("GWFS1WAV", "GWFS1WAV") + case GWFS1EQN extends KeywordName("GWFS1EQN", "GWFS1EQN") /** @group Constructors */ - case object GWFS1X extends KeywordName("GWFS1X", "GWFS1X") + case GWFS1FRM extends KeywordName("GWFS1FRM", "GWFS1FRM") /** @group Constructors */ - case object GWFS1Y extends KeywordName("GWFS1Y", "GWFS1Y") + case GWFS1PMD extends KeywordName("GWFS1PMD", "GWFS1PMD") /** @group Constructors */ - case object GWFS1SIZ extends KeywordName("GWFS1SIZ", "GWFS1SIZ") + case GWFS1PMR extends KeywordName("GWFS1PMR", "GWFS1PMR") /** @group Constructors */ - case object GWFS1CTS extends KeywordName("GWFS1CTS", "GWFS1CTS") + case GWFS1PAR extends KeywordName("GWFS1PAR", "GWFS1PAR") /** @group Constructors */ - case object GWFS2CFG extends KeywordName("GWFS2CFG", "GWFS2CFG") + case GWFS1WAV extends KeywordName("GWFS1WAV", "GWFS1WAV") /** @group Constructors */ - case object GWFS2OBJ extends KeywordName("GWFS2OBJ", "GWFS2OBJ") + case GWFS1X extends KeywordName("GWFS1X", "GWFS1X") /** @group Constructors */ - case object GWFS2RA extends KeywordName("GWFS2RA", "GWFS2RA") + case GWFS1Y extends KeywordName("GWFS1Y", "GWFS1Y") /** @group Constructors */ - case object GWFS2DEC extends KeywordName("GWFS2DEC", "GWFS2DEC") + case GWFS1SIZ extends KeywordName("GWFS1SIZ", "GWFS1SIZ") /** @group Constructors */ - case object GWFS2RV extends KeywordName("GWFS2RV", "GWFS2RV") + case GWFS1CTS extends KeywordName("GWFS1CTS", "GWFS1CTS") /** @group Constructors */ - case object GWFS2EPC extends KeywordName("GWFS2EPC", "GWFS2EPC") + case GWFS2CFG extends KeywordName("GWFS2CFG", "GWFS2CFG") /** @group Constructors */ - case object GWFS2EQN extends KeywordName("GWFS2EQN", "GWFS2EQN") + case GWFS2OBJ extends KeywordName("GWFS2OBJ", "GWFS2OBJ") /** @group Constructors */ - case object GWFS2FRM extends KeywordName("GWFS2FRM", "GWFS2FRM") + case GWFS2RA extends KeywordName("GWFS2RA", "GWFS2RA") /** @group Constructors */ - case object GWFS2PMD extends KeywordName("GWFS2PMD", "GWFS2PMD") + case GWFS2DEC extends KeywordName("GWFS2DEC", "GWFS2DEC") /** @group Constructors */ - case object GWFS2PMR extends KeywordName("GWFS2PMR", "GWFS2PMR") + case GWFS2RV extends KeywordName("GWFS2RV", "GWFS2RV") /** @group Constructors */ - case object GWFS2PAR extends KeywordName("GWFS2PAR", "GWFS2PAR") + case GWFS2EPC extends KeywordName("GWFS2EPC", "GWFS2EPC") /** @group Constructors */ - case object GWFS2WAV extends KeywordName("GWFS2WAV", "GWFS2WAV") + case GWFS2EQN extends KeywordName("GWFS2EQN", "GWFS2EQN") /** @group Constructors */ - case object GWFS2X extends KeywordName("GWFS2X", "GWFS2X") + case GWFS2FRM extends KeywordName("GWFS2FRM", "GWFS2FRM") /** @group Constructors */ - case object GWFS2Y extends KeywordName("GWFS2Y", "GWFS2Y") + case GWFS2PMD extends KeywordName("GWFS2PMD", "GWFS2PMD") /** @group Constructors */ - case object GWFS2SIZ extends KeywordName("GWFS2SIZ", "GWFS2SIZ") + case GWFS2PMR extends KeywordName("GWFS2PMR", "GWFS2PMR") /** @group Constructors */ - case object GWFS2CTS extends KeywordName("GWFS2CTS", "GWFS2CTS") + case GWFS2PAR extends KeywordName("GWFS2PAR", "GWFS2PAR") /** @group Constructors */ - case object GWFS3CFG extends KeywordName("GWFS3CFG", "GWFS3CFG") + case GWFS2WAV extends KeywordName("GWFS2WAV", "GWFS2WAV") /** @group Constructors */ - case object GWFS3OBJ extends KeywordName("GWFS3OBJ", "GWFS3OBJ") + case GWFS2X extends KeywordName("GWFS2X", "GWFS2X") /** @group Constructors */ - case object GWFS3RA extends KeywordName("GWFS3RA", "GWFS3RA") + case GWFS2Y extends KeywordName("GWFS2Y", "GWFS2Y") /** @group Constructors */ - case object GWFS3DEC extends KeywordName("GWFS3DEC", "GWFS3DEC") + case GWFS2SIZ extends KeywordName("GWFS2SIZ", "GWFS2SIZ") /** @group Constructors */ - case object GWFS3RV extends KeywordName("GWFS3RV", "GWFS3RV") + case GWFS2CTS extends KeywordName("GWFS2CTS", "GWFS2CTS") /** @group Constructors */ - case object GWFS3EPC extends KeywordName("GWFS3EPC", "GWFS3EPC") + case GWFS3CFG extends KeywordName("GWFS3CFG", "GWFS3CFG") /** @group Constructors */ - case object GWFS3EQN extends KeywordName("GWFS3EQN", "GWFS3EQN") + case GWFS3OBJ extends KeywordName("GWFS3OBJ", "GWFS3OBJ") /** @group Constructors */ - case object GWFS3FRM extends KeywordName("GWFS3FRM", "GWFS3FRM") + case GWFS3RA extends KeywordName("GWFS3RA", "GWFS3RA") /** @group Constructors */ - case object GWFS3PMD extends KeywordName("GWFS3PMD", "GWFS3PMD") + case GWFS3DEC extends KeywordName("GWFS3DEC", "GWFS3DEC") /** @group Constructors */ - case object GWFS3PMR extends KeywordName("GWFS3PMR", "GWFS3PMR") + case GWFS3RV extends KeywordName("GWFS3RV", "GWFS3RV") /** @group Constructors */ - case object GWFS3PAR extends KeywordName("GWFS3PAR", "GWFS3PAR") + case GWFS3EPC extends KeywordName("GWFS3EPC", "GWFS3EPC") /** @group Constructors */ - case object GWFS3WAV extends KeywordName("GWFS3WAV", "GWFS3WAV") + case GWFS3EQN extends KeywordName("GWFS3EQN", "GWFS3EQN") /** @group Constructors */ - case object GWFS3X extends KeywordName("GWFS3X", "GWFS3X") + case GWFS3FRM extends KeywordName("GWFS3FRM", "GWFS3FRM") /** @group Constructors */ - case object GWFS3Y extends KeywordName("GWFS3Y", "GWFS3Y") + case GWFS3PMD extends KeywordName("GWFS3PMD", "GWFS3PMD") /** @group Constructors */ - case object GWFS3SIZ extends KeywordName("GWFS3SIZ", "GWFS3SIZ") + case GWFS3PMR extends KeywordName("GWFS3PMR", "GWFS3PMR") /** @group Constructors */ - case object GWFS3CTS extends KeywordName("GWFS3CTS", "GWFS3CTS") + case GWFS3PAR extends KeywordName("GWFS3PAR", "GWFS3PAR") /** @group Constructors */ - case object GWFS4CFG extends KeywordName("GWFS4CFG", "GWFS4CFG") + case GWFS3WAV extends KeywordName("GWFS3WAV", "GWFS3WAV") /** @group Constructors */ - case object GWFS4OBJ extends KeywordName("GWFS4OBJ", "GWFS4OBJ") + case GWFS3X extends KeywordName("GWFS3X", "GWFS3X") /** @group Constructors */ - case object GWFS4RA extends KeywordName("GWFS4RA", "GWFS4RA") + case GWFS3Y extends KeywordName("GWFS3Y", "GWFS3Y") /** @group Constructors */ - case object GWFS4DEC extends KeywordName("GWFS4DEC", "GWFS4DEC") + case GWFS3SIZ extends KeywordName("GWFS3SIZ", "GWFS3SIZ") /** @group Constructors */ - case object GWFS4RV extends KeywordName("GWFS4RV", "GWFS4RV") + case GWFS3CTS extends KeywordName("GWFS3CTS", "GWFS3CTS") /** @group Constructors */ - case object GWFS4EPC extends KeywordName("GWFS4EPC", "GWFS4EPC") + case GWFS4CFG extends KeywordName("GWFS4CFG", "GWFS4CFG") /** @group Constructors */ - case object GWFS4EQN extends KeywordName("GWFS4EQN", "GWFS4EQN") + case GWFS4OBJ extends KeywordName("GWFS4OBJ", "GWFS4OBJ") /** @group Constructors */ - case object GWFS4FRM extends KeywordName("GWFS4FRM", "GWFS4FRM") + case GWFS4RA extends KeywordName("GWFS4RA", "GWFS4RA") /** @group Constructors */ - case object GWFS4PMD extends KeywordName("GWFS4PMD", "GWFS4PMD") + case GWFS4DEC extends KeywordName("GWFS4DEC", "GWFS4DEC") /** @group Constructors */ - case object GWFS4PMR extends KeywordName("GWFS4PMR", "GWFS4PMR") + case GWFS4RV extends KeywordName("GWFS4RV", "GWFS4RV") /** @group Constructors */ - case object GWFS4PAR extends KeywordName("GWFS4PAR", "GWFS4PAR") + case GWFS4EPC extends KeywordName("GWFS4EPC", "GWFS4EPC") /** @group Constructors */ - case object GWFS4WAV extends KeywordName("GWFS4WAV", "GWFS4WAV") + case GWFS4EQN extends KeywordName("GWFS4EQN", "GWFS4EQN") /** @group Constructors */ - case object GWFS4X extends KeywordName("GWFS4X", "GWFS4X") + case GWFS4FRM extends KeywordName("GWFS4FRM", "GWFS4FRM") /** @group Constructors */ - case object GWFS4Y extends KeywordName("GWFS4Y", "GWFS4Y") + case GWFS4PMD extends KeywordName("GWFS4PMD", "GWFS4PMD") /** @group Constructors */ - case object GWFS4SIZ extends KeywordName("GWFS4SIZ", "GWFS4SIZ") + case GWFS4PMR extends KeywordName("GWFS4PMR", "GWFS4PMR") /** @group Constructors */ - case object GWFS4CTS extends KeywordName("GWFS4CTS", "GWFS4CTS") + case GWFS4PAR extends KeywordName("GWFS4PAR", "GWFS4PAR") /** @group Constructors */ - case object NODMODE extends KeywordName("NODMODE", "NODMODE") + case GWFS4WAV extends KeywordName("GWFS4WAV", "GWFS4WAV") /** @group Constructors */ - case object NODPIX extends KeywordName("NODPIX", "NODPIX") + case GWFS4X extends KeywordName("GWFS4X", "GWFS4X") /** @group Constructors */ - case object NODCOUNT extends KeywordName("NODCOUNT", "NODCOUNT") + case GWFS4Y extends KeywordName("GWFS4Y", "GWFS4Y") /** @group Constructors */ - case object NODAXOFF extends KeywordName("NODAXOFF", "NODAXOFF") + case GWFS4SIZ extends KeywordName("GWFS4SIZ", "GWFS4SIZ") /** @group Constructors */ - case object NODAYOFF extends KeywordName("NODAYOFF", "NODAYOFF") + case GWFS4CTS extends KeywordName("GWFS4CTS", "GWFS4CTS") /** @group Constructors */ - case object NODBXOFF extends KeywordName("NODBXOFF", "NODBXOFF") + case NODMODE extends KeywordName("NODMODE", "NODMODE") /** @group Constructors */ - case object NODBYOFF extends KeywordName("NODBYOFF", "NODBYOFF") + case NODPIX extends KeywordName("NODPIX", "NODPIX") /** @group Constructors */ - case object ANODCNT extends KeywordName("ANODCNT", "ANODCNT") + case NODCOUNT extends KeywordName("NODCOUNT", "NODCOUNT") /** @group Constructors */ - case object BNODCNT extends KeywordName("BNODCNT", "BNODCNT") + case NODAXOFF extends KeywordName("NODAXOFF", "NODAXOFF") /** @group Constructors */ - case object SUBINT extends KeywordName("SUBINT", "SUBINT") + case NODAYOFF extends KeywordName("NODAYOFF", "NODAYOFF") /** @group Constructors */ - case object BASEPO extends KeywordName("BASEPO", "BASEPO") + case NODBXOFF extends KeywordName("NODBXOFF", "NODBXOFF") /** @group Constructors */ - case object SRIFU1 extends KeywordName("SRIFU1", "SRIFU1") + case NODBYOFF extends KeywordName("NODBYOFF", "NODBYOFF") /** @group Constructors */ - case object SRIFU2 extends KeywordName("SRIFU2", "SRIFU2") + case ANODCNT extends KeywordName("ANODCNT", "ANODCNT") /** @group Constructors */ - case object HRIFU1 extends KeywordName("HRIFU1", "HRIFU1") + case BNODCNT extends KeywordName("BNODCNT", "BNODCNT") /** @group Constructors */ - case object HRIFU2 extends KeywordName("HRIFU2", "HRIFU2") + case SUBINT extends KeywordName("SUBINT", "SUBINT") /** @group Constructors */ - case object IFU1GUID extends KeywordName("IFU1GUID", "IFU1GUID") + case BASEPO extends KeywordName("BASEPO", "BASEPO") /** @group Constructors */ - case object IFU2GUID extends KeywordName("IFU2GUID", "IFU2GUID") + case SRIFU1 extends KeywordName("SRIFU1", "SRIFU1") /** @group Constructors */ - case object FAGITAT1 extends KeywordName("FAGITAT1", "FAGITAT1") + case SRIFU2 extends KeywordName("SRIFU2", "SRIFU2") /** @group Constructors */ - case object FAGITAT2 extends KeywordName("FAGITAT2", "FAGITAT2") + case HRIFU1 extends KeywordName("HRIFU1", "HRIFU1") /** @group Constructors */ - case object NREDEXP extends KeywordName("NREDEXP", "NREDEXP") + case HRIFU2 extends KeywordName("HRIFU2", "HRIFU2") /** @group Constructors */ - case object REDEXPT extends KeywordName("REDEXPT", "REDEXPT") + case IFU1GUID extends KeywordName("IFU1GUID", "IFU1GUID") /** @group Constructors */ - case object NBLUEEXP extends KeywordName("NBLUEEXP", "NBLUEEXP") + case IFU2GUID extends KeywordName("IFU2GUID", "IFU2GUID") /** @group Constructors */ - case object BLUEEXPT extends KeywordName("BLUEEXPT", "BLUEEXPT") + case FAGITAT1 extends KeywordName("FAGITAT1", "FAGITAT1") /** @group Constructors */ - case object NSLITEXP extends KeywordName("NSLITEXP", "NSLITEXP") + case FAGITAT2 extends KeywordName("FAGITAT2", "FAGITAT2") /** @group Constructors */ - case object SLITEXPT extends KeywordName("SLITEXPT", "SLITEXPT") + case NREDEXP extends KeywordName("NREDEXP", "NREDEXP") /** @group Constructors */ - case object REDCCDS extends KeywordName("REDCCDS", "REDCCDS") + case REDEXPT extends KeywordName("REDEXPT", "REDEXPT") /** @group Constructors */ - case object BLUCCDS extends KeywordName("BLUCCDS", "BLUCCDS") + case NBLUEEXP extends KeywordName("NBLUEEXP", "NBLUEEXP") /** @group Constructors */ - case object READRED extends KeywordName("READRED", "READRED") + case BLUEEXPT extends KeywordName("BLUEEXPT", "BLUEEXPT") /** @group Constructors */ - case object READBLU extends KeywordName("READBLU", "READBLU") + case NSLITEXP extends KeywordName("NSLITEXP", "NSLITEXP") /** @group Constructors */ - case object TARGETM extends KeywordName("TARGETM", "TARGETM") + case SLITEXPT extends KeywordName("SLITEXPT", "SLITEXPT") /** @group Constructors */ - case object RESOLUT extends KeywordName("RESOLUT", "RESOLUT") + case REDCCDS extends KeywordName("REDCCDS", "REDCCDS") /** @group Constructors */ - case object TEXPTIME extends KeywordName("TEXPTIME", "TEXPTIME") + case BLUCCDS extends KeywordName("BLUCCDS", "BLUCCDS") /** @group Constructors */ - case object TARGET1 extends KeywordName("TARGET1", "TARGET1") + case READRED extends KeywordName("READRED", "READRED") /** @group Constructors */ - case object TARGET2 extends KeywordName("TARGET2", "TARGET2") + case READBLU extends KeywordName("READBLU", "READBLU") - /** All members of KeywordName, in canonical order. */ - val all: List[KeywordName] = - List( - INSTRUMENT, - SW_NAME, - SW_VER, - OBJECT, - OBSTYPE, - OBSCLASS, - GEMPRGID, - OBSID, - DATALAB, - OBSERVER, - OBSERVAT, - TELESCOP, - PARALLAX, - RADVEL, - EPOCH, - EQUINOX, - TRKEQUIN, - SSA, - RA, - DEC, - ELEVATIO, - AZIMUTH, - CRPA, - HA, - LT, - TRKFRAME, - DECTRACK, - TRKEPOCH, - RATRACK, - FRAME, - PMDEC, - PMRA, - WAVELENG, - RAWIQ, - RAWCC, - RAWWV, - RAWBG, - RAWPIREQ, - RAWGEMQA, - CGUIDMOD, - UT, - DATE, - M2BAFFLE, - M2CENBAF, - ST, - XOFFSET, - YOFFSET, - POFFSET, - QOFFSET, - RAOFFSET, - DECOFFSE, - RATRGOFF, - DECTRGOF, - PA, - IAA, - SFRT2, - SFTILT, - SFLINEAR, - AOFOLD, - PWFS1_ST, - PWFS2_ST, - OIWFS_ST, - AOWFS_ST, - SCIBAND, - NUMREQTW, - REQIQ, - REQCC, - REQBG, - REQWV, - REQMAXAM, - REQMAXHA, - REQMINAM, - REQMINHA, - OIARA, - OIADEC, - OIARV, - OIAWAVEL, - OIAEPOCH, - OIAEQUIN, - OIAFRAME, - OIAOBJEC, - OIAPMDEC, - OIAPMRA, - OIAPARAL, - OIFOCUS, - P1ARA, - P1ADEC, - P1ARV, - P1AWAVEL, - P1AEPOCH, - P1AEQUIN, - P1AFRAME, - P1AOBJEC, - P1APMDEC, - P1APMRA, - P1APARAL, - P1FOCUS, - P2ARA, - P2ADEC, - P2ARV, - P2AWAVEL, - P2AEPOCH, - P2AEQUIN, - P2AFRAME, - P2AOBJEC, - P2APMDEC, - P2APMRA, - P2APARAL, - P2FOCUS, - AOARA, - AOADEC, - AOARV, - AOAWAVEL, - AOAEPOCH, - AOAEQUIN, - AOAFRAME, - AOAOBJEC, - AOAPMDEC, - AOAPMRA, - AOAPARAL, - AOFOCUS, - OIFREQ, - P1FREQ, - P2FREQ, - AIRMASS, - AMSTART, - AMEND, - PROP_MD, - RELEASE, - PREIMAGE, - DATE_OBS, - TIME_OBS, - READMODE, - NREADS, - GCALLAMP, - GCALFILT, - GCALDIFF, - GCALSHUT, - PAR_ANG, - INPORT, - ASTROMTC, - CRFOLLOW, - HUMIDITY, - TAMBIENT, - TAMBIEN2, - PRESSURE, - PRESSUR2, - DEWPOINT, - DEWPOIN2, - WINDSPEE, - WINDSPE2, - WINDDIRE, - ARRAYID, - ARRAYTYP, - UTSTART, - FILTER1, - FW1_ENG, - FILTER2, - FW2_ENG, - CAMERA, - CAM_ENG, - SLIT, - SLIT_ENG, - DECKER, - DKR_ENG, - GRATING, - GR_ENG, - GRATWAVE, - GRATORD, - GRATTILT, - PRISM, - PRSM_ENG, - ACQMIR, - COVER, - FOCUS, - FCS_ENG, - DETBIAS, - UTEND, - OBSEPOCH, - GMOSCC, - ADCENPST, - ADCENPEN, - ADCENPME, - ADCEXPST, - ADCEXPEN, - ADCEXPME, - ADCWLEN1, - ADCWLEN2, - MASKID, - MASKNAME, - MASKTYP, - MASKLOC, - FILTID1, - FILTID2, - GRATID, - GRWLEN, - CENTWAVE, - GRORDER, - GRTILT, - GRSTEP, - DTAX, - DTAY, - DTAZ, - DTAZST, - DTAZEN, - DTAZME, - DTMODE, - ADCMODE, - GMOSDC, - DETTYPE, - DETID, - EXPOSURE, - ADCUSED, - DETNROI, - DETRO0X, - DETRO0XS, - DETRO0Y, - DETRO0YS, - DETRO1X, - DETRO1XS, - DETRO1Y, - DETRO1YS, - DETRO2X, - DETRO2XS, - DETRO2Y, - DETRO2YS, - DETRO3X, - DETRO3XS, - DETRO3Y, - DETRO3YS, - DETRO4X, - DETRO4XS, - DETRO4Y, - DETRO4YS, - DETRO5X, - DETRO5XS, - DETRO5Y, - DETRO5YS, - DETRO6X, - DETRO6XS, - DETRO6Y, - DETRO6YS, - DETRO7X, - DETRO7XS, - DETRO7Y, - DETRO7YS, - DETRO8X, - DETRO8XS, - DETRO8Y, - DETRO8YS, - DETRO9X, - DETRO9XS, - DETRO9Y, - DETRO9YS, - REQTWS01, - REQTWD01, - REQTWN01, - REQTWP01, - REQTWS02, - REQTWD02, - REQTWN02, - REQTWP02, - REQTWS03, - REQTWD03, - REQTWN03, - REQTWP03, - REQTWS04, - REQTWD04, - REQTWN04, - REQTWP04, - REQTWS05, - REQTWD05, - REQTWN05, - REQTWP05, - REQTWS06, - REQTWD06, - REQTWN06, - REQTWP06, - REQTWS07, - REQTWD07, - REQTWN07, - REQTWP07, - REQTWS08, - REQTWD08, - REQTWN08, - REQTWP08, - REQTWS09, - REQTWD09, - REQTWN09, - REQTWP09, - REQTWS10, - REQTWD10, - REQTWN10, - REQTWP10, - REQTWS11, - REQTWD11, - REQTWN11, - REQTWP11, - REQTWS12, - REQTWD12, - REQTWN12, - REQTWP12, - REQTWS13, - REQTWD13, - REQTWN13, - REQTWP13, - REQTWS14, - REQTWD14, - REQTWN14, - REQTWP14, - REQTWS15, - REQTWD15, - REQTWN15, - REQTWP15, - REQTWS16, - REQTWD16, - REQTWN16, - REQTWP16, - REQTWS17, - REQTWD17, - REQTWN17, - REQTWP17, - REQTWS18, - REQTWD18, - REQTWN18, - REQTWP18, - REQTWS19, - REQTWD19, - REQTWN19, - REQTWP19, - REQTWS20, - REQTWD20, - REQTWN20, - REQTWP20, - REQTWS21, - REQTWD21, - REQTWN21, - REQTWP21, - REQTWS22, - REQTWD22, - REQTWN22, - REQTWP22, - REQTWS23, - REQTWD23, - REQTWN23, - REQTWP23, - REQTWS24, - REQTWD24, - REQTWN24, - REQTWP24, - REQTWS25, - REQTWD25, - REQTWN25, - REQTWP25, - REQTWS26, - REQTWD26, - REQTWN26, - REQTWP26, - REQTWS27, - REQTWD27, - REQTWN27, - REQTWP27, - REQTWS28, - REQTWD28, - REQTWN28, - REQTWP28, - REQTWS29, - REQTWD29, - REQTWN29, - REQTWP29, - REQTWS30, - REQTWD30, - REQTWN30, - REQTWP30, - REQTWS31, - REQTWD31, - REQTWN31, - REQTWP31, - REQTWS32, - REQTWD32, - REQTWN32, - REQTWP32, - REQTWS33, - REQTWD33, - REQTWN33, - REQTWP33, - REQTWS34, - REQTWD34, - REQTWN34, - REQTWP34, - REQTWS35, - REQTWD35, - REQTWN35, - REQTWP35, - REQTWS36, - REQTWD36, - REQTWN36, - REQTWP36, - REQTWS37, - REQTWD37, - REQTWN37, - REQTWP37, - REQTWS38, - REQTWD38, - REQTWN38, - REQTWP38, - REQTWS39, - REQTWD39, - REQTWN39, - REQTWP39, - REQTWS40, - REQTWD40, - REQTWN40, - REQTWP40, - REQTWS41, - REQTWD41, - REQTWN41, - REQTWP41, - REQTWS42, - REQTWD42, - REQTWN42, - REQTWP42, - REQTWS43, - REQTWD43, - REQTWN43, - REQTWP43, - REQTWS44, - REQTWD44, - REQTWN44, - REQTWP44, - REQTWS45, - REQTWD45, - REQTWN45, - REQTWP45, - REQTWS46, - REQTWD46, - REQTWN46, - REQTWP46, - REQTWS47, - REQTWD47, - REQTWN47, - REQTWP47, - REQTWS48, - REQTWD48, - REQTWN48, - REQTWP48, - REQTWS49, - REQTWD49, - REQTWN49, - REQTWP49, - REQTWS50, - REQTWD50, - REQTWN50, - REQTWP50, - REQTWS51, - REQTWD51, - REQTWN51, - REQTWP51, - REQTWS52, - REQTWD52, - REQTWN52, - REQTWP52, - REQTWS53, - REQTWD53, - REQTWN53, - REQTWP53, - REQTWS54, - REQTWD54, - REQTWN54, - REQTWP54, - REQTWS55, - REQTWD55, - REQTWN55, - REQTWP55, - REQTWS56, - REQTWD56, - REQTWN56, - REQTWP56, - REQTWS57, - REQTWD57, - REQTWN57, - REQTWP57, - REQTWS58, - REQTWD58, - REQTWN58, - REQTWP58, - REQTWS59, - REQTWD59, - REQTWN59, - REQTWP59, - REQTWS60, - REQTWD60, - REQTWN60, - REQTWP60, - REQTWS61, - REQTWD61, - REQTWN61, - REQTWP61, - REQTWS62, - REQTWD62, - REQTWN62, - REQTWP62, - REQTWS63, - REQTWD63, - REQTWN63, - REQTWP63, - REQTWS64, - REQTWD64, - REQTWN64, - REQTWP64, - REQTWS65, - REQTWD65, - REQTWN65, - REQTWP65, - REQTWS66, - REQTWD66, - REQTWN66, - REQTWP66, - REQTWS67, - REQTWD67, - REQTWN67, - REQTWP67, - REQTWS68, - REQTWD68, - REQTWN68, - REQTWP68, - REQTWS69, - REQTWD69, - REQTWN69, - REQTWP69, - REQTWS70, - REQTWD70, - REQTWN70, - REQTWP70, - REQTWS71, - REQTWD71, - REQTWN71, - REQTWP71, - REQTWS72, - REQTWD72, - REQTWN72, - REQTWP72, - REQTWS73, - REQTWD73, - REQTWN73, - REQTWP73, - REQTWS74, - REQTWD74, - REQTWN74, - REQTWP74, - REQTWS75, - REQTWD75, - REQTWN75, - REQTWP75, - REQTWS76, - REQTWD76, - REQTWN76, - REQTWP76, - REQTWS77, - REQTWD77, - REQTWN77, - REQTWP77, - REQTWS78, - REQTWD78, - REQTWN78, - REQTWP78, - REQTWS79, - REQTWD79, - REQTWN79, - REQTWP79, - REQTWS80, - REQTWD80, - REQTWN80, - REQTWP80, - REQTWS81, - REQTWD81, - REQTWN81, - REQTWP81, - REQTWS82, - REQTWD82, - REQTWN82, - REQTWP82, - REQTWS83, - REQTWD83, - REQTWN83, - REQTWP83, - REQTWS84, - REQTWD84, - REQTWN84, - REQTWP84, - REQTWS85, - REQTWD85, - REQTWN85, - REQTWP85, - REQTWS86, - REQTWD86, - REQTWN86, - REQTWP86, - REQTWS87, - REQTWD87, - REQTWN87, - REQTWP87, - REQTWS88, - REQTWD88, - REQTWN88, - REQTWP88, - REQTWS89, - REQTWD89, - REQTWN89, - REQTWP89, - REQTWS90, - REQTWD90, - REQTWN90, - REQTWP90, - REQTWS91, - REQTWD91, - REQTWN91, - REQTWP91, - REQTWS92, - REQTWD92, - REQTWN92, - REQTWP92, - REQTWS93, - REQTWD93, - REQTWN93, - REQTWP93, - REQTWS94, - REQTWD94, - REQTWN94, - REQTWP94, - REQTWS95, - REQTWD95, - REQTWN95, - REQTWP95, - REQTWS96, - REQTWD96, - REQTWN96, - REQTWP96, - REQTWS97, - REQTWD97, - REQTWN97, - REQTWP97, - REQTWS98, - REQTWD98, - REQTWN98, - REQTWP98, - REQTWS99, - REQTWD99, - REQTWN99, - REQTWP99, - COADDS, - EXPTIME, - FILTER3, - FOCUSNAM, - FOCUSPOS, - FPMASK, - BEAMSPLT, - WINDCOVR, - FRMSPCYCL, - HDRTIMING, - LNRS, - MODE, - NDAVGS, - PVIEW, - TDETABS, - TIME, - TMOUNT, - UCODENAM, - UCODETYP, - VDDCL1, - VDDCL2, - VDDUC, - VDET, - VGGCL1, - VGGCL2, - VSET, - A_TDETABS, - A_TMOUNT, - A_VDDCL1, - A_VDDCL2, - A_VDDUC, - A_VDET, - A_VGGCL1, - A_VGGCL2, - A_VSET, - APOFFSET, - FLIP, - EXPRQ, - DCNAME, - PERIOD, - NPERIODS, - EXPMODE, - BIASPWR, - OBSMODE, - RDTIME, - CTYPE1, - CRPIX1, - CRVAL1, - CTYPE2, - CRPIX2, - CRVAL2, - CD1_1, - CD1_2, - CD2_1, - CD2_2, - RADECSYS, - MJD_OBS, - APERTURE, - FILTER, - AOFREQ, - AOCOUNTS, - AOSEEING, - AOWFSX, - AOWFSY, - AOWFSZ, - AOGAIN, - AONCPAF, - AONDFILT, - AOFLENS, - AOFLEXF, - LGUSTAGE, - AOBS, - LGDFOCUS, - LGTTCNTS, - LGTTEXP, - LGSFCNTS, - LGSFEXP, - FSMTIP, - FSMTILT, - LGZMPOS, - NAALT, - NATHICK, - LGNDFILT, - LGTTIRIS, - ELAPSED, - READDLAY, - FILT1POS, - FILT1CAR, - FILT2POS, - FILT2CAR, - UTLWHEEL, - UTLWPOS, - UTLWCAR, - CVERPOS, - CVERCAR, - CWSTEMP, - DETTEMP, - DETHTEMP, - DEWPRES, - RDNOISE, - GAIN, - SAMPMODE, - NRESETS, - RSTDLAY, - READTIME, - BUNIT, - DCHLTH, - DCSIM, - DSPTIMBN, - DSPTIMBV, - DSPPCIN, - DSPPCIV, - GSAOI_MJD_OBS, - GEMSSADC, - GEMSDICH, - GEMSASTR, - GEMSNADC, - LGWFS1CT, - LGWFS2CT, - LGWFS3CT, - LGWFS4CT, - LGWFS5CT, - LGSLOOP, - TTLOOP, - FOCLOOP, - FLEXLOOP, - LGSSTRHL, - RZEROVAL, - CNSQARE1, - CNSQARE2, - CNSQARE3, - CNSQARE4, - CNSQARE5, - CNSQARE6, - GWFS1CFG, - GWFS1OBJ, - GWFS1RA, - GWFS1DEC, - GWFS1RV, - GWFS1EPC, - GWFS1EQN, - GWFS1FRM, - GWFS1PMD, - GWFS1PMR, - GWFS1PAR, - GWFS1WAV, - GWFS1X, - GWFS1Y, - GWFS1SIZ, - GWFS1CTS, - GWFS2CFG, - GWFS2OBJ, - GWFS2RA, - GWFS2DEC, - GWFS2RV, - GWFS2EPC, - GWFS2EQN, - GWFS2FRM, - GWFS2PMD, - GWFS2PMR, - GWFS2PAR, - GWFS2WAV, - GWFS2X, - GWFS2Y, - GWFS2SIZ, - GWFS2CTS, - GWFS3CFG, - GWFS3OBJ, - GWFS3RA, - GWFS3DEC, - GWFS3RV, - GWFS3EPC, - GWFS3EQN, - GWFS3FRM, - GWFS3PMD, - GWFS3PMR, - GWFS3PAR, - GWFS3WAV, - GWFS3X, - GWFS3Y, - GWFS3SIZ, - GWFS3CTS, - GWFS4CFG, - GWFS4OBJ, - GWFS4RA, - GWFS4DEC, - GWFS4RV, - GWFS4EPC, - GWFS4EQN, - GWFS4FRM, - GWFS4PMD, - GWFS4PMR, - GWFS4PAR, - GWFS4WAV, - GWFS4X, - GWFS4Y, - GWFS4SIZ, - GWFS4CTS, - NODMODE, - NODPIX, - NODCOUNT, - NODAXOFF, - NODAYOFF, - NODBXOFF, - NODBYOFF, - ANODCNT, - BNODCNT, - SUBINT, - BASEPO, - SRIFU1, - SRIFU2, - HRIFU1, - HRIFU2, - IFU1GUID, - IFU2GUID, - FAGITAT1, - FAGITAT2, - NREDEXP, - REDEXPT, - NBLUEEXP, - BLUEEXPT, - NSLITEXP, - SLITEXPT, - REDCCDS, - BLUCCDS, - READRED, - READBLU, - TARGETM, - RESOLUT, - TEXPTIME, - TARGET1, - TARGET2 - ) + /** @group Constructors */ + case TARGETM extends KeywordName("TARGETM", "TARGETM") + /** @group Constructors */ + case RESOLUT extends KeywordName("RESOLUT", "RESOLUT") + + /** @group Constructors */ + case TEXPTIME extends KeywordName("TEXPTIME", "TEXPTIME") + + /** @group Constructors */ + case TARGET1 extends KeywordName("TARGET1", "TARGET1") + + /** @group Constructors */ + case TARGET2 extends KeywordName("TARGET2", "TARGET2") + +} + +object KeywordName { + /** Select the member of KeywordName with the given tag, if any. */ - def fromTag(s: String): Option[KeywordName] = - all.find(_.tag === s) + def fromTag(s: String): Option[KeywordName] = Enumerated.fromTag[KeywordName].getOption(s) /** Select the member of KeywordName with the given tag, throwing if absent. */ def unsafeFromTag(s: String): KeywordName = fromTag(s).getOrElse(throw new NoSuchElementException(s"KeywordName: Invalid tag: '$s'")) - - /** @group Typeclass Instances */ - implicit val KeywordNameEnumerated: Enumerated[KeywordName] = - new Enumerated[KeywordName] { - def all = KeywordName.all - def tag(a: KeywordName) = a.tag - override def unsafeFromTag(s: String): KeywordName = - KeywordName.unsafeFromTag(s) - } - + } diff --git a/modules/server_new/src/main/scala/observe/server/SeqTranslate.scala b/modules/server_new/src/main/scala/observe/server/SeqTranslate.scala index 9aef3aca3..a9b4677eb 100644 --- a/modules/server_new/src/main/scala/observe/server/SeqTranslate.scala +++ b/modules/server_new/src/main/scala/observe/server/SeqTranslate.scala @@ -707,8 +707,9 @@ object SeqTranslate { kwClient, ObsKeywordReader[F, D](obsCfg, stepCfg, site), systemss.tcsKeywordReader, - StateKeywordsReader[F](ctx.conditions, ctx.operator, ctx.observer), - tcsSubsystems + StateKeywordsReader[F](ctx.conditions, ctx.operator, ctx.observer, site), + tcsSubsystems, + site ) private def gwsHeaders(kwClient: KeywordsClient[F]): Header[F] = diff --git a/modules/server_new/src/main/scala/observe/server/keywords/ConditionOps.scala b/modules/server_new/src/main/scala/observe/server/keywords/ConditionOps.scala new file mode 100644 index 000000000..4dad5e9ed --- /dev/null +++ b/modules/server_new/src/main/scala/observe/server/keywords/ConditionOps.scala @@ -0,0 +1,56 @@ +// Copyright (c) 2016-2023 Association of Universities for Research in Astronomy, Inc. (AURA) +// For license information see LICENSE or https://opensource.org/licenses/BSD-3-Clause + +package observe.server.keywords + +import lucuma.core.enums.{Site, SkyBackground, WaterVapor} +import lucuma.core.model.ConstraintSet +import observe.model.Conditions + +object ConditionOps { + + extension (wv: WaterVapor) { + def toMillimeters(site: Site): Double = site match + case Site.GN => wv match + case WaterVapor.VeryDry => 1.0 + case WaterVapor.Dry => 1.6 + case WaterVapor.Median => 3.0 + case WaterVapor.Wet => 5.0 + case Site.GS => wv match + case WaterVapor.VeryDry => 2.3 + case WaterVapor.Dry => 4.3 + case WaterVapor.Median => 7.6 + case WaterVapor.Wet => 10.0 + } + + extension (sb: SkyBackground) { + def toMicroVolts: Double = sb match + case SkyBackground.Darkest => 21.3 + case SkyBackground.Dark => 20.7 + case SkyBackground.Gray => 19.5 + case SkyBackground.Bright => 18.0 + } + + extension (conditions: Conditions) { + def imageQualityStr: String = conditions.iq.map(_.label).getOrElse("Any") + def cloudExtinctionStr: String = conditions.ce.map(_.label).getOrElse("Any") + def waterVaporStr: String = conditions.wv.map(_.label).getOrElse("Any") + def backgroundLightStr: String = conditions.sb.map(_.label).getOrElse("Any") + def imageQualityDbl: Double = conditions.iq.map(_.toArcSeconds.value.toDouble).getOrElse(Double.NaN) + def cloudExtinctionDbl: Double = conditions.ce.map(_.toBrightness).getOrElse(Double.NaN) + def waterVaporDbl(site: Site): Double = conditions.wv.map(_.toMillimeters(site)).getOrElse(Double.NaN) + def backgroundLightDbl: Double = conditions.sb.map(_.toMicroVolts).getOrElse(Double.NaN) + } + + extension (cnd: ConstraintSet) { + def imageQualityStr: String = cnd.imageQuality.label + def cloudExtinctionStr: String = cnd.cloudExtinction.label + def waterVaporStr: String = cnd.waterVapor.label + def backgroundLightStr: String = cnd.skyBackground.label + def imageQualityDbl: Double = cnd.imageQuality.toArcSeconds.value.toDouble + def cloudExtinctionDbl: Double = cnd.cloudExtinction.toBrightness + def waterVaporDbl(site: Site): Double = cnd.waterVapor.toMillimeters(site) + def backgroundLightDbl: Double = cnd.skyBackground.toMicroVolts + } + +} diff --git a/modules/server_new/src/main/scala/observe/server/keywords/ObsKeywordReader.scala b/modules/server_new/src/main/scala/observe/server/keywords/ObsKeywordReader.scala index 0fde936ae..09a02f819 100644 --- a/modules/server_new/src/main/scala/observe/server/keywords/ObsKeywordReader.scala +++ b/modules/server_new/src/main/scala/observe/server/keywords/ObsKeywordReader.scala @@ -10,9 +10,7 @@ import lucuma.core.enums.Site import lucuma.core.enums.StepGuideState import lucuma.core.enums.StepGuideState.Disabled import lucuma.core.enums.StepGuideState.Enabled -import lucuma.core.model.ElevationRange -import lucuma.core.model.TimingWindowEnd -import lucuma.core.model.TimingWindowRepeat +import lucuma.core.model.{ConstraintSet, ElevationRange, TimingWindowEnd, TimingWindowRepeat} import lucuma.core.model.sequence.Step as OcsStep import lucuma.core.model.sequence.StepConfig import lucuma.core.model.sequence.gmos.DynamicConfig @@ -54,7 +52,7 @@ sealed trait ObsKeywordsReader[F[_]] { def sciBand: F[Int] def requestedAirMassAngle: F[Map[String, Double]] def timingWindows: F[List[(Int, TimingWindowKeywords)]] - def requestedConditions: F[Map[String, String]] + def requestedConditions: ConstraintSet def astrometicField: F[Boolean] } @@ -135,12 +133,7 @@ object ObsKeywordReader extends ObsKeywordsReaderConstants { ).pure[F] } - override def requestedConditions: F[Map[String, String]] = Map( - SB -> obsCfg.constraintSet.skyBackground.label, - CC -> obsCfg.constraintSet.cloudExtinction.label, - IQ -> obsCfg.constraintSet.imageQuality.label, - WV -> obsCfg.constraintSet.waterVapor.label - ).pure[F] + override def requestedConditions: ConstraintSet = obsCfg.constraintSet override def timingWindows: F[List[(Int, TimingWindowKeywords)]] = obsCfg.timingWindows.zipWithIndex diff --git a/modules/server_new/src/main/scala/observe/server/keywords/StandardHeader.scala b/modules/server_new/src/main/scala/observe/server/keywords/StandardHeader.scala index 7b8a02c9f..e3fc7abe2 100644 --- a/modules/server_new/src/main/scala/observe/server/keywords/StandardHeader.scala +++ b/modules/server_new/src/main/scala/observe/server/keywords/StandardHeader.scala @@ -7,32 +7,38 @@ import cats.Applicative import cats.data.Nested import cats.effect.Sync import cats.syntax.all.* -import lucuma.core.enums.StepGuideState +import lucuma.core.enums.{Site, StepGuideState} import observe.common.ObsQueriesGQL.RecordDatasetMutation.Data.RecordDataset.Dataset import observe.model.Conditions import observe.model.Observation.Id import observe.model.Observer import observe.model.Operator import observe.model.dhs.ImageFileId -import observe.model.enums.KeywordName +import observe.model.enums.KeywordName import observe.server.OcsBuildInfo import observe.server.tcs.TargetKeywordsReader import observe.server.tcs.TcsController import observe.server.tcs.TcsKeywordsReader import org.typelevel.log4cats.Logger +import ConditionOps.* final case class StateKeywordsReader[F[_]: Applicative]( conditions: Conditions, operator: Option[Operator], - observer: Option[Observer] + observer: Option[Observer], + site: Site ) { def observerName: F[String] = observer.map(_.value.value).getOrElse("observer").pure[F] def operatorName: F[String] = operator.map(_.value.value).getOrElse("ssa").pure[F] - def rawImageQuality: F[String] = conditions.iq.map(_.label).getOrElse("Any").pure[F] - def rawCloudExtinction: F[String] = conditions.ce.map(_.label).getOrElse("Any").pure[F] - def rawWaterVapor: F[String] = conditions.wv.map(_.label).getOrElse("Any").pure[F] - def rawBackgroundLight: F[String] = conditions.sb.map(_.label).getOrElse("Any").pure[F] + def rawImageQuality: F[String] = conditions.imageQualityStr.pure[F] + def rawCloudExtinction: F[String] = conditions.cloudExtinctionStr.pure[F] + def rawWaterVapor: F[String] = conditions.waterVaporStr.pure[F] + def rawBackgroundLight: F[String] = conditions.backgroundLightStr.pure[F] + def rawImageQualityD: F[Double] = conditions.imageQualityDbl.pure[F] + def rawCloudExtinctionD: F[Double] = conditions.cloudExtinctionDbl.pure[F] + def rawWaterVaporD: F[Double] = conditions.waterVaporDbl(site).pure[F] + def rawBackgroundLightD: F[Double] = conditions.backgroundLightDbl.pure[F] } class StandardHeader[F[_]: Sync: Logger]( @@ -40,7 +46,8 @@ class StandardHeader[F[_]: Sync: Logger]( obsReader: ObsKeywordsReader[F], tcsReader: TcsKeywordsReader[F], stateReader: StateKeywordsReader[F], - tcsSubsystems: List[TcsController.Subsystem] + tcsSubsystems: List[TcsController.Subsystem], + site: Site ) extends Header[F] with ObsKeywordsReaderConstants { @@ -106,6 +113,10 @@ class StandardHeader[F[_]: Sync: Logger]( buildString(stateReader.rawCloudExtinction, KeywordName.RAWCC), buildString(stateReader.rawWaterVapor, KeywordName.RAWWV), buildString(stateReader.rawBackgroundLight, KeywordName.RAWBG), + buildDouble(stateReader.rawImageQualityD, KeywordName.RAWDIQ), + buildDouble(stateReader.rawCloudExtinctionD, KeywordName.RAWDCC), + buildDouble(stateReader.rawWaterVaporD, KeywordName.RAWDWV), + buildDouble(stateReader.rawBackgroundLightD, KeywordName.RAWDBG), buildString(obsReader.pIReq, KeywordName.RAWPIREQ), buildString(obsReader.geminiQA, KeywordName.RAWGEMQA), buildString(tcsReader.carouselMode, KeywordName.CGUIDMOD), @@ -153,21 +164,21 @@ class StandardHeader[F[_]: Sync: Logger]( } // TODO abstract requestedConditions/requestedAirMassAngle - def requestedConditions(id: ImageFileId): F[Unit] = { - val keys = List(KeywordName.REQIQ -> IQ, - KeywordName.REQCC -> CC, - KeywordName.REQBG -> SB, - KeywordName.REQWV -> WV + def requestedConditions(id: ImageFileId): F[Unit] = + sendKeywords( + id, + kwClient, + List( + buildString(obsReader.requestedConditions.imageQualityStr.pure[F], KeywordName.REQIQ), + buildString(obsReader.requestedConditions.cloudExtinctionStr.pure[F], KeywordName.REQCC), + buildString(obsReader.requestedConditions.waterVaporStr.pure[F], KeywordName.REQWV), + buildString(obsReader.requestedConditions.backgroundLightStr.pure[F], KeywordName.REQBG), + buildDouble(obsReader.requestedConditions.imageQualityDbl.pure[F], KeywordName.REQDIQ), + buildDouble(obsReader.requestedConditions.cloudExtinctionDbl.pure[F], KeywordName.REQDCC), + buildDouble(obsReader.requestedConditions.waterVaporDbl(site).pure[F], KeywordName.REQDWV), + buildDouble(obsReader.requestedConditions.backgroundLightDbl.pure[F], KeywordName.REQDBG), + ) ) - obsReader.requestedConditions.flatMap { requestedConditions => - val requested = keys - .map { case (keyword, value) => - requestedConditions.get(value).map(v => buildString(v.pure[F], keyword)) - } - .mapFilter(identity) - sendKeywords(id, kwClient, requested).whenA(requested.nonEmpty) - } - } def requestedAirMassAngle(id: ImageFileId): F[Unit] = { val keys = List(KeywordName.REQMAXAM -> MAX_AIRMASS, diff --git a/modules/web/client/package-lock.json b/modules/web/client/package-lock.json index c36e60abb..e774275e5 100644 --- a/modules/web/client/package-lock.json +++ b/modules/web/client/package-lock.json @@ -35,11 +35,12 @@ } }, "node_modules/@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.9.tgz", + "integrity": "sha512-4zpTHZ9Cm6L9L+uIqghQX8ZXg8HKFcjYO3qHoO8zTmRm6HQUJ8SSJ+KRvbMBZn0EGVlT4DRYeQ/6hjlyXBh+Kg==", + "license": "MIT", "dependencies": { - "regenerator-runtime": "^0.13.11" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" @@ -53,6 +54,7 @@ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "aix" @@ -69,6 +71,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -85,6 +88,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -101,6 +105,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -117,6 +122,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -133,6 +139,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -149,6 +156,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -165,6 +173,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -181,6 +190,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -197,6 +207,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -213,6 +224,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -229,6 +241,7 @@ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -245,6 +258,7 @@ "mips64el" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -261,6 +275,7 @@ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -277,6 +292,7 @@ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -293,6 +309,7 @@ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -309,6 +326,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -325,6 +343,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -341,6 +360,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -357,6 +377,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "sunos" @@ -373,6 +394,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -389,6 +411,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -405,6 +428,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -414,29 +438,32 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.4.tgz", - "integrity": "sha512-a4IowK4QkXl4SCWTGUR0INAfEOX3wtsYw3rKK5InQEHMGObkR8Xk44qYQD9P4r6HHw0iIfK6GUKECmY8sTkqRA==", + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz", + "integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==", + "license": "MIT", "dependencies": { - "@floating-ui/utils": "^0.2.4" + "@floating-ui/utils": "^0.2.8" } }, "node_modules/@floating-ui/dom": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.7.tgz", - "integrity": "sha512-wmVfPG5o2xnKDU4jx/m4w5qva9FWHcnZ8BvzEe90D/RpwsJaTAVYPEPdQ8sbr/N8zZTAHlZUTQdqg8ZUbzHmng==", + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.11.tgz", + "integrity": "sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==", + "license": "MIT", "dependencies": { "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.4" + "@floating-ui/utils": "^0.2.8" } }, "node_modules/@floating-ui/react": { - "version": "0.26.20", - "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.20.tgz", - "integrity": "sha512-RixKJJG92fcIsVoqrFr4Onpzh7hlOx4U7NV4aLhMLmtvjZ5oTB/WzXaANYUZATKqXvvW7t9sCxtzejip26N5Ag==", + "version": "0.26.25", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.25.tgz", + "integrity": "sha512-hZOmgN0NTOzOuZxI1oIrDu3Gcl8WViIkvPMpB4xdd4QD6xAMtwgwr3VPoiyH/bLtRcS1cDnhxLSD1NsMJmwh/A==", + "license": "MIT", "dependencies": { - "@floating-ui/react-dom": "^2.1.1", - "@floating-ui/utils": "^0.2.5", + "@floating-ui/react-dom": "^2.1.2", + "@floating-ui/utils": "^0.2.8", "tabbable": "^6.0.0" }, "peerDependencies": { @@ -445,9 +472,10 @@ } }, "node_modules/@floating-ui/react-dom": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.1.tgz", - "integrity": "sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", + "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", + "license": "MIT", "dependencies": { "@floating-ui/dom": "^1.0.0" }, @@ -457,19 +485,22 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.5.tgz", - "integrity": "sha512-sTcG+QZ6fdEUObICavU+aB3Mp8HY4n14wYHdxK4fXjPmv3PXZZeY5RaguJmGyeH/CJQhX3fqKUtS4qc1LoHwhQ==" + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz", + "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==", + "license": "MIT" }, "node_modules/@fontsource/lato": { - "version": "5.0.21", - "resolved": "https://registry.npmjs.org/@fontsource/lato/-/lato-5.0.21.tgz", - "integrity": "sha512-UubLwvJO2bKuhWv6+ocx2Bou/pPIT6q7VpYaHIW7ZDaLPQY3uYAhveJg6P7Lvz5HYHyLba8JUc3yP7wvcqA8zQ==" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@fontsource/lato/-/lato-5.1.0.tgz", + "integrity": "sha512-wYa/DeUS/WuaJoR/vY+v74W6gtOm98DgoRdSj4FuMXe0E0XYGAEVOgh+DxusJR3EglRZU6ZZDF7vZ881vV1KGA==", + "license": "OFL-1.1" }, "node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.5.2", - "resolved": "https://npm.fontawesome.com/@fortawesome/fontawesome-common-types/-/6.5.2/fontawesome-common-types-6.5.2.tgz", - "integrity": "sha512-gBxPg3aVO6J0kpfHNILc+NMhXnqHumFxOmjYCFfOiLZfwhnnfhtsdA2hfJlDnj+8PjAs6kKQPenOTKj3Rf7zHw==", + "version": "6.6.0", + "resolved": "https://npm.fontawesome.com/@fortawesome/fontawesome-common-types/-/6.6.0/fontawesome-common-types-6.6.0.tgz", + "integrity": "sha512-xyX0X9mc0kyz9plIyryrRbl7ngsA9jz77mCZJsUkLl+ZKs0KWObgaEBoSgQiYWAsSmjz/yjl0F++Got0Mdp4Rw==", + "license": "MIT", "engines": { "node": ">=6" } @@ -478,6 +509,7 @@ "version": "6.6.0", "resolved": "https://npm.fontawesome.com/@fortawesome/fontawesome-pro/-/6.6.0/fontawesome-pro-6.6.0.tgz", "integrity": "sha512-I1Fp+yiUYrK0q0UMoO0o9ZEGa0CWhqr0UibM/gcrKl40uYUkVmSemQJPV8+uOJgo4dnOHnTOqIL0r6kcH2hZlQ==", + "license": "UNLICENSED", "engines": { "node": ">=6" } @@ -486,6 +518,7 @@ "version": "6.6.0", "resolved": "https://npm.fontawesome.com/@fortawesome/fontawesome-svg-core/-/6.6.0/fontawesome-svg-core-6.6.0.tgz", "integrity": "sha512-KHwPkCk6oRT4HADE7smhfsKudt9N/9lm6EJ5BVg0tD1yPA5hht837fB87F8pn15D8JfTqQOjhKTktwmLMiD7Kg==", + "license": "MIT", "dependencies": { "@fortawesome/fontawesome-common-types": "6.6.0" }, @@ -493,20 +526,13 @@ "node": ">=6" } }, - "node_modules/@fortawesome/fontawesome-svg-core/node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.6.0", - "resolved": "https://npm.fontawesome.com/@fortawesome/fontawesome-common-types/-/6.6.0/fontawesome-common-types-6.6.0.tgz", - "integrity": "sha512-xyX0X9mc0kyz9plIyryrRbl7ngsA9jz77mCZJsUkLl+ZKs0KWObgaEBoSgQiYWAsSmjz/yjl0F++Got0Mdp4Rw==", - "engines": { - "node": ">=6" - } - }, "node_modules/@fortawesome/pro-duotone-svg-icons": { - "version": "6.5.2", - "resolved": "https://npm.fontawesome.com/@fortawesome/pro-duotone-svg-icons/-/6.5.2/pro-duotone-svg-icons-6.5.2.tgz", - "integrity": "sha512-U8dWrpPxajix1ijJQI8dWkSRpDPnXS/3/XJnCzQ6RlPLaGtAY7LelsYHM/byKUeHDpqpySfIGN1lLh63PDU9ag==", + "version": "6.6.0", + "resolved": "https://npm.fontawesome.com/@fortawesome/pro-duotone-svg-icons/-/6.6.0/pro-duotone-svg-icons-6.6.0.tgz", + "integrity": "sha512-ke5aL4+P0aTc5pxfP9JclD87LQX4sPdj9i2YpYeJaNArtHXc/3QheR98G1G9uk257jIXuI2HTfeCXW4N6+2TXQ==", + "license": "UNLICENSED", "dependencies": { - "@fortawesome/fontawesome-common-types": "6.5.2" + "@fortawesome/fontawesome-common-types": "6.6.0" }, "engines": { "node": ">=6" @@ -516,6 +542,7 @@ "version": "6.6.0", "resolved": "https://npm.fontawesome.com/@fortawesome/pro-light-svg-icons/-/6.6.0/pro-light-svg-icons-6.6.0.tgz", "integrity": "sha512-Seq2iIAcOO48VbOSBH1sS7Yr4PqXQ9ZQwua5YrJ5Gg+ESZagKrWIYT4iYg4HOFfZcZ7KdchedJ1go2MXuDahlA==", + "license": "UNLICENSED", "dependencies": { "@fortawesome/fontawesome-common-types": "6.6.0" }, @@ -523,18 +550,11 @@ "node": ">=6" } }, - "node_modules/@fortawesome/pro-light-svg-icons/node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.6.0", - "resolved": "https://npm.fontawesome.com/@fortawesome/fontawesome-common-types/-/6.6.0/fontawesome-common-types-6.6.0.tgz", - "integrity": "sha512-xyX0X9mc0kyz9plIyryrRbl7ngsA9jz77mCZJsUkLl+ZKs0KWObgaEBoSgQiYWAsSmjz/yjl0F++Got0Mdp4Rw==", - "engines": { - "node": ">=6" - } - }, "node_modules/@fortawesome/pro-regular-svg-icons": { "version": "6.6.0", "resolved": "https://npm.fontawesome.com/@fortawesome/pro-regular-svg-icons/-/6.6.0/pro-regular-svg-icons-6.6.0.tgz", "integrity": "sha512-T6ifZKYhLrEOWD2sOdqyJBblSSg5WqhtlmcVWhWViKTt2ZDqw9WstW/lG2jQK9hv5S5tqJwruab6XUPQEZqs5A==", + "license": "UNLICENSED", "dependencies": { "@fortawesome/fontawesome-common-types": "6.6.0" }, @@ -542,31 +562,25 @@ "node": ">=6" } }, - "node_modules/@fortawesome/pro-regular-svg-icons/node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.6.0", - "resolved": "https://npm.fontawesome.com/@fortawesome/fontawesome-common-types/-/6.6.0/fontawesome-common-types-6.6.0.tgz", - "integrity": "sha512-xyX0X9mc0kyz9plIyryrRbl7ngsA9jz77mCZJsUkLl+ZKs0KWObgaEBoSgQiYWAsSmjz/yjl0F++Got0Mdp4Rw==", - "engines": { - "node": ">=6" - } - }, "node_modules/@fortawesome/pro-solid-svg-icons": { - "version": "6.5.2", - "resolved": "https://npm.fontawesome.com/@fortawesome/pro-solid-svg-icons/-/6.5.2/pro-solid-svg-icons-6.5.2.tgz", - "integrity": "sha512-yhKyRyLDJoTSUN8h+oBl+yspfE6ARPRRbLWbWN4qEiOEcULKTtCTqsqovrnLsCB7qbllRwC50ai+RZ7bC1OPaA==", + "version": "6.6.0", + "resolved": "https://npm.fontawesome.com/@fortawesome/pro-solid-svg-icons/-/6.6.0/pro-solid-svg-icons-6.6.0.tgz", + "integrity": "sha512-IwYuyO+i681arIxOjPUoqRwoHeTqeg6i2s5rY2WbZ1R7PnwavOd1+aPHCJlfU2k8l5LZ+u3hAKlVqu+emQFlZg==", + "license": "UNLICENSED", "dependencies": { - "@fortawesome/fontawesome-common-types": "6.5.2" + "@fortawesome/fontawesome-common-types": "6.6.0" }, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/pro-thin-svg-icons": { - "version": "6.5.2", - "resolved": "https://npm.fontawesome.com/@fortawesome/pro-thin-svg-icons/-/6.5.2/pro-thin-svg-icons-6.5.2.tgz", - "integrity": "sha512-aKs9VnIQUpVq7WKXG7iGYf6jNdobj3kD3eeJpwRfAlMPlIieHjxbNrGDrXUBzXsclHd66n18+TjpGMTPRvEnkA==", + "version": "6.6.0", + "resolved": "https://npm.fontawesome.com/@fortawesome/pro-thin-svg-icons/-/6.6.0/pro-thin-svg-icons-6.6.0.tgz", + "integrity": "sha512-Kp378bhM7e9q0dzIt4hJ/Zgy+1AISQFHyXPT5QVZXQjyovYLy2g8pC+nNOyOwekPCjUNnHPBZVOIhi/Noa7ovg==", + "license": "UNLICENSED", "dependencies": { - "@fortawesome/fontawesome-common-types": "6.5.2" + "@fortawesome/fontawesome-common-types": "6.6.0" }, "engines": { "node": ">=6" @@ -576,6 +590,7 @@ "version": "6.6.0", "resolved": "https://npm.fontawesome.com/@fortawesome/sharp-solid-svg-icons/-/6.6.0/sharp-solid-svg-icons-6.6.0.tgz", "integrity": "sha512-LwVIF8/pr3kSCNunlvfMOOqA/nJhyVZF7yRljzJjeDeM+6m5FE1YpZa17HsiEZZ0FirSLn2iLF7In/niE5dWdA==", + "license": "UNLICENSED", "dependencies": { "@fortawesome/fontawesome-common-types": "6.6.0" }, @@ -583,94 +598,18 @@ "node": ">=6" } }, - "node_modules/@fortawesome/sharp-solid-svg-icons/node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.6.0", - "resolved": "https://npm.fontawesome.com/@fortawesome/fontawesome-common-types/-/6.6.0/fontawesome-common-types-6.6.0.tgz", - "integrity": "sha512-xyX0X9mc0kyz9plIyryrRbl7ngsA9jz77mCZJsUkLl+ZKs0KWObgaEBoSgQiYWAsSmjz/yjl0F++Got0Mdp4Rw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true, - "optional": true, - "peer": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, "node_modules/@juggle/resize-observer": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", - "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==" + "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==", + "license": "Apache-2.0" }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -684,6 +623,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -693,6 +633,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -706,6 +647,7 @@ "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 18" } @@ -715,6 +657,7 @@ "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.0.tgz", "integrity": "sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/auth-token": "^4.0.0", "@octokit/graphql": "^7.1.0", @@ -733,6 +676,7 @@ "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.5.tgz", "integrity": "sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" @@ -746,6 +690,7 @@ "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.0.tgz", "integrity": "sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/request": "^8.3.0", "@octokit/types": "^13.0.0", @@ -759,13 +704,15 @@ "version": "22.2.0", "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@octokit/plugin-paginate-rest": { "version": "11.3.1", "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.1.tgz", "integrity": "sha512-ryqobs26cLtM1kQxqeZui4v8FeznirUsksiA+RYemMPJ7Micju0WSkv50dBksTuZks9O5cg4wp+t8fZ/cLY56g==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/types": "^13.5.0" }, @@ -781,6 +728,7 @@ "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-4.0.1.tgz", "integrity": "sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 18" }, @@ -793,6 +741,7 @@ "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.2.2.tgz", "integrity": "sha512-EI7kXWidkt3Xlok5uN43suK99VWqc8OaIMktY9d9+RNKl69juoTyxmLoWPIZgJYzi41qj/9zU7G/ljnNOJ5AFA==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/types": "^13.5.0" }, @@ -808,6 +757,7 @@ "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.0.tgz", "integrity": "sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/endpoint": "^9.0.1", "@octokit/request-error": "^5.1.0", @@ -823,6 +773,7 @@ "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.0.tgz", "integrity": "sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/types": "^13.1.0", "deprecation": "^2.0.0", @@ -837,6 +788,7 @@ "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.1.1.tgz", "integrity": "sha512-MB4AYDsM5jhIHro/dq4ix1iWTLGToIGk6cWF5L6vanFaMble5jTX/UBQyiv05HsWnwUtY8JrfHy2LWfKwihqMw==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/core": "^5.0.2", "@octokit/plugin-paginate-rest": "11.3.1", @@ -848,18 +800,306 @@ } }, "node_modules/@octokit/types": { - "version": "13.5.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.5.0.tgz", - "integrity": "sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==", + "version": "13.6.1", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.6.1.tgz", + "integrity": "sha512-PHZE9Z+kWXb23Ndik8MKPirBPziOc0D2/3KH1P+6jK5nGWe96kadZuE4jev2/Jq7FvIfTlT2Ltg8Fv2x1v0a5g==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/openapi-types": "^22.2.0" } }, + "node_modules/@parcel/watcher": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.1.tgz", + "integrity": "sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.4.1", + "@parcel/watcher-darwin-arm64": "2.4.1", + "@parcel/watcher-darwin-x64": "2.4.1", + "@parcel/watcher-freebsd-x64": "2.4.1", + "@parcel/watcher-linux-arm-glibc": "2.4.1", + "@parcel/watcher-linux-arm64-glibc": "2.4.1", + "@parcel/watcher-linux-arm64-musl": "2.4.1", + "@parcel/watcher-linux-x64-glibc": "2.4.1", + "@parcel/watcher-linux-x64-musl": "2.4.1", + "@parcel/watcher-win32-arm64": "2.4.1", + "@parcel/watcher-win32-ia32": "2.4.1", + "@parcel/watcher-win32-x64": "2.4.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz", + "integrity": "sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz", + "integrity": "sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz", + "integrity": "sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz", + "integrity": "sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz", + "integrity": "sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz", + "integrity": "sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz", + "integrity": "sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz", + "integrity": "sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz", + "integrity": "sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz", + "integrity": "sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz", + "integrity": "sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz", + "integrity": "sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/@react-hook/latest": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@react-hook/latest/-/latest-1.0.3.tgz", "integrity": "sha512-dy6duzl+JnAZcDbNTfmaP3xHiKtbXYOaz3G51MGVljh548Y8MWzTr+PHLOfvpypEVW9zwvl+VyKjbWKEVbV1Rg==", + "license": "MIT", "peerDependencies": { "react": ">=16.8" } @@ -868,6 +1108,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@react-hook/passive-layout-effect/-/passive-layout-effect-1.2.1.tgz", "integrity": "sha512-IwEphTD75liO8g+6taS+4oqz+nnroocNfWVHWz7j+N+ZO2vYrc6PV1q7GQhuahL0IOR7JccFTsFKQ/mb6iZWAg==", + "license": "MIT", "peerDependencies": { "react": ">=16.8" } @@ -876,6 +1117,7 @@ "version": "1.2.6", "resolved": "https://registry.npmjs.org/@react-hook/resize-observer/-/resize-observer-1.2.6.tgz", "integrity": "sha512-DlBXtLSW0DqYYTW3Ft1/GQFZlTdKY5VAFIC4+km6IK5NiPPDFchGbEJm1j6pSgMqPRHbUQgHJX7RaR76ic1LWA==", + "license": "MIT", "dependencies": { "@juggle/resize-observer": "^3.3.1", "@react-hook/latest": "^1.0.2", @@ -889,6 +1131,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/@react-hook/size/-/size-2.1.2.tgz", "integrity": "sha512-BmE5asyRDxSuQ9p14FUKJ0iBRgV9cROjqNG9jT/EjCM+xHha1HVqbPoT+14FQg1K7xIydabClCibUY4+1tw/iw==", + "license": "MIT", "dependencies": { "@react-hook/passive-layout-effect": "^1.2.0", "@react-hook/resize-observer": "^1.2.1" @@ -898,219 +1141,236 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.2.tgz", - "integrity": "sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz", + "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.2.tgz", - "integrity": "sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz", + "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.2.tgz", - "integrity": "sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz", + "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.2.tgz", - "integrity": "sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz", + "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.2.tgz", - "integrity": "sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz", + "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.2.tgz", - "integrity": "sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz", + "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.2.tgz", - "integrity": "sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz", + "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.2.tgz", - "integrity": "sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz", + "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.2.tgz", - "integrity": "sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz", + "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.2.tgz", - "integrity": "sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz", + "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.2.tgz", - "integrity": "sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz", + "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.2.tgz", - "integrity": "sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz", + "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.2.tgz", - "integrity": "sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz", + "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.2.tgz", - "integrity": "sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz", + "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.2.tgz", - "integrity": "sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz", + "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.2.tgz", - "integrity": "sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz", + "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@tanstack/react-table": { - "version": "8.19.3", - "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.19.3.tgz", - "integrity": "sha512-MtgPZc4y+cCRtU16y1vh1myuyZ2OdkWgMEBzyjYsoMWMicKZGZvcDnub3Zwb6XF2pj9iRMvm1SO1n57lS0vXLw==", + "version": "8.20.5", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.20.5.tgz", + "integrity": "sha512-WEHopKw3znbUZ61s9i0+i9g8drmDo6asTWbrQh8Us63DAk/M0FkmIqERew6P71HI75ksZ2Pxyuf4vvKh9rAkiA==", + "license": "MIT", "dependencies": { - "@tanstack/table-core": "8.19.3" + "@tanstack/table-core": "8.20.5" }, "engines": { "node": ">=12" @@ -1128,6 +1388,7 @@ "version": "3.8.3", "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.8.3.tgz", "integrity": "sha512-9ICwbDUUzN99CJIGc373i8NLoj6zFTKI2Hlcmo0+lCSAhPQ5mxq4dGOMKmLYoEFyHcGQ64Bd6ZVbnPpM6lNK5w==", + "license": "MIT", "dependencies": { "@tanstack/virtual-core": "3.8.3" }, @@ -1141,9 +1402,10 @@ } }, "node_modules/@tanstack/table-core": { - "version": "8.19.3", - "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.19.3.tgz", - "integrity": "sha512-IqREj9ADoml9zCAouIG/5kCGoyIxPFdqdyoxis9FisXFi5vT+iYfEfLosq4xkU/iDbMcEuAj+X8dWRLvKYDNoQ==", + "version": "8.20.5", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.20.5.tgz", + "integrity": "sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -1156,58 +1418,50 @@ "version": "3.8.3", "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.8.3.tgz", "integrity": "sha512-vd2A2TnM5lbnWZnHi9B+L2gPtkSeOtJOAw358JqokIH1+v2J7vUAzFVPwB/wrye12RFOurffXu33plm4uQ+JBQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" } }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.5.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", - "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "dev": true, - "optional": true, - "peer": true + "license": "MIT" }, "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + "version": "15.7.13", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", + "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", + "license": "MIT" }, "node_modules/@types/react": { - "version": "18.2.21", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.21.tgz", - "integrity": "sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA==", + "version": "18.3.12", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz", + "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==", + "license": "MIT", "dependencies": { "@types/prop-types": "*", - "@types/scheduler": "*", "csstype": "^3.0.2" } }, "node_modules/@types/react-transition-group": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.6.tgz", - "integrity": "sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew==", + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.11.tgz", + "integrity": "sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==", + "license": "MIT", "dependencies": { "@types/react": "*" } }, - "node_modules/@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" - }, "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.13.0.tgz", + "integrity": "sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -1215,30 +1469,19 @@ "node": ">=0.4.0" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", "dev": true, + "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -1249,62 +1492,36 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true, - "engines": { - "node": ">=8" - } + "license": "Apache-2.0" }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "optional": true, - "peer": true - }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", + "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "license": "MIT", "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" + "readdirp": "^4.0.1" }, "engines": { - "node": ">= 8.10.0" + "node": ">= 14.16.0" }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "funding": { + "url": "https://paulmillr.com/funding/" } }, "node_modules/combined-stream": { @@ -1312,6 +1529,7 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -1319,26 +1537,20 @@ "node": ">= 0.8" } }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "optional": true, - "peer": true - }, "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -1354,6 +1566,7 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -1362,12 +1575,27 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true + "dev": true, + "license": "ISC" + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } }, "node_modules/dom-helpers": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" @@ -1379,6 +1607,7 @@ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -1412,10 +1641,11 @@ } }, "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -1428,19 +1658,21 @@ } }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -1449,9 +1681,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "dev": true, "funding": [ { @@ -1459,6 +1691,7 @@ "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -1469,10 +1702,11 @@ } }, "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", "dev": true, + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -1488,6 +1722,7 @@ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -1501,6 +1736,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -1509,28 +1745,18 @@ } }, "node_modules/immutable": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", - "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", + "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1540,6 +1766,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -1552,6 +1779,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -1559,12 +1787,14 @@ "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" }, "node_modules/loglevel": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.1.tgz", "integrity": "sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==", + "license": "MIT", "engines": { "node": ">= 0.6.0" }, @@ -1577,6 +1807,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -1589,17 +1820,19 @@ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -1611,6 +1844,7 @@ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1620,6 +1854,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -1628,10 +1863,11 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.7", @@ -1644,6 +1880,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -1651,19 +1888,18 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1673,21 +1909,24 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, + "license": "ISC", "dependencies": { "wrappy": "1" } }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -1696,9 +1935,9 @@ } }, "node_modules/postcss": { - "version": "8.4.45", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.45.tgz", - "integrity": "sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==", + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", "dev": true, "funding": [ { @@ -1714,10 +1953,11 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -1728,6 +1968,7 @@ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", "dev": true, + "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" }, @@ -1741,12 +1982,14 @@ "node_modules/primeicons": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/primeicons/-/primeicons-7.0.0.tgz", - "integrity": "sha512-jK3Et9UzwzTsd6tzl2RmwrVY/b8raJ3QZLzoDACj+oTJ0oX7L9Hy+XnVwgo4QVKlKpnP/Ur13SXV/pVh4LzaDw==" + "integrity": "sha512-jK3Et9UzwzTsd6tzl2RmwrVY/b8raJ3QZLzoDACj+oTJ0oX7L9Hy+XnVwgo4QVKlKpnP/Ur13SXV/pVh4LzaDw==", + "license": "MIT" }, "node_modules/primereact": { - "version": "10.8.2", - "resolved": "https://registry.npmjs.org/primereact/-/primereact-10.8.2.tgz", - "integrity": "sha512-bf7vktogGh0PmKT9WLDcJQoQNqqFqcAlP2crUqccnlTu63FNnQV82qEYyaFvE12Qd5qhm3EYmpsHjpf6/+olTQ==", + "version": "10.8.4", + "resolved": "https://registry.npmjs.org/primereact/-/primereact-10.8.4.tgz", + "integrity": "sha512-jwkSzq6pOHayzEh+9dgk2M71gEZtoQakwPKVo3FUJO3eEX3SoAOchON+Xm1tGCNqtd66ca8RgOWQcpv3AQoMvg==", + "license": "MIT", "dependencies": { "@types/react-transition-group": "^4.4.1", "react-transition-group": "^4.4.1" @@ -1770,6 +2013,7 @@ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6.0" } @@ -1778,6 +2022,7 @@ "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -1788,7 +2033,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/queue-microtask": { "version": "1.2.3", @@ -1808,12 +2054,14 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" }, @@ -1825,6 +2073,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -1836,12 +2085,14 @@ "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" }, "node_modules/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", "dependencies": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", @@ -1854,39 +2105,44 @@ } }, "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", + "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, + "license": "MIT", "engines": { - "node": ">=8.10.0" + "node": ">= 14.16.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, "node_modules/rollup": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.2.tgz", - "integrity": "sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz", + "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==", "dev": true, + "license": "MIT", "dependencies": { - "@types/estree": "1.0.5" + "@types/estree": "1.0.6" }, "bin": { "rollup": "dist/bin/rollup" @@ -1896,22 +2152,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.21.2", - "@rollup/rollup-android-arm64": "4.21.2", - "@rollup/rollup-darwin-arm64": "4.21.2", - "@rollup/rollup-darwin-x64": "4.21.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.21.2", - "@rollup/rollup-linux-arm-musleabihf": "4.21.2", - "@rollup/rollup-linux-arm64-gnu": "4.21.2", - "@rollup/rollup-linux-arm64-musl": "4.21.2", - "@rollup/rollup-linux-powerpc64le-gnu": "4.21.2", - "@rollup/rollup-linux-riscv64-gnu": "4.21.2", - "@rollup/rollup-linux-s390x-gnu": "4.21.2", - "@rollup/rollup-linux-x64-gnu": "4.21.2", - "@rollup/rollup-linux-x64-musl": "4.21.2", - "@rollup/rollup-win32-arm64-msvc": "4.21.2", - "@rollup/rollup-win32-ia32-msvc": "4.21.2", - "@rollup/rollup-win32-x64-msvc": "4.21.2", + "@rollup/rollup-android-arm-eabi": "4.24.0", + "@rollup/rollup-android-arm64": "4.24.0", + "@rollup/rollup-darwin-arm64": "4.24.0", + "@rollup/rollup-darwin-x64": "4.24.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", + "@rollup/rollup-linux-arm-musleabihf": "4.24.0", + "@rollup/rollup-linux-arm64-gnu": "4.24.0", + "@rollup/rollup-linux-arm64-musl": "4.24.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", + "@rollup/rollup-linux-riscv64-gnu": "4.24.0", + "@rollup/rollup-linux-s390x-gnu": "4.24.0", + "@rollup/rollup-linux-x64-gnu": "4.24.0", + "@rollup/rollup-linux-x64-musl": "4.24.0", + "@rollup/rollup-win32-arm64-msvc": "4.24.0", + "@rollup/rollup-win32-ia32-msvc": "4.24.0", + "@rollup/rollup-win32-x64-msvc": "4.24.0", "fsevents": "~2.3.2" } }, @@ -1934,17 +2190,20 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/sass": { - "version": "1.77.8", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.8.tgz", - "integrity": "sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ==", + "version": "1.80.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.80.3.tgz", + "integrity": "sha512-ptDWyVmDMVielpz/oWy3YP3nfs7LpJTHIJZboMVs8GEC9eUmtZTZhMHlTW98wY4aEorDfjN38+Wr/XjskFWcfA==", "dev": true, + "license": "MIT", "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", + "@parcel/watcher": "^2.4.1", + "chokidar": "^4.0.0", "immutable": "^4.0.0", "source-map-js": ">=0.6.2 <2.0.0" }, @@ -1959,38 +2218,17 @@ "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, - "optional": true, - "peer": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -1998,33 +2236,15 @@ "node_modules/tabbable": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" - }, - "node_modules/terser": { - "version": "5.19.4", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.4.tgz", - "integrity": "sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "license": "MIT" }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -2050,6 +2270,7 @@ "url": "https://github.com/sponsors/faisalman" } ], + "license": "MIT", "engines": { "node": "*" } @@ -2058,18 +2279,29 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/unplugin": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.5.0.tgz", - "integrity": "sha512-9ZdRwbh/4gcm1JTOkp9lAkIDrtOyOxgHmY7cjuwI8L/2RTikMcVG25GsZwNAgRuap3iDw2jeq7eoqtAsz5rW3A==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.14.1.tgz", + "integrity": "sha512-lBlHbfSFPToDYp9pjXlUEFVxYLaue9f9T1HC+4OHlmj+HnMDdz9oZY+erXfoCe/5V/7gKUSY2jpXPb9S7f0f/w==", "dev": true, + "license": "MIT", "dependencies": { - "acorn": "^8.10.0", - "chokidar": "^3.5.3", - "webpack-sources": "^3.2.3", - "webpack-virtual-modules": "^0.5.0" + "acorn": "^8.12.1", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "webpack-sources": "^3" + }, + "peerDependenciesMeta": { + "webpack-sources": { + "optional": true + } } }, "node_modules/unplugin-fonts": { @@ -2077,6 +2309,7 @@ "resolved": "https://registry.npmjs.org/unplugin-fonts/-/unplugin-fonts-1.1.1.tgz", "integrity": "sha512-/Aw/rL9D2aslGGM0vi+2R2aG508RSwawLnnBuo+JDSqYc4cHJO1R1phllhN6GysEhBp/6a4B6+vSFPVapWyAAw==", "dev": true, + "license": "MIT", "dependencies": { "fast-glob": "^3.2.12", "unplugin": "^1.3.1" @@ -2096,6 +2329,7 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.3.tgz", "integrity": "sha512-IH+nl64eq9lJjFqU+/yrRnrHPVTlgy42/+IzbOdaFDVlyLgI/wDlf+FCobXLX1cT0X5+7LMyH1mIy2xJdLfo8Q==", "dev": true, + "license": "MIT", "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", @@ -2151,15 +2385,16 @@ } }, "node_modules/vite-plugin-mkcert": { - "version": "1.17.5", - "resolved": "https://registry.npmjs.org/vite-plugin-mkcert/-/vite-plugin-mkcert-1.17.5.tgz", - "integrity": "sha512-KKGY3iHx/9zb7ow8JJ+nLN2HiNIBuPBwj34fJ+jAJT89/8qfk7msO7G7qipR8VDEm9xMCys0xT11QOJbZcg3/Q==", + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/vite-plugin-mkcert/-/vite-plugin-mkcert-1.17.6.tgz", + "integrity": "sha512-4JR1RN0HEg/w17eRQJ/Ve2pSa6KCVQcQO6yKtIaKQCFDyd63zGfXHWpygBkvvRSpqa0GcqNKf0fjUJ0HiJQXVQ==", "dev": true, + "license": "MIT", "dependencies": { - "@octokit/rest": "^20.0.2", - "axios": "^1.6.8", - "debug": "^4.3.4", - "picocolors": "^1.0.0" + "@octokit/rest": "^20.1.1", + "axios": "^1.7.4", + "debug": "^4.3.6", + "picocolors": "^1.0.1" }, "engines": { "node": ">=v16.7.0" @@ -2168,26 +2403,19 @@ "vite": ">=3" } }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/webpack-virtual-modules": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz", - "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==", - "dev": true + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "dev": true, + "license": "MIT" }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "dev": true, + "license": "ISC" } } } From 9155742e2b95127e53dc263938d5c604ad19bd33 Mon Sep 17 00:00:00 2001 From: Carlos Quiroz Date: Mon, 28 Oct 2024 11:52:27 -0300 Subject: [PATCH 23/37] Multiple library updates --- .../scala/observe/server/odb/OdbProxy.scala | 2 +- .../scala/observe/ui/components/MainApp.scala | 3 +- project/Settings.scala | 42 ++++++++++--------- 3 files changed, 25 insertions(+), 22 deletions(-) diff --git a/modules/server_new/src/main/scala/observe/server/odb/OdbProxy.scala b/modules/server_new/src/main/scala/observe/server/odb/OdbProxy.scala index a537f61e3..41ff369b3 100644 --- a/modules/server_new/src/main/scala/observe/server/odb/OdbProxy.scala +++ b/modules/server_new/src/main/scala/observe/server/odb/OdbProxy.scala @@ -468,7 +468,7 @@ object OdbProxy { println(s"RECORDING ATOM: $visitId, $instrument, $sequenceType, $stepCount, $generatedId") RecordAtomMutation[F] .execute: - RecordAtomInput(visitId, instrument, sequenceType, stepCount, generatedId.orIgnore) + RecordAtomInput(visitId, instrument, sequenceType, stepCount.assign, generatedId.orIgnore) .map(_.recordAtom.atomRecord.id) .map(RecordedAtomId(_)) diff --git a/modules/web/client/src/main/scala/observe/ui/components/MainApp.scala b/modules/web/client/src/main/scala/observe/ui/components/MainApp.scala index d6a066efa..0cd3ff817 100644 --- a/modules/web/client/src/main/scala/observe/ui/components/MainApp.scala +++ b/modules/web/client/src/main/scala/observe/ui/components/MainApp.scala @@ -177,7 +177,8 @@ object MainApp extends ServerEventHandler: policy = WSRetryPolicy, onError = (_: Throwable, _) => syncStatus.async.set(SyncStatus.OutOfSync.some).toResource - )(WebSocketClient[IO].connectHighLevel(WSRequest(EventWsUri))) + )(WebSocketClient[IO].connectHighLevel(WSRequest(EventWsUri))), + _ => true.pure[IO] ).map(_.some) .useStateView(Pot.pending[ClientConfig]) // clientConfigPot .useStateView(RootModelData.Initial) // rootModelData diff --git a/project/Settings.scala b/project/Settings.scala index 59d595757..cb2315429 100644 --- a/project/Settings.scala +++ b/project/Settings.scala @@ -10,7 +10,7 @@ object Settings { /** Library versions */ object LibraryVersions { // Scala libraries - val catsEffectVersion = "3.5.4" + val catsEffectVersion = "3.5.5" val catsVersion = "2.12.0" val kittens = "3.4.0" val mouseVersion = "1.3.2" @@ -19,23 +19,25 @@ object Settings { val catsTime = "0.5.1" val catsParseVersion = "1.0.0" - val http4sVersion = "0.23.24-25-e71f1b1-SNAPSHOT" + val http4sVersion = "0.23.29" val http4sDomVersion = "0.2.11" val http4sJdkHttpClientVersion = "0.9.1" val http4sScalaXmlVersion = "0.23.14" + val natchezVersion = "0.3.7" - val coulomb = "0.8.0" - val commonsHttp = "3.1" - val unboundId = "3.2.1" - val jwt = "10.0.1" - val slf4j = "2.0.16" - val log4cats = "2.7.0" - val log4catsLogLevel = "0.3.1" - val logback = "1.5.11" - val janino = "3.1.12" - val pureConfig = "0.17.7" - val monocleVersion = "3.3.0" - val circeVersion = "0.14.9" + val coulomb = "0.8.0" + val commonsHttp = "3.1" + val unboundId = "3.2.1" + val jwt = "10.0.1" + val slf4j = "2.0.16" + val log4cats = "2.7.0" + val log4catsLogLevel = "0.3.1" + val logback = "1.5.12" + val janino = "3.1.12" + val pureConfig = "0.17.7" + val monocleVersion = "3.3.0" + val circeVersion = "0.14.10" + val circeRefinedVersion = "0.15.1" // test libraries val jUnitInterface = "0.13.2" @@ -49,11 +51,11 @@ object Settings { val pprint = "0.9.0" // Gemini Libraries - val lucumaCore = "0.105.5" - val lucumaUI = "0.118.1" - val lucumaSchemas = "0.102.0" - val lucumaSSO = "0.6.25" - val lucumaODBSchema = "0.14.0" + val lucumaCore = "0.106.4" + val lucumaUI = "0.120.0" + val lucumaSchemas = "0.105.1" + val lucumaSSO = "0.6.26" + val lucumaODBSchema = "0.15.0" // Clue val clue = "0.40.0" @@ -177,7 +179,7 @@ object Settings { "io.circe" %%% "circe-core" % LibraryVersions.circeVersion, "io.circe" %%% "circe-generic" % LibraryVersions.circeVersion, "io.circe" %%% "circe-parser" % LibraryVersions.circeVersion, - "io.circe" %%% "circe-refined" % LibraryVersions.circeVersion, + "io.circe" %%% "circe-refined" % LibraryVersions.circeRefinedVersion, "io.circe" %%% "circe-testing" % LibraryVersions.circeVersion % "test" ) ) From 776ed9e47b57d1c09c196d150e3709fd5f3676f4 Mon Sep 17 00:00:00 2001 From: Carlos Quiroz Date: Mon, 28 Oct 2024 19:04:49 -0300 Subject: [PATCH 24/37] Workaround for bug on odb call --- .../main/scala/observe/engine/Engine.scala | 2 +- .../scala/observe/common/ObsQueriesGQL.scala | 5 +--- .../scala/observe/server/ObserveEngine.scala | 28 ++----------------- .../server/keywords/StandardHeader.scala | 2 +- .../scala/observe/server/odb/OdbProxy.scala | 2 +- 5 files changed, 7 insertions(+), 32 deletions(-) diff --git a/modules/engine/src/main/scala/observe/engine/Engine.scala b/modules/engine/src/main/scala/observe/engine/Engine.scala index 63f6204fb..92bcd1f0b 100644 --- a/modules/engine/src/main/scala/observe/engine/Engine.scala +++ b/modules/engine/src/main/scala/observe/engine/Engine.scala @@ -156,7 +156,7 @@ class Engine[F[_]: MonadThrow: Logger, S, U] private ( // Final State case Some(qs: Sequence.State.Final[F]) => putS(id)(qs) *> switch(id)( - SequenceState.Running(userStop, internalStop, true) + SequenceState.Running(userStop, internalStop, waitingNextAtom = true) ) *> send(modifyState(atomLoad(this, id))) // Execution completed. Check breakpoint here case Some(qs) => diff --git a/modules/server_new/src/clue/scala/observe/common/ObsQueriesGQL.scala b/modules/server_new/src/clue/scala/observe/common/ObsQueriesGQL.scala index fa3910eda..c8a4163ff 100644 --- a/modules/server_new/src/clue/scala/observe/common/ObsQueriesGQL.scala +++ b/modules/server_new/src/clue/scala/observe/common/ObsQueriesGQL.scala @@ -363,10 +363,7 @@ object ObsQueriesGQL: label observation { label - program { - label - } - } + } } } } diff --git a/modules/server_new/src/main/scala/observe/server/ObserveEngine.scala b/modules/server_new/src/main/scala/observe/server/ObserveEngine.scala index 4dba96c1d..f410708b5 100644 --- a/modules/server_new/src/main/scala/observe/server/ObserveEngine.scala +++ b/modules/server_new/src/main/scala/observe/server/ObserveEngine.scala @@ -848,28 +848,6 @@ object ObserveEngine { override def requestRefresh(clientId: ClientId): F[Unit] = executeEngine.offer(Event.poll(clientId)) - @unused - private def seqQueueRefreshStream: Stream[F, Either[ObserveFailure, EventType[F]]] = - Stream.empty -// { -// val fd = Duration(settings.odbQueuePollingInterval.toSeconds, TimeUnit.SECONDS) -// Stream -// .fixedDelay[F](fd) -// .evalMap(_ => systems.odb.queuedSequences) -// .flatMap { x => -// Stream.emit( -// Event -// .getState[F, EngineState[F], SeqEvent] { st => -// Stream.eval(odbLoader.refreshSequenceList(x, st)).flatMap(Stream.emits).some -// } -// .asRight -// ) -// } -// .handleErrorWith { e => -// Stream.emit(ObserveFailure.ObserveException(e).asLeft) -// } -// } - private val heartbeatPeriod: FiniteDuration = FiniteDuration(10, TimeUnit.SECONDS) private def heartbeatStream: Stream[F, EventType[F]] = { @@ -1333,9 +1311,9 @@ object ObserveEngine { } } -// /** -// * Triggers the application of a specific step configuration to a system -// */ + /** + * Triggers the application of a specific step configuration to a system / + */ override def configSystem( sid: Observation.Id, observer: Observer, diff --git a/modules/server_new/src/main/scala/observe/server/keywords/StandardHeader.scala b/modules/server_new/src/main/scala/observe/server/keywords/StandardHeader.scala index 7b8a02c9f..845ff0c15 100644 --- a/modules/server_new/src/main/scala/observe/server/keywords/StandardHeader.scala +++ b/modules/server_new/src/main/scala/observe/server/keywords/StandardHeader.scala @@ -73,7 +73,7 @@ class StandardHeader[F[_]: Sync: Logger]( buildString(obsObject, KeywordName.OBJECT), buildString(obsReader.obsType, KeywordName.OBSTYPE), buildString(obsReader.obsClass, KeywordName.OBSCLASS), - buildString(dataset.map(_.observation.program.label.label).getOrElse("").pure[F], + buildString(dataset.map(_.observation.label.programReference.label).getOrElse("").pure[F], KeywordName.GEMPRGID ), buildString(dataset.map(_.observation.label.label).getOrElse("").pure[F], KeywordName.OBSID), diff --git a/modules/server_new/src/main/scala/observe/server/odb/OdbProxy.scala b/modules/server_new/src/main/scala/observe/server/odb/OdbProxy.scala index 41ff369b3..628948af6 100644 --- a/modules/server_new/src/main/scala/observe/server/odb/OdbProxy.scala +++ b/modules/server_new/src/main/scala/observe/server/odb/OdbProxy.scala @@ -291,7 +291,7 @@ object OdbProxy { override def stepStartObserve(obsId: Observation.Id): F[Boolean] = for { stepId <- getCurrentStepId(obsId) - _ <- L.debug(s"Send ODB event stepStartConfigure for obsId: $obsId, step $stepId") + _ <- L.debug(s"Send ODB event stepStartObserve for obsId: $obsId, step $stepId") _ <- AddStepEventMutation[F].execute(stepId = stepId.value, stg = StepStage.StartObserve) _ <- L.debug("ODB event stepStartObserve sent") } yield true From 2133879d724c6ff194737a34b989ce8d2def0c1b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Oct 2024 17:11:17 +0000 Subject: [PATCH 25/37] Bump vite from 5.4.3 to 5.4.10 in /modules/web/client Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.4.3 to 5.4.10. - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v5.4.10/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v5.4.10/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/web/client/package-lock.json | 9 ++++----- modules/web/client/package.json | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/modules/web/client/package-lock.json b/modules/web/client/package-lock.json index e774275e5..3ac35ad8d 100644 --- a/modules/web/client/package-lock.json +++ b/modules/web/client/package-lock.json @@ -30,7 +30,7 @@ "process": "^0.11.10", "sass": "^1.77.8", "unplugin-fonts": "^1.1.1", - "vite": "5.4.3", + "vite": "5.4.10", "vite-plugin-mkcert": "^1.17.5" } }, @@ -2325,11 +2325,10 @@ } }, "node_modules/vite": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.3.tgz", - "integrity": "sha512-IH+nl64eq9lJjFqU+/yrRnrHPVTlgy42/+IzbOdaFDVlyLgI/wDlf+FCobXLX1cT0X5+7LMyH1mIy2xJdLfo8Q==", + "version": "5.4.10", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.10.tgz", + "integrity": "sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==", "dev": true, - "license": "MIT", "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", diff --git a/modules/web/client/package.json b/modules/web/client/package.json index 28d05d00d..1fd0e21b0 100644 --- a/modules/web/client/package.json +++ b/modules/web/client/package.json @@ -25,7 +25,7 @@ "process": "^0.11.10", "sass": "^1.77.8", "unplugin-fonts": "^1.1.1", - "vite": "5.4.3", + "vite": "5.4.10", "vite-plugin-mkcert": "^1.17.5" }, "scripts": { From 82c0e6ef1aa5f04f2bb7e263708ef0aaf0281aec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Piaggio?= Date: Wed, 30 Oct 2024 16:14:01 -0300 Subject: [PATCH 26/37] new sequence model with changes in offsets --- .../scala/observe/model/ObserveStep.scala | 74 ++++++++++++------- .../model/arb/ArbNodAndShuffleStep.scala | 6 ++ .../observe/model/arb/ArbStandardStep.scala | 6 ++ .../scala/observe/common/ObsQueriesGQL.scala | 15 +++- .../scala/observe/server/ObserveEngine.scala | 7 +- .../scala/observe/server/SeqTranslate.scala | 70 +++++++++--------- .../scala/observe/server/SequenceGen.scala | 44 ++++++----- .../main/scala/observe/server/StepsView.scala | 3 +- .../observe/server/gmos/GmosStepsView.scala | 6 +- .../server/keywords/ObsKeywordReader.scala | 10 +-- .../scala/observe/server/odb/OdbProxy.scala | 63 +++++++++------- .../scala/observe/server/tcs/TcsNorth.scala | 35 ++++----- .../scala/observe/server/tcs/TcsSouth.scala | 59 ++++++--------- .../observe/server/ObserveEngineSuite.scala | 25 ++++++- .../observe/server/SeqTranslateSuite.scala | 1 + .../scala/observe/server/TestCommon.scala | 15 +++- .../observe/server/odb/TestOdbProxy.scala | 24 +++--- .../sequence/steps/CurrentAtomStepRow.scala | 1 + .../components/sequence/steps/package.scala | 4 +- project/Settings.scala | 8 +- 20 files changed, 273 insertions(+), 203 deletions(-) diff --git a/modules/model/shared/src/main/scala/observe/model/ObserveStep.scala b/modules/model/shared/src/main/scala/observe/model/ObserveStep.scala index 6080729af..3c6e0d302 100644 --- a/modules/model/shared/src/main/scala/observe/model/ObserveStep.scala +++ b/modules/model/shared/src/main/scala/observe/model/ObserveStep.scala @@ -12,6 +12,7 @@ import lucuma.core.enums.Breakpoint import lucuma.core.enums.Instrument import lucuma.core.model.sequence.Step import lucuma.core.model.sequence.StepConfig +import lucuma.core.model.sequence.TelescopeConfig import lucuma.odb.json.offset.transport.given import lucuma.odb.json.stepconfig.given import monocle.Focus @@ -25,38 +26,59 @@ import observe.model.enums.* import observe.model.enums.PendingObserveCmd enum ObserveStep( - val id: Step.Id, - val instConfig: InstrumentDynamicConfig, - val stepConfig: StepConfig, - val status: StepState, - val breakpoint: Breakpoint, - val fileId: Option[ImageFileId], - val configStatus: List[(Resource | Instrument, ActionStatus)] + val id: Step.Id, + val instConfig: InstrumentDynamicConfig, + val stepConfig: StepConfig, + val telescopeConfig: TelescopeConfig, + val status: StepState, + val breakpoint: Breakpoint, + val fileId: Option[ImageFileId], + val configStatus: List[(Resource | Instrument, ActionStatus)] ) derives Eq, Encoder.AsObject, Decoder: case Standard( - override val id: Step.Id, - override val instConfig: InstrumentDynamicConfig, - override val stepConfig: StepConfig, - override val status: StepState, - override val breakpoint: Breakpoint, - override val fileId: Option[ImageFileId], - override val configStatus: List[(Resource | Instrument, ActionStatus)], - val observeStatus: ActionStatus - ) extends ObserveStep(id, instConfig, stepConfig, status, breakpoint, fileId, configStatus) + override val id: Step.Id, + override val instConfig: InstrumentDynamicConfig, + override val stepConfig: StepConfig, + override val telescopeConfig: TelescopeConfig, + override val status: StepState, + override val breakpoint: Breakpoint, + override val fileId: Option[ImageFileId], + override val configStatus: List[(Resource | Instrument, ActionStatus)], + val observeStatus: ActionStatus + ) extends ObserveStep( + id, + instConfig, + stepConfig, + telescopeConfig, + status, + breakpoint, + fileId, + configStatus + ) case NodAndShuffle( - override val id: Step.Id, - override val instConfig: InstrumentDynamicConfig, - override val stepConfig: StepConfig, - override val status: StepState, - override val breakpoint: Breakpoint, - override val fileId: Option[ImageFileId], - override val configStatus: List[(Resource | Instrument, ActionStatus)], - val nsStatus: NodAndShuffleStatus, - val pendingObserveCmd: Option[PendingObserveCmd] - ) extends ObserveStep(id, instConfig, stepConfig, status, breakpoint, fileId, configStatus) + override val id: Step.Id, + override val instConfig: InstrumentDynamicConfig, + override val stepConfig: StepConfig, + override val telescopeConfig: TelescopeConfig, + override val status: StepState, + override val breakpoint: Breakpoint, + override val fileId: Option[ImageFileId], + override val configStatus: List[(Resource | Instrument, ActionStatus)], + val nsStatus: NodAndShuffleStatus, + val pendingObserveCmd: Option[PendingObserveCmd] + ) extends ObserveStep( + id, + instConfig, + stepConfig, + telescopeConfig, + status, + breakpoint, + fileId, + configStatus + ) object ObserveStep: // Derivation doesn't generate instances for subtypes. diff --git a/modules/model/shared/src/main/scala/observe/model/arb/ArbNodAndShuffleStep.scala b/modules/model/shared/src/main/scala/observe/model/arb/ArbNodAndShuffleStep.scala index 4c2b4a040..fe9a7c168 100644 --- a/modules/model/shared/src/main/scala/observe/model/arb/ArbNodAndShuffleStep.scala +++ b/modules/model/shared/src/main/scala/observe/model/arb/ArbNodAndShuffleStep.scala @@ -7,7 +7,9 @@ import lucuma.core.enums.Breakpoint import lucuma.core.enums.Instrument import lucuma.core.model.sequence.Step import lucuma.core.model.sequence.StepConfig +import lucuma.core.model.sequence.TelescopeConfig import lucuma.core.model.sequence.arb.ArbStepConfig.given +import lucuma.core.model.sequence.arb.ArbTelescopeConfig.given import lucuma.core.util.TimeSpan import lucuma.core.util.arb.ArbEnumerated.given import lucuma.core.util.arb.ArbTimeSpan.given @@ -58,6 +60,7 @@ trait ArbNodAndShuffleStep { id <- arbitrary[Step.Id] d <- arbitrary[InstrumentDynamicConfig] t <- arbitrary[StepConfig] + tc <- arbitrary[TelescopeConfig] s <- arbitrary[StepState] b <- arbitrary[Breakpoint] f <- arbitrary[Option[dhs.ImageFileId]] @@ -68,6 +71,7 @@ trait ArbNodAndShuffleStep { id = id, instConfig = d, stepConfig = t, + telescopeConfig = tc, status = s, breakpoint = b, fileId = f, @@ -83,6 +87,7 @@ trait ArbNodAndShuffleStep { Step.Id, InstrumentDynamicConfig, StepConfig, + TelescopeConfig, StepState, Breakpoint, Option[dhs.ImageFileId], @@ -93,6 +98,7 @@ trait ArbNodAndShuffleStep { (s.id, s.instConfig, s.stepConfig, + s.telescopeConfig, s.status, s.breakpoint, s.fileId, diff --git a/modules/model/shared/src/main/scala/observe/model/arb/ArbStandardStep.scala b/modules/model/shared/src/main/scala/observe/model/arb/ArbStandardStep.scala index 0f2e0aa11..e1178f4fe 100644 --- a/modules/model/shared/src/main/scala/observe/model/arb/ArbStandardStep.scala +++ b/modules/model/shared/src/main/scala/observe/model/arb/ArbStandardStep.scala @@ -7,7 +7,9 @@ import lucuma.core.enums.Breakpoint import lucuma.core.enums.Instrument import lucuma.core.model.sequence.Step import lucuma.core.model.sequence.StepConfig +import lucuma.core.model.sequence.TelescopeConfig import lucuma.core.model.sequence.arb.ArbStepConfig.given +import lucuma.core.model.sequence.arb.ArbTelescopeConfig.given import lucuma.core.util.arb.ArbEnumerated.given import lucuma.core.util.arb.ArbUid.given import observe.model.* @@ -29,6 +31,7 @@ trait ArbStandardStep { d <- arbitrary[InstrumentDynamicConfig] t <- arbitrary[StepConfig] s <- arbitrary[StepState] + tc <- arbitrary[TelescopeConfig] b <- arbitrary[Breakpoint] f <- arbitrary[Option[dhs.ImageFileId]] cs <- arbitrary[List[(Resource, ActionStatus)]] @@ -37,6 +40,7 @@ trait ArbStandardStep { id = id, instConfig = d, stepConfig = t, + telescopeConfig = tc, status = s, breakpoint = b, fileId = f, @@ -51,6 +55,7 @@ trait ArbStandardStep { Step.Id, InstrumentDynamicConfig, StepConfig, + TelescopeConfig, StepState, Breakpoint, Option[dhs.ImageFileId], @@ -61,6 +66,7 @@ trait ArbStandardStep { (s.id, s.instConfig, s.stepConfig, + s.telescopeConfig, s.status, s.breakpoint, s.fileId, diff --git a/modules/server_new/src/clue/scala/observe/common/ObsQueriesGQL.scala b/modules/server_new/src/clue/scala/observe/common/ObsQueriesGQL.scala index c8a4163ff..b3d466610 100644 --- a/modules/server_new/src/clue/scala/observe/common/ObsQueriesGQL.scala +++ b/modules/server_new/src/clue/scala/observe/common/ObsQueriesGQL.scala @@ -140,15 +140,16 @@ object ObsQueriesGQL: diffuser shutter } - ... on Science { - offset { ...offsetFields } - guiding - } ... on SmartGcal { smartGcalType } } + fragment telescopeConfigFields on TelescopeConfig { + offset { ...offsetFields } + guiding + } + fragment stepEstimateFields on StepEstimate { configChange { all { @@ -202,6 +203,9 @@ object ObsQueriesGQL: stepConfig { ...stepConfigFields } + telescopeConfig { + ...telescopeConfigFields + } estimate { ...stepEstimateFields } @@ -249,6 +253,9 @@ object ObsQueriesGQL: stepConfig { ...stepConfigFields } + telescopeConfig { + ...telescopeConfigFields + } estimate { ...stepEstimateFields } diff --git a/modules/server_new/src/main/scala/observe/server/ObserveEngine.scala b/modules/server_new/src/main/scala/observe/server/ObserveEngine.scala index f410708b5..f677d02d4 100644 --- a/modules/server_new/src/main/scala/observe/server/ObserveEngine.scala +++ b/modules/server_new/src/main/scala/observe/server/ObserveEngine.scala @@ -317,7 +317,7 @@ object ObserveEngine { private def stepRequiresChecks(stepConfig: OcsStepConfig): Boolean = stepConfig match { case OcsStepConfig.Gcal(_, _, _, _) => true - case OcsStepConfig.Science(_, _) => true + case OcsStepConfig.Science => true case OcsStepConfig.SmartGcal(_) => true case _ => false } @@ -1724,8 +1724,9 @@ object ObserveEngine { val engSteps = engineSteps(seq) val stepResources = engSteps.map { - case ObserveStep.Standard(id, _, _, _, _, _, configStatus, _) => id -> configStatus.toMap - case ObserveStep.NodAndShuffle(id, _, _, _, _, _, configStatus, _, _) => + case ObserveStep.Standard(id, _, _, _, _, _, _, configStatus, _) => + id -> configStatus.toMap + case ObserveStep.NodAndShuffle(id, _, _, _, _, _, _, configStatus, _, _) => id -> configStatus.toMap }.toMap diff --git a/modules/server_new/src/main/scala/observe/server/SeqTranslate.scala b/modules/server_new/src/main/scala/observe/server/SeqTranslate.scala index a9b4677eb..f8d33ddd9 100644 --- a/modules/server_new/src/main/scala/observe/server/SeqTranslate.scala +++ b/modules/server_new/src/main/scala/observe/server/SeqTranslate.scala @@ -24,6 +24,7 @@ import lucuma.core.model.sequence.ExecutionConfig import lucuma.core.model.sequence.InstrumentExecutionConfig import lucuma.core.model.sequence.Step as OdbStep import lucuma.core.model.sequence.StepConfig +import lucuma.core.model.sequence.TelescopeConfig as CoreTelescopeConfig import lucuma.core.model.sequence.gmos.DynamicConfig import lucuma.core.model.sequence.gmos.StaticConfig import lucuma.core.util.TimeSpan @@ -162,6 +163,7 @@ object SeqTranslate { obsCfg.id, step.instrumentConfig, step.stepConfig, + step.telescopeConfig, step.observeClass, step.id.some ) @@ -194,6 +196,7 @@ object SeqTranslate { ), instConfig = step.instrumentConfig, config = step.stepConfig, + telescopeConfig = step.telescopeConfig, breakpoint = step.breakpoint ) @@ -201,7 +204,7 @@ object SeqTranslate { buildStep( DataId(s"${obsCfg.title}-$dataIdx"), - calcSystems(obsCfg, step.stepConfig, step.instrumentConfig, stepType, insSpec), + calcSystems(obsCfg, step.telescopeConfig, step.instrumentConfig, stepType, insSpec), (ov: SystemOverrides) => calcHeaders(obsCfg, step, stepType, instHeader)(instf(ov).keywordsClient), stepType @@ -370,7 +373,7 @@ object SeqTranslate { stId <- obsSeq.seq.currentStep.map(_.id) curStp <- obsSeq.seqGen.nextAtom.steps.find(_.id === stId) obsCtr <- curStp.some.collect { - case SequenceGen.PendingStepGen[F](_, _, _, obsControl, _, _, _, _, _) => + case SequenceGen.PendingStepGen[F](_, _, _, obsControl, _, _, _, _, _, _) => obsControl } } yield Stream.eval( @@ -498,13 +501,13 @@ object SeqTranslate { } private def getTcs[S <: StaticConfig, D <: DynamicConfig]( - subs: NonEmptySet[TcsController.Subsystem], - useGaos: Boolean, - inst: InstrumentSpecifics[S, D], - lsource: LightSource, - obsConfig: OdbObservation, - stepConfig: StepConfig, - dynamicConfig: D + subs: NonEmptySet[TcsController.Subsystem], + useGaos: Boolean, + inst: InstrumentSpecifics[S, D], + lsource: LightSource, + obsConfig: OdbObservation, + telescopeConfig: CoreTelescopeConfig, + dynamicConfig: D ): SystemOverrides => System[F] = site match { case Site.GS => if (useGaos) { (ov: SystemOverrides) => @@ -516,7 +519,7 @@ object SeqTranslate { systemss.guideDb )( obsConfig.targetEnvironment, - stepConfig, + telescopeConfig, LightPath(lsource, inst.sfName(dynamicConfig)), extractWavelength(dynamicConfig) ): System[F] @@ -524,7 +527,7 @@ object SeqTranslate { TcsSouth .fromConfig[F](overriddenSystems.tcsSouth(ov), subs, None, inst, systemss.guideDb)( obsConfig.targetEnvironment, - stepConfig, + telescopeConfig, LightPath(lsource, inst.sfName(dynamicConfig)), extractWavelength(dynamicConfig) ): System[F] @@ -532,14 +535,15 @@ object SeqTranslate { case Site.GN => if (useGaos) { (ov: SystemOverrides) => - TcsNorth.fromConfig[F](overriddenSystems.tcsNorth(ov), - subs, - Altair(overriddenSystems.altair(ov)).some, - inst, - systemss.guideDb + TcsNorth.fromConfig[F]( + overriddenSystems.tcsNorth(ov), + subs, + Altair(overriddenSystems.altair(ov)).some, + inst, + systemss.guideDb )( obsConfig.targetEnvironment, - stepConfig, + telescopeConfig, LightPath(lsource, inst.sfName(dynamicConfig)), extractWavelength(dynamicConfig) ): System[F] @@ -547,7 +551,7 @@ object SeqTranslate { TcsNorth .fromConfig[F](overriddenSystems.tcsNorth(ov), subs, none, inst, systemss.guideDb)( obsConfig.targetEnvironment, - stepConfig, + telescopeConfig, LightPath(lsource, inst.sfName(dynamicConfig)), extractWavelength(dynamicConfig) ): System[F] @@ -555,11 +559,11 @@ object SeqTranslate { } private def calcSystems[S <: StaticConfig, D <: DynamicConfig]( - obsConfig: OdbObservation, - stepConfig: StepConfig, - dynamicConfig: D, - stepType: StepType, - instSpec: InstrumentSpecifics[S, D] + obsConfig: OdbObservation, + telescopeConfig: CoreTelescopeConfig, + dynamicConfig: D, + stepType: StepType, + instSpec: InstrumentSpecifics[S, D] ): Map[Resource, SystemOverrides => System[F]] = { def adaptGcal(b: GcalController[F] => Gcal[F])(ov: SystemOverrides): Gcal[F] = b( @@ -576,7 +580,7 @@ object SeqTranslate { instSpec, TcsController.LightSource.Sky, obsConfig, - stepConfig, + telescopeConfig, dynamicConfig ), Resource.Gcal -> defaultGcal @@ -590,7 +594,7 @@ object SeqTranslate { instSpec, TcsController.LightSource.Sky, obsConfig, - stepConfig, + telescopeConfig, dynamicConfig ), Resource.Gcal -> defaultGcal @@ -604,7 +608,7 @@ object SeqTranslate { instSpec, TcsController.LightSource.GCAL, obsConfig, - stepConfig, + telescopeConfig, dynamicConfig ), Resource.Gcal -> adaptGcal(Gcal.fromConfig(site === Site.GS, gcalCfg)) @@ -618,7 +622,7 @@ object SeqTranslate { instSpec, TcsController.LightSource.GCAL, obsConfig, - stepConfig, + telescopeConfig, dynamicConfig ), Resource.Gcal -> adaptGcal(Gcal.fromConfig(site === Site.GS, gcalCfg)) @@ -639,7 +643,7 @@ object SeqTranslate { instSpec, TcsController.LightSource.AO, obsConfig, - stepConfig, + telescopeConfig, dynamicConfig ), Resource.Gcal -> defaultGcal @@ -655,7 +659,7 @@ object SeqTranslate { instSpec, TcsController.LightSource.AO, obsConfig, - stepConfig, + telescopeConfig, dynamicConfig ), Resource.Gcal -> defaultGcal @@ -978,14 +982,14 @@ object SeqTranslate { stepConfig: StepConfig, obsClass: ObserveClass ): Either[ObserveFailure, StepType] = stepConfig match { - case StepConfig.Bias | StepConfig.Dark => StepType.DarkOrBias(inst).asRight - case c: StepConfig.Gcal => + case StepConfig.Bias | StepConfig.Dark => StepType.DarkOrBias(inst).asRight + case c: StepConfig.Gcal => if (obsClass =!= ObserveClass.DayCal && inst.hasOI) StepType.NightFlatOrArc(inst, c).asRight else StepType.FlatOrArc(inst, c).asRight - case StepConfig.Science(offset, guiding) => + case StepConfig.Science => // TODO: Here goes the logic to differentiate between a non GAOS, GeMS ot Altair observation. StepType.CelestialObject(inst).asRight - case StepConfig.SmartGcal(smartGcalType) => Unexpected("Smart GCAL is not supported").asLeft + case StepConfig.SmartGcal(_) => Unexpected("Smart GCAL is not supported").asLeft } } diff --git a/modules/server_new/src/main/scala/observe/server/SequenceGen.scala b/modules/server_new/src/main/scala/observe/server/SequenceGen.scala index 4aa6d92fe..d17515620 100644 --- a/modules/server_new/src/main/scala/observe/server/SequenceGen.scala +++ b/modules/server_new/src/main/scala/observe/server/SequenceGen.scala @@ -11,6 +11,7 @@ import lucuma.core.enums.SequenceType import lucuma.core.model.sequence.Atom import lucuma.core.model.sequence.Step import lucuma.core.model.sequence.StepConfig +import lucuma.core.model.sequence.TelescopeConfig as CoreTelescopeConfig import lucuma.core.model.sequence.gmos.DynamicConfig import lucuma.core.model.sequence.gmos.StaticConfig import mouse.all.* @@ -38,7 +39,7 @@ case class SequenceGen[F[_]]( nextAtom: SequenceGen.AtomGen[F] ) { val resources: Set[Resource | Instrument] = nextAtom.steps - .collect { case SequenceGen.PendingStepGen(_, _, resources, _, _, _, _, _, _) => + .collect { case SequenceGen.PendingStepGen(_, _, resources, _, _, _, _, _, _, _) => resources } .foldMap(identity) @@ -46,14 +47,14 @@ case class SequenceGen[F[_]]( def configActionCoord(stepId: Step.Id, r: Resource | Instrument): Option[ActionCoordsInSeq] = nextAtom.steps .find(_.id === stepId) - .collect { case p @ SequenceGen.PendingStepGen(_, _, _, _, _, _, _, _, _) => p } + .collect { case p @ SequenceGen.PendingStepGen(_, _, _, _, _, _, _, _, _, _) => p } .flatMap(_.generator.configActionCoord(r)) .map { case (ex, ac) => ActionCoordsInSeq(stepId, ex, ac) } def resourceAtCoords(c: ActionCoordsInSeq): Option[Resource | Instrument] = nextAtom.steps .find(_.id === c.stepId) - .collect { case p @ SequenceGen.PendingStepGen(_, _, _, _, _, _, _, _, _) => p } + .collect { case p @ SequenceGen.PendingStepGen(_, _, _, _, _, _, _, _, _, _) => p } .flatMap(_.generator.resourceAtCoords(c.execIdx, c.actIdx)) def stepIndex(stepId: Step.Id): Option[Int] = SequenceGen.stepIndex(nextAtom.steps, stepId) @@ -79,6 +80,7 @@ object SequenceGen { val genData: StepStatusGen val instConfig: DynamicConfig val config: StepConfig + val telescopeConfig: CoreTelescopeConfig } object StepGen { @@ -88,9 +90,9 @@ object SequenceGen { ctx: HeaderExtraData ): EngineStep[F] = stepGen match { - case p: PendingStepGen[F] => + case p: PendingStepGen[F] => EngineStep.init[F](stepGen.id, p.generator.generate(ctx, systemOverrides)) - case CompletedStepGen(id, _, _, _, _, _) => EngineStep.init[F](id, Nil) + case CompletedStepGen(id, _, _, _, _, _, _) => EngineStep.init[F](id, Nil) } } @@ -135,26 +137,28 @@ object SequenceGen { } case class PendingStepGen[F[_]]( - id: Step.Id, - dataId: DataId, - resources: Set[Resource | Instrument], - obsControl: SystemOverrides => InstrumentSystem.ObserveControl[F], - generator: StepActionsGen[F], - genData: StepStatusGen = StepStatusGen.Null, - instConfig: DynamicConfig, - config: StepConfig, - breakpoint: Breakpoint + id: Step.Id, + dataId: DataId, + resources: Set[Resource | Instrument], + obsControl: SystemOverrides => InstrumentSystem.ObserveControl[F], + generator: StepActionsGen[F], + genData: StepStatusGen = StepStatusGen.Null, + instConfig: DynamicConfig, + config: StepConfig, + telescopeConfig: CoreTelescopeConfig, + breakpoint: Breakpoint ) extends StepGen[F] // Receiving a sequence from the ODB with a completed step without an image file id would be // weird, but I still use an Option just in case case class CompletedStepGen[F[_]]( - id: Step.Id, - dataId: DataId, - fileId: Option[ImageFileId], - genData: StepStatusGen = StepStatusGen.Null, - instConfig: DynamicConfig, - config: StepConfig + id: Step.Id, + dataId: DataId, + fileId: Option[ImageFileId], + genData: StepStatusGen = StepStatusGen.Null, + instConfig: DynamicConfig, + config: StepConfig, + telescopeConfig: CoreTelescopeConfig ) extends StepGen[F] def stepIndex[F[_]]( diff --git a/modules/server_new/src/main/scala/observe/server/StepsView.scala b/modules/server_new/src/main/scala/observe/server/StepsView.scala index a2935fc4d..4a9207059 100644 --- a/modules/server_new/src/main/scala/observe/server/StepsView.scala +++ b/modules/server_new/src/main/scala/observe/server/StepsView.scala @@ -152,12 +152,13 @@ object StepsView { id = step.id, instConfig = InstrumentDynamicConfig.fromDynamicConfig(stepg.instConfig), stepConfig = stepg.config, + telescopeConfig = stepg.telescopeConfig, status = status, breakpoint = step.breakpoint, configStatus = configStatus, observeStatus = observeStatus(step.executions), fileId = fileId(step.executions).orElse(stepg.some.collect { - case SequenceGen.CompletedStepGen(_, _, fileId, _, _, _) => fileId + case SequenceGen.CompletedStepGen(_, _, fileId, _, _, _, _) => fileId }.flatten) ) } diff --git a/modules/server_new/src/main/scala/observe/server/gmos/GmosStepsView.scala b/modules/server_new/src/main/scala/observe/server/gmos/GmosStepsView.scala index 44129dc2e..afa575167 100644 --- a/modules/server_new/src/main/scala/observe/server/gmos/GmosStepsView.scala +++ b/modules/server_new/src/main/scala/observe/server/gmos/GmosStepsView.scala @@ -53,6 +53,7 @@ class GmosStepsView[F[_]] extends StepsView[F] { id = step.id, instConfig = InstrumentDynamicConfig.fromDynamicConfig(stepg.instConfig), stepConfig = stepg.config, + telescopeConfig = stepg.telescopeConfig, status = status, breakpoint = step.breakpoint, configStatus = configStatus, @@ -65,8 +66,9 @@ class GmosStepsView[F[_]] extends StepsView[F] { ), fileId = StepsView .fileId(step.executions) - .orElse(stepg.some.collect { case SequenceGen.CompletedStepGen(_, _, fileId, _, _, _) => - fileId + .orElse(stepg.some.collect { + case SequenceGen.CompletedStepGen(_, _, fileId, _, _, _, _) => + fileId }.flatten), pendingObserveCmd = (observeStatus(step.executions) === ActionStatus.Running).option(pendingObsCmd).flatten diff --git a/modules/server_new/src/main/scala/observe/server/keywords/ObsKeywordReader.scala b/modules/server_new/src/main/scala/observe/server/keywords/ObsKeywordReader.scala index 09a02f819..cc7c4582d 100644 --- a/modules/server_new/src/main/scala/observe/server/keywords/ObsKeywordReader.scala +++ b/modules/server_new/src/main/scala/observe/server/keywords/ObsKeywordReader.scala @@ -98,11 +98,11 @@ object ObsKeywordReader extends ObsKeywordsReaderConstants { override def obsType: F[String] = ( step.stepConfig match { - case StepConfig.Bias => "BIAS" - case StepConfig.Dark => "DARK" - case StepConfig.Gcal(lamp, filter, diffuser, shutter) => "FLAT" - case StepConfig.Science(offset, guiding) => "OBJECT" - case StepConfig.SmartGcal(smartGcalType) => "FLAT" + case StepConfig.Bias => "BIAS" + case StepConfig.Dark => "DARK" + case StepConfig.Gcal(_, _, _, _) => "FLAT" + case StepConfig.Science => "OBJECT" + case StepConfig.SmartGcal(_) => "FLAT" } ).pure[F] diff --git a/modules/server_new/src/main/scala/observe/server/odb/OdbProxy.scala b/modules/server_new/src/main/scala/observe/server/odb/OdbProxy.scala index 628948af6..9f02aab07 100644 --- a/modules/server_new/src/main/scala/observe/server/odb/OdbProxy.scala +++ b/modules/server_new/src/main/scala/observe/server/odb/OdbProxy.scala @@ -26,6 +26,8 @@ import lucuma.core.model.sequence.Atom import lucuma.core.model.sequence.Dataset import lucuma.core.model.sequence.Step import lucuma.core.model.sequence.StepConfig +import lucuma.core.model.sequence.TelescopeConfig +import lucuma.core.model.sequence.TelescopeConfig as CoreTelescopeConfig import lucuma.core.model.sequence.gmos.DynamicConfig import lucuma.core.model.sequence.gmos.StaticConfig import lucuma.schemas.ObservationDB @@ -59,11 +61,12 @@ sealed trait OdbEventCommands[F[_]] { generatedId: Option[Atom.Id] ): F[Unit] def stepStartStep( - obsId: Observation.Id, - dynamicConfig: DynamicConfig, - stepConfig: StepConfig, - observeClass: ObserveClass, - generatedId: Option[Step.Id] + obsId: Observation.Id, + dynamicConfig: DynamicConfig, + stepConfig: StepConfig, + telescopeConfig: CoreTelescopeConfig, + observeClass: ObserveClass, + generatedId: Option[Step.Id] ): F[Unit] def stepStartConfigure(obsId: Observation.Id): F[Unit] def stepEndConfigure(obsId: Observation.Id): F[Boolean] @@ -128,11 +131,12 @@ object OdbProxy { ().pure[F] override def stepStartStep( - obsId: Observation.Id, - dynamicConfig: DynamicConfig, - stepConfig: StepConfig, - observeClass: ObserveClass, - generatedId: Option[Step.Id] + obsId: Observation.Id, + dynamicConfig: DynamicConfig, + stepConfig: StepConfig, + telescopeConfig: CoreTelescopeConfig, + observeClass: ObserveClass, + generatedId: Option[Step.Id] ): F[Unit] = ().pure[F] override def stepStartConfigure(obsId: Observation.Id): F[Unit] = Applicative[F].unit @@ -257,15 +261,17 @@ object OdbProxy { } yield () override def stepStartStep( - obsId: Observation.Id, - dynamicConfig: DynamicConfig, - stepConfig: StepConfig, - observeClass: ObserveClass, - generatedId: Option[Step.Id] + obsId: Observation.Id, + dynamicConfig: DynamicConfig, + stepConfig: StepConfig, + telescopeConfig: CoreTelescopeConfig, + observeClass: ObserveClass, + generatedId: Option[Step.Id] ): F[Unit] = for { atomId <- getCurrentAtomId(obsId) - stepId <- recordStep(atomId, dynamicConfig, stepConfig, observeClass, generatedId) + stepId <- + recordStep(atomId, dynamicConfig, stepConfig, telescopeConfig, observeClass, generatedId) _ <- setCurrentStepId(obsId, stepId.some) _ <- L.debug(s"Recorded step for obsId: $obsId, recordedStepId: $stepId") _ <- AddStepEventMutation[F] @@ -465,7 +471,6 @@ object OdbProxy { instrument: Instrument, generatedId: Option[Atom.Id] ): F[RecordedAtomId] = - println(s"RECORDING ATOM: $visitId, $instrument, $sequenceType, $stepCount, $generatedId") RecordAtomMutation[F] .execute: RecordAtomInput(visitId, instrument, sequenceType, stepCount.assign, generatedId.orIgnore) @@ -473,11 +478,12 @@ object OdbProxy { .map(RecordedAtomId(_)) private def recordStep( - atomId: RecordedAtomId, - dynamicConfig: DynamicConfig, - stepConfig: StepConfig, - observeClass: ObserveClass, - generatedId: Option[Step.Id] + atomId: RecordedAtomId, + dynamicConfig: DynamicConfig, + stepConfig: StepConfig, + telescopeConfig: TelescopeConfig, + observeClass: ObserveClass, + generatedId: Option[Step.Id] ): F[RecordedStepId] = dynamicConfig match { case s @ DynamicConfig.GmosNorth(_, _, _, _, _, _, _) => recordGmosNorthStep: @@ -485,6 +491,7 @@ object OdbProxy { atomId.value, s.toInput, stepConfig.toInput, + telescopeConfig.toInput.assign, observeClass, generatedId.orIgnore ) @@ -494,6 +501,7 @@ object OdbProxy { atomId.value, s.toInput, stepConfig.toInput, + telescopeConfig.toInput.assign, observeClass, generatedId.orIgnore ) @@ -549,11 +557,12 @@ object OdbProxy { } override def stepStartStep( - obsId: Observation.Id, - dynamicConfig: DynamicConfig, - stepConfig: StepConfig, - observeClass: ObserveClass, - generatedId: Option[Step.Id] + obsId: Observation.Id, + dynamicConfig: DynamicConfig, + stepConfig: StepConfig, + telescopeConfig: CoreTelescopeConfig, + observeClass: ObserveClass, + generatedId: Option[Step.Id] ): F[Unit] = Applicative[F].unit override def stepStartConfigure(obsId: Observation.Id): F[Unit] = Applicative[F].unit diff --git a/modules/server_new/src/main/scala/observe/server/tcs/TcsNorth.scala b/modules/server_new/src/main/scala/observe/server/tcs/TcsNorth.scala index 12bc37433..d9e3dca3d 100644 --- a/modules/server_new/src/main/scala/observe/server/tcs/TcsNorth.scala +++ b/modules/server_new/src/main/scala/observe/server/tcs/TcsNorth.scala @@ -13,9 +13,10 @@ import lucuma.core.enums.Site import lucuma.core.enums.StepGuideState import lucuma.core.enums.TipTiltSource import lucuma.core.math.Angle +import lucuma.core.math.Offset import lucuma.core.math.Wavelength import lucuma.core.model.GuideConfig -import lucuma.core.model.sequence.StepConfig +import lucuma.core.model.sequence.TelescopeConfig as CoreTelescopeConfig import mouse.all.* import observe.common.ObsQueriesGQL.ObsQuery.Data.Observation.TargetEnvironment import observe.model.enums.NodAndShuffleStage @@ -197,30 +198,24 @@ object TcsNorth { guideConfigDb: GuideConfigDb[F] )( targets: TargetEnvironment, - stepConfig: StepConfig, + telescopeConfig: CoreTelescopeConfig, lightPath: LightPath, observingWavelength: Option[Wavelength] ): TcsNorth[F] = { + val p: Offset.P = telescopeConfig.offset.p + val q: Offset.Q = telescopeConfig.offset.q - val gwp1 = none.flatMap(_ => - StepConfig.science.andThen(StepConfig.Science.guiding).getOption(stepConfig) - ) - val gwp2 = none.flatMap(_ => - StepConfig.science.andThen(StepConfig.Science.guiding).getOption(stepConfig) - ) - val gwoi = none.flatMap(_ => - StepConfig.science.andThen(StepConfig.Science.guiding).getOption(stepConfig) - ) - val gwao = none.flatMap(_ => - StepConfig.science.andThen(StepConfig.Science.guiding).getOption(stepConfig) - ) + val guiding: StepGuideState = telescopeConfig.guiding + + val gwp1 = none.map(_ => guiding) + val gwp2 = none.map(_ => guiding) + val gwoi = none.map(_ => guiding) + val gwao = none.map(_ => guiding) val offset = - StepConfig.science.andThen(StepConfig.Science.offset).getOption(stepConfig).map { o => - InstrumentOffset( - OffsetP(Angle.signedDecimalArcseconds.get(o.p.toAngle).toDouble.withUnit[ArcSecond]), - OffsetQ(Angle.signedDecimalArcseconds.get(o.q.toAngle).toDouble.withUnit[ArcSecond]) - ) - } + InstrumentOffset( + OffsetP(Angle.signedDecimalArcseconds.get(p.toAngle).toDouble.withUnit[ArcSecond]), + OffsetQ(Angle.signedDecimalArcseconds.get(q.toAngle).toDouble.withUnit[ArcSecond]) + ).some val tcsSeqCfg = TcsSeqConfig[F]( gwp1, diff --git a/modules/server_new/src/main/scala/observe/server/tcs/TcsSouth.scala b/modules/server_new/src/main/scala/observe/server/tcs/TcsSouth.scala index 941a8ce36..4aa0b3301 100644 --- a/modules/server_new/src/main/scala/observe/server/tcs/TcsSouth.scala +++ b/modules/server_new/src/main/scala/observe/server/tcs/TcsSouth.scala @@ -14,11 +14,12 @@ import lucuma.core.enums.Site import lucuma.core.enums.StepGuideState import lucuma.core.enums.TipTiltSource import lucuma.core.math.Angle +import lucuma.core.math.Offset import lucuma.core.math.Wavelength import lucuma.core.model.GemsConfig import lucuma.core.model.GemsConfig.* import lucuma.core.model.GuideConfig -import lucuma.core.model.sequence.StepConfig +import lucuma.core.model.sequence.TelescopeConfig as CoreTelescopeConfig import mouse.all.* import observe.common.ObsQueriesGQL.ObsQuery.Data.Observation.TargetEnvironment import observe.model.enums.NodAndShuffleStage @@ -223,48 +224,30 @@ object TcsSouth { guideConfigDb: GuideConfigDb[F] )( targets: TargetEnvironment, - stepConfig: StepConfig, + telescopeConfig: CoreTelescopeConfig, lightPath: LightPath, observingWavelength: Option[Wavelength] ): TcsSouth[F] = { + val p: Offset.P = telescopeConfig.offset.p + val q: Offset.Q = telescopeConfig.offset.q - val gwp1 = none.flatMap(_ => - StepConfig.science.andThen(StepConfig.Science.guiding).getOption(stepConfig) - ) - val gwp2 = none.flatMap(_ => - StepConfig.science.andThen(StepConfig.Science.guiding).getOption(stepConfig) - ) - val gwoi = none.flatMap(_ => - StepConfig.science.andThen(StepConfig.Science.guiding).getOption(stepConfig) - ) - val gwc1 = none.flatMap(_ => - StepConfig.science.andThen(StepConfig.Science.guiding).getOption(stepConfig) - ) - val gwc2 = none.flatMap(_ => - StepConfig.science.andThen(StepConfig.Science.guiding).getOption(stepConfig) - ) - val gwc3 = none.flatMap(_ => - StepConfig.science.andThen(StepConfig.Science.guiding).getOption(stepConfig) - ) - val gwod1 = none.flatMap(_ => - StepConfig.science.andThen(StepConfig.Science.guiding).getOption(stepConfig) - ) - val gwod2 = none.flatMap(_ => - StepConfig.science.andThen(StepConfig.Science.guiding).getOption(stepConfig) - ) - val gwod3 = none.flatMap(_ => - StepConfig.science.andThen(StepConfig.Science.guiding).getOption(stepConfig) - ) - val gwod4 = none.flatMap(_ => - StepConfig.science.andThen(StepConfig.Science.guiding).getOption(stepConfig) - ) + val guiding: StepGuideState = telescopeConfig.guiding + + val gwp1 = none.map(_ => guiding) + val gwp2 = none.map(_ => guiding) + val gwoi = none.map(_ => guiding) + val gwc1 = none.map(_ => guiding) + val gwc2 = none.map(_ => guiding) + val gwc3 = none.map(_ => guiding) + val gwod1 = none.map(_ => guiding) + val gwod2 = none.map(_ => guiding) + val gwod3 = none.map(_ => guiding) + val gwod4 = none.map(_ => guiding) val offset = - StepConfig.science.andThen(StepConfig.Science.offset).getOption(stepConfig).map { o => - InstrumentOffset( - OffsetP(Angle.signedDecimalArcseconds.get(o.p.toAngle).toDouble.withUnit[ArcSecond]), - OffsetQ(Angle.signedDecimalArcseconds.get(o.q.toAngle).toDouble.withUnit[ArcSecond]) - ) - } + InstrumentOffset( + OffsetP(Angle.signedDecimalArcseconds.get(p.toAngle).toDouble.withUnit[ArcSecond]), + OffsetQ(Angle.signedDecimalArcseconds.get(q.toAngle).toDouble.withUnit[ArcSecond]) + ).some val tcsSeqCfg = TcsSeqConfig[F]( gwp1, diff --git a/modules/server_new/src/test/scala/observe/server/ObserveEngineSuite.scala b/modules/server_new/src/test/scala/observe/server/ObserveEngineSuite.scala index 359626864..8cecef274 100644 --- a/modules/server_new/src/test/scala/observe/server/ObserveEngineSuite.scala +++ b/modules/server_new/src/test/scala/observe/server/ObserveEngineSuite.scala @@ -13,7 +13,6 @@ import eu.timepit.refined.types.numeric.PosLong import eu.timepit.refined.types.string.NonEmptyString import lucuma.core.enums.* import lucuma.core.enums.Instrument -import lucuma.core.math.Offset import lucuma.core.model.ConstraintSet import lucuma.core.model.ElevationRange import lucuma.core.model.Program @@ -363,7 +362,7 @@ class ObserveEngineSuite extends TestCommon { val obsTypes: NonEmptyList[(ObserveClass, StepConfig)] = NonEmptyList( (ObserveClass.ProgramCal, StepConfig.Dark), - List((ObserveClass.Science, StepConfig.Science(Offset.Zero, StepGuideState.Enabled))) + List((ObserveClass.Science, StepConfig.Science)) ) val startStepIdx = 1 @@ -381,6 +380,7 @@ class ObserveEngineSuite extends TestCommon { stepId(idx + startStepIdx), dynamicCfg1, st, + telescopeCfg1, StepEstimate.Zero, cl, Breakpoint.Disabled @@ -443,6 +443,7 @@ class ObserveEngineSuite extends TestCommon { StepStatusGen.Null, step.instrumentConfig, step.stepConfig, + step.telescopeConfig, breakpoint = Breakpoint.Disabled ) }.toList @@ -623,7 +624,7 @@ class ObserveEngineSuite extends TestCommon { val obsTypes: NonEmptyList[(ObserveClass, StepConfig)] = NonEmptyList( (ObserveClass.ProgramCal, StepConfig.Dark), - List((ObserveClass.Science, StepConfig.Science(Offset.Zero, StepGuideState.Enabled))) + List((ObserveClass.Science, StepConfig.Science)) ) val startStepIdx = 1 @@ -641,6 +642,7 @@ class ObserveEngineSuite extends TestCommon { stepId(idx + startStepIdx), dynamicCfg1, st, + telescopeCfg1, StepEstimate.Zero, cl, Breakpoint.Disabled @@ -704,6 +706,7 @@ class ObserveEngineSuite extends TestCommon { StepStatusGen.Null, step.instrumentConfig, step.stepConfig, + step.telescopeConfig, breakpoint = Breakpoint.Disabled ) }.toList @@ -843,6 +846,7 @@ class ObserveEngineSuite extends TestCommon { stepId(1), dynamicCfg1, stepCfg1, + telescopeCfg1, StepEstimate.Zero, ObserveClass.Science, Breakpoint.Disabled @@ -854,6 +858,7 @@ class ObserveEngineSuite extends TestCommon { stepId(i), dynamicCfg1, stepCfg1, + telescopeCfg1, StepEstimate.Zero, ObserveClass.Science, Breakpoint.Disabled @@ -865,6 +870,7 @@ class ObserveEngineSuite extends TestCommon { stepId(firstScienceStepId), dynamicCfg1, stepCfg1, + telescopeCfg1, StepEstimate.Zero, ObserveClass.Science, Breakpoint.Disabled @@ -876,6 +882,7 @@ class ObserveEngineSuite extends TestCommon { stepId(i), dynamicCfg1, stepCfg1, + telescopeCfg1, StepEstimate.Zero, ObserveClass.Science, Breakpoint.Disabled @@ -971,6 +978,7 @@ class ObserveEngineSuite extends TestCommon { stepId(1 + stepCount), dynamicCfg1, stepCfg1, + telescopeCfg1, StepEstimate.Zero, ObserveClass.Science, Breakpoint.Disabled @@ -982,6 +990,7 @@ class ObserveEngineSuite extends TestCommon { stepId(i + stepCount), dynamicCfg1, stepCfg1, + telescopeCfg1, StepEstimate.Zero, ObserveClass.Science, Breakpoint.Disabled @@ -1100,7 +1109,13 @@ class ObserveEngineSuite extends TestCommon { (ev: TestOdbProxy.OdbEvent) => assertEquals( ev, - TestOdbProxy.StepStartStep(seqObsId1, dynamicCfg1, stepCfg1, ObserveClass.Science) + TestOdbProxy.StepStartStep( + seqObsId1, + dynamicCfg1, + stepCfg1, + telescopeCfg1, + ObserveClass.Science + ) ), (ev: TestOdbProxy.OdbEvent) => assertEquals(ev, TestOdbProxy.StepStartConfigure(seqObsId1)), (ev: TestOdbProxy.OdbEvent) => assertEquals(ev, TestOdbProxy.StepEndConfigure(seqObsId1)), @@ -1130,6 +1145,7 @@ class ObserveEngineSuite extends TestCommon { stepId(1), dynamicCfg1, stepCfg1, + telescopeCfg1, StepEstimate.Zero, ObserveClass.Science, Breakpoint.Disabled @@ -1141,6 +1157,7 @@ class ObserveEngineSuite extends TestCommon { stepId(i), dynamicCfg1, stepCfg1, + telescopeCfg1, StepEstimate.Zero, ObserveClass.Science, Breakpoint.Disabled diff --git a/modules/server_new/src/test/scala/observe/server/SeqTranslateSuite.scala b/modules/server_new/src/test/scala/observe/server/SeqTranslateSuite.scala index 3bd8f4a9c..82d9cf299 100644 --- a/modules/server_new/src/test/scala/observe/server/SeqTranslateSuite.scala +++ b/modules/server_new/src/test/scala/observe/server/SeqTranslateSuite.scala @@ -66,6 +66,7 @@ class SeqTranslateSuite extends TestCommon { StepStatusGen.Null, dynamicCfg1, stepCfg1, + telescopeCfg1, breakpoint = Breakpoint.Disabled ) ) diff --git a/modules/server_new/src/test/scala/observe/server/TestCommon.scala b/modules/server_new/src/test/scala/observe/server/TestCommon.scala index c27f88c3c..0ba25a876 100644 --- a/modules/server_new/src/test/scala/observe/server/TestCommon.scala +++ b/modules/server_new/src/test/scala/observe/server/TestCommon.scala @@ -48,6 +48,7 @@ import lucuma.core.model.sequence.InstrumentExecutionConfig.GmosNorth import lucuma.core.model.sequence.Step import lucuma.core.model.sequence.StepConfig import lucuma.core.model.sequence.StepEstimate +import lucuma.core.model.sequence.TelescopeConfig as CoreTelescopeConfig import lucuma.core.model.sequence.gmos.DynamicConfig import lucuma.core.model.sequence.gmos.GmosCcdMode import lucuma.core.model.sequence.gmos.GmosFpuMask @@ -304,10 +305,9 @@ object TestCommon { GmosFpuMask.Builtin[GmosNorthFpu](GmosNorthFpu.LongSlit_0_50).some ) - val stepCfg1: StepConfig = StepConfig.Science( - Offset.Zero, - StepGuideState.Enabled - ) + val stepCfg1: StepConfig = StepConfig.Science + + val telescopeCfg1: CoreTelescopeConfig = CoreTelescopeConfig(Offset.Zero, StepGuideState.Enabled) def odbObservation(id: Observation.Id, stepCount: Int = 1): ODBObservation = ODBObservation( @@ -341,6 +341,7 @@ object TestCommon { stepId(1), dynamicCfg1, stepCfg1, + telescopeCfg1, StepEstimate.Zero, ObserveClass.Science, Breakpoint.Disabled @@ -352,6 +353,7 @@ object TestCommon { stepId(i), dynamicCfg1, stepCfg1, + telescopeCfg1, StepEstimate.Zero, ObserveClass.Science, Breakpoint.Disabled @@ -394,6 +396,7 @@ object TestCommon { StepStatusGen.Null, dynamicCfg1, stepCfg1, + telescopeCfg1, breakpoint = Breakpoint.Disabled ) ) @@ -428,6 +431,7 @@ object TestCommon { StepStatusGen.Null, dynamicCfg1, stepCfg1, + telescopeCfg1, breakpoint = Breakpoint.Disabled ) ) @@ -479,6 +483,7 @@ object TestCommon { stepId(1), dynamicCfg1, stepCfg1, + telescopeCfg1, StepEstimate.Zero, ObserveClass.Science, Breakpoint.Disabled @@ -519,6 +524,7 @@ object TestCommon { StepStatusGen.Null, dynamicCfg1, stepCfg1, + telescopeCfg1, breakpoint = Breakpoint.Disabled ), SequenceGen.PendingStepGen( @@ -540,6 +546,7 @@ object TestCommon { StepStatusGen.Null, dynamicCfg1, stepCfg1, + telescopeCfg1, breakpoint = Breakpoint.Disabled ) ) diff --git a/modules/server_new/src/test/scala/observe/server/odb/TestOdbProxy.scala b/modules/server_new/src/test/scala/observe/server/odb/TestOdbProxy.scala index 3381113e7..f4efb7f82 100644 --- a/modules/server_new/src/test/scala/observe/server/odb/TestOdbProxy.scala +++ b/modules/server_new/src/test/scala/observe/server/odb/TestOdbProxy.scala @@ -28,6 +28,7 @@ import lucuma.core.model.sequence.ExecutionSequence import lucuma.core.model.sequence.InstrumentExecutionConfig import lucuma.core.model.sequence.Step import lucuma.core.model.sequence.StepConfig +import lucuma.core.model.sequence.TelescopeConfig as CoreTelescopeConfig import lucuma.core.model.sequence.gmos import lucuma.core.model.sequence.gmos.DynamicConfig import lucuma.core.model.sequence.gmos.StaticConfig @@ -133,12 +134,14 @@ object TestOdbProxy { }) *> addEvent(AtomStart(obsId, instrument, sequenceType, stepCount)) override def stepStartStep( - obsId: Observation.Id, - dynamicConfig: DynamicConfig, - stepConfig: StepConfig, - observeClass: ObserveClass, - generatedId: Option[Step.Id] - ): F[Unit] = addEvent(StepStartStep(obsId, dynamicConfig, stepConfig, observeClass)) + obsId: Observation.Id, + dynamicConfig: DynamicConfig, + stepConfig: StepConfig, + telescopeConfig: CoreTelescopeConfig, + observeClass: ObserveClass, + generatedId: Option[Step.Id] + ): F[Unit] = + addEvent(StepStartStep(obsId, dynamicConfig, stepConfig, telescopeConfig, observeClass)) override def stepStartConfigure(obsId: Observation.Id): F[Unit] = addEvent( StepStartConfigure(obsId) @@ -215,10 +218,11 @@ object TestOdbProxy { stepCount: NonNegShort ) extends OdbEvent case class StepStartStep( - obsId: Observation.Id, - dynamicConfig: DynamicConfig, - stepConfig: StepConfig, - observeClass: ObserveClass + obsId: Observation.Id, + dynamicConfig: DynamicConfig, + stepConfig: StepConfig, + telescopeConfig: CoreTelescopeConfig, + observeClass: ObserveClass ) extends OdbEvent case class StepStartConfigure(obsId: Observation.Id) extends OdbEvent case class StepEndConfigure(obsId: Observation.Id) extends OdbEvent diff --git a/modules/web/client/src/main/scala/observe/ui/components/sequence/steps/CurrentAtomStepRow.scala b/modules/web/client/src/main/scala/observe/ui/components/sequence/steps/CurrentAtomStepRow.scala index 8a632492c..5cd01971c 100644 --- a/modules/web/client/src/main/scala/observe/ui/components/sequence/steps/CurrentAtomStepRow.scala +++ b/modules/web/client/src/main/scala/observe/ui/components/sequence/steps/CurrentAtomStepRow.scala @@ -19,6 +19,7 @@ case class CurrentAtomStepRow[+D]( val id = step.id.asRight val instrumentConfig = step.instConfig.config.asInstanceOf[D].some val stepConfig = step.stepConfig.some + val telescopeConfig = step.telescopeConfig.some val isFinished = step.status.isFinished // TODO This could be an estimate for pending steps, or the time it took for finished steps. // In either case, we don't have the information from the server. diff --git a/modules/web/client/src/main/scala/observe/ui/components/sequence/steps/package.scala b/modules/web/client/src/main/scala/observe/ui/components/sequence/steps/package.scala index aad743901..1fc2dbe84 100644 --- a/modules/web/client/src/main/scala/observe/ui/components/sequence/steps/package.scala +++ b/modules/web/client/src/main/scala/observe/ui/components/sequence/steps/package.scala @@ -17,8 +17,8 @@ extension [D](row: SequenceRow[D]) case (Some(StepConfig.Dark), true) => ExecutionStepType.NodAndShuffleDark.some case (Some(StepConfig.Dark), _) => ExecutionStepType.Dark.some case (Some(StepConfig.Gcal(_, _, _, _)), _) => ExecutionStepType.Calibration.some - case (Some(StepConfig.Science(_, _)), true) => ExecutionStepType.NodAndShuffle.some - case (Some(StepConfig.Science(_, _)), _) => ExecutionStepType.Object.some + case (Some(StepConfig.Science), true) => ExecutionStepType.NodAndShuffle.some + case (Some(StepConfig.Science), _) => ExecutionStepType.Object.some case (Some(StepConfig.SmartGcal(SmartGcalType.Arc)), _) => ExecutionStepType.Arc.some case (Some(StepConfig.SmartGcal(SmartGcalType.Flat)), _) => ExecutionStepType.Flat.some case (Some(StepConfig.SmartGcal(_)), _) => none // Unknown SmartGcal type diff --git a/project/Settings.scala b/project/Settings.scala index cb2315429..a2e0dd885 100644 --- a/project/Settings.scala +++ b/project/Settings.scala @@ -51,11 +51,11 @@ object Settings { val pprint = "0.9.0" // Gemini Libraries - val lucumaCore = "0.106.4" - val lucumaUI = "0.120.0" - val lucumaSchemas = "0.105.1" + val lucumaCore = "0.107.0" + val lucumaUI = "0.121.0" + val lucumaSchemas = "0.106.0" val lucumaSSO = "0.6.26" - val lucumaODBSchema = "0.15.0" + val lucumaODBSchema = "0.16.0" // Clue val clue = "0.40.0" From e97b768f05414b9a50436170e764c8e9a7432257 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Piaggio?= Date: Wed, 30 Oct 2024 17:16:49 -0300 Subject: [PATCH 27/37] migrations for new observation workflow --- .../src/clue/scala/observe/common/ObsQueriesGQL.scala | 10 +++++++--- .../test/scala/observe/server/ObserveEngineSuite.scala | 6 ++---- .../src/test/scala/observe/server/TestCommon.scala | 9 +++------ .../test/scala/observe/server/odb/TestOdbProxy.scala | 8 ++++---- .../src/clue/scala/observe/queries/ObsQueriesGQL.scala | 5 ++++- 5 files changed, 20 insertions(+), 18 deletions(-) diff --git a/modules/server_new/src/clue/scala/observe/common/ObsQueriesGQL.scala b/modules/server_new/src/clue/scala/observe/common/ObsQueriesGQL.scala index b3d466610..d53411af4 100644 --- a/modules/server_new/src/clue/scala/observe/common/ObsQueriesGQL.scala +++ b/modules/server_new/src/clue/scala/observe/common/ObsQueriesGQL.scala @@ -17,9 +17,12 @@ object ObsQueriesGQL: @GraphQL trait ActiveObservationIdsQuery extends GraphQLOperation[ObservationDB]: + // TODO The ODB API doesn't provide a way to filter ready observations, + // so we filter by accepted proposals for now. + // Revise this when the API supports it OR we start getting obersvations from the scheduler. val document = """ query { - observations(WHERE: { status: { eq: { EQ: READY } } }) { + observations(WHERE: {program: {proposalStatus: {EQ: ACCEPTED}}}) { matches { id title @@ -35,8 +38,9 @@ object ObsQueriesGQL: observation(observationId: $obsId) { id title - status - activeStatus + workflow { + state + } program { id name diff --git a/modules/server_new/src/test/scala/observe/server/ObserveEngineSuite.scala b/modules/server_new/src/test/scala/observe/server/ObserveEngineSuite.scala index 8cecef274..83b03cd36 100644 --- a/modules/server_new/src/test/scala/observe/server/ObserveEngineSuite.scala +++ b/modules/server_new/src/test/scala/observe/server/ObserveEngineSuite.scala @@ -391,8 +391,7 @@ class ObserveEngineSuite extends TestCommon { ODBObservation( id = seqObsId1, title = "Test Observation".refined, - ObsStatus.Ready, - ObsActiveStatus.Active, + ODBObservation.Workflow(ObservationWorkflowState.Ready), ODBObservation.Program( Program.Id(PosLong.unsafeFrom(123)), None @@ -654,8 +653,7 @@ class ObserveEngineSuite extends TestCommon { ODBObservation( id = seqObsId1, title = "Test Observation".refined, - ObsStatus.Ready, - ObsActiveStatus.Active, + ODBObservation.Workflow(ObservationWorkflowState.Ready), ODBObservation.Program( Program.Id(PosLong.unsafeFrom(123)), None diff --git a/modules/server_new/src/test/scala/observe/server/TestCommon.scala b/modules/server_new/src/test/scala/observe/server/TestCommon.scala index 0ba25a876..38d671206 100644 --- a/modules/server_new/src/test/scala/observe/server/TestCommon.scala +++ b/modules/server_new/src/test/scala/observe/server/TestCommon.scala @@ -28,8 +28,7 @@ import lucuma.core.enums.GmosYBinning import lucuma.core.enums.ImageQuality import lucuma.core.enums.Instrument import lucuma.core.enums.MosPreImaging -import lucuma.core.enums.ObsActiveStatus -import lucuma.core.enums.ObsStatus +import lucuma.core.enums.ObservationWorkflowState import lucuma.core.enums.ObserveClass import lucuma.core.enums.SequenceType import lucuma.core.enums.Site @@ -313,8 +312,7 @@ object TestCommon { ODBObservation( id = id, title = "Test Observation".refined, - ObsStatus.Ready, - ObsActiveStatus.Active, + ODBObservation.Workflow(ObservationWorkflowState.Ready), ODBObservation.Program( Program.Id(PosLong.unsafeFrom(123)), None @@ -455,8 +453,7 @@ object TestCommon { ODBObservation( id = id, title = "Test Observation".refined, - ObsStatus.Ready, - ObsActiveStatus.Active, + ODBObservation.Workflow(ObservationWorkflowState.Ready), ODBObservation.Program( Program.Id(PosLong.unsafeFrom(123)), None diff --git a/modules/server_new/src/test/scala/observe/server/odb/TestOdbProxy.scala b/modules/server_new/src/test/scala/observe/server/odb/TestOdbProxy.scala index f4efb7f82..29bc3e0be 100644 --- a/modules/server_new/src/test/scala/observe/server/odb/TestOdbProxy.scala +++ b/modules/server_new/src/test/scala/observe/server/odb/TestOdbProxy.scala @@ -12,8 +12,7 @@ import eu.timepit.refined.types.numeric.PosLong import lucuma.core.enums.CloudExtinction import lucuma.core.enums.ImageQuality import lucuma.core.enums.Instrument -import lucuma.core.enums.ObsActiveStatus -import lucuma.core.enums.ObsStatus +import lucuma.core.enums.ObservationWorkflowState import lucuma.core.enums.ObserveClass import lucuma.core.enums.SequenceType import lucuma.core.enums.SkyBackground @@ -34,7 +33,9 @@ import lucuma.core.model.sequence.gmos.DynamicConfig import lucuma.core.model.sequence.gmos.StaticConfig import lucuma.refined.* import monocle.syntax.all.focus +import observe.common.ObsQueriesGQL.ObsQuery import observe.common.ObsQueriesGQL.ObsQuery.Data +import observe.common.ObsQueriesGQL.ObsQuery.Data.Observation as ODBObservation import observe.common.ObsQueriesGQL.RecordDatasetMutation.Data.RecordDataset.Dataset import observe.model.dhs.ImageFileId import observe.model.odb.ObsRecordedIds @@ -72,8 +73,7 @@ object TestOdbProxy { .Observation( oid, title = "Test Observation".refined, - ObsStatus.Ready, - ObsActiveStatus.Active, + ODBObservation.Workflow(ObservationWorkflowState.Ready), Data.Observation.Program(Program.Id(PosLong.unsafeFrom(1))), Data.Observation.TargetEnvironment.apply(), ConstraintSet(ImageQuality.TwoPointZero, diff --git a/modules/web/client/src/clue/scala/observe/queries/ObsQueriesGQL.scala b/modules/web/client/src/clue/scala/observe/queries/ObsQueriesGQL.scala index 602cae82f..d6d261510 100644 --- a/modules/web/client/src/clue/scala/observe/queries/ObsQueriesGQL.scala +++ b/modules/web/client/src/clue/scala/observe/queries/ObsQueriesGQL.scala @@ -12,9 +12,12 @@ object ObsQueriesGQL { @GraphQL trait ActiveObservationIdsQuery extends GraphQLOperation[ObservationDB] { + // TODO The ODB API doesn't provide a way to filter ready observations, + // so we filter by accepted proposals for now. + // Revise this when the API supports it OR we start getting obersvations from the scheduler. val document = s""" query { - observations(WHERE: { status: { EQ: READY } }) { + observations(WHERE: {program: {proposalStatus: {EQ: ACCEPTED}}}) { matches $ObservationSummarySubquery } } From 5b9c30ff260d3425d7e70d8e2cac3c4491816f50 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 3 Nov 2024 06:23:31 +0000 Subject: [PATCH 28/37] Bump sass from 1.80.3 to 1.80.6 in /modules/web/client Bumps [sass](https://github.com/sass/dart-sass) from 1.80.3 to 1.80.6. - [Release notes](https://github.com/sass/dart-sass/releases) - [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md) - [Commits](https://github.com/sass/dart-sass/compare/1.80.3...1.80.6) --- updated-dependencies: - dependency-name: sass dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/web/client/package-lock.json | 18 +++++++++++------- modules/web/client/package.json | 2 +- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/modules/web/client/package-lock.json b/modules/web/client/package-lock.json index e774275e5..c1c7eb450 100644 --- a/modules/web/client/package-lock.json +++ b/modules/web/client/package-lock.json @@ -28,7 +28,7 @@ "devDependencies": { "prettier": "^3.3.3", "process": "^0.11.10", - "sass": "^1.77.8", + "sass": "^1.80.6", "unplugin-fonts": "^1.1.1", "vite": "5.4.3", "vite-plugin-mkcert": "^1.17.5" @@ -815,6 +815,7 @@ "integrity": "sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { "detect-libc": "^1.0.3", "is-glob": "^4.0.3", @@ -1584,6 +1585,7 @@ "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", "dev": true, "license": "Apache-2.0", + "optional": true, "bin": { "detect-libc": "bin/detect-libc.js" }, @@ -1893,7 +1895,8 @@ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true }, "node_modules/object-assign": { "version": "4.1.1", @@ -2196,13 +2199,11 @@ } }, "node_modules/sass": { - "version": "1.80.3", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.80.3.tgz", - "integrity": "sha512-ptDWyVmDMVielpz/oWy3YP3nfs7LpJTHIJZboMVs8GEC9eUmtZTZhMHlTW98wY4aEorDfjN38+Wr/XjskFWcfA==", + "version": "1.80.6", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.80.6.tgz", + "integrity": "sha512-ccZgdHNiBF1NHBsWvacvT5rju3y1d/Eu+8Ex6c21nHp2lZGLBEtuwc415QfiI1PJa1TpCo3iXwwSRjRpn2Ckjg==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/watcher": "^2.4.1", "chokidar": "^4.0.0", "immutable": "^4.0.0", "source-map-js": ">=0.6.2 <2.0.0" @@ -2212,6 +2213,9 @@ }, "engines": { "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" } }, "node_modules/scheduler": { diff --git a/modules/web/client/package.json b/modules/web/client/package.json index 28d05d00d..93b1a72ab 100644 --- a/modules/web/client/package.json +++ b/modules/web/client/package.json @@ -23,7 +23,7 @@ "devDependencies": { "prettier": "^3.3.3", "process": "^0.11.10", - "sass": "^1.77.8", + "sass": "^1.80.6", "unplugin-fonts": "^1.1.1", "vite": "5.4.3", "vite-plugin-mkcert": "^1.17.5" From a5582ee91bd13b10b6fabca428f8be67de6c9552 Mon Sep 17 00:00:00 2001 From: "lucuma-steward[bot]" <106720676+lucuma-steward[bot]@users.noreply.github.com> Date: Sun, 3 Nov 2024 08:13:21 +0000 Subject: [PATCH 29/37] Update sbt-buildinfo to 0.13.0 --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index 70bde64e4..ec4a2aa21 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -8,7 +8,7 @@ addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.17.0") addSbtPlugin("io.spray" % "sbt-revolver" % "0.10.0") // Extract metadata from sbt and make it available to the code -addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.12.0") +addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.13.0") // Support making distributions addSbtPlugin("com.github.sbt" % "sbt-native-packager" % "1.10.4") From f61ce5b9f94ba4db7f556abb101f97eea3f980cc Mon Sep 17 00:00:00 2001 From: "lucuma-steward[bot]" <106720676+lucuma-steward[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 00:33:34 +0000 Subject: [PATCH 30/37] Update sbt to 1.10.5 --- project/build.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/build.properties b/project/build.properties index bc7390601..db1723b08 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.3 +sbt.version=1.10.5 From 3487f04af9706ecfa1faccca7e5ae76b388af606 Mon Sep 17 00:00:00 2001 From: "lucuma-steward[bot]" <106720676+lucuma-steward[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 12:16:46 +0000 Subject: [PATCH 31/37] Update lucuma-sso-backend-client to 0.6.27 --- project/Settings.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Settings.scala b/project/Settings.scala index a2e0dd885..2b77ef4cb 100644 --- a/project/Settings.scala +++ b/project/Settings.scala @@ -54,7 +54,7 @@ object Settings { val lucumaCore = "0.107.0" val lucumaUI = "0.121.0" val lucumaSchemas = "0.106.0" - val lucumaSSO = "0.6.26" + val lucumaSSO = "0.6.27" val lucumaODBSchema = "0.16.0" // Clue From 045befe84ef1678b5a773cd658a37ac7c2305ba2 Mon Sep 17 00:00:00 2001 From: Carlos Quiroz Date: Mon, 4 Nov 2024 14:33:48 -0300 Subject: [PATCH 32/37] Remove temporal constraint --- .../scala/observe/server/SeqTranslate.scala | 22 ++++++++----------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/modules/server_new/src/main/scala/observe/server/SeqTranslate.scala b/modules/server_new/src/main/scala/observe/server/SeqTranslate.scala index 9aef3aca3..dac0df5c6 100644 --- a/modules/server_new/src/main/scala/observe/server/SeqTranslate.scala +++ b/modules/server_new/src/main/scala/observe/server/SeqTranslate.scala @@ -65,11 +65,8 @@ import observe.server.tcs.TcsController.LightPath import observe.server.tcs.TcsController.LightSource import org.typelevel.log4cats.Logger -//trait SeqTranslate[F[_]] extends ObserveActions { trait SeqTranslate[F[_]] { - def sequence(sequence: OdbObservation)(using - tio: Temporal[F] - ): F[(List[Throwable], Option[SequenceGen[F]])] + def sequence(sequence: OdbObservation): F[(List[Throwable], Option[SequenceGen[F]])] def nextAtom( sequence: OdbObservation, @@ -208,15 +205,14 @@ object SeqTranslate { ) } - override def sequence(sequence: OdbObservation)(using - tio: Temporal[F] - ): F[(List[Throwable], Option[SequenceGen[F]])] = sequence.execution.config match { - case Some(c @ InstrumentExecutionConfig.GmosNorth(_)) => - buildSequenceGmosN(sequence, c).pure[F] - case Some(c @ InstrumentExecutionConfig.GmosSouth(_)) => - buildSequenceGmosS(sequence, c).pure[F] - case _ => ApplicativeThrow[F].raiseError(new Exception("Unknown sequence type")) - } + override def sequence(sequence: OdbObservation): F[(List[Throwable], Option[SequenceGen[F]])] = + sequence.execution.config match { + case Some(c @ InstrumentExecutionConfig.GmosNorth(_)) => + buildSequenceGmosN(sequence, c).pure[F] + case Some(c @ InstrumentExecutionConfig.GmosSouth(_)) => + buildSequenceGmosS(sequence, c).pure[F] + case _ => ApplicativeThrow[F].raiseError(new Exception("Unknown sequence type")) + } private def buildNextAtom[S <: StaticConfig, D <: DynamicConfig]( sequence: OdbObservation, From d29106d4a20d29ff8f04982450f18481951387b3 Mon Sep 17 00:00:00 2001 From: "lucuma-steward[bot]" <106720676+lucuma-steward[bot]@users.noreply.github.com> Date: Tue, 5 Nov 2024 04:15:08 +0000 Subject: [PATCH 33/37] Update lucuma-react-common, ... to 0.71.3 --- project/Settings.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Settings.scala b/project/Settings.scala index a2e0dd885..90f4d0778 100644 --- a/project/Settings.scala +++ b/project/Settings.scala @@ -63,7 +63,7 @@ object Settings { // ScalaJS libraries val crystal = "0.45.3" val javaTimeJS = "2.6.0" - val lucumaReact = "0.71.2" + val lucumaReact = "0.71.3" val scalaDom = "2.3.0" val scalajsReact = "3.0.0-beta6" } From 08c0d279c42c6944389a1da4614261ef3369af6c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <106720676+lucuma-steward[bot]@users.noreply.github.com> Date: Tue, 5 Nov 2024 07:46:53 +0000 Subject: [PATCH 34/37] flake.lock: Update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flake lock file updates: • Updated input 'typelevel-nix': 'github:typelevel/typelevel-nix/51e89c0ef21bcddf215263f6a70580aa43dff015' (2024-10-14) → 'github:typelevel/typelevel-nix/39294462366bb43d2fa2bfa25ec77598bf036f7b' (2024-11-04) • Updated input 'typelevel-nix/nixpkgs': 'github:nixos/nixpkgs/b69de56fac8c2b6f8fd27f2eca01dcda8e0a4221' (2024-10-10) → 'github:nixos/nixpkgs/2d2a9ddbe3f2c00747398f3dc9b05f7f2ebb0f53' (2024-10-30) --- flake.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/flake.lock b/flake.lock index 2d73e4ea9..7db6a6d31 100644 --- a/flake.lock +++ b/flake.lock @@ -41,11 +41,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1728538411, - "narHash": "sha256-f0SBJz1eZ2yOuKUr5CA9BHULGXVSn6miBuUWdTyhUhU=", + "lastModified": 1730272153, + "narHash": "sha256-B5WRZYsRlJgwVHIV6DvidFN7VX7Fg9uuwkRW9Ha8z+w=", "owner": "nixos", "repo": "nixpkgs", - "rev": "b69de56fac8c2b6f8fd27f2eca01dcda8e0a4221", + "rev": "2d2a9ddbe3f2c00747398f3dc9b05f7f2ebb0f53", "type": "github" }, "original": { @@ -90,11 +90,11 @@ "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1728921068, - "narHash": "sha256-EThEbbbXhfBgsiOEhdeqPKx9+GWRMc5iM4VqY/aDS6k=", + "lastModified": 1730735124, + "narHash": "sha256-rCTE/5ECdmf0f1gY1mAoTdvdejTYlLJWaa4WyyoWHN8=", "owner": "typelevel", "repo": "typelevel-nix", - "rev": "51e89c0ef21bcddf215263f6a70580aa43dff015", + "rev": "39294462366bb43d2fa2bfa25ec77598bf036f7b", "type": "github" }, "original": { From 22ced12a38eaa7702f268a42c5b18d2d1d83ddf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20L=C3=BChrs?= Date: Tue, 5 Nov 2024 16:52:10 -0300 Subject: [PATCH 35/37] SC-3912 Produced percetile keywords from new constraint types. --- .../observe/model/enums/KeywordName.scala | 6 +- .../scala/observe/server/SeqTranslate.scala | 11 +- .../main/scala/observe/server/Systems.scala | 41 +++-- .../server/keywords/ConditionOps.scala | 173 ++++++++++++++---- .../server/keywords/ConditionSetReader.scala | 107 +++++++++++ .../server/keywords/ConstraintSetReader.scala | 41 +++++ .../server/keywords/ObsKeywordReader.scala | 52 ++---- .../server/keywords/StandardHeader.scala | 104 ++++++----- 8 files changed, 386 insertions(+), 149 deletions(-) create mode 100644 modules/server_new/src/main/scala/observe/server/keywords/ConditionSetReader.scala create mode 100644 modules/server_new/src/main/scala/observe/server/keywords/ConstraintSetReader.scala diff --git a/modules/model/shared/src/main/scala/observe/model/enums/KeywordName.scala b/modules/model/shared/src/main/scala/observe/model/enums/KeywordName.scala index 86c0761f7..e8d91561c 100644 --- a/modules/model/shared/src/main/scala/observe/model/enums/KeywordName.scala +++ b/modules/model/shared/src/main/scala/observe/model/enums/KeywordName.scala @@ -2682,16 +2682,16 @@ enum KeywordName( /** @group Constructors */ case TARGET2 extends KeywordName("TARGET2", "TARGET2") - + } object KeywordName { - + /** Select the member of KeywordName with the given tag, if any. */ def fromTag(s: String): Option[KeywordName] = Enumerated.fromTag[KeywordName].getOption(s) /** Select the member of KeywordName with the given tag, throwing if absent. */ def unsafeFromTag(s: String): KeywordName = fromTag(s).getOrElse(throw new NoSuchElementException(s"KeywordName: Invalid tag: '$s'")) - + } diff --git a/modules/server_new/src/main/scala/observe/server/SeqTranslate.scala b/modules/server_new/src/main/scala/observe/server/SeqTranslate.scala index a9b4677eb..b36abf5c6 100644 --- a/modules/server_new/src/main/scala/observe/server/SeqTranslate.scala +++ b/modules/server_new/src/main/scala/observe/server/SeqTranslate.scala @@ -705,11 +705,14 @@ object SeqTranslate { )(ctx: HeaderExtraData): Header[F] = new StandardHeader( kwClient, - ObsKeywordReader[F, D](obsCfg, stepCfg, site), + ObsKeywordReader[F, D](obsCfg, stepCfg, site, systemss), systemss.tcsKeywordReader, - StateKeywordsReader[F](ctx.conditions, ctx.operator, ctx.observer, site), - tcsSubsystems, - site + StateKeywordsReader[F](systemss.conditionSetReader(ctx.conditions), + ctx.operator, + ctx.observer, + site + ), + tcsSubsystems ) private def gwsHeaders(kwClient: KeywordsClient[F]): Header[F] = diff --git a/modules/server_new/src/main/scala/observe/server/Systems.scala b/modules/server_new/src/main/scala/observe/server/Systems.scala index c44841576..76f6d62a9 100644 --- a/modules/server_new/src/main/scala/observe/server/Systems.scala +++ b/modules/server_new/src/main/scala/observe/server/Systems.scala @@ -19,6 +19,7 @@ import io.circe.syntax.* import lucuma.core.enums.Site import lucuma.schemas.ObservationDB import mouse.boolean.* +import observe.model.Conditions import observe.model.config.* import observe.model.odb.ObsRecordedIds import observe.server.altair.* @@ -57,6 +58,7 @@ case class Systems[F[_]] private[server] ( gems: GemsController[F], guideDb: GuideConfigDb[F], tcsKeywordReader: TcsKeywordsReader[F], + conditionSetReader: Conditions => ConditionSetReader[F], gcalKeywordReader: GcalKeywordReader[F], gmosKeywordReader: GmosKeywordReader[F], /* gnirsKeywordReader: GnirsKeywordReader[F], @@ -172,7 +174,8 @@ object Systems { TcsSouthController[IO], TcsKeywordsReader[IO], AltairController[IO], - AltairKeywordReader[IO] + AltairKeywordReader[IO], + Conditions => ConditionSetReader[IO] ) ] = for { @@ -184,12 +187,16 @@ object Systems { tcsNCtr = tcsNorth(tcsEpicsO, site) tcsSCtr = tcsSouth(tcsEpicsO, site, gcdb) tcsKR = tcsEpicsO.map(TcsKeywordsReaderEpics[IO]).getOrElse(DummyTcsKeywordsReader[IO]) + condsR = tcsEpicsO + .map(ConditionSetReaderEpics.apply(site, _)) + .getOrElse(DummyConditionSetReader(site)) } yield ( tcsNCtr, tcsSCtr, tcsKR, altairCtr, - altairKR + altairKR, + condsR ) def gems( @@ -368,29 +375,29 @@ object Systems { def build(site: Site, httpClient: Client[IO]): Resource[IO, Systems[IO]] = for { - clt <- Resource.eval(JdkWSClient.simple[IO]) - webSocketBackend = clue.http4s.Http4sWebSocketBackend[IO](clt) - odbProxy <- + clt <- Resource.eval(JdkWSClient.simple[IO]) + webSocketBackend = clue.http4s.Http4sWebSocketBackend[IO](clt) + odbProxy <- Resource.eval[IO, OdbProxy[IO]]( odbProxy[IO](using Async[IO], Logger[IO], webSocketBackend) ) - dhsClient <- Resource.eval(dhs[IO](httpClient)) - gcdb <- Resource.eval(GuideConfigDb.newDb[IO]) - gcals <- Resource.eval(gcal) - (gcalCtr, gcalKR) = gcals - v <- Resource.eval(tcsObjects(gcdb, site)) - (tcsGN, tcsGS, tcsKR, altairCtr, altairKR) = v - w <- Resource.eval(gemsObjects) - (gemsCtr, gemsKR, gsaoiCtr, gsaoiKR) = w + dhsClient <- Resource.eval(dhs[IO](httpClient)) + gcdb <- Resource.eval(GuideConfigDb.newDb[IO]) + gcals <- Resource.eval(gcal) + (gcalCtr, gcalKR) = gcals + v <- Resource.eval(tcsObjects(gcdb, site)) + (tcsGN, tcsGS, tcsKR, altairCtr, altairKR, condsR) = v + w <- Resource.eval(gemsObjects) + (gemsCtr, gemsKR, gsaoiCtr, gsaoiKR) = w // (gnirsCtr, gnirsKR) <- Resource.eval(gnirs) // f2Controller <- Resource.eval(flamingos2) // (niriCtr, niriKR) <- Resource.eval(niri) // (nifsCtr, nifsKR) <- Resource.eval(nifs) - gms <- Resource.eval(gmosObjects(site)) - (gmosSouthCtr, gmosNorthCtr, gmosKR) = gms + gms <- Resource.eval(gmosObjects(site)) + (gmosSouthCtr, gmosNorthCtr, gmosKR) = gms // gpiController <- gpi[IO](httpClient) // ghostController <- ghost[IO](httpClient) - gwsKR <- Resource.eval(gws) + gwsKR <- Resource.eval(gws) } yield Systems[IO]( odbProxy, dhsClient, @@ -410,6 +417,7 @@ object Systems { gemsCtr, gcdb, tcsKR, + condsR, gcalKR, gmosKR, // gnirsKR, @@ -455,6 +463,7 @@ object Systems { GemsControllerSim[F], guideDb, DummyTcsKeywordsReader[F], + DummyConditionSetReader.apply[F](Site.GN), DummyGcalKeywordsReader[F], GmosKeywordReaderDummy[F], AltairKeywordReaderDummy[F], diff --git a/modules/server_new/src/main/scala/observe/server/keywords/ConditionOps.scala b/modules/server_new/src/main/scala/observe/server/keywords/ConditionOps.scala index 4dad5e9ed..e41fb7a7f 100644 --- a/modules/server_new/src/main/scala/observe/server/keywords/ConditionOps.scala +++ b/modules/server_new/src/main/scala/observe/server/keywords/ConditionOps.scala @@ -3,54 +3,153 @@ package observe.server.keywords -import lucuma.core.enums.{Site, SkyBackground, WaterVapor} +import cats.data.NonEmptyList +import cats.syntax.all.* +import lucuma.core.enums.CloudExtinction +import lucuma.core.enums.ImageQuality +import lucuma.core.enums.Site +import lucuma.core.enums.SkyBackground +import lucuma.core.enums.WaterVapor +import lucuma.core.math.Angle +import lucuma.core.math.Wavelength import lucuma.core.model.ConstraintSet import observe.model.Conditions +import scala.annotation.tailrec +import scala.math.Ordering.Implicits.infixOrderingOps +import scala.math.Pi +import scala.math.abs +import scala.math.pow +import scala.math.sin + object ConditionOps { - + extension (wv: WaterVapor) { def toMillimeters(site: Site): Double = site match - case Site.GN => wv match - case WaterVapor.VeryDry => 1.0 - case WaterVapor.Dry => 1.6 - case WaterVapor.Median => 3.0 - case WaterVapor.Wet => 5.0 - case Site.GS => wv match - case WaterVapor.VeryDry => 2.3 - case WaterVapor.Dry => 4.3 - case WaterVapor.Median => 7.6 - case WaterVapor.Wet => 10.0 + case Site.GN => + wv match + case WaterVapor.VeryDry => 1.0 + case WaterVapor.Dry => 1.6 + case WaterVapor.Median => 3.0 + case WaterVapor.Wet => 5.0 + case Site.GS => + wv match + case WaterVapor.VeryDry => 2.3 + case WaterVapor.Dry => 4.3 + case WaterVapor.Median => 7.6 + case WaterVapor.Wet => 10.0 } extension (sb: SkyBackground) { def toMicroVolts: Double = sb match case SkyBackground.Darkest => 21.3 - case SkyBackground.Dark => 20.7 - case SkyBackground.Gray => 19.5 - case SkyBackground.Bright => 18.0 - } - - extension (conditions: Conditions) { - def imageQualityStr: String = conditions.iq.map(_.label).getOrElse("Any") - def cloudExtinctionStr: String = conditions.ce.map(_.label).getOrElse("Any") - def waterVaporStr: String = conditions.wv.map(_.label).getOrElse("Any") - def backgroundLightStr: String = conditions.sb.map(_.label).getOrElse("Any") - def imageQualityDbl: Double = conditions.iq.map(_.toArcSeconds.value.toDouble).getOrElse(Double.NaN) - def cloudExtinctionDbl: Double = conditions.ce.map(_.toBrightness).getOrElse(Double.NaN) - def waterVaporDbl(site: Site): Double = conditions.wv.map(_.toMillimeters(site)).getOrElse(Double.NaN) - def backgroundLightDbl: Double = conditions.sb.map(_.toMicroVolts).getOrElse(Double.NaN) - } - - extension (cnd: ConstraintSet) { - def imageQualityStr: String = cnd.imageQuality.label - def cloudExtinctionStr: String = cnd.cloudExtinction.label - def waterVaporStr: String = cnd.waterVapor.label - def backgroundLightStr: String = cnd.skyBackground.label - def imageQualityDbl: Double = cnd.imageQuality.toArcSeconds.value.toDouble - def cloudExtinctionDbl: Double = cnd.cloudExtinction.toBrightness - def waterVaporDbl(site: Site): Double = cnd.waterVapor.toMillimeters(site) - def backgroundLightDbl: Double = cnd.skyBackground.toMicroVolts + case SkyBackground.Dark => 20.7 + case SkyBackground.Gray => 19.5 + case SkyBackground.Bright => 18.0 + } + + private def nearestLookup[V](map: NonEmptyList[(Double, V)])(key: Double): V = { + @tailrec + def findAcc(acc: (Double, V), rem: List[(Double, V)]): V = rem match { + case Nil => acc._2 + case ::(head, next) => + if (abs(acc._1 - key) <= abs(head._1 - key)) + acc._2 + else + findAcc(head, next) + } + + findAcc(map.head, map.tail) + } + + private def binnedLookup[A: Ordering, V](map: NonEmptyList[(A, V)])(key: A): V = { + @tailrec + def findAcc(acc: (A, V), rem: List[(A, V)]): V = rem match { + case Nil => acc._2 + case ::(head, next) => + if (key <= head._1) + acc._2 + else + findAcc(head, next) + } + + findAcc(map.head, map.tail) + } + + private val iqBins = NonEmptyList + .of(0.350, 0.475, 0.630, 0.780, 0.900, 1.02, 1.20, 1.65, 2.2, 3.4, 4.8, 11.7) + .zip( + NonEmptyList + .of( + NonEmptyList.of(0.60, 0.90, 1.20, 2.00), + NonEmptyList.of(0.60, 0.85, 1.10, 1.90), + NonEmptyList.of(0.50, 0.75, 1.05, 1.80), + NonEmptyList.of(0.50, 0.75, 1.05, 1.70), + NonEmptyList.of(0.50, 0.70, 0.95, 1.70), + NonEmptyList.of(0.40, 0.70, 0.95, 1.65), + NonEmptyList.of(0.40, 0.60, 0.85, 1.55), + NonEmptyList.of(0.40, 0.60, 0.85, 1.50), + NonEmptyList.of(0.35, 0.55, 0.80, 1.40), + NonEmptyList.of(0.35, 0.50, 0.75, 1.25), + NonEmptyList.of(0.35, 0.50, 0.70, 1.15), + NonEmptyList.of(0.31, 0.37, 0.45, 0.75) + ) + .map(_.zip(NonEmptyList.of(20, 70, 85, 100))) + ) + + extension (iq: ImageQuality) { + def toPercentile(wv: Wavelength, elevation: Angle): Int = { + // Pickering approximation (thanks Andy Stephens) + val airmass = 1.0 / sin( + (90.0 - elevation.toDoubleDegrees + 244.0 / (165.0 + 47.0 * pow( + 90.0 - elevation.toDoubleDegrees, + 1.1 + ))) * Pi / 180 + ) + val atZenith: Angle = iq.toAngle * (1.0 / pow(airmass, 0.6)) + binnedLookup(nearestLookup(iqBins)(wv.toMicrometers.value.value.toDouble))( + atZenith.toDoubleDegrees * 3600.0 + ) + } + } + + extension (ce: CloudExtinction) { + def toPercentile: Int = ce match { + case CloudExtinction.PointOne => 50 + case CloudExtinction.PointThree => 70 + case CloudExtinction.PointFive => 80 + case CloudExtinction.OnePointZero => 80 + case CloudExtinction.OnePointFive => 100 + case CloudExtinction.TwoPointZero => 100 + case CloudExtinction.ThreePointZero => 100 + } + } + + extension (wv: WaterVapor) { + def toPercentile: Int = wv match { + case WaterVapor.VeryDry => 20 + case WaterVapor.Dry => 50 + case WaterVapor.Median => 80 + case WaterVapor.Wet => 100 + } + } + + extension (bg: SkyBackground) { + def toPercentile: Int = bg match { + case SkyBackground.Darkest => 20 + case SkyBackground.Dark => 50 + case SkyBackground.Gray => 80 + case SkyBackground.Bright => 100 + } + } + + extension (constrainSet: ConstraintSet) { + def asConditions: Conditions = Conditions( + constrainSet.cloudExtinction.some, + constrainSet.imageQuality.some, + constrainSet.skyBackground.some, + constrainSet.waterVapor.some + ) } } diff --git a/modules/server_new/src/main/scala/observe/server/keywords/ConditionSetReader.scala b/modules/server_new/src/main/scala/observe/server/keywords/ConditionSetReader.scala new file mode 100644 index 000000000..52b7d1613 --- /dev/null +++ b/modules/server_new/src/main/scala/observe/server/keywords/ConditionSetReader.scala @@ -0,0 +1,107 @@ +// Copyright (c) 2016-2023 Association of Universities for Research in Astronomy, Inc. (AURA) +// For license information see LICENSE or https://opensource.org/licenses/BSD-3-Clause + +package observe.server.keywords + +import cats.Applicative +import cats.Monad +import cats.syntax.all.* +import lucuma.core.enums.Site +import lucuma.core.math.Angle +import lucuma.core.math.Wavelength +import observe.model.Conditions +import observe.server.tcs.TcsEpics + +import ConditionOps.* + +trait ConditionSetReader[F[_]] { + def imageQualityStr: F[String] + + def cloudExtinctionStr: F[String] + + def waterVaporStr: F[String] + + def backgroundLightStr: F[String] + + def imageQualityDbl: F[Double] + + def cloudExtinctionDbl: F[Double] + + def waterVaporDbl: F[Double] + + def backgroundLightDbl: F[Double] +} + +object ConditionSetReaderEpics { + def apply[F[_]: Monad](site: Site, tcsEpics: TcsEpics[F])( + conditions: Conditions + ): ConditionSetReader[F] = new ConditionSetReader[F]: + private def percentileStr(v: Option[Int]): String = + v.map(x => if (x === 100) "Any" else s"$x-percentile").getOrElse("UNKNOWN") + + override def imageQualityStr: F[String] = for { + wv <- tcsEpics.sourceATarget.centralWavelenght + el <- tcsEpics.elevation + } yield percentileStr( + Wavelength + .fromIntNanometers(wv.toInt) + .flatMap(w => conditions.iq.map(_.toPercentile(w, Angle.fromDoubleDegrees(el)))) + ) + + override def cloudExtinctionStr: F[String] = + percentileStr(conditions.ce.map(_.toPercentile)).pure[F] + + override def waterVaporStr: F[String] = percentileStr(conditions.wv.map(_.toPercentile)).pure[F] + + override def backgroundLightStr: F[String] = + percentileStr(conditions.sb.map(_.toPercentile)).pure[F] + + override def imageQualityDbl: F[Double] = conditions.iq + .map(_.toArcSeconds.value.toDouble) + .getOrElse(DefaultHeaderValue[Double].default) + .pure[F] + + override def cloudExtinctionDbl: F[Double] = + conditions.ce.map(_.toBrightness).getOrElse(DefaultHeaderValue[Double].default).pure[F] + + override def waterVaporDbl: F[Double] = + conditions.wv.map(_.toMillimeters(site)).getOrElse(DefaultHeaderValue[Double].default).pure[F] + + override def backgroundLightDbl: F[Double] = + conditions.sb.map(_.toMicroVolts).getOrElse(DefaultHeaderValue[Double].default).pure[F] +} + +object DummyConditionSetReader { + def apply[F[_]: Applicative](site: Site)(conditions: Conditions): ConditionSetReader[F] = + new ConditionSetReader[F] { + private def percentileStr(v: Option[Int]): String = + v.map(x => if (x === 100) "Any" else s"$x-percentile").getOrElse("UNKNOWN") + + override def imageQualityStr: F[String] = DefaultHeaderValue[String].default.pure[F] + + override def cloudExtinctionStr: F[String] = + percentileStr(conditions.ce.map(_.toPercentile)).pure[F] + + override def waterVaporStr: F[String] = + percentileStr(conditions.wv.map(_.toPercentile)).pure[F] + + override def backgroundLightStr: F[String] = + percentileStr(conditions.sb.map(_.toPercentile)).pure[F] + + override def imageQualityDbl: F[Double] = conditions.iq + .map(_.toArcSeconds.value.toDouble) + .getOrElse(DefaultHeaderValue[Double].default) + .pure[F] + + override def cloudExtinctionDbl: F[Double] = + conditions.ce.map(_.toBrightness).getOrElse(DefaultHeaderValue[Double].default).pure[F] + + override def waterVaporDbl: F[Double] = conditions.wv + .map(_.toMillimeters(site)) + .getOrElse(DefaultHeaderValue[Double].default) + .pure[F] + + override def backgroundLightDbl: F[Double] = + conditions.sb.map(_.toMicroVolts).getOrElse(DefaultHeaderValue[Double].default).pure[F] + } +} diff --git a/modules/server_new/src/main/scala/observe/server/keywords/ConstraintSetReader.scala b/modules/server_new/src/main/scala/observe/server/keywords/ConstraintSetReader.scala new file mode 100644 index 000000000..2e372bf68 --- /dev/null +++ b/modules/server_new/src/main/scala/observe/server/keywords/ConstraintSetReader.scala @@ -0,0 +1,41 @@ +// Copyright (c) 2016-2023 Association of Universities for Research in Astronomy, Inc. (AURA) +// For license information see LICENSE or https://opensource.org/licenses/BSD-3-Clause + +package observe.server.keywords + +import cats.Applicative +import cats.syntax.all.* +import lucuma.core.model.ConstraintSet +import lucuma.core.model.ElevationRange + +trait ConstraintSetReader[F[_]] { + def imageQualityStr: F[String] + + def cloudExtinctionStr: F[String] + + def waterVaporStr: F[String] + + def backgroundLightStr: F[String] + + def imageQualityDbl: F[Double] + + def cloudExtinctionDbl: F[Double] + + def waterVaporDbl: F[Double] + + def backgroundLightDbl: F[Double] + + def elevationRange: F[ElevationRange] +} + +object ConstraintSetReader { + def apply[F[_]: Applicative]( + constraintSet: ConstraintSet, + conditionSetReader: ConditionSetReader[F] + ): ConstraintSetReader[F] = new ConstraintSetReader[F] { + + export conditionSetReader.* + + override def elevationRange: F[ElevationRange] = constraintSet.elevationRange.pure[F] + } +} diff --git a/modules/server_new/src/main/scala/observe/server/keywords/ObsKeywordReader.scala b/modules/server_new/src/main/scala/observe/server/keywords/ObsKeywordReader.scala index 09a02f819..49ace5a07 100644 --- a/modules/server_new/src/main/scala/observe/server/keywords/ObsKeywordReader.scala +++ b/modules/server_new/src/main/scala/observe/server/keywords/ObsKeywordReader.scala @@ -10,17 +10,21 @@ import lucuma.core.enums.Site import lucuma.core.enums.StepGuideState import lucuma.core.enums.StepGuideState.Disabled import lucuma.core.enums.StepGuideState.Enabled -import lucuma.core.model.{ConstraintSet, ElevationRange, TimingWindowEnd, TimingWindowRepeat} +import lucuma.core.model.TimingWindowEnd +import lucuma.core.model.TimingWindowRepeat import lucuma.core.model.sequence.Step as OcsStep import lucuma.core.model.sequence.StepConfig import lucuma.core.model.sequence.gmos.DynamicConfig import lucuma.core.util.TimeSpan import observe.common.ObsQueriesGQL.ObsQuery.Data.Observation +import observe.server.Systems import java.time.LocalDate import java.time.ZoneId import java.time.format.DateTimeFormatter +import ConditionOps.* + sealed trait ObsKeywordsReader[F[_]] { def obsType: F[String] def obsClass: F[String] @@ -50,31 +54,11 @@ sealed trait ObsKeywordsReader[F[_]] { def geminiQA: F[String] def pIReq: F[String] def sciBand: F[Int] - def requestedAirMassAngle: F[Map[String, Double]] def timingWindows: F[List[(Int, TimingWindowKeywords)]] - def requestedConditions: ConstraintSet + def requestedConditions: ConstraintSetReader[F] def astrometicField: F[Boolean] } -trait ObsKeywordsReaderConstants { - // Constants taken from SPSiteQualityCB - // TODO Make them public in SPSiteQualityCB - val MIN_HOUR_ANGLE: String = "MinHourAngle" - val MAX_HOUR_ANGLE: String = "MaxHourAngle" - val MIN_AIRMASS: String = "MinAirmass" - val MAX_AIRMASS: String = "MaxAirmass" - - val TIMING_WINDOW_START: String = "TimingWindowStart" - val TIMING_WINDOW_DURATION: String = "TimingWindowDuration" - val TIMING_WINDOW_REPEAT: String = "TimingWindowRepeat" - val TIMING_WINDOW_PERIOD: String = "TimingWindowPeriod" - - val SB: String = "SkyBackground" - val CC: String = "CloudCover" - val IQ: String = "ImageQuality" - val WV: String = "WaterVapor" -} - // A Timing window always has 4 keywords final case class TimingWindowKeywords( start: String, @@ -83,11 +67,12 @@ final case class TimingWindowKeywords( period: Double ) -object ObsKeywordReader extends ObsKeywordsReaderConstants { +object ObsKeywordReader { def apply[F[_]: Sync, D <: DynamicConfig]( obsCfg: Observation, step: OcsStep[D], - site: Site + site: Site, + sys: Systems[F] ): ObsKeywordsReader[F] = new ObsKeywordsReader[F] { // Format used on FITS keywords @@ -119,21 +104,10 @@ object ObsKeywordReader extends ObsKeywordsReaderConstants { override def obsId: F[String] = obsCfg.title.value.pure[F] - override def requestedAirMassAngle: F[Map[String, Double]] = - obsCfg.constraintSet.elevationRange match { - case ElevationRange.AirMass(min, max) => - Map( - MAX_AIRMASS -> max.value.toDouble, - MIN_AIRMASS -> min.value.toDouble - ).pure[F] - case ElevationRange.HourAngle(minHours, maxHours) => - Map( - MAX_HOUR_ANGLE -> maxHours.value.toDouble, - MIN_HOUR_ANGLE -> minHours.value.toDouble - ).pure[F] - } - - override def requestedConditions: ConstraintSet = obsCfg.constraintSet + override def requestedConditions: ConstraintSetReader[F] = ConstraintSetReader.apply( + obsCfg.constraintSet, + sys.conditionSetReader(obsCfg.constraintSet.asConditions) + ) override def timingWindows: F[List[(Int, TimingWindowKeywords)]] = obsCfg.timingWindows.zipWithIndex diff --git a/modules/server_new/src/main/scala/observe/server/keywords/StandardHeader.scala b/modules/server_new/src/main/scala/observe/server/keywords/StandardHeader.scala index b440639fb..a1323aab8 100644 --- a/modules/server_new/src/main/scala/observe/server/keywords/StandardHeader.scala +++ b/modules/server_new/src/main/scala/observe/server/keywords/StandardHeader.scala @@ -3,42 +3,44 @@ package observe.server.keywords -import cats.Applicative +import cats.Monad import cats.data.Nested import cats.effect.Sync import cats.syntax.all.* -import lucuma.core.enums.{Site, StepGuideState} +import lucuma.core.enums.Site +import lucuma.core.enums.StepGuideState +import lucuma.core.model.ElevationRange import observe.common.ObsQueriesGQL.RecordDatasetMutation.Data.RecordDataset.Dataset -import observe.model.Conditions import observe.model.Observation.Id import observe.model.Observer import observe.model.Operator import observe.model.dhs.ImageFileId -import observe.model.enums.KeywordName +import observe.model.enums.KeywordName import observe.server.OcsBuildInfo import observe.server.tcs.TargetKeywordsReader import observe.server.tcs.TcsController import observe.server.tcs.TcsKeywordsReader import org.typelevel.log4cats.Logger + import ConditionOps.* -final case class StateKeywordsReader[F[_]: Applicative]( - conditions: Conditions, +final case class StateKeywordsReader[F[_]: Monad]( + conditions: ConditionSetReader[F], operator: Option[Operator], observer: Option[Observer], - site: Site + site: Site ) { - def observerName: F[String] = observer.map(_.value.value).getOrElse("observer").pure[F] - def operatorName: F[String] = operator.map(_.value.value).getOrElse("ssa").pure[F] - def rawImageQuality: F[String] = conditions.imageQualityStr.pure[F] - def rawCloudExtinction: F[String] = conditions.cloudExtinctionStr.pure[F] - def rawWaterVapor: F[String] = conditions.waterVaporStr.pure[F] - def rawBackgroundLight: F[String] = conditions.backgroundLightStr.pure[F] - def rawImageQualityD: F[Double] = conditions.imageQualityDbl.pure[F] - def rawCloudExtinctionD: F[Double] = conditions.cloudExtinctionDbl.pure[F] - def rawWaterVaporD: F[Double] = conditions.waterVaporDbl(site).pure[F] - def rawBackgroundLightD: F[Double] = conditions.backgroundLightDbl.pure[F] + def observerName: F[String] = observer.map(_.value.value).getOrElse("observer").pure[F] + def operatorName: F[String] = operator.map(_.value.value).getOrElse("ssa").pure[F] + def rawImageQuality: F[String] = conditions.imageQualityStr + def rawCloudExtinction: F[String] = conditions.cloudExtinctionStr + def rawWaterVapor: F[String] = conditions.waterVaporStr + def rawBackgroundLight: F[String] = conditions.backgroundLightStr + def rawImageQualityD: F[Double] = conditions.imageQualityDbl + def rawCloudExtinctionD: F[Double] = conditions.cloudExtinctionDbl + def rawWaterVaporD: F[Double] = conditions.waterVaporDbl + def rawBackgroundLightD: F[Double] = conditions.backgroundLightDbl } class StandardHeader[F[_]: Sync: Logger]( @@ -46,10 +48,8 @@ class StandardHeader[F[_]: Sync: Logger]( obsReader: ObsKeywordsReader[F], tcsReader: TcsKeywordsReader[F], stateReader: StateKeywordsReader[F], - tcsSubsystems: List[TcsController.Subsystem], - site: Site -) extends Header[F] - with ObsKeywordsReaderConstants { + tcsSubsystems: List[TcsController.Subsystem] +) extends Header[F] { val obsObject: F[String] = for { obsType <- obsReader.obsType @@ -165,36 +165,40 @@ class StandardHeader[F[_]: Sync: Logger]( // TODO abstract requestedConditions/requestedAirMassAngle def requestedConditions(id: ImageFileId): F[Unit] = - sendKeywords( - id, - kwClient, - List( - buildString(obsReader.requestedConditions.imageQualityStr.pure[F], KeywordName.REQIQ), - buildString(obsReader.requestedConditions.cloudExtinctionStr.pure[F], KeywordName.REQCC), - buildString(obsReader.requestedConditions.waterVaporStr.pure[F], KeywordName.REQWV), - buildString(obsReader.requestedConditions.backgroundLightStr.pure[F], KeywordName.REQBG), - buildDouble(obsReader.requestedConditions.imageQualityDbl.pure[F], KeywordName.REQDIQ), - buildDouble(obsReader.requestedConditions.cloudExtinctionDbl.pure[F], KeywordName.REQDCC), - buildDouble(obsReader.requestedConditions.waterVaporDbl(site).pure[F], KeywordName.REQDWV), - buildDouble(obsReader.requestedConditions.backgroundLightDbl.pure[F], KeywordName.REQDBG), - ) - ) - - def requestedAirMassAngle(id: ImageFileId): F[Unit] = { - val keys = List(KeywordName.REQMAXAM -> MAX_AIRMASS, - KeywordName.REQMAXHA -> MAX_HOUR_ANGLE, - KeywordName.REQMINAM -> MIN_AIRMASS, - KeywordName.REQMINHA -> MIN_HOUR_ANGLE - ) - obsReader.requestedAirMassAngle.flatMap { airMassAngle => - val requested = keys - .map { case (keyword, value) => - airMassAngle.get(value).map(v => buildDouble(v.pure[F], keyword)) - } - .mapFilter(identity) - sendKeywords[F](id, kwClient, requested).whenA(requested.nonEmpty) + tcsReader.elevation.flatMap { el => + tcsReader.sourceATarget.wavelength.flatMap { wavel => + sendKeywords( + id, + kwClient, + List( + buildString(obsReader.requestedConditions.imageQualityStr, KeywordName.REQIQ), + buildString(obsReader.requestedConditions.cloudExtinctionStr, KeywordName.REQCC), + buildString(obsReader.requestedConditions.waterVaporStr, KeywordName.REQWV), + buildString(obsReader.requestedConditions.backgroundLightStr, KeywordName.REQBG), + buildDouble(obsReader.requestedConditions.imageQualityDbl, KeywordName.REQDIQ), + buildDouble(obsReader.requestedConditions.cloudExtinctionDbl, KeywordName.REQDCC), + buildDouble(obsReader.requestedConditions.waterVaporDbl, KeywordName.REQDWV), + buildDouble(obsReader.requestedConditions.backgroundLightDbl, KeywordName.REQDBG) + ) + ) + } } - } + + def requestedAirMassAngle(id: ImageFileId): F[Unit] = + obsReader.requestedConditions.elevationRange + .map { + case ElevationRange.AirMass(min, max) => + List( + buildDouble(max.value.toDouble.pure[F], KeywordName.REQMAXAM), + buildDouble(min.value.toDouble.pure[F], KeywordName.REQMINAM) + ) + case ElevationRange.HourAngle(minHours, maxHours) => + List( + buildDouble(maxHours.value.toDouble.pure[F], KeywordName.REQMAXHA), + buildDouble(minHours.value.toDouble.pure[F], KeywordName.REQMINHA) + ) + } + .flatMap(sendKeywords[F](id, kwClient, _)) def guiderKeywords( id: ImageFileId, From ab5c1472f94d4bc19f6c2e266746bdde6676e136 Mon Sep 17 00:00:00 2001 From: "lucuma-steward[bot]" <106720676+lucuma-steward[bot]@users.noreply.github.com> Date: Wed, 6 Nov 2024 12:19:24 +0000 Subject: [PATCH 36/37] Update lucuma-odb-schema to 0.16.1 --- project/Settings.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Settings.scala b/project/Settings.scala index 2b77ef4cb..d78471544 100644 --- a/project/Settings.scala +++ b/project/Settings.scala @@ -55,7 +55,7 @@ object Settings { val lucumaUI = "0.121.0" val lucumaSchemas = "0.106.0" val lucumaSSO = "0.6.27" - val lucumaODBSchema = "0.16.0" + val lucumaODBSchema = "0.16.1" // Clue val clue = "0.40.0" From 9ad50af584fc5d7b62c0c6736cad37a41fbb83e7 Mon Sep 17 00:00:00 2001 From: "lucuma-steward[bot]" <106720676+lucuma-steward[bot]@users.noreply.github.com> Date: Wed, 6 Nov 2024 12:19:31 +0000 Subject: [PATCH 37/37] Update lucuma-schemas, ... to 0.107.1 --- project/Settings.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Settings.scala b/project/Settings.scala index 2b77ef4cb..8e20adbaf 100644 --- a/project/Settings.scala +++ b/project/Settings.scala @@ -53,7 +53,7 @@ object Settings { // Gemini Libraries val lucumaCore = "0.107.0" val lucumaUI = "0.121.0" - val lucumaSchemas = "0.106.0" + val lucumaSchemas = "0.107.1" val lucumaSSO = "0.6.27" val lucumaODBSchema = "0.16.0"