From f7571211fdc46fa601c2cc65a0ee17827598b7ef Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Fri, 21 Jul 2023 16:33:53 +0200 Subject: [PATCH 01/95] initial branch commit --- api/schema.graphqls | 2 +- internal/graph/generated/generated.go | 28 +++++++++++++------------- internal/graph/model/models_gen.go | 4 ++-- internal/graph/util.go | 17 ++++++++++++++-- internal/metricdata/cc-metric-store.go | 2 +- internal/metricdata/metricdata.go | 4 ++-- web/frontend/src/Analysis.root.svelte | 6 +++--- 7 files changed, 38 insertions(+), 25 deletions(-) diff --git a/api/schema.graphqls b/api/schema.graphqls index 82681c0..4802117 100644 --- a/api/schema.graphqls +++ b/api/schema.graphqls @@ -156,7 +156,7 @@ type MetricFootprints { } type Footprints { - nodehours: [NullableFloat!]! + timeweights: [NullableFloat!]! metrics: [MetricFootprints!]! } diff --git a/internal/graph/generated/generated.go b/internal/graph/generated/generated.go index 229c6b5..1f3c349 100644 --- a/internal/graph/generated/generated.go +++ b/internal/graph/generated/generated.go @@ -68,8 +68,8 @@ type ComplexityRoot struct { } Footprints struct { - Metrics func(childComplexity int) int - Nodehours func(childComplexity int) int + Metrics func(childComplexity int) int + Timeweights func(childComplexity int) int } HistoPoint struct { @@ -406,12 +406,12 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.Footprints.Metrics(childComplexity), true - case "Footprints.nodehours": - if e.complexity.Footprints.Nodehours == nil { + case "Footprints.timeweights": + if e.complexity.Footprints.Timeweights == nil { break } - return e.complexity.Footprints.Nodehours(childComplexity), true + return e.complexity.Footprints.Timeweights(childComplexity), true case "HistoPoint.count": if e.complexity.HistoPoint.Count == nil { @@ -1666,7 +1666,7 @@ type MetricFootprints { } type Footprints { - nodehours: [NullableFloat!]! + timeweights: [NullableFloat!]! metrics: [MetricFootprints!]! } @@ -2753,8 +2753,8 @@ func (ec *executionContext) fieldContext_Count_count(ctx context.Context, field return fc, nil } -func (ec *executionContext) _Footprints_nodehours(ctx context.Context, field graphql.CollectedField, obj *model.Footprints) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Footprints_nodehours(ctx, field) +func (ec *executionContext) _Footprints_timeweights(ctx context.Context, field graphql.CollectedField, obj *model.Footprints) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Footprints_timeweights(ctx, field) if err != nil { return graphql.Null } @@ -2767,7 +2767,7 @@ func (ec *executionContext) _Footprints_nodehours(ctx context.Context, field gra }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return obj.Nodehours, nil + return obj.Timeweights, nil }) if err != nil { ec.Error(ctx, err) @@ -2784,7 +2784,7 @@ func (ec *executionContext) _Footprints_nodehours(ctx context.Context, field gra return ec.marshalNNullableFloat2ᚕgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐFloatᚄ(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Footprints_nodehours(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Footprints_timeweights(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Footprints", Field: field, @@ -6945,8 +6945,8 @@ func (ec *executionContext) fieldContext_Query_jobsFootprints(ctx context.Contex IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { - case "nodehours": - return ec.fieldContext_Footprints_nodehours(ctx, field) + case "timeweights": + return ec.fieldContext_Footprints_timeweights(ctx, field) case "metrics": return ec.fieldContext_Footprints_metrics(ctx, field) } @@ -11715,9 +11715,9 @@ func (ec *executionContext) _Footprints(ctx context.Context, sel ast.SelectionSe switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Footprints") - case "nodehours": + case "timeweights": - out.Values[i] = ec._Footprints_nodehours(ctx, field, obj) + out.Values[i] = ec._Footprints_timeweights(ctx, field, obj) if out.Values[i] == graphql.Null { invalids++ diff --git a/internal/graph/model/models_gen.go b/internal/graph/model/models_gen.go index 8284051..7dacdf2 100644 --- a/internal/graph/model/models_gen.go +++ b/internal/graph/model/models_gen.go @@ -22,8 +22,8 @@ type FloatRange struct { } type Footprints struct { - Nodehours []schema.Float `json:"nodehours"` - Metrics []*MetricFootprints `json:"metrics"` + Timeweights []schema.Float `json:"timeweights"` + Metrics []*MetricFootprints `json:"metrics"` } type HistoPoint struct { diff --git a/internal/graph/util.go b/internal/graph/util.go index c9423e1..64676c8 100644 --- a/internal/graph/util.go +++ b/internal/graph/util.go @@ -107,6 +107,8 @@ func (r *queryResolver) jobsFootprints(ctx context.Context, filter []*model.JobF } nodehours := make([]schema.Float, 0, len(jobs)) + acchours := make([]schema.Float, 0, len(jobs)) + hwthours := make([]schema.Float, 0, len(jobs)) for _, job := range jobs { if job.MonitoringStatus == schema.MonitoringStatusDisabled || job.MonitoringStatus == schema.MonitoringStatusArchivingFailed { continue @@ -117,7 +119,18 @@ func (r *queryResolver) jobsFootprints(ctx context.Context, filter []*model.JobF return nil, err } + // #166 collect arrays: Null values or no null values? nodehours = append(nodehours, schema.Float(float64(job.Duration)/60.0*float64(job.NumNodes))) + if job.NumAcc > 0 { + acchours = append(acchours, schema.Float(float64(job.Duration)/60.0*float64(job.NumAcc))) + } else { + acchours = append(acchours, schema.Float(0.0)) + } + if job.NumHWThreads > 0 { + hwthours = append(hwthours, schema.Float(float64(job.Duration)/60.0*float64(job.NumHWThreads))) + } else { + hwthours = append(hwthours, schema.Float(0.0)) + } } res := make([]*model.MetricFootprints, len(avgs)) @@ -129,8 +142,8 @@ func (r *queryResolver) jobsFootprints(ctx context.Context, filter []*model.JobF } return &model.Footprints{ - Nodehours: nodehours, - Metrics: res, + Timeweights: nodehours, + Metrics: res, }, nil } diff --git a/internal/metricdata/cc-metric-store.go b/internal/metricdata/cc-metric-store.go index 6b3153f..cfaa6fd 100644 --- a/internal/metricdata/cc-metric-store.go +++ b/internal/metricdata/cc-metric-store.go @@ -506,7 +506,7 @@ func (ccms *CCMetricStore) LoadStats( metrics []string, ctx context.Context) (map[string]map[string]schema.MetricStatistics, error) { - queries, _, err := ccms.buildQueries(job, metrics, []schema.MetricScope{schema.MetricScopeNode}) + queries, _, err := ccms.buildQueries(job, metrics, []schema.MetricScope{schema.MetricScopeNode}) // #166 Add scope shere for analysis view accelerator normalization? if err != nil { log.Warn("Error while building query") return nil, err diff --git a/internal/metricdata/metricdata.go b/internal/metricdata/metricdata.go index 08898bd..fc91e7d 100644 --- a/internal/metricdata/metricdata.go +++ b/internal/metricdata/metricdata.go @@ -182,7 +182,7 @@ func LoadAverages( ctx context.Context) error { if job.State != schema.JobStateRunning && useArchive { - return archive.LoadAveragesFromArchive(job, metrics, data) + return archive.LoadAveragesFromArchive(job, metrics, data) // #166 change also here } repo, ok := metricDataRepos[job.Cluster] @@ -190,7 +190,7 @@ func LoadAverages( return fmt.Errorf("METRICDATA/METRICDATA > no metric data repository configured for '%s'", job.Cluster) } - stats, err := repo.LoadStats(job, metrics, ctx) + stats, err := repo.LoadStats(job, metrics, ctx) // #166 how to handle stats for acc normalizazion? if err != nil { log.Errorf("Error while loading statistics for job %v (User %v, Project %v)", job.JobID, job.User, job.Project) return err diff --git a/web/frontend/src/Analysis.root.svelte b/web/frontend/src/Analysis.root.svelte index 2e6f5b5..2ecf9db 100644 --- a/web/frontend/src/Analysis.root.svelte +++ b/web/frontend/src/Analysis.root.svelte @@ -76,7 +76,7 @@ query: gql` query($jobFilters: [JobFilter!]!, $metrics: [String!]!) { footprints: jobsFootprints(filter: $jobFilters, metrics: $metrics) { - nodehours, + timeweights, metrics { metric, data } } }`, @@ -229,7 +229,7 @@ let:width renderFor="analysis" items={metricsInHistograms.map(metric => ({ metric, ...binsFromFootprint( - $footprintsQuery.data.footprints.nodehours, + $footprintsQuery.data.footprints.timeweights, $footprintsQuery.data.footprints.metrics.find(f => f.metric == metric).data, numBins) }))} itemsPerRow={ccconfig.plot_view_plotsPerRow}> @@ -271,7 +271,7 @@ (metricConfig(cluster.name, item.m1)?.unit?.base ? metricConfig(cluster.name, item.m1)?.unit?.base : '')}]`} yLabel={`${item.m2} [${(metricConfig(cluster.name, item.m2)?.unit?.prefix ? metricConfig(cluster.name, item.m2)?.unit?.prefix : '') + (metricConfig(cluster.name, item.m2)?.unit?.base ? metricConfig(cluster.name, item.m2)?.unit?.base : '')}]`} - X={item.f1} Y={item.f2} S={$footprintsQuery.data.footprints.nodehours} /> + X={item.f1} Y={item.f2} S={$footprintsQuery.data.footprints.timeweights} /> From 2655bda64416431b7ce05b36553d9685ab85f21b Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Mon, 24 Jul 2023 11:12:22 +0200 Subject: [PATCH 02/95] feat: enable uplot XY-Zoom for metrics - Disable jobView manual zoom --- web/frontend/src/Job.root.svelte | 4 ++-- web/frontend/src/plots/MetricPlot.svelte | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/web/frontend/src/Job.root.svelte b/web/frontend/src/Job.root.svelte index 2ec1ade..6f78196 100644 --- a/web/frontend/src/Job.root.svelte +++ b/web/frontend/src/Job.root.svelte @@ -279,9 +279,9 @@ {/if} - +
diff --git a/web/frontend/src/plots/MetricPlot.svelte b/web/frontend/src/plots/MetricPlot.svelte index c0440fd..6b45c70 100644 --- a/web/frontend/src/plots/MetricPlot.svelte +++ b/web/frontend/src/plots/MetricPlot.svelte @@ -177,7 +177,7 @@ x: { time: false }, y: maxY ? { range: [0., maxY * 1.1] } : {} }, - cursor: { show: false }, + cursor: { drag: { x: true, y: true } }, legend: { show: false, live: false } } From 742c2e399e9db818eb80f7b735014970f03e6e53 Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Wed, 26 Jul 2023 13:44:06 +0200 Subject: [PATCH 03/95] feat: Add uplot histogram, implemented in userview - For testing - add conversion function to utils --- web/frontend/src/User.root.svelte | 57 ++----- web/frontend/src/plots/Histogramuplot.svelte | 168 +++++++++++++++++++ web/frontend/src/plots/MetricPlot.svelte | 3 +- web/frontend/src/units.js | 12 +- web/frontend/src/utils.js | 10 ++ 5 files changed, 205 insertions(+), 45 deletions(-) create mode 100644 web/frontend/src/plots/Histogramuplot.svelte diff --git a/web/frontend/src/User.root.svelte b/web/frontend/src/User.root.svelte index 9c94eca..55aacc1 100644 --- a/web/frontend/src/User.root.svelte +++ b/web/frontend/src/User.root.svelte @@ -1,13 +1,13 @@ + +{#if data.length > 0} +
+
+
+{:else} + Cannot render histogram: No data! +{/if} + + diff --git a/web/frontend/src/plots/MetricPlot.svelte b/web/frontend/src/plots/MetricPlot.svelte index 6b45c70..a20b307 100644 --- a/web/frontend/src/plots/MetricPlot.svelte +++ b/web/frontend/src/plots/MetricPlot.svelte @@ -323,8 +323,9 @@ {#if series[0].data.length > 0}
{:else} - Cannot render plot: No series data returned for {metric} + Cannot render plot: No series data returned for {metric} {/if} + \ No newline at end of file From da8cefe15378ce7bb2dfe0505ab3b8fb90ed9ca3 Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Thu, 10 Aug 2023 18:05:16 +0200 Subject: [PATCH 20/95] feat: Change histogram to piechart in status view --- web/frontend/src/Status.root.svelte | 29 ++++++----- web/frontend/src/User.root.svelte | 2 +- web/frontend/src/plots/Pie.svelte | 78 +++++++++++++++++++++++++++++ 3 files changed, 95 insertions(+), 14 deletions(-) create mode 100644 web/frontend/src/plots/Pie.svelte diff --git a/web/frontend/src/Status.root.svelte b/web/frontend/src/Status.root.svelte index c979ac5..5d96995 100644 --- a/web/frontend/src/Status.root.svelte +++ b/web/frontend/src/Status.root.svelte @@ -1,7 +1,7 @@ + +
+ +
+ + From e80ce7a4742f4cfe19efb6170ade0d7f53b847ca Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Thu, 10 Aug 2023 18:06:19 +0200 Subject: [PATCH 21/95] feat: Rework analysis view top to contain piechart --- web/frontend/src/Analysis.root.svelte | 134 +++++++++++++++----------- 1 file changed, 78 insertions(+), 56 deletions(-) diff --git a/web/frontend/src/Analysis.root.svelte b/web/frontend/src/Analysis.root.svelte index 1cfadc9..ba04e05 100644 --- a/web/frontend/src/Analysis.root.svelte +++ b/web/frontend/src/Analysis.root.svelte @@ -6,7 +6,8 @@ import Filters from './filters/Filters.svelte' import PlotSelection from './PlotSelection.svelte' import Histogramuplot from './plots/Histogramuplot.svelte' - import Histogram, { binsFromFootprint } from './plots/Histogram.svelte' + import Pie from './plots/Pie.svelte' + import { binsFromFootprint } from './plots/Histogram.svelte' import ScatterPlot from './plots/Scatter.svelte' import PlotTable from './PlotTable.svelte' import Roofline from './plots/Roofline.svelte' @@ -30,7 +31,7 @@ let filterComponent; // see why here: https://stackoverflow.com/questions/58287729/how-can-i-export-a-function-from-a-svelte-component-that-changes-a-value-in-the let jobFilters = []; let rooflineMaxY; - let colWidth; + let colWidth1, colWidth2, colWidth3, colWidth4; let numBins = 50; let maxY = -1; const ccconfig = getContext('cc-config') @@ -135,82 +136,103 @@ {:else if $statsQuery.data} - -
-
- - - - - - - - - - - - - - - - - -
Total Jobs{$statsQuery.data.stats[0].totalJobs}
Short Jobs{$statsQuery.data.stats[0].shortJobs}
Total Walltime{$statsQuery.data.stats[0].totalWalltime}
Total Core Hours{$statsQuery.data.stats[0].totalCoreHours}
+ + + + + + + + + + + + + + + + + + + +
Total Jobs{$statsQuery.data.stats[0].totalJobs}
Short Jobs{$statsQuery.data.stats[0].shortJobs}
Total Walltime{$statsQuery.data.stats[0].totalWalltime}
Total Core Hours{$statsQuery.data.stats[0].totalCoreHours}
+ + +
+
Top Users
+ {#key $statsQuery.data.topUsers} + b.count - a.count).map((tu) => tu.count)} + entities={$statsQuery.data.topUsers.sort((a, b) => b.count - a.count).map((tu) => tu.name)} + /> + {/key}
-
- {#key $statsQuery.data.topUsers} -

Top Users (by node hours)

- b.count - a.count).map(({ count }, idx) => ({ count, value: idx }))} - label={(x) => x < $statsQuery.data.topUsers.length ? $statsQuery.data.topUsers[Math.floor(x)].name : 'No Users'} - ylabel="Node Hours [h]"/> + + + + + {#each $statsQuery.data.topUsers.sort((a, b) => b.count - a.count) as { name, count }} + + + + + {/each} +
User NameNode Hours
{name}{count}
+ + + + + {#if $rooflineQuery.fetching} + + {:else if $rooflineQuery.error} + {$rooflineQuery.error.message} + {:else if $rooflineQuery.data && cluster} +
+ {#key $rooflineQuery.data} + {/key} -
-
-
+
+ {/if} + + +
{#key $statsQuery.data.stats[0].histDuration} {/key} -
-
+
+ + +
{#key $statsQuery.data.stats[0].histNumNodes} {/key} -
-
- {#if $rooflineQuery.fetching} - - {:else if $rooflineQuery.error} - {$rooflineQuery.error.message} - {:else if $rooflineQuery.data && cluster} - {#key $rooflineQuery.data} - - {/key} - {/if} -
+
+ {/if} -
+
+ {#if $footprintsQuery.error} @@ -284,7 +306,7 @@ {/if} From e91cdf6b793a4217852c7385dd088f739f22838e Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Fri, 11 Aug 2023 09:15:43 +0200 Subject: [PATCH 22/95] Add dependencies --- web/frontend/package-lock.json | 217 ++++++++++++++++++--------------- web/frontend/package.json | 2 + 2 files changed, 124 insertions(+), 95 deletions(-) diff --git a/web/frontend/package-lock.json b/web/frontend/package-lock.json index b00380d..0d1e68d 100644 --- a/web/frontend/package-lock.json +++ b/web/frontend/package-lock.json @@ -11,7 +11,9 @@ "dependencies": { "@rollup/plugin-replace": "^5.0.2", "@urql/svelte": "^4.0.1", + "chart.js": "^4.3.3", "graphql": "^16.6.0", + "svelte-chartjs": "^3.1.2", "sveltestrap": "^5.10.0", "uplot": "^1.6.24", "wonka": "^6.3.2" @@ -27,9 +29,9 @@ } }, "node_modules/@0no-co/graphql.web": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@0no-co/graphql.web/-/graphql.web-1.0.1.tgz", - "integrity": "sha512-6Yaxyv6rOwRkLIvFaL0NrLDgfNqC/Ng9QOPmTmlqW4mORXMEKmh5NYGkIvvt5Yw8fZesnMAqkj8cIqTj8f40cQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@0no-co/graphql.web/-/graphql.web-1.0.4.tgz", + "integrity": "sha512-W3ezhHGfO0MS1PtGloaTpg0PbaT8aZSmmaerL7idtU5F7oCI+uu25k+MsMS31BVFlp4aMkHSrNRxiD72IlK8TA==", "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" }, @@ -40,9 +42,9 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "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, "dependencies": { "@jridgewell/set-array": "^1.0.1", @@ -54,9 +56,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "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, "engines": { "node": ">=6.0.0" @@ -72,9 +74,9 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "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, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", @@ -82,24 +84,29 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", - "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "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, "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@kurkle/color": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", + "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" + }, "node_modules/@popperjs/core": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.0.tgz", - "integrity": "sha512-zrsUxjLOKAzdewIDRWy9nsV1GQsKBCWaGwsZQlCgr6/q+vjyZhFgqedLfFBuI9anTPEUT4APq9Mu0SZBTzIcGQ==", + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -131,9 +138,9 @@ } }, "node_modules/@rollup/plugin-node-resolve": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.0.2.tgz", - "integrity": "sha512-Y35fRGUjC3FaurG722uhUuG8YHOJRJQbI6/CkbRkdPotSpDj9NtIN85z1zrcyDcCQIW4qp5mgG72U+gJ0TAFEg==", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.1.0.tgz", + "integrity": "sha512-xeZHCgsiZ9pzYVgAo9580eCGqwh/XCEUM9q6iQfGNocjgkufHAqC3exA+45URvhiYV8sBF9RlBai650eNs7AsA==", "dev": true, "dependencies": { "@rollup/pluginutils": "^5.0.1", @@ -176,14 +183,14 @@ } }, "node_modules/@rollup/plugin-terser": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.1.tgz", - "integrity": "sha512-aKS32sw5a7hy+fEXVy+5T95aDIwjpGHCTv833HXVtyKMDoVS7pBr5K3L9hEQoNqbJFjfANPrNpIXlTQ7is00eA==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.3.tgz", + "integrity": "sha512-EF0oejTMtkyhrkwCdg0HJ0IpkcaVg1MMSf2olHb2Jp+1mnLM04OhjpJWGma4HobiDTF0WCyViWuvadyE9ch2XA==", "dev": true, "dependencies": { - "serialize-javascript": "^6.0.0", - "smob": "^0.0.6", - "terser": "^5.15.1" + "serialize-javascript": "^6.0.1", + "smob": "^1.0.0", + "terser": "^5.17.4" }, "engines": { "node": ">=14.0.0" @@ -197,15 +204,6 @@ } } }, - "node_modules/@rollup/plugin-terser/node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, "node_modules/@rollup/pluginutils": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", @@ -239,30 +237,30 @@ "dev": true }, "node_modules/@urql/core": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@urql/core/-/core-4.0.7.tgz", - "integrity": "sha512-UtZ9oSbSFODXzFydgLCXpAQz26KGT1d6uEfcylKphiRWNXSWZi8k7vhJXNceNm/Dn0MiZ+kaaJHKcnGY1jvHRQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@urql/core/-/core-4.1.1.tgz", + "integrity": "sha512-iIoAy6BY+BUZZ7KIpnMT7C9q+ULf5ZCVxGe3/i7WZSJBrQa2h1QkIMhL+8fAKmOn9gt83jSIv5drWWnhZ9izEA==", "dependencies": { "@0no-co/graphql.web": "^1.0.1", "wonka": "^6.3.2" } }, "node_modules/@urql/svelte": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@urql/svelte/-/svelte-4.0.1.tgz", - "integrity": "sha512-WbsVjuK7IUNlJlvXAgevjQunoso0T+AngFlb0zafDvay6HN47Zc3CSVbAlP8KjETjERUMJLuiqknmPFFm2GEFQ==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@urql/svelte/-/svelte-4.0.4.tgz", + "integrity": "sha512-HYz9dHdqEcs9d82WWczQ3XG+zuup3TS01H+txaij/QfQ+KHjrlrn0EkOHQQd1S+H8+nFjFU2x9+HE3+3fuwL1A==", "dependencies": { - "@urql/core": "^4.0.0", + "@urql/core": "^4.1.0", "wonka": "^6.3.2" }, "peerDependencies": { - "svelte": "^3.0.0" + "svelte": "^3.0.0 || ^4.0.0" } }, "node_modules/acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -304,6 +302,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/chart.js": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.3.3.tgz", + "integrity": "sha512-aTk7pBw+x6sQYhon/NR3ikfUJuym/LdgpTlgZRe2PaEhjUMKBKyNaFCMVRAyTEWYFNO7qRu7iQVqOw/OqzxZxQ==", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=7" + } + }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -313,13 +322,13 @@ "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true }, "node_modules/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, "engines": { "node": ">=0.10.0" @@ -376,9 +385,9 @@ } }, "node_modules/graphql": { - "version": "16.6.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.6.0.tgz", - "integrity": "sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw==", + "version": "16.7.1", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.7.1.tgz", + "integrity": "sha512-DRYR9tf+UGU0KOsMcKAlXeFfX89UiiIZ0dRU3mR0yJfu6OjZqUcp68NnFLnqQU5RexygFoDy1EW+ccOYcPfmHg==", "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" } @@ -427,9 +436,9 @@ } }, "node_modules/is-core-module": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", - "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -441,7 +450,7 @@ "node_modules/is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", "dev": true }, "node_modules/is-reference": { @@ -512,12 +521,12 @@ } }, "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", "dev": true, "dependencies": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -538,9 +547,9 @@ } }, "node_modules/rollup": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.21.0.tgz", - "integrity": "sha512-ANPhVcyeHvYdQMUyCbczy33nbLzI7RzrBje4uvNiTDJGIMtlKoOStmympwr9OtS1LZxiDmE2wvxHyVhoLtf1KQ==", + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.0.tgz", + "integrity": "sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==", "devOptional": true, "bin": { "rollup": "dist/bin/rollup" @@ -569,9 +578,9 @@ } }, "node_modules/rollup-plugin-svelte": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/rollup-plugin-svelte/-/rollup-plugin-svelte-7.1.4.tgz", - "integrity": "sha512-Jm0FCydR7k8bBGe7wimXAes8x2zEK10Ew3f3lEZwYor/Zya3X0AZVeSAPRH7yiXB9hWQVzJu597EUeNwGDTdjQ==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/rollup-plugin-svelte/-/rollup-plugin-svelte-7.1.6.tgz", + "integrity": "sha512-nVFRBpGWI2qUY1OcSiEEA/kjCY2+vAjO9BI8SzA7NRrh2GTunLd6w2EYmnMt/atgdg8GvcNjLsmZmbQs/u4SQA==", "dev": true, "dependencies": { "@rollup/pluginutils": "^4.1.0", @@ -618,10 +627,19 @@ } ] }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, "node_modules/smob": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/smob/-/smob-0.0.6.tgz", - "integrity": "sha512-V21+XeNni+tTyiST1MHsa84AQhT1aFZipzPpOFAVB8DkHzwJyjjAmt9bgwnuZiZWnIbMo2duE29wybxv/7HWUw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/smob/-/smob-1.4.0.tgz", + "integrity": "sha512-MqR3fVulhjWuRNSMydnTlweu38UhQ0HXM4buStD/S3mc/BzX3CuM9OmhyQpmtYCvoYdl5ris6TI0ZqH355Ymqg==", "dev": true }, "node_modules/source-map": { @@ -656,32 +674,41 @@ } }, "node_modules/svelte": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.58.0.tgz", - "integrity": "sha512-brIBNNB76mXFmU/Kerm4wFnkskBbluBDCjx/8TcpYRb298Yh2dztS2kQ6bhtjMcvUhd5ynClfwpz5h2gnzdQ1A==", + "version": "3.59.2", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.59.2.tgz", + "integrity": "sha512-vzSyuGr3eEoAtT/A6bmajosJZIUWySzY2CzB3w2pgPvnkUjGqlDnsNnA0PMO+mMAhuyMul6C2uuZzY6ELSkzyA==", "engines": { "node": ">= 8" } }, + "node_modules/svelte-chartjs": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/svelte-chartjs/-/svelte-chartjs-3.1.2.tgz", + "integrity": "sha512-3+6gY2IJ9Ua8R9pk3iS1ypa7Z9OoXCJb9oPwIfTp7caJM+X+RrWnH2CTkGAq7FeSxc2nnmW08tYN88Q8Y+5M+w==", + "peerDependencies": { + "chart.js": "^3.5.0 || ^4.0.0", + "svelte": "^3.45.0" + } + }, "node_modules/sveltestrap": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/sveltestrap/-/sveltestrap-5.10.0.tgz", - "integrity": "sha512-k6Ob+6G2AMYvBidXHBKM9W28fJqFHbmosqCe/NC8pv6TV7K+v47Yw+zmnLWkjqCzzmjkSLkL48SrHZrlWc9mYQ==", + "version": "5.11.1", + "resolved": "https://registry.npmjs.org/sveltestrap/-/sveltestrap-5.11.1.tgz", + "integrity": "sha512-FIvPIEU1VolqMN1wi2XrC8aehWVbIJEST7zPfPbOUUfPimyx9giN4nA3We5wkXrBUaifXA8CSIwuHFvf3CmYQw==", "dependencies": { - "@popperjs/core": "^2.9.2" + "@popperjs/core": "^2.11.8" }, "peerDependencies": { - "svelte": "^3.29.0" + "svelte": "^3.53.1" } }, "node_modules/terser": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.1.tgz", - "integrity": "sha512-hVl35zClmpisy6oaoKALOpS0rDYLxRFLHhRuDlEGTKey9qHjS1w9GMORjuwIMt70Wan4lwsLYyWDVnWgF+KUEw==", + "version": "5.19.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", + "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", "dev": true, "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -693,14 +720,14 @@ } }, "node_modules/uplot": { - "version": "1.6.24", - "resolved": "https://registry.npmjs.org/uplot/-/uplot-1.6.24.tgz", - "integrity": "sha512-WpH2BsrFrqxkMu+4XBvc0eCDsRBhzoq9crttYeSI0bfxpzR5YoSVzZXOKFVWcVC7sp/aDXrdDPbDZGCtck2PVg==" + "version": "1.6.25", + "resolved": "https://registry.npmjs.org/uplot/-/uplot-1.6.25.tgz", + "integrity": "sha512-eWLAhEaGtIcVBiS67mC2UC0yV+G6eYLS2rU67N4F2JVWjt7uBMg4xKXUYGW0dEz9G+m7fNatjCVXHts4gjyuMQ==" }, "node_modules/wonka": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.3.2.tgz", - "integrity": "sha512-2xXbQ1LnwNS7egVm1HPhW2FyKrekolzhpM3mCwXdQr55gO+tAiY76rhb32OL9kKsW8taj++iP7C6hxlVzbnvrw==" + "version": "6.3.4", + "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.3.4.tgz", + "integrity": "sha512-CjpbqNtBGNAeyNS/9W6q3kSkKE52+FjIj7AkFlLr11s/VWGUu6a2CdYSdGxocIhIVjaW/zchesBQUKPVU69Cqg==" }, "node_modules/wrappy": { "version": "1.0.2", diff --git a/web/frontend/package.json b/web/frontend/package.json index 0b8baaa..4ef7314 100644 --- a/web/frontend/package.json +++ b/web/frontend/package.json @@ -18,7 +18,9 @@ "dependencies": { "@rollup/plugin-replace": "^5.0.2", "@urql/svelte": "^4.0.1", + "chart.js": "^4.3.3", "graphql": "^16.6.0", + "svelte-chartjs": "^3.1.2", "sveltestrap": "^5.10.0", "uplot": "^1.6.24", "wonka": "^6.3.2" From 32420fb5313778cd40f14a4100c7bbd6d6013fac Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Fri, 11 Aug 2023 09:41:39 +0200 Subject: [PATCH 23/95] Add pie color legend to Top-Tables --- web/frontend/src/Analysis.root.svelte | 9 ++++--- web/frontend/src/Status.root.svelte | 24 ++++++++++++++---- web/frontend/src/plots/Pie.svelte | 36 +++++++++++++-------------- 3 files changed, 42 insertions(+), 27 deletions(-) diff --git a/web/frontend/src/Analysis.root.svelte b/web/frontend/src/Analysis.root.svelte index ba04e05..e7fe720 100644 --- a/web/frontend/src/Analysis.root.svelte +++ b/web/frontend/src/Analysis.root.svelte @@ -2,11 +2,11 @@ import { init, convert2uplot } from './utils.js' import { getContext, onMount } from 'svelte' import { queryStore, gql, getContextClient } from '@urql/svelte' - import { Row, Col, Spinner, Card, Table } from 'sveltestrap' + import { Row, Col, Spinner, Card, Table, Icon } from 'sveltestrap' import Filters from './filters/Filters.svelte' import PlotSelection from './PlotSelection.svelte' import Histogramuplot from './plots/Histogramuplot.svelte' - import Pie from './plots/Pie.svelte' + import Pie, { colors } from './plots/Pie.svelte' import { binsFromFootprint } from './plots/Histogram.svelte' import ScatterPlot from './plots/Scatter.svelte' import PlotTable from './PlotTable.svelte' @@ -172,9 +172,10 @@ - - {#each $statsQuery.data.topUsers.sort((a, b) => b.count - a.count) as { name, count }} + + {#each $statsQuery.data.topUsers.sort((a, b) => b.count - a.count) as { name, count }, i} + diff --git a/web/frontend/src/Status.root.svelte b/web/frontend/src/Status.root.svelte index 5d96995..11aa255 100644 --- a/web/frontend/src/Status.root.svelte +++ b/web/frontend/src/Status.root.svelte @@ -1,7 +1,7 @@ From 05b43c0f21c87b746fc0ca155d36cc3460440a5b Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Fri, 11 Aug 2023 13:34:30 +0200 Subject: [PATCH 27/95] Cleanup and fixes on new plots --- web/frontend/src/Analysis.root.svelte | 11 +- web/frontend/src/Status.root.svelte | 6 +- web/frontend/src/User.root.svelte | 6 +- web/frontend/src/plots/Histogram.svelte | 361 +++++++++---------- web/frontend/src/plots/Histogramuplot.svelte | 216 ----------- web/frontend/src/plots/Pie.svelte | 2 + web/frontend/src/utils.js | 43 +++ 7 files changed, 231 insertions(+), 414 deletions(-) delete mode 100644 web/frontend/src/plots/Histogramuplot.svelte diff --git a/web/frontend/src/Analysis.root.svelte b/web/frontend/src/Analysis.root.svelte index e7fe720..63751b4 100644 --- a/web/frontend/src/Analysis.root.svelte +++ b/web/frontend/src/Analysis.root.svelte @@ -5,9 +5,9 @@ import { Row, Col, Spinner, Card, Table, Icon } from 'sveltestrap' import Filters from './filters/Filters.svelte' import PlotSelection from './PlotSelection.svelte' - import Histogramuplot from './plots/Histogramuplot.svelte' + import Histogram from './plots/Histogram.svelte' import Pie, { colors } from './plots/Pie.svelte' - import { binsFromFootprint } from './plots/Histogram.svelte' + import { binsFromFootprint } from './utils.js' import ScatterPlot from './plots/Scatter.svelte' import PlotTable from './PlotTable.svelte' import Roofline from './plots/Roofline.svelte' @@ -204,7 +204,7 @@
{#key $statsQuery.data.stats[0].histDuration} -
{#key $statsQuery.data.stats[0].histNumNodes} - f.metric == metric).data, numBins) }))} itemsPerRow={ccconfig.plot_view_plotsPerRow}> - ({ m1, f1: $footprintsQuery.data.footprints.metrics.find(f => f.metric == m1).data, m2, f2: $footprintsQuery.data.footprints.metrics.find(f => f.metric == m2).data }))} diff --git a/web/frontend/src/Status.root.svelte b/web/frontend/src/Status.root.svelte index d402c08..244862c 100644 --- a/web/frontend/src/Status.root.svelte +++ b/web/frontend/src/Status.root.svelte @@ -2,7 +2,7 @@ import Refresher from './joblist/Refresher.svelte' import Roofline, { transformPerNodeData } from './plots/Roofline.svelte' import Pie, { colors } from './plots/Pie.svelte' - import Histogramuplot from './plots/Histogramuplot.svelte' + import Histogram from './plots/Histogram.svelte' import { Row, Col, Spinner, Card, CardHeader, CardTitle, CardBody, Table, Progress, Icon } from 'sveltestrap' import { init, convert2uplot } from './utils.js' import { scaleNumbers } from './units.js' @@ -213,7 +213,7 @@
{#key $mainQuery.data.stats} -
{#key $mainQuery.data.stats} -
{#key $stats.data.jobsStatistics[0].histDuration} -
{#key $stats.data.jobsStatistics[0].histNumNodes} - String - - data: [{ value: Number, count: Number }] + - Todo --> -
(infoText = '')}> - {infoText} - -
- - +{#if data.length > 0} +
+{:else} + Cannot render histogram: No data! +{/if} - diff --git a/web/frontend/src/plots/Histogramuplot.svelte b/web/frontend/src/plots/Histogramuplot.svelte deleted file mode 100644 index d3e1aaa..0000000 --- a/web/frontend/src/plots/Histogramuplot.svelte +++ /dev/null @@ -1,216 +0,0 @@ - - - - -{#if data.length > 0} -
-{:else} - Cannot render histogram: No data! -{/if} - - diff --git a/web/frontend/src/plots/Pie.svelte b/web/frontend/src/plots/Pie.svelte index 0db451f..6355f09 100644 --- a/web/frontend/src/plots/Pie.svelte +++ b/web/frontend/src/plots/Pie.svelte @@ -23,6 +23,7 @@ Title, Tooltip, Legend, + Filler, ArcElement, CategoryScale } from 'chart.js'; @@ -31,6 +32,7 @@ Title, Tooltip, Legend, + Filler, ArcElement, CategoryScale ); diff --git a/web/frontend/src/utils.js b/web/frontend/src/utils.js index 37b9426..f68fec4 100644 --- a/web/frontend/src/utils.js +++ b/web/frontend/src/utils.js @@ -6,6 +6,7 @@ import { } from "@urql/svelte"; import { setContext, getContext, hasContext, onDestroy, tick } from "svelte"; import { readable } from "svelte/store"; +import { formatNumber } from './units.js' /* * Call this function only at component initialization time! @@ -323,3 +324,45 @@ export function convert2uplot(canvasData) { }) return uplotData } + +export function binsFromFootprint(weights, values, numBins) { + let min = 0, max = 0 + if (values.length != 0) { + for (let x of values) { + min = Math.min(min, x) + max = Math.max(max, x) + } + max += 1 // So that we have an exclusive range. + } + + if (numBins == null || numBins < 3) + numBins = 3 + + const bins = new Array(numBins).fill(0) + for (let i = 0; i < values.length; i++) + bins[Math.floor(((values[i] - min) / (max - min)) * numBins)] += weights ? weights[i] : 1 + + // return { + // label: idx => { + // let start = min + (idx / numBins) * (max - min) + // let stop = min + ((idx + 1) / numBins) * (max - min) + // return `${formatNumber(start)} - ${formatNumber(stop)}` + // }, + // bins: bins.map((count, idx) => ({ value: idx, count: count })), + // min: min, + // max: max + // } + + return { + bins: bins.map((count, idx) => ({ + value: idx => { // Get rounded down next integer to bins' Start-Stop Mean Value + let start = min + (idx / numBins) * (max - min) + let stop = min + ((idx + 1) / numBins) * (max - min) + return `${formatNumber(Math.floor((start+stop)/2))}` + }, + count: count + })), + min: min, + max: max + } +} From 19d645f65cdda318724800c4af205cbec02ba279 Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Sat, 12 Aug 2023 09:02:41 +0200 Subject: [PATCH 28/95] Readd URL token and cleanup Fix session values. --- docs/JWT-Handling.md | 44 ++++++++++++++++++-------- internal/auth/auth.go | 51 ++++++++++++++++++------------- internal/auth/jwt.go | 14 +++++++-- internal/auth/jwtCookieSession.go | 18 ----------- internal/auth/jwtSession.go | 6 +++- internal/auth/local.go | 3 +- pkg/schema/config.go | 6 ++-- 7 files changed, 83 insertions(+), 59 deletions(-) diff --git a/docs/JWT-Handling.md b/docs/JWT-Handling.md index 8b03246..d3a6335 100644 --- a/docs/JWT-Handling.md +++ b/docs/JWT-Handling.md @@ -1,11 +1,13 @@ ## Introduction -ClusterCockpit uses JSON Web Tokens (JWT) for authorization of its APIs. -JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contained way for securely transmitting information between parties as a JSON object. -This information can be verified and trusted because it is digitally signed. -In ClusterCockpit JWTs are signed using a public/private key pair using ECDSA. -Because tokens are signed using public/private key pairs, the signature also certifies that only the party holding the private key is the one that signed it. -Currently JWT tokens in ClusterCockpit not yet expire. +ClusterCockpit uses JSON Web Tokens (JWT) for authorization of its APIs. JSON +Web Token (JWT) is an open standard (RFC 7519) that defines a compact and +self-contained way for securely transmitting information between parties as a +JSON object. This information can be verified and trusted because it is +digitally signed. In ClusterCockpit JWTs are signed using a public/private key +pair using ECDSA. Because tokens are signed using public/private key pairs, the +signature also certifies that only the party holding the private key is the one +that signed it. Token expiration is set to the configuration option MaxAge. ## JWT Payload @@ -25,8 +27,15 @@ $ ./gen-keypair 2. Add keypair in your `.env` file. A template can be found in `./configs`. There are two usage scenarios: -* The APIs are used during a browser session. In this case on login a JWT token is issued on login, that is used by the web frontend to authorize against the GraphQL and REST APIs. -* The REST API is used outside a browser session, e.g. by scripts. In this case you have to issue a token manually. This possible from within the configuration view or on the command line. It is recommended to issue a JWT token in this case for a special user that only has the `api` role. By using different users for different purposes a fine grained access control and access revocation management is possible. +* The APIs are used during a browser session. In this case on login a JWT token + is issued on login, that is used by the web frontend to authorize against the + GraphQL and REST APIs. +* The REST API is used outside a browser session, e.g. by scripts. In this case + you have to issue a token manually. This possible from within the + configuration view or on the command line. It is recommended to issue a JWT + token in this case for a special user that only has the `api` role. By using + different users for different purposes a fine grained access control and + access revocation management is possible. The token is commonly specified in the Authorization HTTP header using the Bearer schema. @@ -46,16 +55,24 @@ $ curl -X GET "" -H "accept: application/json" -H "Content-Type: ``` ## Accept externally generated JWTs provided via cookie -If there is an external service like an AuthAPI that can generate JWTs and hand them over to ClusterCockpit via cookies, CC can be configured to accept them: +If there is an external service like an AuthAPI that can generate JWTs and hand +them over to ClusterCockpit via cookies, CC can be configured to accept them: -1. `.env`: CC needs a public ed25519 key to verify foreign JWT signatures. Public keys in PEM format can be converted with the instructions in [/tools/convert-pem-pubkey-for-cc](../tools/convert-pem-pubkey-for-cc/Readme.md) . +1. `.env`: CC needs a public ed25519 key to verify foreign JWT signatures. + Public keys in PEM format can be converted with the instructions in + [/tools/convert-pem-pubkey-for-cc](../tools/convert-pem-pubkey-for-cc/Readme.md) + . ``` CROSS_LOGIN_JWT_PUBLIC_KEY="+51iXX8BdLFocrppRxIw52xCOf8xFSH/eNilN5IHVGc=" ``` -2. `config.json`: Insert a name for the cookie (set by the external service) containing the JWT so that CC knows where to look at. Define a trusted issuer (JWT claim 'iss'), otherwise it will be rejected. -If you want usernames and user roles from JWTs ('sub' and 'roles' claim) to be validated against CC's internal database, you need to enable it here. Unknown users will then be rejected and roles set via JWT will be ignored. +2. `config.json`: Insert a name for the cookie (set by the external service) + containing the JWT so that CC knows where to look at. Define a trusted issuer + (JWT claim 'iss'), otherwise it will be rejected. If you want usernames and + user roles from JWTs ('sub' and 'roles' claim) to be validated against CC's + internal database, you need to enable it here. Unknown users will then be + rejected and roles set via JWT will be ignored. ```json "jwts": { @@ -65,7 +82,8 @@ If you want usernames and user roles from JWTs ('sub' and 'roles' claim) to be v } ``` -3. Make sure your external service includes the same issuer (`iss`) in its JWTs. Example JWT payload: +3. Make sure your external service includes the same issuer (`iss`) in its JWTs. + Example JWT payload: ```json { diff --git a/internal/auth/auth.go b/internal/auth/auth.go index 8c1dca7..3d40500 100644 --- a/internal/auth/auth.go +++ b/internal/auth/auth.go @@ -97,26 +97,29 @@ func (auth *Authentication) AuthViaSession( if session.IsNew { return nil, nil } - - var username string - var projects, roles []string - - if val, ok := session.Values["username"]; ok { - username, _ = val.(string) - } else { - return nil, errors.New("No key username in session") - } - if val, ok := session.Values["projects"]; ok { - projects, _ = val.([]string) - } else { - return nil, errors.New("No key projects in session") - } - if val, ok := session.Values["projects"]; ok { - roles, _ = val.([]string) - } else { - return nil, errors.New("No key roles in session") - } - + // + // var username string + // var projects, roles []string + // + // if val, ok := session.Values["username"]; ok { + // username, _ = val.(string) + // } else { + // return nil, errors.New("no key username in session") + // } + // if val, ok := session.Values["projects"]; ok { + // projects, _ = val.([]string) + // } else { + // return nil, errors.New("no key projects in session") + // } + // if val, ok := session.Values["projects"]; ok { + // roles, _ = val.([]string) + // } else { + // return nil, errors.New("no key roles in session") + // } + // + username, _ := session.Values["username"].(string) + projects, _ := session.Values["projects"].([]string) + roles, _ := session.Values["roles"].([]string) return &User{ Username: username, Projects: projects, @@ -261,6 +264,12 @@ func (auth *Authentication) Auth( return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { user, err := auth.JwtAuth.AuthViaJWT(rw, r) + if err != nil { + log.Infof("authentication failed: %s", err.Error()) + http.Error(rw, err.Error(), http.StatusUnauthorized) + return + } + if user == nil { user, err = auth.AuthViaSession(rw, r) if err != nil { @@ -276,7 +285,7 @@ func (auth *Authentication) Auth( return } - log.Debug("authentication failed: no authenticator applied") + log.Debug("authentication failed") onfailure(rw, r, errors.New("unauthorized (please login first)")) }) } diff --git a/internal/auth/jwt.go b/internal/auth/jwt.go index 75a69b8..0ac446e 100644 --- a/internal/auth/jwt.go +++ b/internal/auth/jwt.go @@ -62,6 +62,11 @@ func (ja *JWTAuthenticator) AuthViaJWT( rawtoken = strings.TrimPrefix(rawtoken, "Bearer ") } + // there is no token + if rawtoken == "" { + return nil, nil + } + token, err := jwt.Parse(rawtoken, func(t *jwt.Token) (interface{}, error) { if t.Method != jwt.SigningMethodEdDSA { return nil, errors.New("only Ed25519/EdDSA supported") @@ -81,6 +86,11 @@ func (ja *JWTAuthenticator) AuthViaJWT( // Token is valid, extract payload claims := token.Claims.(jwt.MapClaims) sub, _ := claims["sub"].(string) + exp, _ := claims["exp"].(float64) + + if exp < float64(time.Now().Unix()) { + return nil, errors.New("token is expired") + } var roles []string @@ -109,8 +119,8 @@ func (ja *JWTAuthenticator) AuthViaJWT( return &User{ Username: sub, Roles: roles, - AuthType: AuthSession, - AuthSource: AuthViaToken, + AuthType: AuthToken, + AuthSource: -1, }, nil } diff --git a/internal/auth/jwtCookieSession.go b/internal/auth/jwtCookieSession.go index 1ae3a5b..af7fb64 100644 --- a/internal/auth/jwtCookieSession.go +++ b/internal/auth/jwtCookieSession.go @@ -24,8 +24,6 @@ type JWTCookieSessionAuthenticator struct { privateKey ed25519.PrivateKey publicKeyCrossLogin ed25519.PublicKey // For accepting externally generated JWTs - loginTokenKey []byte // HS256 key - config *schema.JWTAuthConfig } @@ -55,15 +53,6 @@ func (ja *JWTCookieSessionAuthenticator) Init(auth *Authentication, conf interfa ja.privateKey = ed25519.PrivateKey(bytes) } - if pubKey = os.Getenv("CROSS_LOGIN_JWT_HS512_KEY"); pubKey != "" { - bytes, err := base64.StdEncoding.DecodeString(pubKey) - if err != nil { - log.Warn("Could not decode cross login JWT HS512 key") - return err - } - ja.loginTokenKey = bytes - } - // Look for external public keys pubKeyCrossLogin, keyFound := os.LookupEnv("CROSS_LOGIN_JWT_PUBLIC_KEY") if keyFound && pubKeyCrossLogin != "" { @@ -105,13 +94,6 @@ func (ja *JWTCookieSessionAuthenticator) CanLogin( rw http.ResponseWriter, r *http.Request) bool { - if ja.publicKeyCrossLogin == nil || - ja.config == nil || - ja.config.TrustedExternalIssuer == "" { - - return false - } - cookieName := "" if ja.config != nil && ja.config.CookieName != "" { cookieName = ja.config.CookieName diff --git a/internal/auth/jwtSession.go b/internal/auth/jwtSession.go index 7c4f6f0..7ee45e7 100644 --- a/internal/auth/jwtSession.go +++ b/internal/auth/jwtSession.go @@ -45,7 +45,7 @@ func (ja *JWTSessionAuthenticator) CanLogin( rw http.ResponseWriter, r *http.Request) bool { - return r.Header.Get("Authorization") != "" + return r.Header.Get("Authorization") != "" || r.URL.Query().Get("login-token") != "" } func (ja *JWTSessionAuthenticator) Login( @@ -54,6 +54,10 @@ func (ja *JWTSessionAuthenticator) Login( r *http.Request) (*User, error) { rawtoken := strings.TrimPrefix(r.Header.Get("Authorization"), "Bearer ") + if rawtoken == "" { + rawtoken = r.URL.Query().Get("login-token") + } + token, err := jwt.Parse(rawtoken, func(t *jwt.Token) (interface{}, error) { if t.Method == jwt.SigningMethodHS256 || t.Method == jwt.SigningMethodHS512 { return ja.loginTokenKey, nil diff --git a/internal/auth/local.go b/internal/auth/local.go index 8854aff..dd41a25 100644 --- a/internal/auth/local.go +++ b/internal/auth/local.go @@ -39,7 +39,8 @@ func (la *LocalAuthenticator) Login( rw http.ResponseWriter, r *http.Request) (*User, error) { - if e := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(r.FormValue("password"))); e != nil { + if e := bcrypt.CompareHashAndPassword([]byte(user.Password), + []byte(r.FormValue("password"))); e != nil { log.Errorf("AUTH/LOCAL > Authentication for user %s failed!", user.Username) return nil, fmt.Errorf("AUTH/LOCAL > Authentication failed") } diff --git a/pkg/schema/config.go b/pkg/schema/config.go index 9a88ea2..190ee03 100644 --- a/pkg/schema/config.go +++ b/pkg/schema/config.go @@ -20,7 +20,7 @@ type LdapConfig struct { } type JWTAuthConfig struct { - // Specifies for how long a session or JWT shall be valid + // Specifies for how long a JWT token shall be valid // as a string parsable by time.ParseDuration(). MaxAge int64 `json:"max-age"` @@ -102,7 +102,7 @@ type ProgramConfig struct { LdapConfig *LdapConfig `json:"ldap"` JwtConfig *JWTAuthConfig `json:"jwts"` - // If 0 or empty, the session/token does not expire! + // If 0 or empty, the session does not expire! SessionMaxAge string `json:"session-max-age"` // If both those options are not empty, use HTTPS using those certificates. @@ -113,7 +113,7 @@ type ProgramConfig struct { // redirect every request incoming at port 80 to that url. RedirectHttpTo string `json:"redirect-http-to"` - // If overwriten, at least all the options in the defaults below must + // If overwritten, at least all the options in the defaults below must // be provided! Most options here can be overwritten by the user. UiDefaults map[string]interface{} `json:"ui-defaults"` From 9e3ba41746b91365e94ff9205625e350c74ceab8 Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Sat, 12 Aug 2023 09:30:33 +0200 Subject: [PATCH 29/95] Correct jwt docs --- docs/JWT-Handling.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/JWT-Handling.md b/docs/JWT-Handling.md index d3a6335..8b8d000 100644 --- a/docs/JWT-Handling.md +++ b/docs/JWT-Handling.md @@ -27,9 +27,8 @@ $ ./gen-keypair 2. Add keypair in your `.env` file. A template can be found in `./configs`. There are two usage scenarios: -* The APIs are used during a browser session. In this case on login a JWT token - is issued on login, that is used by the web frontend to authorize against the - GraphQL and REST APIs. +* The APIs are used during a browser session. API accesses are authorized with + the active session. * The REST API is used outside a browser session, e.g. by scripts. In this case you have to issue a token manually. This possible from within the configuration view or on the command line. It is recommended to issue a JWT From 4a2afc7a5a7ad0ac165125396fc5c4d9a661d634 Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Mon, 14 Aug 2023 12:40:21 +0200 Subject: [PATCH 30/95] Add LDAPSyncOnLogin option Cleanup Extend docs Remove obsolete Expiration attribute --- docs/dev-authentication.md | 69 ++++++++++++++----------------- internal/auth/auth.go | 5 +-- internal/auth/jwt.go | 5 --- internal/auth/jwtCookieSession.go | 6 +-- internal/auth/jwtSession.go | 4 +- internal/auth/ldap.go | 49 ++++++++++++++++++++-- internal/auth/local.go | 1 + pkg/schema/config.go | 1 + 8 files changed, 84 insertions(+), 56 deletions(-) diff --git a/docs/dev-authentication.md b/docs/dev-authentication.md index d40bdb0..9b84c4b 100644 --- a/docs/dev-authentication.md +++ b/docs/dev-authentication.md @@ -124,42 +124,8 @@ It is first checked if the required configuration keys are set: ``` The Login function: - -# Auth - -The Auth function (located in `auth.go`): -* Returns a new http handler function that is defined right away -* This handler iterates over all authenticators -* Calls `Auth()` on every authenticator -* If err is not nil and the user object is valid it puts the user object in the - request context and starts the onSuccess http handler -* Otherwise it calls the onFailure handler - -## Local - -Calls the `AuthViaSession()` function in `auth.go`. This will extract username, -projects and roles from the session and initialize a user object with those -values. - -## LDAP - -Calls the `AuthViaSession()` function in `auth.go`. This will extract username, -projects and roles from the session and initialize a user object with those -values. - -# JWT - -Check for JWT token: -* Is token passed in the `X-Auth-Token` or `Authorization` header -* If no token is found in a header it tries to read the token from a configured -cookie. - -Finally it calls AuthViaSession in `auth.go` if a valid session exists. This is -true if a JWT token was previously used to initiate a session. In this case the -user object initialized with the session is returned right away. - -In case a token was found extract and parse the token: -* Check if signing method is Ed25519/EdDSA +* Extracts and parses the token +* Checks if signing method is Ed25519/EdDSA * In case publicKeyCrossLogin is configured: - Check if `iss` issuer claim matched trusted issuer from configuration - Return public cross login key @@ -167,7 +133,34 @@ In case a token was found extract and parse the token: * Check if claims are valid * Depending on the option `ForceJWTValidationViaDatabase ` the roles are extracted from JWT token or taken from user object fetched from database -* In case the token was extracted from cookie create a new session and ask the - browser to delete the JWT cookie +* Ask browser to delete the JWT cookie * Return valid user object +# Auth + +The Auth function (located in `auth.go`): +* Returns a new http handler function that is defined right away +* This handler tries two methods to authenticate a user: + - Via a JWT API token in `AuthViaJWT()` + - Via a valid session in `AuthViaSession()` +* If err is not nil and the user object is valid it puts the user object in the + request context and starts the onSuccess http handler +* Otherwise it calls the onFailure handler + +## AuthViaJWT + +Implemented in JWTAuthenticator: +* Extract token either from header `X-Auth-Token` or `Authorization` with Bearer + prefix +* Parse token and check if it is valid. The Parse routine will also check if the + token is expired. +* If the option `ForceJWTValidationViaDatabase` is set it will ensure the + user object exists in the database and takes the roles from the database user +* Otherwise the roles are extracted from the roles claim +* Returns a valid user object with AuthType set to AuthToken + +## AuthViaSession + +* Extracts session +* Get values username, projects, and roles from session +* Returns a valid user object with AuthType set to AuthSession diff --git a/internal/auth/auth.go b/internal/auth/auth.go index 3d40500..8149bc1 100644 --- a/internal/auth/auth.go +++ b/internal/auth/auth.go @@ -43,7 +43,6 @@ type User struct { AuthSource AuthSource `json:"authSource"` Email string `json:"email"` Projects []string `json:"projects"` - Expiration time.Time } func (u *User) HasProject(project string) bool { @@ -66,7 +65,7 @@ func GetUser(ctx context.Context) *User { type Authenticator interface { Init(auth *Authentication, config interface{}) error - CanLogin(user *User, rw http.ResponseWriter, r *http.Request) bool + CanLogin(user *User, username string, rw http.ResponseWriter, r *http.Request) bool Login(user *User, rw http.ResponseWriter, r *http.Request) (*User, error) } @@ -208,7 +207,7 @@ func (auth *Authentication) Login( } for _, authenticator := range auth.authenticators { - if !authenticator.CanLogin(dbUser, rw, r) { + if !authenticator.CanLogin(dbUser, username, rw, r) { continue } diff --git a/internal/auth/jwt.go b/internal/auth/jwt.go index 0ac446e..6a77fc4 100644 --- a/internal/auth/jwt.go +++ b/internal/auth/jwt.go @@ -86,11 +86,6 @@ func (ja *JWTAuthenticator) AuthViaJWT( // Token is valid, extract payload claims := token.Claims.(jwt.MapClaims) sub, _ := claims["sub"].(string) - exp, _ := claims["exp"].(float64) - - if exp < float64(time.Now().Unix()) { - return nil, errors.New("token is expired") - } var roles []string diff --git a/internal/auth/jwtCookieSession.go b/internal/auth/jwtCookieSession.go index af7fb64..8f31335 100644 --- a/internal/auth/jwtCookieSession.go +++ b/internal/auth/jwtCookieSession.go @@ -10,7 +10,6 @@ import ( "errors" "net/http" "os" - "time" "github.com/ClusterCockpit/cc-backend/pkg/log" "github.com/ClusterCockpit/cc-backend/pkg/schema" @@ -91,6 +90,7 @@ func (ja *JWTCookieSessionAuthenticator) Init(auth *Authentication, conf interfa func (ja *JWTCookieSessionAuthenticator) CanLogin( user *User, + username string, rw http.ResponseWriter, r *http.Request) bool { @@ -140,7 +140,7 @@ func (ja *JWTCookieSessionAuthenticator) Login( return ja.publicKey, nil }) if err != nil { - log.Warn("Error while parsing token") + log.Warn("error while parsing token") return nil, err } @@ -152,7 +152,6 @@ func (ja *JWTCookieSessionAuthenticator) Login( claims := token.Claims.(jwt.MapClaims) sub, _ := claims["sub"].(string) - exp, _ := claims["exp"].(float64) var name string if val, ok := claims["name"]; ok { @@ -201,6 +200,5 @@ func (ja *JWTCookieSessionAuthenticator) Login( } } - user.Expiration = time.Unix(int64(exp), 0) return user, nil } diff --git a/internal/auth/jwtSession.go b/internal/auth/jwtSession.go index 7ee45e7..e0f2f8b 100644 --- a/internal/auth/jwtSession.go +++ b/internal/auth/jwtSession.go @@ -10,7 +10,6 @@ import ( "net/http" "os" "strings" - "time" "github.com/ClusterCockpit/cc-backend/pkg/log" "github.com/golang-jwt/jwt/v4" @@ -42,6 +41,7 @@ func (ja *JWTSessionAuthenticator) Init(auth *Authentication, conf interface{}) func (ja *JWTSessionAuthenticator) CanLogin( user *User, + username string, rw http.ResponseWriter, r *http.Request) bool { @@ -76,7 +76,6 @@ func (ja *JWTSessionAuthenticator) Login( claims := token.Claims.(jwt.MapClaims) sub, _ := claims["sub"].(string) - exp, _ := claims["exp"].(float64) var name string if val, ok := claims["name"]; ok { @@ -102,6 +101,5 @@ func (ja *JWTSessionAuthenticator) Login( } } - user.Expiration = time.Unix(int64(exp), 0) return user, nil } diff --git a/internal/auth/ldap.go b/internal/auth/ldap.go index fc9753d..17b5c0c 100644 --- a/internal/auth/ldap.go +++ b/internal/auth/ldap.go @@ -66,10 +66,51 @@ func (la *LdapAuthenticator) Init( func (la *LdapAuthenticator) CanLogin( user *User, + username string, rw http.ResponseWriter, r *http.Request) bool { - return user != nil && user.AuthSource == AuthViaLDAP + if user != nil && user.AuthSource == AuthViaLDAP { + return true + } else { + if la.config.SyncUserOnLogin { + l, err := la.getLdapConnection(true) + if err != nil { + log.Error("LDAP connection error") + } + + // Search for the given username + searchRequest := ldap.NewSearchRequest( + la.config.UserBase, + ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false, + fmt.Sprintf("(%s(uid=%s))", la.config.UserFilter, username), + []string{"dn", "uid", "gecos"}, nil) + + sr, err := l.Search(searchRequest) + if err != nil { + log.Warn(err) + return false + } + + if len(sr.Entries) != 1 { + log.Warn("User does not exist or too many entries returned") + return false + } + + entry := sr.Entries[0] + name := entry.GetAttributeValue("gecos") + + if _, err := la.auth.db.Exec(`INSERT INTO user (username, ldap, name, roles) VALUES (?, ?, ?, ?)`, + username, 1, name, "[\""+GetRoleString(RoleUser)+"\"]"); err != nil { + log.Errorf("User '%s' new in LDAP: Insert into DB failed", username) + return false + } + + return true + } + } + + return false } func (la *LdapAuthenticator) Login( @@ -124,8 +165,10 @@ func (la *LdapAuthenticator) Sync() error { defer l.Close() ldapResults, err := l.Search(ldap.NewSearchRequest( - la.config.UserBase, ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false, - la.config.UserFilter, []string{"dn", "uid", "gecos"}, nil)) + la.config.UserBase, + ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false, + fmt.Sprintf("(%s(uid=%s))", la.config.UserFilter, "*"), + []string{"dn", "uid", "gecos"}, nil)) if err != nil { log.Warn("LDAP search error") return err diff --git a/internal/auth/local.go b/internal/auth/local.go index dd41a25..700db3a 100644 --- a/internal/auth/local.go +++ b/internal/auth/local.go @@ -28,6 +28,7 @@ func (la *LocalAuthenticator) Init( func (la *LocalAuthenticator) CanLogin( user *User, + username string, rw http.ResponseWriter, r *http.Request) bool { diff --git a/pkg/schema/config.go b/pkg/schema/config.go index 190ee03..2a4047c 100644 --- a/pkg/schema/config.go +++ b/pkg/schema/config.go @@ -17,6 +17,7 @@ type LdapConfig struct { UserFilter string `json:"user_filter"` SyncInterval string `json:"sync_interval"` // Parsed using time.ParseDuration. SyncDelOldUsers bool `json:"sync_del_old_users"` + SyncUserOnLogin bool `json:"syncUserOnLogin"` } type JWTAuthConfig struct { From e69f2c425333289d8f34e5aebc845ae20e33cb5f Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Mon, 14 Aug 2023 13:35:32 +0200 Subject: [PATCH 31/95] Update Release notes --- ReleaseNotes.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 127d4a8..d66a27f 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,11 +1,16 @@ -# `cc-backend` version 1.1.0 +# `cc-backend` version 1.2.0 Supports job archive version 1 and database version 6. This is a minor release of `cc-backend`, the API backend and frontend implementation of ClusterCockpit. -** Breaking changes v1 ** +** Breaking changes ** + +The LDAP configuration option user_filter was changed and now should not include +the wildcard. Example: +* Old: `"user_filter": "(&(objectclass=posixAccount)(uid=*))"` +* New: `"user_filter": "&(objectclass=posixAccount)"` The aggregate job statistic core hours is now computed using the job table column `num_hwthreads`. In a future release this column will be renamed to From e550e57ac0a7da7072256236c41e0cb8e87e2461 Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Mon, 14 Aug 2023 13:52:26 +0200 Subject: [PATCH 32/95] Fix Java/Grails issued token parsing - Tested locally until successfull login - Initialize empty projects array --- internal/auth/jwtSession.go | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/internal/auth/jwtSession.go b/internal/auth/jwtSession.go index 7ee45e7..90725d4 100644 --- a/internal/auth/jwtSession.go +++ b/internal/auth/jwtSession.go @@ -79,12 +79,26 @@ func (ja *JWTSessionAuthenticator) Login( exp, _ := claims["exp"].(float64) var name string - if val, ok := claims["name"]; ok { + // Java/Grails Issued Token + if wrap, ok := claims["name"].(map[string]interface{}); ok { + if vals, ok := wrap["values"].([]interface{}); ok { + name = fmt.Sprintf("%v %v", vals[0], vals[1]) + } + } else if val, ok := claims["name"]; ok { name, _ = val.(string) } var roles []string - if rawroles, ok := claims["roles"]; ok { + // Java/Grails Issued Token + if rawroles, ok := claims["roles"].([]interface{}); ok { + for _, rr := range rawroles { + if r, ok := rr.(string); ok { + if isValidRole(r) { + roles = append(roles, r) + } + } + } + } else if rawroles, ok := claims["roles"]; ok { for _, r := range rawroles.([]string) { if isValidRole(r) { roles = append(roles, r) @@ -92,11 +106,26 @@ func (ja *JWTSessionAuthenticator) Login( } } + projects := make([]string, 0) + // Java/Grails Issued Token + // if rawprojs, ok := claims["projects"].([]interface{}); ok { + // for _, pp := range rawprojs { + // if p, ok := pp.(string); ok { + // projects = append(projects, p) + // } + // } + // } else if rawprojs, ok := claims["projects"]; ok { + // for _, p := range rawprojs.([]string) { + // projects = append(projects, p) + // } + // } + if user == nil { user = &User{ Username: sub, Name: name, Roles: roles, + Projects: projects, AuthType: AuthSession, AuthSource: AuthViaToken, } From 90bdfcfbb62d88dd5eba5ef06fa70e1a8c38ecf2 Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Mon, 14 Aug 2023 14:33:05 +0200 Subject: [PATCH 33/95] Add secured subrouter for REST API Rename IP filter option Add array helper in util --- internal/api/rest.go | 201 ++++++++++++++++++++++++----------------- internal/util/array.go | 14 +++ pkg/schema/config.go | 4 +- 3 files changed, 135 insertions(+), 84 deletions(-) create mode 100644 internal/util/array.go diff --git a/internal/api/rest.go b/internal/api/rest.go index c1f6fd1..1e758a2 100644 --- a/internal/api/rest.go +++ b/internal/api/rest.go @@ -26,6 +26,7 @@ import ( "github.com/ClusterCockpit/cc-backend/internal/importer" "github.com/ClusterCockpit/cc-backend/internal/metricdata" "github.com/ClusterCockpit/cc-backend/internal/repository" + "github.com/ClusterCockpit/cc-backend/internal/util" "github.com/ClusterCockpit/cc-backend/pkg/archive" "github.com/ClusterCockpit/cc-backend/pkg/log" "github.com/ClusterCockpit/cc-backend/pkg/schema" @@ -76,23 +77,65 @@ func (api *RestApi) MountRoutes(r *mux.Router) { r.HandleFunc("/jobs/delete_job/", api.deleteJobByRequest).Methods(http.MethodDelete) r.HandleFunc("/jobs/delete_job/{id}", api.deleteJobById).Methods(http.MethodDelete) r.HandleFunc("/jobs/delete_job_before/{ts}", api.deleteJobBefore).Methods(http.MethodDelete) - r.HandleFunc("/secured/addProject/{id}/{project}", api.secureUpdateUser).Methods(http.MethodPost) - r.HandleFunc("/secured/addRole/{id}/{role}", api.secureUpdateUser).Methods(http.MethodPost) - - if api.Authentication != nil { - r.HandleFunc("/jwt/", api.getJWT).Methods(http.MethodGet) - r.HandleFunc("/roles/", api.getRoles).Methods(http.MethodGet) - r.HandleFunc("/users/", api.createUser).Methods(http.MethodPost, http.MethodPut) - r.HandleFunc("/users/", api.getUsers).Methods(http.MethodGet) - r.HandleFunc("/users/", api.deleteUser).Methods(http.MethodDelete) - r.HandleFunc("/user/{id}", api.updateUser).Methods(http.MethodPost) - r.HandleFunc("/configuration/", api.updateConfiguration).Methods(http.MethodPost) - } + // r.HandleFunc("/secured/addProject/{id}/{project}", api.secureUpdateUser).Methods(http.MethodPost) + // r.HandleFunc("/secured/addRole/{id}/{role}", api.secureUpdateUser).Methods(http.MethodPost) if api.MachineStateDir != "" { r.HandleFunc("/machine_state/{cluster}/{host}", api.getMachineState).Methods(http.MethodGet) r.HandleFunc("/machine_state/{cluster}/{host}", api.putMachineState).Methods(http.MethodPut, http.MethodPost) } + + if api.Authentication != nil { + rw := r.MatcherFunc( + func(rq *http.Request, rm *mux.RouteMatch) bool { + user := auth.GetUser(rq.Context()) + return user.AuthType == auth.AuthSession + }).Subrouter() + rw.HandleFunc("/jwt/", api.getJWT).Methods(http.MethodGet) + rw.HandleFunc("/roles/", api.getRoles).Methods(http.MethodGet) + rw.HandleFunc("/users/", api.createUser).Methods(http.MethodPost, http.MethodPut) + rw.HandleFunc("/users/", api.getUsers).Methods(http.MethodGet) + rw.HandleFunc("/users/", api.deleteUser).Methods(http.MethodDelete) + rw.HandleFunc("/user/{id}", api.updateUser).Methods(http.MethodPost) + rw.HandleFunc("/configuration/", api.updateConfiguration).Methods(http.MethodPost) + + rs := r.PathPrefix("/secured").MatcherFunc( + func(rq *http.Request, rm *mux.RouteMatch) bool { + user := auth.GetUser(rq.Context()) + // this only applies for token based authorization + if user.AuthType != auth.AuthToken { + return false + } + + // If nothing declared in config: deny all request to this endpoint + if config.Keys.ApiAllowedIPs == nil || len(config.Keys.ApiAllowedIPs) == 0 { + return false + } + + // extract IP address + IPAddress := rq.Header.Get("X-Real-Ip") + if IPAddress == "" { + IPAddress = rq.Header.Get("X-Forwarded-For") + } + if IPAddress == "" { + IPAddress = rq.RemoteAddr + } + + // check if IP is allowed + if !util.Contains(config.Keys.ApiAllowedIPs, IPAddress) { + return false + } + + return true + }).Subrouter() + rs.HandleFunc("/jwt/", api.getJWT).Methods(http.MethodGet) + rs.HandleFunc("/roles/", api.getRoles).Methods(http.MethodGet) + rs.HandleFunc("/users/", api.createUser).Methods(http.MethodPost, http.MethodPut) + rs.HandleFunc("/users/", api.getUsers).Methods(http.MethodGet) + rs.HandleFunc("/users/", api.deleteUser).Methods(http.MethodDelete) + rs.HandleFunc("/user/{id}", api.updateUser).Methods(http.MethodPost) + rs.HandleFunc("/configuration/", api.updateConfiguration).Methods(http.MethodPost) + } } // StartJobApiResponse model @@ -1051,76 +1094,70 @@ func (api *RestApi) updateUser(rw http.ResponseWriter, r *http.Request) { } } -func (api *RestApi) secureUpdateUser(rw http.ResponseWriter, r *http.Request) { - if user := auth.GetUser(r.Context()); user != nil && !user.HasRole(auth.RoleApi) { - handleError(fmt.Errorf("missing role: %v", auth.GetRoleString(auth.RoleApi)), http.StatusForbidden, rw) - return - } - - // If nothing declared in config: deny all request to this endpint - if config.Keys.ApiAllowedAddrs == nil || len(config.Keys.ApiAllowedAddrs) == 0 { - handleError(fmt.Errorf("denied by default policy!"), http.StatusForbidden, rw) - return - } - - // IP CHECK HERE (WIP) - // Probably better as private routine - IPAddress := r.Header.Get("X-Real-Ip") - if IPAddress == "" { - IPAddress = r.Header.Get("X-Forwarded-For") - } - if IPAddress == "" { - IPAddress = r.RemoteAddr - } - - // Also This - ipOk := false - for _, a := range config.Keys.ApiAllowedAddrs { - if a == IPAddress { - ipOk = true - } - } - - if IPAddress == "" || ipOk == false { - handleError(fmt.Errorf("unknown ip: %v", IPAddress), http.StatusForbidden, rw) - return - } - // IP CHECK END - - // Get Values - id := mux.Vars(r)["id"] - newproj := mux.Vars(r)["project"] - newrole := mux.Vars(r)["role"] - - // TODO: Handle anything but roles... - if newrole != "" { - if err := api.Authentication.AddRole(r.Context(), id, newrole); err != nil { - handleError(errors.New(err.Error()), http.StatusUnprocessableEntity, rw) - return - } - - rw.Header().Add("Content-Type", "application/json") - rw.WriteHeader(http.StatusOK) - json.NewEncoder(rw).Encode(UpdateUserApiResponse{ - Message: fmt.Sprintf("Successfully added role %s to %s", newrole, id), - }) - - } else if newproj != "" { - if err := api.Authentication.AddProject(r.Context(), id, newproj); err != nil { - handleError(errors.New(err.Error()), http.StatusUnprocessableEntity, rw) - return - } - - rw.Header().Add("Content-Type", "application/json") - rw.WriteHeader(http.StatusOK) - json.NewEncoder(rw).Encode(UpdateUserApiResponse{ - Message: fmt.Sprintf("Successfully added project %s to %s", newproj, id), - }) - - } else { - handleError(errors.New("Not Add [role|project]?"), http.StatusBadRequest, rw) - } -} +// func (api *RestApi) secureUpdateUser(rw http.ResponseWriter, r *http.Request) { +// if user := auth.GetUser(r.Context()); user != nil && !user.HasRole(auth.RoleApi) { +// handleError(fmt.Errorf("missing role: %v", auth.GetRoleString(auth.RoleApi)), http.StatusForbidden, rw) +// return +// } +// +// // IP CHECK HERE (WIP) +// // Probably better as private routine +// IPAddress := r.Header.Get("X-Real-Ip") +// if IPAddress == "" { +// IPAddress = r.Header.Get("X-Forwarded-For") +// } +// if IPAddress == "" { +// IPAddress = r.RemoteAddr +// } +// +// // Also This +// ipOk := false +// for _, a := range config.Keys.ApiAllowedAddrs { +// if a == IPAddress { +// ipOk = true +// } +// } +// +// if IPAddress == "" || ipOk == false { +// handleError(fmt.Errorf("unknown ip: %v", IPAddress), http.StatusForbidden, rw) +// return +// } +// // IP CHECK END +// +// // Get Values +// id := mux.Vars(r)["id"] +// newproj := mux.Vars(r)["project"] +// newrole := mux.Vars(r)["role"] +// +// // TODO: Handle anything but roles... +// if newrole != "" { +// if err := api.Authentication.AddRole(r.Context(), id, newrole); err != nil { +// handleError(errors.New(err.Error()), http.StatusUnprocessableEntity, rw) +// return +// } +// +// rw.Header().Add("Content-Type", "application/json") +// rw.WriteHeader(http.StatusOK) +// json.NewEncoder(rw).Encode(UpdateUserApiResponse{ +// Message: fmt.Sprintf("Successfully added role %s to %s", newrole, id), +// }) +// +// } else if newproj != "" { +// if err := api.Authentication.AddProject(r.Context(), id, newproj); err != nil { +// handleError(errors.New(err.Error()), http.StatusUnprocessableEntity, rw) +// return +// } +// +// rw.Header().Add("Content-Type", "application/json") +// rw.WriteHeader(http.StatusOK) +// json.NewEncoder(rw).Encode(UpdateUserApiResponse{ +// Message: fmt.Sprintf("Successfully added project %s to %s", newproj, id), +// }) +// +// } else { +// handleError(errors.New("Not Add [role|project]?"), http.StatusBadRequest, rw) +// } +// } func (api *RestApi) updateConfiguration(rw http.ResponseWriter, r *http.Request) { rw.Header().Set("Content-Type", "text/plain") diff --git a/internal/util/array.go b/internal/util/array.go new file mode 100644 index 0000000..bc7ed04 --- /dev/null +++ b/internal/util/array.go @@ -0,0 +1,14 @@ +// Copyright (C) 2023 NHR@FAU, University Erlangen-Nuremberg. +// All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. +package util + +func Contains[T comparable](items []T, item T) bool { + for _, v := range items { + if v == item { + return true + } + } + return false +} diff --git a/pkg/schema/config.go b/pkg/schema/config.go index b59feb3..95cc641 100644 --- a/pkg/schema/config.go +++ b/pkg/schema/config.go @@ -70,8 +70,8 @@ type ProgramConfig struct { // Address where the http (or https) server will listen on (for example: 'localhost:80'). Addr string `json:"addr"` - // Addresses from which the /secured/* API endpoints can be reached - ApiAllowedAddrs []string `json:"apiAllowedAddrs"` + // Addresses from which the /api/secured/* API endpoints can be reached + ApiAllowedIPs []string `json:"apiAllowedIPs"` // Drop root permissions once .env was read and the port was taken. User string `json:"user"` From 202521cbfd3d13e7935e52e04c6482bd5b5f7c3c Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Mon, 14 Aug 2023 18:38:30 +0200 Subject: [PATCH 34/95] Restructure routing and security check --- internal/api/rest.go | 129 +++++++++++++++++++++++++------------------ 1 file changed, 76 insertions(+), 53 deletions(-) diff --git a/internal/api/rest.go b/internal/api/rest.go index 1e758a2..501cf3b 100644 --- a/internal/api/rest.go +++ b/internal/api/rest.go @@ -1,4 +1,4 @@ -// Copyright (C) 2022 NHR@FAU, University Erlangen-Nuremberg. +// Copyright (C) 2023 NHR@FAU, University Erlangen-Nuremberg. // All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. @@ -86,55 +86,13 @@ func (api *RestApi) MountRoutes(r *mux.Router) { } if api.Authentication != nil { - rw := r.MatcherFunc( - func(rq *http.Request, rm *mux.RouteMatch) bool { - user := auth.GetUser(rq.Context()) - return user.AuthType == auth.AuthSession - }).Subrouter() - rw.HandleFunc("/jwt/", api.getJWT).Methods(http.MethodGet) - rw.HandleFunc("/roles/", api.getRoles).Methods(http.MethodGet) - rw.HandleFunc("/users/", api.createUser).Methods(http.MethodPost, http.MethodPut) - rw.HandleFunc("/users/", api.getUsers).Methods(http.MethodGet) - rw.HandleFunc("/users/", api.deleteUser).Methods(http.MethodDelete) - rw.HandleFunc("/user/{id}", api.updateUser).Methods(http.MethodPost) - rw.HandleFunc("/configuration/", api.updateConfiguration).Methods(http.MethodPost) - - rs := r.PathPrefix("/secured").MatcherFunc( - func(rq *http.Request, rm *mux.RouteMatch) bool { - user := auth.GetUser(rq.Context()) - // this only applies for token based authorization - if user.AuthType != auth.AuthToken { - return false - } - - // If nothing declared in config: deny all request to this endpoint - if config.Keys.ApiAllowedIPs == nil || len(config.Keys.ApiAllowedIPs) == 0 { - return false - } - - // extract IP address - IPAddress := rq.Header.Get("X-Real-Ip") - if IPAddress == "" { - IPAddress = rq.Header.Get("X-Forwarded-For") - } - if IPAddress == "" { - IPAddress = rq.RemoteAddr - } - - // check if IP is allowed - if !util.Contains(config.Keys.ApiAllowedIPs, IPAddress) { - return false - } - - return true - }).Subrouter() - rs.HandleFunc("/jwt/", api.getJWT).Methods(http.MethodGet) - rs.HandleFunc("/roles/", api.getRoles).Methods(http.MethodGet) - rs.HandleFunc("/users/", api.createUser).Methods(http.MethodPost, http.MethodPut) - rs.HandleFunc("/users/", api.getUsers).Methods(http.MethodGet) - rs.HandleFunc("/users/", api.deleteUser).Methods(http.MethodDelete) - rs.HandleFunc("/user/{id}", api.updateUser).Methods(http.MethodPost) - rs.HandleFunc("/configuration/", api.updateConfiguration).Methods(http.MethodPost) + r.HandleFunc("/jwt/", api.getJWT).Methods(http.MethodGet) + r.HandleFunc("/roles/", api.getRoles).Methods(http.MethodGet) + r.HandleFunc("/users/", api.createUser).Methods(http.MethodPost, http.MethodPut) + r.HandleFunc("/users/", api.getUsers).Methods(http.MethodGet) + r.HandleFunc("/users/", api.deleteUser).Methods(http.MethodDelete) + r.HandleFunc("/user/{id}", api.updateUser).Methods(http.MethodPost) + r.HandleFunc("/configuration/", api.updateConfiguration).Methods(http.MethodPost) } } @@ -223,6 +181,36 @@ func decode(r io.Reader, val interface{}) error { return dec.Decode(val) } +func securedCheck(r *http.Request) error { + user := auth.GetUser(r.Context()) + if user == nil { + return fmt.Errorf("no user in context") + } + + if user.AuthType == auth.AuthToken { + // If nothing declared in config: deny all request to this endpoint + if config.Keys.ApiAllowedIPs == nil || len(config.Keys.ApiAllowedIPs) == 0 { + return fmt.Errorf("missing configuration key ApiAllowedIPs") + } + + // extract IP address + IPAddress := r.Header.Get("X-Real-Ip") + if IPAddress == "" { + IPAddress = r.Header.Get("X-Forwarded-For") + } + if IPAddress == "" { + IPAddress = r.RemoteAddr + } + + // check if IP is allowed + if !util.Contains(config.Keys.ApiAllowedIPs, IPAddress) { + return fmt.Errorf("unknown ip: %v", IPAddress) + } + } + + return nil +} + // getJobs godoc // @summary Lists all jobs // @tags query @@ -943,6 +931,11 @@ func (api *RestApi) getJobMetrics(rw http.ResponseWriter, r *http.Request) { } func (api *RestApi) getJWT(rw http.ResponseWriter, r *http.Request) { + err := securedCheck(r) + if err != nil { + http.Error(rw, err.Error(), http.StatusForbidden) + } + rw.Header().Set("Content-Type", "text/plain") username := r.FormValue("username") me := auth.GetUser(r.Context()) @@ -971,6 +964,11 @@ func (api *RestApi) getJWT(rw http.ResponseWriter, r *http.Request) { } func (api *RestApi) createUser(rw http.ResponseWriter, r *http.Request) { + err := securedCheck(r) + if err != nil { + http.Error(rw, err.Error(), http.StatusForbidden) + } + rw.Header().Set("Content-Type", "text/plain") me := auth.GetUser(r.Context()) if !me.HasRole(auth.RoleAdmin) { @@ -978,17 +976,22 @@ func (api *RestApi) createUser(rw http.ResponseWriter, r *http.Request) { return } - username, password, role, name, email, project := r.FormValue("username"), r.FormValue("password"), r.FormValue("role"), r.FormValue("name"), r.FormValue("email"), r.FormValue("project") + username, password, role, name, email, project := r.FormValue("username"), + r.FormValue("password"), r.FormValue("role"), r.FormValue("name"), + r.FormValue("email"), r.FormValue("project") + if len(password) == 0 && role != auth.GetRoleString(auth.RoleApi) { http.Error(rw, "Only API users are allowed to have a blank password (login will be impossible)", http.StatusBadRequest) return } if len(project) != 0 && role != auth.GetRoleString(auth.RoleManager) { - http.Error(rw, "only managers require a project (can be changed later)", http.StatusBadRequest) + http.Error(rw, "only managers require a project (can be changed later)", + http.StatusBadRequest) return } else if len(project) == 0 && role == auth.GetRoleString(auth.RoleManager) { - http.Error(rw, "managers require a project to manage (can be changed later)", http.StatusBadRequest) + http.Error(rw, "managers require a project to manage (can be changed later)", + http.StatusBadRequest) return } @@ -1007,6 +1010,11 @@ func (api *RestApi) createUser(rw http.ResponseWriter, r *http.Request) { } func (api *RestApi) deleteUser(rw http.ResponseWriter, r *http.Request) { + err := securedCheck(r) + if err != nil { + http.Error(rw, err.Error(), http.StatusForbidden) + } + if user := auth.GetUser(r.Context()); !user.HasRole(auth.RoleAdmin) { http.Error(rw, "Only admins are allowed to delete a user", http.StatusForbidden) return @@ -1022,6 +1030,11 @@ func (api *RestApi) deleteUser(rw http.ResponseWriter, r *http.Request) { } func (api *RestApi) getUsers(rw http.ResponseWriter, r *http.Request) { + err := securedCheck(r) + if err != nil { + http.Error(rw, err.Error(), http.StatusForbidden) + } + if user := auth.GetUser(r.Context()); !user.HasRole(auth.RoleAdmin) { http.Error(rw, "Only admins are allowed to fetch a list of users", http.StatusForbidden) return @@ -1037,6 +1050,11 @@ func (api *RestApi) getUsers(rw http.ResponseWriter, r *http.Request) { } func (api *RestApi) getRoles(rw http.ResponseWriter, r *http.Request) { + err := securedCheck(r) + if err != nil { + http.Error(rw, err.Error(), http.StatusForbidden) + } + user := auth.GetUser(r.Context()) if !user.HasRole(auth.RoleAdmin) { http.Error(rw, "only admins are allowed to fetch a list of roles", http.StatusForbidden) @@ -1053,6 +1071,11 @@ func (api *RestApi) getRoles(rw http.ResponseWriter, r *http.Request) { } func (api *RestApi) updateUser(rw http.ResponseWriter, r *http.Request) { + err := securedCheck(r) + if err != nil { + http.Error(rw, err.Error(), http.StatusForbidden) + } + if user := auth.GetUser(r.Context()); !user.HasRole(auth.RoleAdmin) { http.Error(rw, "Only admins are allowed to update a user", http.StatusForbidden) return From 4f6d1fec68f53a9dee3f1727f2abfb1b95dfd738 Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Wed, 16 Aug 2023 09:19:41 +0200 Subject: [PATCH 35/95] Fix errors in ldap auth --- internal/auth/auth.go | 13 +++++++------ internal/auth/ldap.go | 4 +++- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/internal/auth/auth.go b/internal/auth/auth.go index 8149bc1..500ef1a 100644 --- a/internal/auth/auth.go +++ b/internal/auth/auth.go @@ -158,12 +158,13 @@ func Init(db *sqlx.DB, } if config, ok := configs["ldap"]; ok { - auth.LdapAuth = &LdapAuthenticator{} - if err := auth.LdapAuth.Init(auth, config); err != nil { - log.Error("Error while initializing authentication -> ldapAuth init failed") - return nil, err + ldapAuth := &LdapAuthenticator{} + if err := ldapAuth.Init(auth, config); err != nil { + log.Warn("Error while initializing authentication -> ldapAuth init failed") + } else { + auth.LdapAuth = ldapAuth + auth.authenticators = append(auth.authenticators, auth.LdapAuth) } - auth.authenticators = append(auth.authenticators, auth.LdapAuth) } jwtSessionAuth := &JWTSessionAuthenticator{} @@ -174,7 +175,7 @@ func Init(db *sqlx.DB, } jwtCookieSessionAuth := &JWTCookieSessionAuthenticator{} - if err := jwtSessionAuth.Init(auth, configs["jwt"]); err != nil { + if err := jwtCookieSessionAuth.Init(auth, configs["jwt"]); err != nil { log.Warn("Error while initializing authentication -> jwtCookieSessionAuth init failed") } else { auth.authenticators = append(auth.authenticators, jwtCookieSessionAuth) diff --git a/internal/auth/ldap.go b/internal/auth/ldap.go index 17b5c0c..9feebc1 100644 --- a/internal/auth/ldap.go +++ b/internal/auth/ldap.go @@ -59,6 +59,8 @@ func (la *LdapAuthenticator) Init( log.Print("sync done") } }() + } else { + return fmt.Errorf("missing LDAP configuration") } return nil @@ -73,7 +75,7 @@ func (la *LdapAuthenticator) CanLogin( if user != nil && user.AuthSource == AuthViaLDAP { return true } else { - if la.config.SyncUserOnLogin { + if la.config != nil && la.config.SyncUserOnLogin { l, err := la.getLdapConnection(true) if err != nil { log.Error("LDAP connection error") From 80aed874157cd797f39a39bad06142cd4452c25d Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Wed, 16 Aug 2023 17:21:12 +0200 Subject: [PATCH 36/95] Retry fetching user after CanLogin --- internal/auth/auth.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/internal/auth/auth.go b/internal/auth/auth.go index 500ef1a..57bf3c4 100644 --- a/internal/auth/auth.go +++ b/internal/auth/auth.go @@ -211,6 +211,10 @@ func (auth *Authentication) Login( if !authenticator.CanLogin(dbUser, username, rw, r) { continue } + dbUser, err = auth.GetUser(username) + if err != nil && err != sql.ErrNoRows { + log.Errorf("Error while loading user '%v'", username) + } user, err := authenticator.Login(dbUser, rw, r) if err != nil { From 87ce4f63d48a331cf44ea1450224967363a48d9c Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Thu, 17 Aug 2023 10:29:00 +0200 Subject: [PATCH 37/95] Refactor auth module Separate parts Add user repository Add user schema --- cmd/cc-backend/main.go | 23 +- internal/api/rest.go | 97 +++-- internal/auth/auth.go | 73 +--- internal/auth/jwt.go | 18 +- internal/auth/jwtCookieSession.go | 20 +- internal/auth/jwtSession.go | 22 +- internal/auth/ldap.go | 12 +- internal/auth/local.go | 9 +- internal/auth/users.go | 289 ------------- internal/graph/schema.resolvers.go | 15 +- internal/repository/job.go | 11 +- internal/repository/query.go | 9 +- internal/repository/stats.go | 3 +- internal/repository/tags.go | 7 +- internal/repository/user.go | 392 +++++++++++++----- internal/repository/userConfig.go | 137 ++++++ .../{user_test.go => userConfig_test.go} | 4 +- internal/routerConfig/routes.go | 35 +- pkg/schema/config.go | 11 +- internal/auth/roles.go => pkg/schema/user.go | 41 +- .../auth_test.go => pkg/schema/user_test.go | 2 +- web/web.go | 7 +- 22 files changed, 637 insertions(+), 600 deletions(-) delete mode 100644 internal/auth/users.go create mode 100644 internal/repository/userConfig.go rename internal/repository/{user_test.go => userConfig_test.go} (94%) rename internal/auth/roles.go => pkg/schema/user.go (82%) rename internal/auth/auth_test.go => pkg/schema/user_test.go (99%) diff --git a/cmd/cc-backend/main.go b/cmd/cc-backend/main.go index 8164792..60c5edd 100644 --- a/cmd/cc-backend/main.go +++ b/cmd/cc-backend/main.go @@ -228,14 +228,16 @@ func main() { log.Fatal("invalid argument format for user creation") } - if err := authentication.AddUser(&auth.User{ + ur := repository.GetUserRepository() + if err := ur.AddUser(&schema.User{ Username: parts[0], Projects: make([]string, 0), Password: parts[2], Roles: strings.Split(parts[1], ","), }); err != nil { log.Fatalf("adding '%s' user authentication failed: %v", parts[0], err) } } if flagDelUser != "" { - if err := authentication.DelUser(flagDelUser); err != nil { + ur := repository.GetUserRepository() + if err := ur.DelUser(flagDelUser); err != nil { log.Fatalf("deleting user failed: %v", err) } } @@ -252,12 +254,13 @@ func main() { } if flagGenJWT != "" { - user, err := authentication.GetUser(flagGenJWT) + ur := repository.GetUserRepository() + user, err := ur.GetUser(flagGenJWT) if err != nil { log.Fatalf("could not get user from JWT: %v", err) } - if !user.HasRole(auth.RoleApi) { + if !user.HasRole(schema.RoleApi) { log.Warnf("user '%s' does not have the API role", user.Username) } @@ -327,15 +330,15 @@ func main() { r.HandleFunc("/login", func(rw http.ResponseWriter, r *http.Request) { rw.Header().Add("Content-Type", "text/html; charset=utf-8") - web.RenderTemplate(rw, r, "login.tmpl", &web.Page{Title: "Login", Build: buildInfo}) + web.RenderTemplate(rw, "login.tmpl", &web.Page{Title: "Login", Build: buildInfo}) }).Methods(http.MethodGet) r.HandleFunc("/imprint", func(rw http.ResponseWriter, r *http.Request) { rw.Header().Add("Content-Type", "text/html; charset=utf-8") - web.RenderTemplate(rw, r, "imprint.tmpl", &web.Page{Title: "Imprint", Build: buildInfo}) + web.RenderTemplate(rw, "imprint.tmpl", &web.Page{Title: "Imprint", Build: buildInfo}) }) r.HandleFunc("/privacy", func(rw http.ResponseWriter, r *http.Request) { rw.Header().Add("Content-Type", "text/html; charset=utf-8") - web.RenderTemplate(rw, r, "privacy.tmpl", &web.Page{Title: "Privacy", Build: buildInfo}) + web.RenderTemplate(rw, "privacy.tmpl", &web.Page{Title: "Privacy", Build: buildInfo}) }) // Some routes, such as /login or /query, should only be accessible to a user that is logged in. @@ -351,7 +354,7 @@ func main() { func(rw http.ResponseWriter, r *http.Request, err error) { rw.Header().Add("Content-Type", "text/html; charset=utf-8") rw.WriteHeader(http.StatusUnauthorized) - web.RenderTemplate(rw, r, "login.tmpl", &web.Page{ + web.RenderTemplate(rw, "login.tmpl", &web.Page{ Title: "Login failed - ClusterCockpit", MsgType: "alert-warning", Message: err.Error(), @@ -362,7 +365,7 @@ func main() { r.Handle("/logout", authentication.Logout(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { rw.Header().Add("Content-Type", "text/html; charset=utf-8") rw.WriteHeader(http.StatusOK) - web.RenderTemplate(rw, r, "login.tmpl", &web.Page{ + web.RenderTemplate(rw, "login.tmpl", &web.Page{ Title: "Bye - ClusterCockpit", MsgType: "alert-info", Message: "Logout successful", @@ -378,7 +381,7 @@ func main() { // On failure: func(rw http.ResponseWriter, r *http.Request, err error) { rw.WriteHeader(http.StatusUnauthorized) - web.RenderTemplate(rw, r, "login.tmpl", &web.Page{ + web.RenderTemplate(rw, "login.tmpl", &web.Page{ Title: "Authentication failed - ClusterCockpit", MsgType: "alert-danger", Message: err.Error(), diff --git a/internal/api/rest.go b/internal/api/rest.go index 501cf3b..0716514 100644 --- a/internal/api/rest.go +++ b/internal/api/rest.go @@ -182,12 +182,12 @@ func decode(r io.Reader, val interface{}) error { } func securedCheck(r *http.Request) error { - user := auth.GetUser(r.Context()) + user := repository.GetUserFromContext(r.Context()) if user == nil { return fmt.Errorf("no user in context") } - if user.AuthType == auth.AuthToken { + if user.AuthType == schema.AuthToken { // If nothing declared in config: deny all request to this endpoint if config.Keys.ApiAllowedIPs == nil || len(config.Keys.ApiAllowedIPs) == 0 { return fmt.Errorf("missing configuration key ApiAllowedIPs") @@ -232,8 +232,10 @@ func securedCheck(r *http.Request) error { // @router /jobs/ [get] func (api *RestApi) getJobs(rw http.ResponseWriter, r *http.Request) { - if user := auth.GetUser(r.Context()); user != nil && !user.HasRole(auth.RoleApi) { - handleError(fmt.Errorf("missing role: %v", auth.GetRoleString(auth.RoleApi)), http.StatusForbidden, rw) + if user := repository.GetUserFromContext(r.Context()); user != nil && + !user.HasRole(schema.RoleApi) { + + handleError(fmt.Errorf("missing role: %v", schema.GetRoleString(schema.RoleApi)), http.StatusForbidden, rw) return } @@ -374,9 +376,11 @@ func (api *RestApi) getJobs(rw http.ResponseWriter, r *http.Request) { // @security ApiKeyAuth // @router /jobs/{id} [post] func (api *RestApi) getJobById(rw http.ResponseWriter, r *http.Request) { - if user := auth.GetUser(r.Context()); user != nil && !user.HasRole(auth.RoleApi) { + if user := repository.GetUserFromContext(r.Context()); user != nil && + !user.HasRole(schema.RoleApi) { + handleError(fmt.Errorf("missing role: %v", - auth.GetRoleString(auth.RoleApi)), http.StatusForbidden, rw) + schema.GetRoleString(schema.RoleApi)), http.StatusForbidden, rw) return } @@ -465,8 +469,10 @@ func (api *RestApi) getJobById(rw http.ResponseWriter, r *http.Request) { // @security ApiKeyAuth // @router /jobs/tag_job/{id} [post] func (api *RestApi) tagJob(rw http.ResponseWriter, r *http.Request) { - if user := auth.GetUser(r.Context()); user != nil && !user.HasRole(auth.RoleApi) { - handleError(fmt.Errorf("missing role: %v", auth.GetRoleString(auth.RoleApi)), http.StatusForbidden, rw) + if user := repository.GetUserFromContext(r.Context()); user != nil && + !user.HasRole(schema.RoleApi) { + + handleError(fmt.Errorf("missing role: %v", schema.GetRoleString(schema.RoleApi)), http.StatusForbidden, rw) return } @@ -530,8 +536,10 @@ func (api *RestApi) tagJob(rw http.ResponseWriter, r *http.Request) { // @security ApiKeyAuth // @router /jobs/start_job/ [post] func (api *RestApi) startJob(rw http.ResponseWriter, r *http.Request) { - if user := auth.GetUser(r.Context()); user != nil && !user.HasRole(auth.RoleApi) { - handleError(fmt.Errorf("missing role: %v", auth.GetRoleString(auth.RoleApi)), http.StatusForbidden, rw) + if user := repository.GetUserFromContext(r.Context()); user != nil && + !user.HasRole(schema.RoleApi) { + + handleError(fmt.Errorf("missing role: %v", schema.GetRoleString(schema.RoleApi)), http.StatusForbidden, rw) return } @@ -611,8 +619,10 @@ func (api *RestApi) startJob(rw http.ResponseWriter, r *http.Request) { // @security ApiKeyAuth // @router /jobs/stop_job/{id} [post] func (api *RestApi) stopJobById(rw http.ResponseWriter, r *http.Request) { - if user := auth.GetUser(r.Context()); user != nil && !user.HasRole(auth.RoleApi) { - handleError(fmt.Errorf("missing role: %v", auth.GetRoleString(auth.RoleApi)), http.StatusForbidden, rw) + if user := repository.GetUserFromContext(r.Context()); user != nil && + !user.HasRole(schema.RoleApi) { + + handleError(fmt.Errorf("missing role: %v", schema.GetRoleString(schema.RoleApi)), http.StatusForbidden, rw) return } @@ -664,8 +674,10 @@ func (api *RestApi) stopJobById(rw http.ResponseWriter, r *http.Request) { // @security ApiKeyAuth // @router /jobs/stop_job/ [post] func (api *RestApi) stopJobByRequest(rw http.ResponseWriter, r *http.Request) { - if user := auth.GetUser(r.Context()); user != nil && !user.HasRole(auth.RoleApi) { - handleError(fmt.Errorf("missing role: %v", auth.GetRoleString(auth.RoleApi)), http.StatusForbidden, rw) + if user := repository.GetUserFromContext(r.Context()); user != nil && + !user.HasRole(schema.RoleApi) { + + handleError(fmt.Errorf("missing role: %v", schema.GetRoleString(schema.RoleApi)), http.StatusForbidden, rw) return } @@ -710,8 +722,8 @@ func (api *RestApi) stopJobByRequest(rw http.ResponseWriter, r *http.Request) { // @security ApiKeyAuth // @router /jobs/delete_job/{id} [delete] func (api *RestApi) deleteJobById(rw http.ResponseWriter, r *http.Request) { - if user := auth.GetUser(r.Context()); user != nil && !user.HasRole(auth.RoleApi) { - handleError(fmt.Errorf("missing role: %v", auth.GetRoleString(auth.RoleApi)), http.StatusForbidden, rw) + if user := repository.GetUserFromContext(r.Context()); user != nil && !user.HasRole(schema.RoleApi) { + handleError(fmt.Errorf("missing role: %v", schema.GetRoleString(schema.RoleApi)), http.StatusForbidden, rw) return } @@ -758,8 +770,9 @@ func (api *RestApi) deleteJobById(rw http.ResponseWriter, r *http.Request) { // @security ApiKeyAuth // @router /jobs/delete_job/ [delete] func (api *RestApi) deleteJobByRequest(rw http.ResponseWriter, r *http.Request) { - if user := auth.GetUser(r.Context()); user != nil && !user.HasRole(auth.RoleApi) { - handleError(fmt.Errorf("missing role: %v", auth.GetRoleString(auth.RoleApi)), http.StatusForbidden, rw) + if user := repository.GetUserFromContext(r.Context()); user != nil && + !user.HasRole(schema.RoleApi) { + handleError(fmt.Errorf("missing role: %v", schema.GetRoleString(schema.RoleApi)), http.StatusForbidden, rw) return } @@ -814,8 +827,8 @@ func (api *RestApi) deleteJobByRequest(rw http.ResponseWriter, r *http.Request) // @security ApiKeyAuth // @router /jobs/delete_job_before/{ts} [delete] func (api *RestApi) deleteJobBefore(rw http.ResponseWriter, r *http.Request) { - if user := auth.GetUser(r.Context()); user != nil && !user.HasRole(auth.RoleApi) { - handleError(fmt.Errorf("missing role: %v", auth.GetRoleString(auth.RoleApi)), http.StatusForbidden, rw) + if user := repository.GetUserFromContext(r.Context()); user != nil && !user.HasRole(schema.RoleApi) { + handleError(fmt.Errorf("missing role: %v", schema.GetRoleString(schema.RoleApi)), http.StatusForbidden, rw) return } @@ -938,8 +951,8 @@ func (api *RestApi) getJWT(rw http.ResponseWriter, r *http.Request) { rw.Header().Set("Content-Type", "text/plain") username := r.FormValue("username") - me := auth.GetUser(r.Context()) - if !me.HasRole(auth.RoleAdmin) { + me := repository.GetUserFromContext(r.Context()) + if !me.HasRole(schema.RoleAdmin) { if username != me.Username { http.Error(rw, "Only admins are allowed to sign JWTs not for themselves", http.StatusForbidden) @@ -947,7 +960,7 @@ func (api *RestApi) getJWT(rw http.ResponseWriter, r *http.Request) { } } - user, err := api.Authentication.GetUser(username) + user, err := repository.GetUserRepository().GetUser(username) if err != nil { http.Error(rw, err.Error(), http.StatusUnprocessableEntity) return @@ -970,8 +983,8 @@ func (api *RestApi) createUser(rw http.ResponseWriter, r *http.Request) { } rw.Header().Set("Content-Type", "text/plain") - me := auth.GetUser(r.Context()) - if !me.HasRole(auth.RoleAdmin) { + me := repository.GetUserFromContext(r.Context()) + if !me.HasRole(schema.RoleAdmin) { http.Error(rw, "Only admins are allowed to create new users", http.StatusForbidden) return } @@ -980,22 +993,22 @@ func (api *RestApi) createUser(rw http.ResponseWriter, r *http.Request) { r.FormValue("password"), r.FormValue("role"), r.FormValue("name"), r.FormValue("email"), r.FormValue("project") - if len(password) == 0 && role != auth.GetRoleString(auth.RoleApi) { + if len(password) == 0 && role != schema.GetRoleString(schema.RoleApi) { http.Error(rw, "Only API users are allowed to have a blank password (login will be impossible)", http.StatusBadRequest) return } - if len(project) != 0 && role != auth.GetRoleString(auth.RoleManager) { + if len(project) != 0 && role != schema.GetRoleString(schema.RoleManager) { http.Error(rw, "only managers require a project (can be changed later)", http.StatusBadRequest) return - } else if len(project) == 0 && role == auth.GetRoleString(auth.RoleManager) { + } else if len(project) == 0 && role == schema.GetRoleString(schema.RoleManager) { http.Error(rw, "managers require a project to manage (can be changed later)", http.StatusBadRequest) return } - if err := api.Authentication.AddUser(&auth.User{ + if err := repository.GetUserRepository().AddUser(&schema.User{ Username: username, Name: name, Password: password, @@ -1015,13 +1028,13 @@ func (api *RestApi) deleteUser(rw http.ResponseWriter, r *http.Request) { http.Error(rw, err.Error(), http.StatusForbidden) } - if user := auth.GetUser(r.Context()); !user.HasRole(auth.RoleAdmin) { + if user := repository.GetUserFromContext(r.Context()); !user.HasRole(schema.RoleAdmin) { http.Error(rw, "Only admins are allowed to delete a user", http.StatusForbidden) return } username := r.FormValue("username") - if err := api.Authentication.DelUser(username); err != nil { + if err := repository.GetUserRepository().DelUser(username); err != nil { http.Error(rw, err.Error(), http.StatusUnprocessableEntity) return } @@ -1035,12 +1048,12 @@ func (api *RestApi) getUsers(rw http.ResponseWriter, r *http.Request) { http.Error(rw, err.Error(), http.StatusForbidden) } - if user := auth.GetUser(r.Context()); !user.HasRole(auth.RoleAdmin) { + if user := repository.GetUserFromContext(r.Context()); !user.HasRole(schema.RoleAdmin) { http.Error(rw, "Only admins are allowed to fetch a list of users", http.StatusForbidden) return } - users, err := api.Authentication.ListUsers(r.URL.Query().Get("not-just-user") == "true") + users, err := repository.GetUserRepository().ListUsers(r.URL.Query().Get("not-just-user") == "true") if err != nil { http.Error(rw, err.Error(), http.StatusInternalServerError) return @@ -1055,13 +1068,13 @@ func (api *RestApi) getRoles(rw http.ResponseWriter, r *http.Request) { http.Error(rw, err.Error(), http.StatusForbidden) } - user := auth.GetUser(r.Context()) - if !user.HasRole(auth.RoleAdmin) { + user := repository.GetUserFromContext(r.Context()) + if !user.HasRole(schema.RoleAdmin) { http.Error(rw, "only admins are allowed to fetch a list of roles", http.StatusForbidden) return } - roles, err := auth.GetValidRoles(user) + roles, err := schema.GetValidRoles(user) if err != nil { http.Error(rw, err.Error(), http.StatusInternalServerError) return @@ -1076,7 +1089,7 @@ func (api *RestApi) updateUser(rw http.ResponseWriter, r *http.Request) { http.Error(rw, err.Error(), http.StatusForbidden) } - if user := auth.GetUser(r.Context()); !user.HasRole(auth.RoleAdmin) { + if user := repository.GetUserFromContext(r.Context()); !user.HasRole(schema.RoleAdmin) { http.Error(rw, "Only admins are allowed to update a user", http.StatusForbidden) return } @@ -1089,25 +1102,25 @@ func (api *RestApi) updateUser(rw http.ResponseWriter, r *http.Request) { // TODO: Handle anything but roles... if newrole != "" { - if err := api.Authentication.AddRole(r.Context(), mux.Vars(r)["id"], newrole); err != nil { + if err := repository.GetUserRepository().AddRole(r.Context(), mux.Vars(r)["id"], newrole); err != nil { http.Error(rw, err.Error(), http.StatusUnprocessableEntity) return } rw.Write([]byte("Add Role Success")) } else if delrole != "" { - if err := api.Authentication.RemoveRole(r.Context(), mux.Vars(r)["id"], delrole); err != nil { + if err := repository.GetUserRepository().RemoveRole(r.Context(), mux.Vars(r)["id"], delrole); err != nil { http.Error(rw, err.Error(), http.StatusUnprocessableEntity) return } rw.Write([]byte("Remove Role Success")) } else if newproj != "" { - if err := api.Authentication.AddProject(r.Context(), mux.Vars(r)["id"], newproj); err != nil { + if err := repository.GetUserRepository().AddProject(r.Context(), mux.Vars(r)["id"], newproj); err != nil { http.Error(rw, err.Error(), http.StatusUnprocessableEntity) return } rw.Write([]byte("Add Project Success")) } else if delproj != "" { - if err := api.Authentication.RemoveProject(r.Context(), mux.Vars(r)["id"], delproj); err != nil { + if err := repository.GetUserRepository().RemoveProject(r.Context(), mux.Vars(r)["id"], delproj); err != nil { http.Error(rw, err.Error(), http.StatusUnprocessableEntity) return } @@ -1188,7 +1201,7 @@ func (api *RestApi) updateConfiguration(rw http.ResponseWriter, r *http.Request) fmt.Printf("REST > KEY: %#v\nVALUE: %#v\n", key, value) - if err := repository.GetUserCfgRepo().UpdateConfig(key, value, auth.GetUser(r.Context())); err != nil { + if err := repository.GetUserCfgRepo().UpdateConfig(key, value, repository.GetUserFromContext(r.Context())); err != nil { http.Error(rw, err.Error(), http.StatusUnprocessableEntity) return } diff --git a/internal/auth/auth.go b/internal/auth/auth.go index 57bf3c4..d79f28b 100644 --- a/internal/auth/auth.go +++ b/internal/auth/auth.go @@ -14,65 +14,19 @@ import ( "os" "time" + "github.com/ClusterCockpit/cc-backend/internal/repository" "github.com/ClusterCockpit/cc-backend/pkg/log" + "github.com/ClusterCockpit/cc-backend/pkg/schema" "github.com/gorilla/sessions" "github.com/jmoiron/sqlx" ) -type AuthSource int - -const ( - AuthViaLocalPassword AuthSource = iota - AuthViaLDAP - AuthViaToken -) - -type AuthType int - -const ( - AuthToken AuthType = iota - AuthSession -) - -type User struct { - Username string `json:"username"` - Password string `json:"-"` - Name string `json:"name"` - Roles []string `json:"roles"` - AuthType AuthType `json:"authType"` - AuthSource AuthSource `json:"authSource"` - Email string `json:"email"` - Projects []string `json:"projects"` -} - -func (u *User) HasProject(project string) bool { - for _, p := range u.Projects { - if p == project { - return true - } - } - return false -} - -func GetUser(ctx context.Context) *User { - x := ctx.Value(ContextUserKey) - if x == nil { - return nil - } - - return x.(*User) -} - type Authenticator interface { Init(auth *Authentication, config interface{}) error - CanLogin(user *User, username string, rw http.ResponseWriter, r *http.Request) bool - Login(user *User, rw http.ResponseWriter, r *http.Request) (*User, error) + CanLogin(user *schema.User, username string, rw http.ResponseWriter, r *http.Request) bool + Login(user *schema.User, rw http.ResponseWriter, r *http.Request) (*schema.User, error) } -type ContextKey string - -const ContextUserKey ContextKey = "user" - type Authentication struct { db *sqlx.DB sessionStore *sessions.CookieStore @@ -86,7 +40,7 @@ type Authentication struct { func (auth *Authentication) AuthViaSession( rw http.ResponseWriter, - r *http.Request) (*User, error) { + r *http.Request) (*schema.User, error) { session, err := auth.sessionStore.Get(r, "session") if err != nil { log.Error("Error while getting session store") @@ -119,11 +73,11 @@ func (auth *Authentication) AuthViaSession( username, _ := session.Values["username"].(string) projects, _ := session.Values["projects"].([]string) roles, _ := session.Values["roles"].([]string) - return &User{ + return &schema.User{ Username: username, Projects: projects, Roles: roles, - AuthType: AuthSession, + AuthType: schema.AuthSession, AuthSource: -1, }, nil } @@ -196,12 +150,13 @@ func (auth *Authentication) Login( onfailure func(rw http.ResponseWriter, r *http.Request, loginErr error)) http.Handler { return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { + ur := repository.GetUserRepository() err := errors.New("no authenticator applied") username := r.FormValue("username") - dbUser := (*User)(nil) + dbUser := (*schema.User)(nil) if username != "" { - dbUser, err = auth.GetUser(username) + dbUser, err = ur.GetUser(username) if err != nil && err != sql.ErrNoRows { log.Errorf("Error while loading user '%v'", username) } @@ -211,7 +166,7 @@ func (auth *Authentication) Login( if !authenticator.CanLogin(dbUser, username, rw, r) { continue } - dbUser, err = auth.GetUser(username) + dbUser, err = ur.GetUser(username) if err != nil && err != sql.ErrNoRows { log.Errorf("Error while loading user '%v'", username) } @@ -243,7 +198,7 @@ func (auth *Authentication) Login( } if dbUser == nil { - if err := auth.AddUser(user); err != nil { + if err := ur.AddUser(user); err != nil { // TODO Add AuthSource log.Errorf("Error while adding user '%v' to auth from XX", user.Username) @@ -251,7 +206,7 @@ func (auth *Authentication) Login( } log.Infof("login successfull: user: %#v (roles: %v, projects: %v)", user.Username, user.Roles, user.Projects) - ctx := context.WithValue(r.Context(), ContextUserKey, user) + ctx := context.WithValue(r.Context(), repository.ContextUserKey, user) onsuccess.ServeHTTP(rw, r.WithContext(ctx)) return } @@ -284,7 +239,7 @@ func (auth *Authentication) Auth( } if user != nil { - ctx := context.WithValue(r.Context(), ContextUserKey, user) + ctx := context.WithValue(r.Context(), repository.ContextUserKey, user) onsuccess.ServeHTTP(rw, r.WithContext(ctx)) return } diff --git a/internal/auth/jwt.go b/internal/auth/jwt.go index 6a77fc4..0690b9b 100644 --- a/internal/auth/jwt.go +++ b/internal/auth/jwt.go @@ -13,22 +13,19 @@ import ( "strings" "time" + "github.com/ClusterCockpit/cc-backend/internal/repository" "github.com/ClusterCockpit/cc-backend/pkg/log" "github.com/ClusterCockpit/cc-backend/pkg/schema" "github.com/golang-jwt/jwt/v4" ) type JWTAuthenticator struct { - auth *Authentication - publicKey ed25519.PublicKey privateKey ed25519.PrivateKey config *schema.JWTAuthConfig } func (ja *JWTAuthenticator) Init(auth *Authentication, conf interface{}) error { - - ja.auth = auth ja.config = conf.(*schema.JWTAuthConfig) pubKey, privKey := os.Getenv("JWT_PUBLIC_KEY"), os.Getenv("JWT_PRIVATE_KEY") @@ -54,7 +51,7 @@ func (ja *JWTAuthenticator) Init(auth *Authentication, conf interface{}) error { func (ja *JWTAuthenticator) AuthViaJWT( rw http.ResponseWriter, - r *http.Request) (*User, error) { + r *http.Request) (*schema.User, error) { rawtoken := r.Header.Get("X-Auth-Token") if rawtoken == "" { @@ -90,8 +87,9 @@ func (ja *JWTAuthenticator) AuthViaJWT( var roles []string // Validate user + roles from JWT against database? - if ja.config != nil && ja.config.ForceJWTValidationViaDatabase { - user, err := ja.auth.GetUser(sub) + if ja.config != nil && ja.config.ValidateUser { + ur := repository.GetUserRepository() + user, err := ur.GetUser(sub) // Deny any logins for unknown usernames if err != nil { @@ -111,16 +109,16 @@ func (ja *JWTAuthenticator) AuthViaJWT( } } - return &User{ + return &schema.User{ Username: sub, Roles: roles, - AuthType: AuthToken, + AuthType: schema.AuthToken, AuthSource: -1, }, nil } // Generate a new JWT that can be used for authentication -func (ja *JWTAuthenticator) ProvideJWT(user *User) (string, error) { +func (ja *JWTAuthenticator) ProvideJWT(user *schema.User) (string, error) { if ja.privateKey == nil { return "", errors.New("environment variable 'JWT_PRIVATE_KEY' not set") diff --git a/internal/auth/jwtCookieSession.go b/internal/auth/jwtCookieSession.go index 8f31335..4787107 100644 --- a/internal/auth/jwtCookieSession.go +++ b/internal/auth/jwtCookieSession.go @@ -73,10 +73,10 @@ func (ja *JWTCookieSessionAuthenticator) Init(auth *Authentication, conf interfa log.Warn("cookieName for JWTs not configured (cross login via JWT cookie will fail)") return errors.New("cookieName for JWTs not configured (cross login via JWT cookie will fail)") } - if !ja.config.ForceJWTValidationViaDatabase { + if !ja.config.ValidateUser { log.Warn("forceJWTValidationViaDatabase not set to true: CC will accept users and roles defined in JWTs regardless of its own database!") } - if ja.config.TrustedExternalIssuer == "" { + if ja.config.TrustedIssuer == "" { log.Warn("trustedExternalIssuer for JWTs not configured (cross login via JWT cookie will fail)") return errors.New("trustedExternalIssuer for JWTs not configured (cross login via JWT cookie will fail)") } @@ -89,7 +89,7 @@ func (ja *JWTCookieSessionAuthenticator) Init(auth *Authentication, conf interfa } func (ja *JWTCookieSessionAuthenticator) CanLogin( - user *User, + user *schema.User, username string, rw http.ResponseWriter, r *http.Request) bool { @@ -112,9 +112,9 @@ func (ja *JWTCookieSessionAuthenticator) CanLogin( } func (ja *JWTCookieSessionAuthenticator) Login( - user *User, + user *schema.User, rw http.ResponseWriter, - r *http.Request) (*User, error) { + r *http.Request) (*schema.User, error) { jwtCookie, err := r.Cookie(ja.config.CookieName) var rawtoken string @@ -129,7 +129,7 @@ func (ja *JWTCookieSessionAuthenticator) Login( } unvalidatedIssuer, success := t.Claims.(jwt.MapClaims)["iss"].(string) - if success && unvalidatedIssuer == ja.config.TrustedExternalIssuer { + if success && unvalidatedIssuer == ja.config.TrustedIssuer { // The (unvalidated) issuer seems to be the expected one, // use public cross login key from config return ja.publicKeyCrossLogin, nil @@ -160,7 +160,7 @@ func (ja *JWTCookieSessionAuthenticator) Login( var roles []string - if ja.config.ForceJWTValidationViaDatabase { + if ja.config.ValidateUser { // Deny any logins for unknown usernames if user == nil { log.Warn("Could not find user from JWT in internal database.") @@ -191,12 +191,12 @@ func (ja *JWTCookieSessionAuthenticator) Login( http.SetCookie(rw, deletedCookie) if user == nil { - user = &User{ + user = &schema.User{ Username: sub, Name: name, Roles: roles, - AuthType: AuthSession, - AuthSource: AuthViaToken, + AuthType: schema.AuthSession, + AuthSource: schema.AuthViaToken, } } diff --git a/internal/auth/jwtSession.go b/internal/auth/jwtSession.go index 13af7c1..59250ac 100644 --- a/internal/auth/jwtSession.go +++ b/internal/auth/jwtSession.go @@ -12,21 +12,17 @@ import ( "strings" "github.com/ClusterCockpit/cc-backend/pkg/log" + "github.com/ClusterCockpit/cc-backend/pkg/schema" "github.com/golang-jwt/jwt/v4" ) type JWTSessionAuthenticator struct { - auth *Authentication - loginTokenKey []byte // HS256 key } var _ Authenticator = (*JWTSessionAuthenticator)(nil) func (ja *JWTSessionAuthenticator) Init(auth *Authentication, conf interface{}) error { - - ja.auth = auth - if pubKey := os.Getenv("CROSS_LOGIN_JWT_HS512_KEY"); pubKey != "" { bytes, err := base64.StdEncoding.DecodeString(pubKey) if err != nil { @@ -40,7 +36,7 @@ func (ja *JWTSessionAuthenticator) Init(auth *Authentication, conf interface{}) } func (ja *JWTSessionAuthenticator) CanLogin( - user *User, + user *schema.User, username string, rw http.ResponseWriter, r *http.Request) bool { @@ -49,9 +45,9 @@ func (ja *JWTSessionAuthenticator) CanLogin( } func (ja *JWTSessionAuthenticator) Login( - user *User, + user *schema.User, rw http.ResponseWriter, - r *http.Request) (*User, error) { + r *http.Request) (*schema.User, error) { rawtoken := strings.TrimPrefix(r.Header.Get("Authorization"), "Bearer ") if rawtoken == "" { @@ -92,14 +88,14 @@ func (ja *JWTSessionAuthenticator) Login( if rawroles, ok := claims["roles"].([]interface{}); ok { for _, rr := range rawroles { if r, ok := rr.(string); ok { - if isValidRole(r) { + if schema.IsValidRole(r) { roles = append(roles, r) } } } } else if rawroles, ok := claims["roles"]; ok { for _, r := range rawroles.([]string) { - if isValidRole(r) { + if schema.IsValidRole(r) { roles = append(roles, r) } } @@ -120,13 +116,13 @@ func (ja *JWTSessionAuthenticator) Login( // } if user == nil { - user = &User{ + user = &schema.User{ Username: sub, Name: name, Roles: roles, Projects: projects, - AuthType: AuthSession, - AuthSource: AuthViaToken, + AuthType: schema.AuthSession, + AuthSource: schema.AuthViaToken, } } diff --git a/internal/auth/ldap.go b/internal/auth/ldap.go index 9feebc1..925e967 100644 --- a/internal/auth/ldap.go +++ b/internal/auth/ldap.go @@ -67,12 +67,12 @@ func (la *LdapAuthenticator) Init( } func (la *LdapAuthenticator) CanLogin( - user *User, + user *schema.User, username string, rw http.ResponseWriter, r *http.Request) bool { - if user != nil && user.AuthSource == AuthViaLDAP { + if user != nil && user.AuthSource == schema.AuthViaLDAP { return true } else { if la.config != nil && la.config.SyncUserOnLogin { @@ -103,7 +103,7 @@ func (la *LdapAuthenticator) CanLogin( name := entry.GetAttributeValue("gecos") if _, err := la.auth.db.Exec(`INSERT INTO user (username, ldap, name, roles) VALUES (?, ?, ?, ?)`, - username, 1, name, "[\""+GetRoleString(RoleUser)+"\"]"); err != nil { + username, 1, name, "[\""+schema.GetRoleString(schema.RoleUser)+"\"]"); err != nil { log.Errorf("User '%s' new in LDAP: Insert into DB failed", username) return false } @@ -116,9 +116,9 @@ func (la *LdapAuthenticator) CanLogin( } func (la *LdapAuthenticator) Login( - user *User, + user *schema.User, rw http.ResponseWriter, - r *http.Request) (*User, error) { + r *http.Request) (*schema.User, error) { l, err := la.getLdapConnection(false) if err != nil { @@ -203,7 +203,7 @@ func (la *LdapAuthenticator) Sync() error { name := newnames[username] log.Debugf("sync: add %v (name: %v, roles: [user], ldap: true)", username, name) if _, err := la.auth.db.Exec(`INSERT INTO user (username, ldap, name, roles) VALUES (?, ?, ?, ?)`, - username, 1, name, "[\""+GetRoleString(RoleUser)+"\"]"); err != nil { + username, 1, name, "[\""+schema.GetRoleString(schema.RoleUser)+"\"]"); err != nil { log.Errorf("User '%s' new in LDAP: Insert into DB failed", username) return err } diff --git a/internal/auth/local.go b/internal/auth/local.go index 700db3a..fb1ba0f 100644 --- a/internal/auth/local.go +++ b/internal/auth/local.go @@ -9,6 +9,7 @@ import ( "net/http" "github.com/ClusterCockpit/cc-backend/pkg/log" + "github.com/ClusterCockpit/cc-backend/pkg/schema" "golang.org/x/crypto/bcrypt" ) @@ -27,18 +28,18 @@ func (la *LocalAuthenticator) Init( } func (la *LocalAuthenticator) CanLogin( - user *User, + user *schema.User, username string, rw http.ResponseWriter, r *http.Request) bool { - return user != nil && user.AuthSource == AuthViaLocalPassword + return user != nil && user.AuthSource == schema.AuthViaLocalPassword } func (la *LocalAuthenticator) Login( - user *User, + user *schema.User, rw http.ResponseWriter, - r *http.Request) (*User, error) { + r *http.Request) (*schema.User, error) { if e := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(r.FormValue("password"))); e != nil { diff --git a/internal/auth/users.go b/internal/auth/users.go deleted file mode 100644 index b69533b..0000000 --- a/internal/auth/users.go +++ /dev/null @@ -1,289 +0,0 @@ -// Copyright (C) 2022 NHR@FAU, University Erlangen-Nuremberg. -// All rights reserved. -// Use of this source code is governed by a MIT-style -// license that can be found in the LICENSE file. -package auth - -import ( - "context" - "database/sql" - "encoding/json" - "errors" - "fmt" - "strings" - - "github.com/ClusterCockpit/cc-backend/internal/graph/model" - "github.com/ClusterCockpit/cc-backend/pkg/log" - sq "github.com/Masterminds/squirrel" - "github.com/jmoiron/sqlx" - "golang.org/x/crypto/bcrypt" -) - -func (auth *Authentication) GetUser(username string) (*User, error) { - - user := &User{Username: username} - var hashedPassword, name, rawRoles, email, rawProjects sql.NullString - if err := sq.Select("password", "ldap", "name", "roles", "email", "projects").From("user"). - Where("user.username = ?", username).RunWith(auth.db). - QueryRow().Scan(&hashedPassword, &user.AuthSource, &name, &rawRoles, &email, &rawProjects); err != nil { - log.Warnf("Error while querying user '%v' from database", username) - return nil, err - } - - user.Password = hashedPassword.String - user.Name = name.String - user.Email = email.String - if rawRoles.Valid { - if err := json.Unmarshal([]byte(rawRoles.String), &user.Roles); err != nil { - log.Warn("Error while unmarshaling raw roles from DB") - return nil, err - } - } - if rawProjects.Valid { - if err := json.Unmarshal([]byte(rawProjects.String), &user.Projects); err != nil { - return nil, err - } - } - - return user, nil -} - -func (auth *Authentication) AddUser(user *User) error { - - rolesJson, _ := json.Marshal(user.Roles) - projectsJson, _ := json.Marshal(user.Projects) - - cols := []string{"username", "roles", "projects"} - vals := []interface{}{user.Username, string(rolesJson), string(projectsJson)} - - if user.Name != "" { - cols = append(cols, "name") - vals = append(vals, user.Name) - } - if user.Email != "" { - cols = append(cols, "email") - vals = append(vals, user.Email) - } - if user.Password != "" { - password, err := bcrypt.GenerateFromPassword([]byte(user.Password), bcrypt.DefaultCost) - if err != nil { - log.Error("Error while encrypting new user password") - return err - } - cols = append(cols, "password") - vals = append(vals, string(password)) - } - - if _, err := sq.Insert("user").Columns(cols...).Values(vals...).RunWith(auth.db).Exec(); err != nil { - log.Errorf("Error while inserting new user '%v' into DB", user.Username) - return err - } - - log.Infof("new user %#v created (roles: %s, auth-source: %d, projects: %s)", user.Username, rolesJson, user.AuthSource, projectsJson) - return nil -} - -func (auth *Authentication) DelUser(username string) error { - - _, err := auth.db.Exec(`DELETE FROM user WHERE user.username = ?`, username) - log.Errorf("Error while deleting user '%s' from DB", username) - return err -} - -func (auth *Authentication) ListUsers(specialsOnly bool) ([]*User, error) { - - q := sq.Select("username", "name", "email", "roles", "projects").From("user") - if specialsOnly { - q = q.Where("(roles != '[\"user\"]' AND roles != '[]')") - } - - rows, err := q.RunWith(auth.db).Query() - if err != nil { - log.Warn("Error while querying user list") - return nil, err - } - - users := make([]*User, 0) - defer rows.Close() - for rows.Next() { - rawroles := "" - rawprojects := "" - user := &User{} - var name, email sql.NullString - if err := rows.Scan(&user.Username, &name, &email, &rawroles, &rawprojects); err != nil { - log.Warn("Error while scanning user list") - return nil, err - } - - if err := json.Unmarshal([]byte(rawroles), &user.Roles); err != nil { - log.Warn("Error while unmarshaling raw role list") - return nil, err - } - - if err := json.Unmarshal([]byte(rawprojects), &user.Projects); err != nil { - return nil, err - } - - user.Name = name.String - user.Email = email.String - users = append(users, user) - } - return users, nil -} - -func (auth *Authentication) AddRole( - ctx context.Context, - username string, - queryrole string) error { - - newRole := strings.ToLower(queryrole) - user, err := auth.GetUser(username) - if err != nil { - log.Warnf("Could not load user '%s'", username) - return err - } - - exists, valid := user.HasValidRole(newRole) - - if !valid { - return fmt.Errorf("Supplied role is no valid option : %v", newRole) - } - if exists { - return fmt.Errorf("User %v already has role %v", username, newRole) - } - - roles, _ := json.Marshal(append(user.Roles, newRole)) - if _, err := sq.Update("user").Set("roles", roles).Where("user.username = ?", username).RunWith(auth.db).Exec(); err != nil { - log.Errorf("Error while adding new role for user '%s'", user.Username) - return err - } - return nil -} - -func (auth *Authentication) RemoveRole(ctx context.Context, username string, queryrole string) error { - oldRole := strings.ToLower(queryrole) - user, err := auth.GetUser(username) - if err != nil { - log.Warnf("Could not load user '%s'", username) - return err - } - - exists, valid := user.HasValidRole(oldRole) - - if !valid { - return fmt.Errorf("Supplied role is no valid option : %v", oldRole) - } - if !exists { - return fmt.Errorf("Role already deleted for user '%v': %v", username, oldRole) - } - - if oldRole == GetRoleString(RoleManager) && len(user.Projects) != 0 { - return fmt.Errorf("Cannot remove role 'manager' while user %s still has assigned project(s) : %v", username, user.Projects) - } - - var newroles []string - for _, r := range user.Roles { - if r != oldRole { - newroles = append(newroles, r) // Append all roles not matching requested to be deleted role - } - } - - var mroles, _ = json.Marshal(newroles) - if _, err := sq.Update("user").Set("roles", mroles).Where("user.username = ?", username).RunWith(auth.db).Exec(); err != nil { - log.Errorf("Error while removing role for user '%s'", user.Username) - return err - } - return nil -} - -func (auth *Authentication) AddProject( - ctx context.Context, - username string, - project string) error { - - user, err := auth.GetUser(username) - if err != nil { - return err - } - - if !user.HasRole(RoleManager) { - return fmt.Errorf("user '%s' is not a manager!", username) - } - - if user.HasProject(project) { - return fmt.Errorf("user '%s' already manages project '%s'", username, project) - } - - projects, _ := json.Marshal(append(user.Projects, project)) - if _, err := sq.Update("user").Set("projects", projects).Where("user.username = ?", username).RunWith(auth.db).Exec(); err != nil { - return err - } - - return nil -} - -func (auth *Authentication) RemoveProject(ctx context.Context, username string, project string) error { - user, err := auth.GetUser(username) - if err != nil { - return err - } - - if !user.HasRole(RoleManager) { - return fmt.Errorf("user '%#v' is not a manager!", username) - } - - if !user.HasProject(project) { - return fmt.Errorf("user '%#v': Cannot remove project '%#v' - Does not match!", username, project) - } - - var exists bool - var newprojects []string - for _, p := range user.Projects { - if p != project { - newprojects = append(newprojects, p) // Append all projects not matching requested to be deleted project - } else { - exists = true - } - } - - if exists == true { - var result interface{} - if len(newprojects) == 0 { - result = "[]" - } else { - result, _ = json.Marshal(newprojects) - } - if _, err := sq.Update("user").Set("projects", result).Where("user.username = ?", username).RunWith(auth.db).Exec(); err != nil { - return err - } - return nil - } else { - return fmt.Errorf("user %s already does not manage project %s", username, project) - } -} - -func FetchUser(ctx context.Context, db *sqlx.DB, username string) (*model.User, error) { - me := GetUser(ctx) - if me != nil && me.Username != username && me.HasNotRoles([]Role{RoleAdmin, RoleSupport, RoleManager}) { - return nil, errors.New("forbidden") - } - - user := &model.User{Username: username} - var name, email sql.NullString - if err := sq.Select("name", "email").From("user").Where("user.username = ?", username). - RunWith(db).QueryRow().Scan(&name, &email); err != nil { - if err == sql.ErrNoRows { - /* This warning will be logged *often* for non-local users, i.e. users mentioned only in job-table or archive, */ - /* since FetchUser will be called to retrieve full name and mail for every job in query/list */ - // log.Warnf("User '%s' Not found in DB", username) - return nil, nil - } - - log.Warnf("Error while fetching user '%s'", username) - return nil, err - } - - user.Name = name.String - user.Email = email.String - return user, nil -} diff --git a/internal/graph/schema.resolvers.go b/internal/graph/schema.resolvers.go index cd24a2a..1be455c 100644 --- a/internal/graph/schema.resolvers.go +++ b/internal/graph/schema.resolvers.go @@ -11,7 +11,6 @@ import ( "strconv" "time" - "github.com/ClusterCockpit/cc-backend/internal/auth" "github.com/ClusterCockpit/cc-backend/internal/graph/generated" "github.com/ClusterCockpit/cc-backend/internal/graph/model" "github.com/ClusterCockpit/cc-backend/internal/metricdata" @@ -51,7 +50,7 @@ func (r *jobResolver) MetaData(ctx context.Context, obj *schema.Job) (interface{ // UserData is the resolver for the userData field. func (r *jobResolver) UserData(ctx context.Context, obj *schema.Job) (*model.User, error) { - return auth.FetchUser(ctx, r.DB, obj.User) + return repository.GetUserRepository().FetchUserInCtx(ctx, obj.User) } // CreateTag is the resolver for the createTag field. @@ -122,7 +121,7 @@ func (r *mutationResolver) RemoveTagsFromJob(ctx context.Context, job string, ta // UpdateConfiguration is the resolver for the updateConfiguration field. func (r *mutationResolver) UpdateConfiguration(ctx context.Context, name string, value string) (*string, error) { - if err := repository.GetUserCfgRepo().UpdateConfig(name, value, auth.GetUser(ctx)); err != nil { + if err := repository.GetUserCfgRepo().UpdateConfig(name, value, repository.GetUserFromContext(ctx)); err != nil { log.Warn("Error while updating user config") return nil, err } @@ -142,7 +141,7 @@ func (r *queryResolver) Tags(ctx context.Context) ([]*schema.Tag, error) { // User is the resolver for the user field. func (r *queryResolver) User(ctx context.Context, username string) (*model.User, error) { - return auth.FetchUser(ctx, r.DB, username) + return repository.GetUserRepository().FetchUserInCtx(ctx, username) } // AllocatedNodes is the resolver for the allocatedNodes field. @@ -178,7 +177,9 @@ func (r *queryResolver) Job(ctx context.Context, id string) (*schema.Job, error) return nil, err } - if user := auth.GetUser(ctx); user != nil && job.User != user.Username && user.HasNotRoles([]auth.Role{auth.RoleAdmin, auth.RoleSupport, auth.RoleManager}) { + if user := repository.GetUserFromContext(ctx); user != nil && + job.User != user.Username && + user.HasNotRoles([]schema.Role{schema.RoleAdmin, schema.RoleSupport, schema.RoleManager}) { return nil, errors.New("you are not allowed to see this job") } @@ -318,8 +319,8 @@ func (r *queryResolver) RooflineHeatmap(ctx context.Context, filter []*model.Job // NodeMetrics is the resolver for the nodeMetrics field. func (r *queryResolver) NodeMetrics(ctx context.Context, cluster string, nodes []string, scopes []schema.MetricScope, metrics []string, from time.Time, to time.Time) ([]*model.NodeMetrics, error) { - user := auth.GetUser(ctx) - if user != nil && !user.HasRole(auth.RoleAdmin) { + user := repository.GetUserFromContext(ctx) + if user != nil && !user.HasRole(schema.RoleAdmin) { return nil, errors.New("you need to be an administrator for this query") } diff --git a/internal/repository/job.go b/internal/repository/job.go index b712a86..449c267 100644 --- a/internal/repository/job.go +++ b/internal/repository/job.go @@ -14,7 +14,6 @@ import ( "sync" "time" - "github.com/ClusterCockpit/cc-backend/internal/auth" "github.com/ClusterCockpit/cc-backend/internal/graph/model" "github.com/ClusterCockpit/cc-backend/internal/metricdata" "github.com/ClusterCockpit/cc-backend/pkg/log" @@ -615,7 +614,7 @@ func (r *JobRepository) WaitForArchiving() { r.archivePending.Wait() } -func (r *JobRepository) FindUserOrProjectOrJobname(user *auth.User, searchterm string) (jobid string, username string, project string, jobname string) { +func (r *JobRepository) FindUserOrProjectOrJobname(user *schema.User, searchterm string) (jobid string, username string, project string, jobname string) { if _, err := strconv.Atoi(searchterm); err == nil { // Return empty on successful conversion: parent method will redirect for integer jobId return searchterm, "", "", "" } else { // Has to have letters and logged-in user for other guesses @@ -644,14 +643,14 @@ func (r *JobRepository) FindUserOrProjectOrJobname(user *auth.User, searchterm s var ErrNotFound = errors.New("no such jobname, project or user") var ErrForbidden = errors.New("not authorized") -func (r *JobRepository) FindColumnValue(user *auth.User, searchterm string, table string, selectColumn string, whereColumn string, isLike bool) (result string, err error) { +func (r *JobRepository) FindColumnValue(user *schema.User, searchterm string, table string, selectColumn string, whereColumn string, isLike bool) (result string, err error) { compareStr := " = ?" query := searchterm if isLike { compareStr = " LIKE ?" query = "%" + searchterm + "%" } - if user.HasAnyRole([]auth.Role{auth.RoleAdmin, auth.RoleSupport, auth.RoleManager}) { + if user.HasAnyRole([]schema.Role{schema.RoleAdmin, schema.RoleSupport, schema.RoleManager}) { theQuery := sq.Select(table+"."+selectColumn).Distinct().From(table). Where(table+"."+whereColumn+compareStr, query) @@ -676,9 +675,9 @@ func (r *JobRepository) FindColumnValue(user *auth.User, searchterm string, tabl } } -func (r *JobRepository) FindColumnValues(user *auth.User, query string, table string, selectColumn string, whereColumn string) (results []string, err error) { +func (r *JobRepository) FindColumnValues(user *schema.User, query string, table string, selectColumn string, whereColumn string) (results []string, err error) { emptyResult := make([]string, 0) - if user.HasAnyRole([]auth.Role{auth.RoleAdmin, auth.RoleSupport, auth.RoleManager}) { + if user.HasAnyRole([]schema.Role{schema.RoleAdmin, schema.RoleSupport, schema.RoleManager}) { rows, err := sq.Select(table+"."+selectColumn).Distinct().From(table). Where(table+"."+whereColumn+" LIKE ?", fmt.Sprint("%", query, "%")). RunWith(r.stmtCache).Query() diff --git a/internal/repository/query.go b/internal/repository/query.go index 02e5304..0501fe1 100644 --- a/internal/repository/query.go +++ b/internal/repository/query.go @@ -12,7 +12,6 @@ import ( "strings" "time" - "github.com/ClusterCockpit/cc-backend/internal/auth" "github.com/ClusterCockpit/cc-backend/internal/graph/model" "github.com/ClusterCockpit/cc-backend/pkg/log" "github.com/ClusterCockpit/cc-backend/pkg/schema" @@ -130,20 +129,20 @@ func (r *JobRepository) CountJobs( } func SecurityCheck(ctx context.Context, query sq.SelectBuilder) (sq.SelectBuilder, error) { - user := auth.GetUser(ctx) + user := GetUserFromContext(ctx) if user == nil { var qnil sq.SelectBuilder return qnil, fmt.Errorf("user context is nil!") - } else if user.HasAnyRole([]auth.Role{auth.RoleAdmin, auth.RoleSupport, auth.RoleApi}) { // Admin & Co. : All jobs + } else if user.HasAnyRole([]schema.Role{schema.RoleAdmin, schema.RoleSupport, schema.RoleApi}) { // Admin & Co. : All jobs return query, nil - } else if user.HasRole(auth.RoleManager) { // Manager : Add filter for managed projects' jobs only + personal jobs + } else if user.HasRole(schema.RoleManager) { // Manager : Add filter for managed projects' jobs only + personal jobs if len(user.Projects) != 0 { return query.Where(sq.Or{sq.Eq{"job.project": user.Projects}, sq.Eq{"job.user": user.Username}}), nil } else { log.Debugf("Manager-User '%s' has no defined projects to lookup! Query only personal jobs ...", user.Username) return query.Where("job.user = ?", user.Username), nil } - } else if user.HasRole(auth.RoleUser) { // User : Only personal jobs + } else if user.HasRole(schema.RoleUser) { // User : Only personal jobs return query.Where("job.user = ?", user.Username), nil } else { // Shortterm compatibility: Return User-Query if no roles: diff --git a/internal/repository/stats.go b/internal/repository/stats.go index 158d34a..8a74008 100644 --- a/internal/repository/stats.go +++ b/internal/repository/stats.go @@ -10,7 +10,6 @@ import ( "fmt" "time" - "github.com/ClusterCockpit/cc-backend/internal/auth" "github.com/ClusterCockpit/cc-backend/internal/config" "github.com/ClusterCockpit/cc-backend/internal/graph/model" "github.com/ClusterCockpit/cc-backend/pkg/log" @@ -86,7 +85,7 @@ func (r *JobRepository) buildStatsQuery( } func (r *JobRepository) getUserName(ctx context.Context, id string) string { - user := auth.GetUser(ctx) + user := GetUserFromContext(ctx) name, _ := r.FindColumnValue(user, id, "user", "name", "username", false) if name != "" { return name diff --git a/internal/repository/tags.go b/internal/repository/tags.go index 6c46352..52bc836 100644 --- a/internal/repository/tags.go +++ b/internal/repository/tags.go @@ -7,7 +7,6 @@ package repository import ( "strings" - "github.com/ClusterCockpit/cc-backend/internal/auth" "github.com/ClusterCockpit/cc-backend/pkg/archive" "github.com/ClusterCockpit/cc-backend/pkg/log" "github.com/ClusterCockpit/cc-backend/pkg/schema" @@ -68,7 +67,7 @@ func (r *JobRepository) CreateTag(tagType string, tagName string) (tagId int64, return res.LastInsertId() } -func (r *JobRepository) CountTags(user *auth.User) (tags []schema.Tag, counts map[string]int, err error) { +func (r *JobRepository) CountTags(user *schema.User) (tags []schema.Tag, counts map[string]int, err error) { tags = make([]schema.Tag, 0, 100) xrows, err := r.DB.Queryx("SELECT id, tag_type, tag_name FROM tag") if err != nil { @@ -88,10 +87,10 @@ func (r *JobRepository) CountTags(user *auth.User) (tags []schema.Tag, counts ma LeftJoin("jobtag jt ON t.id = jt.tag_id"). GroupBy("t.tag_name") - if user != nil && user.HasAnyRole([]auth.Role{auth.RoleAdmin, auth.RoleSupport}) { // ADMIN || SUPPORT: Count all jobs + if user != nil && user.HasAnyRole([]schema.Role{schema.RoleAdmin, schema.RoleSupport}) { // ADMIN || SUPPORT: Count all jobs log.Debug("CountTags: User Admin or Support -> Count all Jobs for Tags") // Unchanged: Needs to be own case still, due to UserRole/NoRole compatibility handling in else case - } else if user != nil && user.HasRole(auth.RoleManager) { // MANAGER: Count own jobs plus project's jobs + } else if user != nil && user.HasRole(schema.RoleManager) { // MANAGER: Count own jobs plus project's jobs // Build ("project1", "project2", ...) list of variable length directly in SQL string q = q.Where("jt.job_id IN (SELECT id FROM job WHERE job.user = ? OR job.project IN (\""+strings.Join(user.Projects, "\",\"")+"\"))", user.Username) } else if user != nil { // USER OR NO ROLE (Compatibility): Only count own jobs diff --git a/internal/repository/user.go b/internal/repository/user.go index 6a6fe62..3db7e4d 100644 --- a/internal/repository/user.go +++ b/internal/repository/user.go @@ -1,137 +1,325 @@ -// Copyright (C) 2022 NHR@FAU, University Erlangen-Nuremberg. +// Copyright (C) 2023 NHR@FAU, University Erlangen-Nuremberg. // All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. package repository import ( + "context" + "database/sql" "encoding/json" + "errors" + "fmt" + "strings" "sync" - "time" - "github.com/ClusterCockpit/cc-backend/internal/auth" - "github.com/ClusterCockpit/cc-backend/internal/config" + "github.com/ClusterCockpit/cc-backend/internal/graph/model" "github.com/ClusterCockpit/cc-backend/pkg/log" - "github.com/ClusterCockpit/cc-backend/pkg/lrucache" + "github.com/ClusterCockpit/cc-backend/pkg/schema" + sq "github.com/Masterminds/squirrel" "github.com/jmoiron/sqlx" + "golang.org/x/crypto/bcrypt" ) var ( - userCfgRepoOnce sync.Once - userCfgRepoInstance *UserCfgRepo + userRepoOnce sync.Once + userRepoInstance *UserRepository ) -type UserCfgRepo struct { - DB *sqlx.DB - Lookup *sqlx.Stmt - lock sync.RWMutex - uiDefaults map[string]interface{} - cache *lrucache.Cache +type UserRepository struct { + DB *sqlx.DB + driver string } -func GetUserCfgRepo() *UserCfgRepo { - userCfgRepoOnce.Do(func() { +func GetUserRepository() *UserRepository { + userRepoOnce.Do(func() { db := GetConnection() - lookupConfigStmt, err := db.DB.Preparex(`SELECT confkey, value FROM configuration WHERE configuration.username = ?`) - if err != nil { - log.Fatalf("db.DB.Preparex() error: %v", err) - } - - userCfgRepoInstance = &UserCfgRepo{ - DB: db.DB, - Lookup: lookupConfigStmt, - uiDefaults: config.Keys.UiDefaults, - cache: lrucache.New(1024), + userRepoInstance = &UserRepository{ + DB: db.DB, + driver: db.Driver, } }) - - return userCfgRepoInstance + return userRepoInstance } -// Return the personalised UI config for the currently authenticated -// user or return the plain default config. -func (uCfg *UserCfgRepo) GetUIConfig(user *auth.User) (map[string]interface{}, error) { - if user == nil { - uCfg.lock.RLock() - copy := make(map[string]interface{}, len(uCfg.uiDefaults)) - for k, v := range uCfg.uiDefaults { - copy[k] = v - } - uCfg.lock.RUnlock() - return copy, nil - } - - data := uCfg.cache.Get(user.Username, func() (interface{}, time.Duration, int) { - uiconfig := make(map[string]interface{}, len(uCfg.uiDefaults)) - for k, v := range uCfg.uiDefaults { - uiconfig[k] = v - } - - rows, err := uCfg.Lookup.Query(user.Username) - if err != nil { - log.Warnf("Error while looking up user uiconfig for user '%v'", user.Username) - return err, 0, 0 - } - - size := 0 - defer rows.Close() - for rows.Next() { - var key, rawval string - if err := rows.Scan(&key, &rawval); err != nil { - log.Warn("Error while scanning user uiconfig values") - return err, 0, 0 - } - - var val interface{} - if err := json.Unmarshal([]byte(rawval), &val); err != nil { - log.Warn("Error while unmarshaling raw user uiconfig json") - return err, 0, 0 - } - - size += len(key) - size += len(rawval) - uiconfig[key] = val - } - - // Add global ShortRunningJobsDuration setting as plot_list_hideShortRunningJobs - uiconfig["plot_list_hideShortRunningJobs"] = config.Keys.ShortRunningJobsDuration - - return uiconfig, 24 * time.Hour, size - }) - if err, ok := data.(error); ok { - log.Error("Error in returned dataset") +func (r *UserRepository) GetUser(username string) (*schema.User, error) { + user := &schema.User{Username: username} + var hashedPassword, name, rawRoles, email, rawProjects sql.NullString + if err := sq.Select("password", "ldap", "name", "roles", "email", "projects").From("user"). + Where("user.username = ?", username).RunWith(r.DB). + QueryRow().Scan(&hashedPassword, &user.AuthSource, &name, &rawRoles, &email, &rawProjects); err != nil { + log.Warnf("Error while querying user '%v' from database", username) return nil, err } - return data.(map[string]interface{}), nil -} - -// If the context does not have a user, update the global ui configuration -// without persisting it! If there is a (authenticated) user, update only his -// configuration. -func (uCfg *UserCfgRepo) UpdateConfig( - key, value string, - user *auth.User) error { - - if user == nil { - var val interface{} - if err := json.Unmarshal([]byte(value), &val); err != nil { - log.Warn("Error while unmarshaling raw user config json") - return err + user.Password = hashedPassword.String + user.Name = name.String + user.Email = email.String + if rawRoles.Valid { + if err := json.Unmarshal([]byte(rawRoles.String), &user.Roles); err != nil { + log.Warn("Error while unmarshaling raw roles from DB") + return nil, err + } + } + if rawProjects.Valid { + if err := json.Unmarshal([]byte(rawProjects.String), &user.Projects); err != nil { + return nil, err } - - uCfg.lock.Lock() - defer uCfg.lock.Unlock() - uCfg.uiDefaults[key] = val - return nil } - if _, err := uCfg.DB.Exec(`REPLACE INTO configuration (username, confkey, value) VALUES (?, ?, ?)`, user.Username, key, value); err != nil { - log.Warnf("Error while replacing user config in DB for user '%v'", user.Username) + return user, nil +} + +func (r *UserRepository) AddUser(user *schema.User) error { + rolesJson, _ := json.Marshal(user.Roles) + projectsJson, _ := json.Marshal(user.Projects) + + cols := []string{"username", "roles", "projects"} + vals := []interface{}{user.Username, string(rolesJson), string(projectsJson)} + + if user.Name != "" { + cols = append(cols, "name") + vals = append(vals, user.Name) + } + if user.Email != "" { + cols = append(cols, "email") + vals = append(vals, user.Email) + } + if user.Password != "" { + password, err := bcrypt.GenerateFromPassword([]byte(user.Password), bcrypt.DefaultCost) + if err != nil { + log.Error("Error while encrypting new user password") + return err + } + cols = append(cols, "password") + vals = append(vals, string(password)) + } + + if _, err := sq.Insert("user").Columns(cols...).Values(vals...).RunWith(r.DB).Exec(); err != nil { + log.Errorf("Error while inserting new user '%v' into DB", user.Username) return err } - uCfg.cache.Del(user.Username) + log.Infof("new user %#v created (roles: %s, auth-source: %d, projects: %s)", user.Username, rolesJson, user.AuthSource, projectsJson) return nil } + +func (r *UserRepository) DelUser(username string) error { + + _, err := r.DB.Exec(`DELETE FROM user WHERE user.username = ?`, username) + log.Errorf("Error while deleting user '%s' from DB", username) + return err +} + +func (r *UserRepository) ListUsers(specialsOnly bool) ([]*schema.User, error) { + + q := sq.Select("username", "name", "email", "roles", "projects").From("user") + if specialsOnly { + q = q.Where("(roles != '[\"user\"]' AND roles != '[]')") + } + + rows, err := q.RunWith(r.DB).Query() + if err != nil { + log.Warn("Error while querying user list") + return nil, err + } + + users := make([]*schema.User, 0) + defer rows.Close() + for rows.Next() { + rawroles := "" + rawprojects := "" + user := &schema.User{} + var name, email sql.NullString + if err := rows.Scan(&user.Username, &name, &email, &rawroles, &rawprojects); err != nil { + log.Warn("Error while scanning user list") + return nil, err + } + + if err := json.Unmarshal([]byte(rawroles), &user.Roles); err != nil { + log.Warn("Error while unmarshaling raw role list") + return nil, err + } + + if err := json.Unmarshal([]byte(rawprojects), &user.Projects); err != nil { + return nil, err + } + + user.Name = name.String + user.Email = email.String + users = append(users, user) + } + return users, nil +} + +func (r *UserRepository) AddRole( + ctx context.Context, + username string, + queryrole string) error { + + newRole := strings.ToLower(queryrole) + user, err := r.GetUser(username) + if err != nil { + log.Warnf("Could not load user '%s'", username) + return err + } + + exists, valid := user.HasValidRole(newRole) + + if !valid { + return fmt.Errorf("Supplied role is no valid option : %v", newRole) + } + if exists { + return fmt.Errorf("User %v already has role %v", username, newRole) + } + + roles, _ := json.Marshal(append(user.Roles, newRole)) + if _, err := sq.Update("user").Set("roles", roles).Where("user.username = ?", username).RunWith(r.DB).Exec(); err != nil { + log.Errorf("Error while adding new role for user '%s'", user.Username) + return err + } + return nil +} + +func (r *UserRepository) RemoveRole(ctx context.Context, username string, queryrole string) error { + oldRole := strings.ToLower(queryrole) + user, err := r.GetUser(username) + if err != nil { + log.Warnf("Could not load user '%s'", username) + return err + } + + exists, valid := user.HasValidRole(oldRole) + + if !valid { + return fmt.Errorf("Supplied role is no valid option : %v", oldRole) + } + if !exists { + return fmt.Errorf("Role already deleted for user '%v': %v", username, oldRole) + } + + if oldRole == schema.GetRoleString(schema.RoleManager) && len(user.Projects) != 0 { + return fmt.Errorf("Cannot remove role 'manager' while user %s still has assigned project(s) : %v", username, user.Projects) + } + + var newroles []string + for _, r := range user.Roles { + if r != oldRole { + newroles = append(newroles, r) // Append all roles not matching requested to be deleted role + } + } + + var mroles, _ = json.Marshal(newroles) + if _, err := sq.Update("user").Set("roles", mroles).Where("user.username = ?", username).RunWith(r.DB).Exec(); err != nil { + log.Errorf("Error while removing role for user '%s'", user.Username) + return err + } + return nil +} + +func (r *UserRepository) AddProject( + ctx context.Context, + username string, + project string) error { + + user, err := r.GetUser(username) + if err != nil { + return err + } + + if !user.HasRole(schema.RoleManager) { + return fmt.Errorf("user '%s' is not a manager!", username) + } + + if user.HasProject(project) { + return fmt.Errorf("user '%s' already manages project '%s'", username, project) + } + + projects, _ := json.Marshal(append(user.Projects, project)) + if _, err := sq.Update("user").Set("projects", projects).Where("user.username = ?", username).RunWith(r.DB).Exec(); err != nil { + return err + } + + return nil +} + +func (r *UserRepository) RemoveProject(ctx context.Context, username string, project string) error { + user, err := r.GetUser(username) + if err != nil { + return err + } + + if !user.HasRole(schema.RoleManager) { + return fmt.Errorf("user '%#v' is not a manager!", username) + } + + if !user.HasProject(project) { + return fmt.Errorf("user '%#v': Cannot remove project '%#v' - Does not match!", username, project) + } + + var exists bool + var newprojects []string + for _, p := range user.Projects { + if p != project { + newprojects = append(newprojects, p) // Append all projects not matching requested to be deleted project + } else { + exists = true + } + } + + if exists == true { + var result interface{} + if len(newprojects) == 0 { + result = "[]" + } else { + result, _ = json.Marshal(newprojects) + } + if _, err := sq.Update("user").Set("projects", result).Where("user.username = ?", username).RunWith(r.DB).Exec(); err != nil { + return err + } + return nil + } else { + return fmt.Errorf("user %s already does not manage project %s", username, project) + } +} + +type ContextKey string + +const ContextUserKey ContextKey = "user" + +func GetUserFromContext(ctx context.Context) *schema.User { + x := ctx.Value(ContextUserKey) + if x == nil { + return nil + } + + return x.(*schema.User) +} + +func (r *UserRepository) FetchUserInCtx(ctx context.Context, username string) (*model.User, error) { + me := GetUserFromContext(ctx) + if me != nil && me.Username != username && + me.HasNotRoles([]schema.Role{schema.RoleAdmin, schema.RoleSupport, schema.RoleManager}) { + return nil, errors.New("forbidden") + } + + user := &model.User{Username: username} + var name, email sql.NullString + if err := sq.Select("name", "email").From("user").Where("user.username = ?", username). + RunWith(r.DB).QueryRow().Scan(&name, &email); err != nil { + if err == sql.ErrNoRows { + /* This warning will be logged *often* for non-local users, i.e. users mentioned only in job-table or archive, */ + /* since FetchUser will be called to retrieve full name and mail for every job in query/list */ + // log.Warnf("User '%s' Not found in DB", username) + return nil, nil + } + + log.Warnf("Error while fetching user '%s'", username) + return nil, err + } + + user.Name = name.String + user.Email = email.String + return user, nil +} diff --git a/internal/repository/userConfig.go b/internal/repository/userConfig.go new file mode 100644 index 0000000..fb8c3f5 --- /dev/null +++ b/internal/repository/userConfig.go @@ -0,0 +1,137 @@ +// Copyright (C) 2022 NHR@FAU, University Erlangen-Nuremberg. +// All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. +package repository + +import ( + "encoding/json" + "sync" + "time" + + "github.com/ClusterCockpit/cc-backend/internal/config" + "github.com/ClusterCockpit/cc-backend/pkg/log" + "github.com/ClusterCockpit/cc-backend/pkg/lrucache" + "github.com/ClusterCockpit/cc-backend/pkg/schema" + "github.com/jmoiron/sqlx" +) + +var ( + userCfgRepoOnce sync.Once + userCfgRepoInstance *UserCfgRepo +) + +type UserCfgRepo struct { + DB *sqlx.DB + Lookup *sqlx.Stmt + lock sync.RWMutex + uiDefaults map[string]interface{} + cache *lrucache.Cache +} + +func GetUserCfgRepo() *UserCfgRepo { + userCfgRepoOnce.Do(func() { + db := GetConnection() + + lookupConfigStmt, err := db.DB.Preparex(`SELECT confkey, value FROM configuration WHERE configuration.username = ?`) + if err != nil { + log.Fatalf("db.DB.Preparex() error: %v", err) + } + + userCfgRepoInstance = &UserCfgRepo{ + DB: db.DB, + Lookup: lookupConfigStmt, + uiDefaults: config.Keys.UiDefaults, + cache: lrucache.New(1024), + } + }) + + return userCfgRepoInstance +} + +// Return the personalised UI config for the currently authenticated +// user or return the plain default config. +func (uCfg *UserCfgRepo) GetUIConfig(user *schema.User) (map[string]interface{}, error) { + if user == nil { + uCfg.lock.RLock() + copy := make(map[string]interface{}, len(uCfg.uiDefaults)) + for k, v := range uCfg.uiDefaults { + copy[k] = v + } + uCfg.lock.RUnlock() + return copy, nil + } + + data := uCfg.cache.Get(user.Username, func() (interface{}, time.Duration, int) { + uiconfig := make(map[string]interface{}, len(uCfg.uiDefaults)) + for k, v := range uCfg.uiDefaults { + uiconfig[k] = v + } + + rows, err := uCfg.Lookup.Query(user.Username) + if err != nil { + log.Warnf("Error while looking up user uiconfig for user '%v'", user.Username) + return err, 0, 0 + } + + size := 0 + defer rows.Close() + for rows.Next() { + var key, rawval string + if err := rows.Scan(&key, &rawval); err != nil { + log.Warn("Error while scanning user uiconfig values") + return err, 0, 0 + } + + var val interface{} + if err := json.Unmarshal([]byte(rawval), &val); err != nil { + log.Warn("Error while unmarshaling raw user uiconfig json") + return err, 0, 0 + } + + size += len(key) + size += len(rawval) + uiconfig[key] = val + } + + // Add global ShortRunningJobsDuration setting as plot_list_hideShortRunningJobs + uiconfig["plot_list_hideShortRunningJobs"] = config.Keys.ShortRunningJobsDuration + + return uiconfig, 24 * time.Hour, size + }) + if err, ok := data.(error); ok { + log.Error("Error in returned dataset") + return nil, err + } + + return data.(map[string]interface{}), nil +} + +// If the context does not have a user, update the global ui configuration +// without persisting it! If there is a (authenticated) user, update only his +// configuration. +func (uCfg *UserCfgRepo) UpdateConfig( + key, value string, + user *schema.User) error { + + if user == nil { + var val interface{} + if err := json.Unmarshal([]byte(value), &val); err != nil { + log.Warn("Error while unmarshaling raw user config json") + return err + } + + uCfg.lock.Lock() + defer uCfg.lock.Unlock() + uCfg.uiDefaults[key] = val + return nil + } + + if _, err := uCfg.DB.Exec(`REPLACE INTO configuration (username, confkey, value) VALUES (?, ?, ?)`, user.Username, key, value); err != nil { + log.Warnf("Error while replacing user config in DB for user '%v'", user.Username) + return err + } + + uCfg.cache.Del(user.Username) + return nil +} diff --git a/internal/repository/user_test.go b/internal/repository/userConfig_test.go similarity index 94% rename from internal/repository/user_test.go rename to internal/repository/userConfig_test.go index ac3b0d5..0beec7b 100644 --- a/internal/repository/user_test.go +++ b/internal/repository/userConfig_test.go @@ -9,9 +9,9 @@ import ( "path/filepath" "testing" - "github.com/ClusterCockpit/cc-backend/internal/auth" "github.com/ClusterCockpit/cc-backend/internal/config" "github.com/ClusterCockpit/cc-backend/pkg/log" + "github.com/ClusterCockpit/cc-backend/pkg/schema" _ "github.com/mattn/go-sqlite3" ) @@ -53,7 +53,7 @@ func setupUserTest(t *testing.T) *UserCfgRepo { func TestGetUIConfig(t *testing.T) { r := setupUserTest(t) - u := auth.User{Username: "demo"} + u := schema.User{Username: "demo"} cfg, err := r.GetUIConfig(&u) if err != nil { diff --git a/internal/routerConfig/routes.go b/internal/routerConfig/routes.go index 5fad301..322cbf3 100644 --- a/internal/routerConfig/routes.go +++ b/internal/routerConfig/routes.go @@ -13,11 +13,11 @@ import ( "strings" "time" - "github.com/ClusterCockpit/cc-backend/internal/auth" "github.com/ClusterCockpit/cc-backend/internal/graph/model" "github.com/ClusterCockpit/cc-backend/internal/repository" "github.com/ClusterCockpit/cc-backend/internal/util" "github.com/ClusterCockpit/cc-backend/pkg/log" + "github.com/ClusterCockpit/cc-backend/pkg/schema" "github.com/ClusterCockpit/cc-backend/web" "github.com/gorilla/mux" ) @@ -81,12 +81,11 @@ func setupJobRoute(i InfoType, r *http.Request) InfoType { } func setupUserRoute(i InfoType, r *http.Request) InfoType { - jobRepo := repository.GetJobRepository() username := mux.Vars(r)["id"] i["id"] = username i["username"] = username // TODO: If forbidden (== err exists), redirect to error page - if user, _ := auth.FetchUser(r.Context(), jobRepo.DB, username); user != nil { + if user, _ := repository.GetUserRepository().FetchUserInCtx(r.Context(), username); user != nil { i["name"] = user.Name i["email"] = user.Email } @@ -125,7 +124,7 @@ func setupAnalysisRoute(i InfoType, r *http.Request) InfoType { func setupTaglistRoute(i InfoType, r *http.Request) InfoType { jobRepo := repository.GetJobRepository() - user := auth.GetUser(r.Context()) + user := repository.GetUserFromContext(r.Context()) tags, counts, err := jobRepo.CountTags(user) tagMap := make(map[string][]map[string]interface{}) @@ -255,7 +254,7 @@ func SetupRoutes(router *mux.Router, buildInfo web.Build) { for _, route := range routes { route := route router.HandleFunc(route.Route, func(rw http.ResponseWriter, r *http.Request) { - conf, err := userCfgRepo.GetUIConfig(auth.GetUser(r.Context())) + conf, err := userCfgRepo.GetUIConfig(repository.GetUserFromContext(r.Context())) if err != nil { http.Error(rw, err.Error(), http.StatusInternalServerError) return @@ -268,9 +267,9 @@ func SetupRoutes(router *mux.Router, buildInfo web.Build) { } // Get User -> What if NIL? - user := auth.GetUser(r.Context()) + user := repository.GetUserFromContext(r.Context()) // Get Roles - availableRoles, _ := auth.GetValidRolesMap(user) + availableRoles, _ := schema.GetValidRolesMap(user) page := web.Page{ Title: title, @@ -285,14 +284,14 @@ func SetupRoutes(router *mux.Router, buildInfo web.Build) { page.FilterPresets = buildFilterPresets(r.URL.Query()) } - web.RenderTemplate(rw, r, route.Template, &page) + web.RenderTemplate(rw, route.Template, &page) }) } } func HandleSearchBar(rw http.ResponseWriter, r *http.Request, buildInfo web.Build) { - user := auth.GetUser(r.Context()) - availableRoles, _ := auth.GetValidRolesMap(user) + user := repository.GetUserFromContext(r.Context()) + availableRoles, _ := schema.GetValidRolesMap(user) if search := r.URL.Query().Get("searchId"); search != "" { repo := repository.GetJobRepository() @@ -309,10 +308,10 @@ func HandleSearchBar(rw http.ResponseWriter, r *http.Request, buildInfo web.Buil case "arrayJobId": http.Redirect(rw, r, "/monitoring/jobs/?arrayJobId="+url.QueryEscape(strings.Trim(splitSearch[1], " ")), http.StatusFound) // All Users: Redirect to Tablequery case "username": - if user.HasAnyRole([]auth.Role{auth.RoleAdmin, auth.RoleSupport, auth.RoleManager}) { + if user.HasAnyRole([]schema.Role{schema.RoleAdmin, schema.RoleSupport, schema.RoleManager}) { http.Redirect(rw, r, "/monitoring/users/?user="+url.QueryEscape(strings.Trim(splitSearch[1], " ")), http.StatusFound) } else { - web.RenderTemplate(rw, r, "message.tmpl", &web.Page{Title: "Error", MsgType: "alert-danger", Message: "Missing Access Rights", User: *user, Roles: availableRoles, Build: buildInfo}) + web.RenderTemplate(rw, "message.tmpl", &web.Page{Title: "Error", MsgType: "alert-danger", Message: "Missing Access Rights", User: *user, Roles: availableRoles, Build: buildInfo}) } case "name": usernames, _ := repo.FindColumnValues(user, strings.Trim(splitSearch[1], " "), "user", "username", "name") @@ -320,14 +319,14 @@ func HandleSearchBar(rw http.ResponseWriter, r *http.Request, buildInfo web.Buil joinedNames := strings.Join(usernames, "&user=") http.Redirect(rw, r, "/monitoring/users/?user="+joinedNames, http.StatusFound) } else { - if user.HasAnyRole([]auth.Role{auth.RoleAdmin, auth.RoleSupport, auth.RoleManager}) { + if user.HasAnyRole([]schema.Role{schema.RoleAdmin, schema.RoleSupport, schema.RoleManager}) { http.Redirect(rw, r, "/monitoring/users/?user=NoUserNameFound", http.StatusPermanentRedirect) } else { - web.RenderTemplate(rw, r, "message.tmpl", &web.Page{Title: "Error", MsgType: "alert-danger", Message: "Missing Access Rights", User: *user, Roles: availableRoles, Build: buildInfo}) + web.RenderTemplate(rw, "message.tmpl", &web.Page{Title: "Error", MsgType: "alert-danger", Message: "Missing Access Rights", User: *user, Roles: availableRoles, Build: buildInfo}) } } default: - web.RenderTemplate(rw, r, "message.tmpl", &web.Page{Title: "Warning", MsgType: "alert-warning", Message: fmt.Sprintf("Unknown search type: %s", strings.Trim(splitSearch[0], " ")), User: *user, Roles: availableRoles, Build: buildInfo}) + web.RenderTemplate(rw, "message.tmpl", &web.Page{Title: "Warning", MsgType: "alert-warning", Message: fmt.Sprintf("Unknown search type: %s", strings.Trim(splitSearch[0], " ")), User: *user, Roles: availableRoles, Build: buildInfo}) } } else if len(splitSearch) == 1 { @@ -342,13 +341,13 @@ func HandleSearchBar(rw http.ResponseWriter, r *http.Request, buildInfo web.Buil } else if jobname != "" { http.Redirect(rw, r, "/monitoring/jobs/?jobName="+url.QueryEscape(jobname), http.StatusFound) // JobName (contains) } else { - web.RenderTemplate(rw, r, "message.tmpl", &web.Page{Title: "Info", MsgType: "alert-info", Message: "Search without result", User: *user, Roles: availableRoles, Build: buildInfo}) + web.RenderTemplate(rw, "message.tmpl", &web.Page{Title: "Info", MsgType: "alert-info", Message: "Search without result", User: *user, Roles: availableRoles, Build: buildInfo}) } } else { - web.RenderTemplate(rw, r, "message.tmpl", &web.Page{Title: "Error", MsgType: "alert-danger", Message: "Searchbar query parameters malformed", User: *user, Roles: availableRoles, Build: buildInfo}) + web.RenderTemplate(rw, "message.tmpl", &web.Page{Title: "Error", MsgType: "alert-danger", Message: "Searchbar query parameters malformed", User: *user, Roles: availableRoles, Build: buildInfo}) } } else { - web.RenderTemplate(rw, r, "message.tmpl", &web.Page{Title: "Warning", MsgType: "alert-warning", Message: "Empty search", User: *user, Roles: availableRoles, Build: buildInfo}) + web.RenderTemplate(rw, "message.tmpl", &web.Page{Title: "Warning", MsgType: "alert-warning", Message: "Empty search", User: *user, Roles: availableRoles, Build: buildInfo}) } } diff --git a/pkg/schema/config.go b/pkg/schema/config.go index 95cc641..efcd6f9 100644 --- a/pkg/schema/config.go +++ b/pkg/schema/config.go @@ -17,7 +17,9 @@ type LdapConfig struct { UserFilter string `json:"user_filter"` SyncInterval string `json:"sync_interval"` // Parsed using time.ParseDuration. SyncDelOldUsers bool `json:"sync_del_old_users"` - SyncUserOnLogin bool `json:"syncUserOnLogin"` + + // Should an non-existent user be added to the DB if user exists in ldap directory + SyncUserOnLogin bool `json:"syncUserOnLogin"` } type JWTAuthConfig struct { @@ -30,10 +32,13 @@ type JWTAuthConfig struct { // Deny login for users not in database (but defined in JWT). // Ignore user roles defined in JWTs ('roles' claim), get them from db. - ForceJWTValidationViaDatabase bool `json:"forceJWTValidationViaDatabase"` + ValidateUser bool `json:"validateUser"` // Specifies which issuer should be accepted when validating external JWTs ('iss' claim) - TrustedExternalIssuer string `json:"trustedExternalIssuer"` + TrustedIssuer string `json:"trustedIssuer"` + + // Should an non-existent user be added to the DB based on the information in the token + SyncUserOnLogin bool `json:"syncUserOnLogin"` } type IntRange struct { diff --git a/internal/auth/roles.go b/pkg/schema/user.go similarity index 82% rename from internal/auth/roles.go rename to pkg/schema/user.go index e352df1..1547d3f 100644 --- a/internal/auth/roles.go +++ b/pkg/schema/user.go @@ -2,7 +2,7 @@ // All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. -package auth +package schema import ( "fmt" @@ -21,6 +21,41 @@ const ( RoleError ) +type AuthSource int + +const ( + AuthViaLocalPassword AuthSource = iota + AuthViaLDAP + AuthViaToken +) + +type AuthType int + +const ( + AuthToken AuthType = iota + AuthSession +) + +type User struct { + Username string `json:"username"` + Password string `json:"-"` + Name string `json:"name"` + Roles []string `json:"roles"` + AuthType AuthType `json:"authType"` + AuthSource AuthSource `json:"authSource"` + Email string `json:"email"` + Projects []string `json:"projects"` +} + +func (u *User) HasProject(project string) bool { + for _, p := range u.Projects { + if p == project { + return true + } + } + return false +} + func GetRoleString(roleInt Role) string { return [6]string{"anonymous", "api", "user", "manager", "support", "admin"}[roleInt] } @@ -44,12 +79,12 @@ func getRoleEnum(roleStr string) Role { } } -func isValidRole(role string) bool { +func IsValidRole(role string) bool { return getRoleEnum(role) != RoleError } func (u *User) HasValidRole(role string) (hasRole bool, isValid bool) { - if isValidRole(role) { + if IsValidRole(role) { for _, r := range u.Roles { if r == role { return true, true diff --git a/internal/auth/auth_test.go b/pkg/schema/user_test.go similarity index 99% rename from internal/auth/auth_test.go rename to pkg/schema/user_test.go index 81aa4eb..cd054c3 100644 --- a/internal/auth/auth_test.go +++ b/pkg/schema/user_test.go @@ -2,7 +2,7 @@ // All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. -package auth +package schema import ( "testing" diff --git a/web/web.go b/web/web.go index c94c2b1..8d4ce4b 100644 --- a/web/web.go +++ b/web/web.go @@ -11,7 +11,6 @@ import ( "net/http" "strings" - "github.com/ClusterCockpit/cc-backend/internal/auth" "github.com/ClusterCockpit/cc-backend/internal/config" "github.com/ClusterCockpit/cc-backend/internal/util" "github.com/ClusterCockpit/cc-backend/pkg/log" @@ -92,8 +91,8 @@ type Page struct { Title string // Page title MsgType string // For generic use in message boxes Message string // For generic use in message boxes - User auth.User // Information about the currently logged in user (Full User Info) - Roles map[string]auth.Role // Available roles for frontend render checks + User schema.User // Information about the currently logged in user (Full User Info) + Roles map[string]schema.Role // Available roles for frontend render checks Build Build // Latest information about the application Clusters []schema.ClusterConfig // List of all clusters for use in the Header FilterPresets map[string]interface{} // For pages with the Filter component, this can be used to set initial filters. @@ -101,7 +100,7 @@ type Page struct { Config map[string]interface{} // UI settings for the currently logged in user (e.g. line width, ...) } -func RenderTemplate(rw http.ResponseWriter, r *http.Request, file string, page *Page) { +func RenderTemplate(rw http.ResponseWriter, file string, page *Page) { t, ok := templates[file] if !ok { log.Errorf("WEB/WEB > template '%s' not found", file) From c7a04328d9c91151fb3a9b55a36c99c4f55a8bb7 Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Thu, 17 Aug 2023 10:35:16 +0200 Subject: [PATCH 38/95] Fix schema and tests --- configs/config.json | 4 ++-- pkg/schema/schemas/config.schema.json | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/configs/config.json b/configs/config.json index 1cc2550..6c4d4bd 100644 --- a/configs/config.json +++ b/configs/config.json @@ -42,9 +42,9 @@ ], "jwts": { "cookieName": "", - "forceJWTValidationViaDatabase": false, + "validateUser": false, "max-age": 0, - "trustedExternalIssuer": "" + "trustedIssuer": "" }, "short-running-jobs-duration": 300 } diff --git a/pkg/schema/schemas/config.schema.json b/pkg/schema/schemas/config.schema.json index 6518281..7505c1c 100644 --- a/pkg/schema/schemas/config.schema.json +++ b/pkg/schema/schemas/config.schema.json @@ -107,10 +107,6 @@ "description": "Specifies for how long a session shall be valid as a string parsable by time.ParseDuration(). If 0 or empty, the session/token does not expire!", "type": "string" }, - "jwt-max-age": { - "description": "Specifies for how long a JWT token shall be valid as a string parsable by time.ParseDuration(). If 0 or empty, the session/token does not expire!", - "type": "string" - }, "https-cert-file": { "description": "Filepath to SSL certificate. If also https-key-file is set use HTTPS using those certificates.", "type": "string" @@ -166,6 +162,10 @@ "sync_del_old_users": { "description": "Delete obsolete users in database.", "type": "boolean" + }, + "syncUserOnLogin": { + "description": "Add non-existent user to DB at login attempt if user exists in Ldap directory", + "type": "boolean" } }, "required": [ From 15231bc68358719deb48b4583999744ea38dc92d Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Thu, 17 Aug 2023 12:34:30 +0200 Subject: [PATCH 39/95] Cleanup and adapt to new structure --- cmd/cc-backend/main.go | 2 +- internal/auth/auth.go | 33 ++++------------ internal/auth/jwt.go | 2 +- internal/auth/jwtCookieSession.go | 6 +-- internal/auth/jwtSession.go | 11 +++++- internal/auth/ldap.go | 66 +++++++++++++++++++------------ internal/auth/local.go | 2 - internal/repository/user.go | 26 ++++++++++++ pkg/schema/user.go | 1 + 9 files changed, 89 insertions(+), 60 deletions(-) diff --git a/cmd/cc-backend/main.go b/cmd/cc-backend/main.go index 60c5edd..dd00046 100644 --- a/cmd/cc-backend/main.go +++ b/cmd/cc-backend/main.go @@ -211,7 +211,7 @@ func main() { var authentication *auth.Authentication if !config.Keys.DisableAuthentication { var err error - if authentication, err = auth.Init(db.DB, map[string]interface{}{ + if authentication, err = auth.Init(map[string]interface{}{ "ldap": config.Keys.LdapConfig, "jwt": config.Keys.JwtConfig, }); err != nil { diff --git a/internal/auth/auth.go b/internal/auth/auth.go index d79f28b..cc2bcb4 100644 --- a/internal/auth/auth.go +++ b/internal/auth/auth.go @@ -18,17 +18,15 @@ import ( "github.com/ClusterCockpit/cc-backend/pkg/log" "github.com/ClusterCockpit/cc-backend/pkg/schema" "github.com/gorilla/sessions" - "github.com/jmoiron/sqlx" ) type Authenticator interface { - Init(auth *Authentication, config interface{}) error + Init(config interface{}) error CanLogin(user *schema.User, username string, rw http.ResponseWriter, r *http.Request) bool Login(user *schema.User, rw http.ResponseWriter, r *http.Request) (*schema.User, error) } type Authentication struct { - db *sqlx.DB sessionStore *sessions.CookieStore SessionMaxAge time.Duration @@ -82,10 +80,8 @@ func (auth *Authentication) AuthViaSession( }, nil } -func Init(db *sqlx.DB, - configs map[string]interface{}) (*Authentication, error) { +func Init(configs map[string]interface{}) (*Authentication, error) { auth := &Authentication{} - auth.db = db sessKey := os.Getenv("SESSION_KEY") if sessKey == "" { @@ -106,14 +102,14 @@ func Init(db *sqlx.DB, } auth.JwtAuth = &JWTAuthenticator{} - if err := auth.JwtAuth.Init(auth, configs["jwt"]); err != nil { + if err := auth.JwtAuth.Init(configs["jwt"]); err != nil { log.Error("Error while initializing authentication -> jwtAuth init failed") return nil, err } if config, ok := configs["ldap"]; ok { ldapAuth := &LdapAuthenticator{} - if err := ldapAuth.Init(auth, config); err != nil { + if err := ldapAuth.Init(config); err != nil { log.Warn("Error while initializing authentication -> ldapAuth init failed") } else { auth.LdapAuth = ldapAuth @@ -122,21 +118,21 @@ func Init(db *sqlx.DB, } jwtSessionAuth := &JWTSessionAuthenticator{} - if err := jwtSessionAuth.Init(auth, configs["jwt"]); err != nil { + if err := jwtSessionAuth.Init(configs["jwt"]); err != nil { log.Warn("Error while initializing authentication -> jwtSessionAuth init failed") } else { auth.authenticators = append(auth.authenticators, jwtSessionAuth) } jwtCookieSessionAuth := &JWTCookieSessionAuthenticator{} - if err := jwtCookieSessionAuth.Init(auth, configs["jwt"]); err != nil { + if err := jwtCookieSessionAuth.Init(configs["jwt"]); err != nil { log.Warn("Error while initializing authentication -> jwtCookieSessionAuth init failed") } else { auth.authenticators = append(auth.authenticators, jwtCookieSessionAuth) } auth.LocalAuth = &LocalAuthenticator{} - if err := auth.LocalAuth.Init(auth, nil); err != nil { + if err := auth.LocalAuth.Init(nil); err != nil { log.Error("Error while initializing authentication -> localAuth init failed") return nil, err } @@ -150,13 +146,12 @@ func (auth *Authentication) Login( onfailure func(rw http.ResponseWriter, r *http.Request, loginErr error)) http.Handler { return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { - ur := repository.GetUserRepository() err := errors.New("no authenticator applied") username := r.FormValue("username") dbUser := (*schema.User)(nil) if username != "" { - dbUser, err = ur.GetUser(username) + dbUser, err = repository.GetUserRepository().GetUser(username) if err != nil && err != sql.ErrNoRows { log.Errorf("Error while loading user '%v'", username) } @@ -166,10 +161,6 @@ func (auth *Authentication) Login( if !authenticator.CanLogin(dbUser, username, rw, r) { continue } - dbUser, err = ur.GetUser(username) - if err != nil && err != sql.ErrNoRows { - log.Errorf("Error while loading user '%v'", username) - } user, err := authenticator.Login(dbUser, rw, r) if err != nil { @@ -197,14 +188,6 @@ func (auth *Authentication) Login( return } - if dbUser == nil { - if err := ur.AddUser(user); err != nil { - // TODO Add AuthSource - log.Errorf("Error while adding user '%v' to auth from XX", - user.Username) - } - } - log.Infof("login successfull: user: %#v (roles: %v, projects: %v)", user.Username, user.Roles, user.Projects) ctx := context.WithValue(r.Context(), repository.ContextUserKey, user) onsuccess.ServeHTTP(rw, r.WithContext(ctx)) diff --git a/internal/auth/jwt.go b/internal/auth/jwt.go index 0690b9b..9c0166d 100644 --- a/internal/auth/jwt.go +++ b/internal/auth/jwt.go @@ -25,7 +25,7 @@ type JWTAuthenticator struct { config *schema.JWTAuthConfig } -func (ja *JWTAuthenticator) Init(auth *Authentication, conf interface{}) error { +func (ja *JWTAuthenticator) Init(conf interface{}) error { ja.config = conf.(*schema.JWTAuthConfig) pubKey, privKey := os.Getenv("JWT_PUBLIC_KEY"), os.Getenv("JWT_PRIVATE_KEY") diff --git a/internal/auth/jwtCookieSession.go b/internal/auth/jwtCookieSession.go index 4787107..ad0b033 100644 --- a/internal/auth/jwtCookieSession.go +++ b/internal/auth/jwtCookieSession.go @@ -17,8 +17,6 @@ import ( ) type JWTCookieSessionAuthenticator struct { - auth *Authentication - publicKey ed25519.PublicKey privateKey ed25519.PrivateKey publicKeyCrossLogin ed25519.PublicKey // For accepting externally generated JWTs @@ -28,9 +26,7 @@ type JWTCookieSessionAuthenticator struct { var _ Authenticator = (*JWTCookieSessionAuthenticator)(nil) -func (ja *JWTCookieSessionAuthenticator) Init(auth *Authentication, conf interface{}) error { - - ja.auth = auth +func (ja *JWTCookieSessionAuthenticator) Init(conf interface{}) error { ja.config = conf.(*schema.JWTAuthConfig) pubKey, privKey := os.Getenv("JWT_PUBLIC_KEY"), os.Getenv("JWT_PRIVATE_KEY") diff --git a/internal/auth/jwtSession.go b/internal/auth/jwtSession.go index 59250ac..5a29360 100644 --- a/internal/auth/jwtSession.go +++ b/internal/auth/jwtSession.go @@ -11,6 +11,7 @@ import ( "os" "strings" + "github.com/ClusterCockpit/cc-backend/internal/repository" "github.com/ClusterCockpit/cc-backend/pkg/log" "github.com/ClusterCockpit/cc-backend/pkg/schema" "github.com/golang-jwt/jwt/v4" @@ -18,11 +19,15 @@ import ( type JWTSessionAuthenticator struct { loginTokenKey []byte // HS256 key + + config *schema.JWTAuthConfig } var _ Authenticator = (*JWTSessionAuthenticator)(nil) -func (ja *JWTSessionAuthenticator) Init(auth *Authentication, conf interface{}) error { +func (ja *JWTSessionAuthenticator) Init(conf interface{}) error { + ja.config = conf.(*schema.JWTAuthConfig) + if pubKey := os.Getenv("CROSS_LOGIN_JWT_HS512_KEY"); pubKey != "" { bytes, err := base64.StdEncoding.DecodeString(pubKey) if err != nil { @@ -124,6 +129,10 @@ func (ja *JWTSessionAuthenticator) Login( AuthType: schema.AuthSession, AuthSource: schema.AuthViaToken, } + + if err := repository.GetUserRepository().AddUser(user); err != nil { + log.Errorf("Error while adding user '%s' to DB", user.Username) + } } return user, nil diff --git a/internal/auth/ldap.go b/internal/auth/ldap.go index 925e967..c3bde4a 100644 --- a/internal/auth/ldap.go +++ b/internal/auth/ldap.go @@ -12,24 +12,21 @@ import ( "strings" "time" + "github.com/ClusterCockpit/cc-backend/internal/repository" "github.com/ClusterCockpit/cc-backend/pkg/log" "github.com/ClusterCockpit/cc-backend/pkg/schema" "github.com/go-ldap/ldap/v3" ) type LdapAuthenticator struct { - auth *Authentication config *schema.LdapConfig syncPassword string } var _ Authenticator = (*LdapAuthenticator)(nil) -func (la *LdapAuthenticator) Init( - auth *Authentication, - conf interface{}) error { +func (la *LdapAuthenticator) Init(conf interface{}) error { - la.auth = auth la.config = conf.(*schema.LdapConfig) la.syncPassword = os.Getenv("LDAP_ADMIN_PASSWORD") @@ -101,13 +98,30 @@ func (la *LdapAuthenticator) CanLogin( entry := sr.Entries[0] name := entry.GetAttributeValue("gecos") + var roles []string + roles = append(roles, schema.GetRoleString(schema.RoleUser)) + projects := make([]string, 0) - if _, err := la.auth.db.Exec(`INSERT INTO user (username, ldap, name, roles) VALUES (?, ?, ?, ?)`, - username, 1, name, "[\""+schema.GetRoleString(schema.RoleUser)+"\"]"); err != nil { - log.Errorf("User '%s' new in LDAP: Insert into DB failed", username) + user = &schema.User{ + Username: username, + Name: name, + Roles: roles, + Projects: projects, + AuthType: schema.AuthSession, + AuthSource: schema.AuthViaLDAP, + } + + if err := repository.GetUserRepository().AddUser(user); err != nil { + log.Errorf("User '%s' LDAP: Insert into DB failed", username) return false } + // if _, err := la.auth.db.Exec(`INSERT INTO user (username, ldap, name, roles) VALUES (?, ?, ?, ?)`, + // username, 1, name, "[\""+schema.GetRoleString(schema.RoleUser)+"\"]"); err != nil { + // log.Errorf("User '%s' new in LDAP: Insert into DB failed", username) + // return false + // } + return true } } @@ -137,25 +151,18 @@ func (la *LdapAuthenticator) Login( } func (la *LdapAuthenticator) Sync() error { - const IN_DB int = 1 const IN_LDAP int = 2 const IN_BOTH int = 3 + ur := repository.GetUserRepository() users := map[string]int{} - rows, err := la.auth.db.Query(`SELECT username FROM user WHERE user.ldap = 1`) + usernames, err := ur.GetLdapUsernames() if err != nil { - log.Warn("Error while querying LDAP users") return err } - for rows.Next() { - var username string - if err := rows.Scan(&username); err != nil { - log.Warnf("Error while scanning for user '%s'", username) - return err - } - + for _, username := range usernames { users[username] = IN_DB } @@ -194,17 +201,26 @@ func (la *LdapAuthenticator) Sync() error { for username, where := range users { if where == IN_DB && la.config.SyncDelOldUsers { + ur.DelUser(username) log.Debugf("sync: remove %v (does not show up in LDAP anymore)", username) - if _, err := la.auth.db.Exec(`DELETE FROM user WHERE user.username = ?`, username); err != nil { - log.Errorf("User '%s' not in LDAP anymore: Delete from DB failed", username) - return err - } } else if where == IN_LDAP { name := newnames[username] + + var roles []string + roles = append(roles, schema.GetRoleString(schema.RoleUser)) + projects := make([]string, 0) + + user := &schema.User{ + Username: username, + Name: name, + Roles: roles, + Projects: projects, + AuthSource: schema.AuthViaLDAP, + } + log.Debugf("sync: add %v (name: %v, roles: [user], ldap: true)", username, name) - if _, err := la.auth.db.Exec(`INSERT INTO user (username, ldap, name, roles) VALUES (?, ?, ?, ?)`, - username, 1, name, "[\""+schema.GetRoleString(schema.RoleUser)+"\"]"); err != nil { - log.Errorf("User '%s' new in LDAP: Insert into DB failed", username) + if err := ur.AddUser(user); err != nil { + log.Errorf("User '%s' LDAP: Insert into DB failed", username) return err } } diff --git a/internal/auth/local.go b/internal/auth/local.go index fb1ba0f..0c6303a 100644 --- a/internal/auth/local.go +++ b/internal/auth/local.go @@ -20,10 +20,8 @@ type LocalAuthenticator struct { var _ Authenticator = (*LocalAuthenticator)(nil) func (la *LocalAuthenticator) Init( - auth *Authentication, _ interface{}) error { - la.auth = auth return nil } diff --git a/internal/repository/user.go b/internal/repository/user.go index 3db7e4d..5439b6e 100644 --- a/internal/repository/user.go +++ b/internal/repository/user.go @@ -71,6 +71,28 @@ func (r *UserRepository) GetUser(username string) (*schema.User, error) { return user, nil } +func (r *UserRepository) GetLdapUsernames() ([]string, error) { + + var users []string + rows, err := r.DB.Query(`SELECT username FROM user WHERE user.ldap = 1`) + if err != nil { + log.Warn("Error while querying usernames") + return nil, err + } + + for rows.Next() { + var username string + if err := rows.Scan(&username); err != nil { + log.Warnf("Error while scanning for user '%s'", username) + return nil, err + } + + users = append(users, username) + } + + return users, nil +} + func (r *UserRepository) AddUser(user *schema.User) error { rolesJson, _ := json.Marshal(user.Roles) projectsJson, _ := json.Marshal(user.Projects) @@ -95,6 +117,10 @@ func (r *UserRepository) AddUser(user *schema.User) error { cols = append(cols, "password") vals = append(vals, string(password)) } + if user.AuthSource != -1 { + cols = append(cols, "ldap") + vals = append(vals, int(user.AuthSource)) + } if _, err := sq.Insert("user").Columns(cols...).Values(vals...).RunWith(r.DB).Exec(); err != nil { log.Errorf("Error while inserting new user '%v' into DB", user.Username) diff --git a/pkg/schema/user.go b/pkg/schema/user.go index 1547d3f..047f617 100644 --- a/pkg/schema/user.go +++ b/pkg/schema/user.go @@ -27,6 +27,7 @@ const ( AuthViaLocalPassword AuthSource = iota AuthViaLDAP AuthViaToken + AuthViaAll ) type AuthType int From 29552fadc3d15ec3136e207315b8a6d3cb65899d Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Thu, 17 Aug 2023 14:02:04 +0200 Subject: [PATCH 40/95] Cleanup SyncOnLogin Handling --- internal/auth/auth.go | 10 ++++++---- internal/auth/jwtCookieSession.go | 13 ++++++++++--- internal/auth/jwtSession.go | 10 ++++++---- internal/auth/ldap.go | 19 ++++++++++--------- internal/auth/local.go | 4 ++-- 5 files changed, 34 insertions(+), 22 deletions(-) diff --git a/internal/auth/auth.go b/internal/auth/auth.go index cc2bcb4..8da45da 100644 --- a/internal/auth/auth.go +++ b/internal/auth/auth.go @@ -22,7 +22,7 @@ import ( type Authenticator interface { Init(config interface{}) error - CanLogin(user *schema.User, username string, rw http.ResponseWriter, r *http.Request) bool + CanLogin(user *schema.User, username string, rw http.ResponseWriter, r *http.Request) (*schema.User, bool) Login(user *schema.User, rw http.ResponseWriter, r *http.Request) (*schema.User, error) } @@ -148,7 +148,7 @@ func (auth *Authentication) Login( return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { err := errors.New("no authenticator applied") username := r.FormValue("username") - dbUser := (*schema.User)(nil) + var dbUser *schema.User if username != "" { dbUser, err = repository.GetUserRepository().GetUser(username) @@ -158,11 +158,13 @@ func (auth *Authentication) Login( } for _, authenticator := range auth.authenticators { - if !authenticator.CanLogin(dbUser, username, rw, r) { + var ok bool + var user *schema.User + if user, ok = authenticator.CanLogin(dbUser, username, rw, r); !ok { continue } - user, err := authenticator.Login(dbUser, rw, r) + user, err = authenticator.Login(user, rw, r) if err != nil { log.Warnf("user login failed: %s", err.Error()) onfailure(rw, r, err) diff --git a/internal/auth/jwtCookieSession.go b/internal/auth/jwtCookieSession.go index ad0b033..42ebcd2 100644 --- a/internal/auth/jwtCookieSession.go +++ b/internal/auth/jwtCookieSession.go @@ -11,6 +11,7 @@ import ( "net/http" "os" + "github.com/ClusterCockpit/cc-backend/internal/repository" "github.com/ClusterCockpit/cc-backend/pkg/log" "github.com/ClusterCockpit/cc-backend/pkg/schema" "github.com/golang-jwt/jwt/v4" @@ -88,7 +89,7 @@ func (ja *JWTCookieSessionAuthenticator) CanLogin( user *schema.User, username string, rw http.ResponseWriter, - r *http.Request) bool { + r *http.Request) (*schema.User, bool) { cookieName := "" if ja.config != nil && ja.config.CookieName != "" { @@ -100,11 +101,11 @@ func (ja *JWTCookieSessionAuthenticator) CanLogin( jwtCookie, err := r.Cookie(cookieName) if err == nil && jwtCookie.Value != "" { - return true + return user, true } } - return false + return nil, false } func (ja *JWTCookieSessionAuthenticator) Login( @@ -194,6 +195,12 @@ func (ja *JWTCookieSessionAuthenticator) Login( AuthType: schema.AuthSession, AuthSource: schema.AuthViaToken, } + + if ja.config.SyncUserOnLogin { + if err := repository.GetUserRepository().AddUser(user); err != nil { + log.Errorf("Error while adding user '%s' to DB", user.Username) + } + } } return user, nil diff --git a/internal/auth/jwtSession.go b/internal/auth/jwtSession.go index 5a29360..d9dce85 100644 --- a/internal/auth/jwtSession.go +++ b/internal/auth/jwtSession.go @@ -44,9 +44,9 @@ func (ja *JWTSessionAuthenticator) CanLogin( user *schema.User, username string, rw http.ResponseWriter, - r *http.Request) bool { + r *http.Request) (*schema.User, bool) { - return r.Header.Get("Authorization") != "" || r.URL.Query().Get("login-token") != "" + return user, r.Header.Get("Authorization") != "" || r.URL.Query().Get("login-token") != "" } func (ja *JWTSessionAuthenticator) Login( @@ -130,8 +130,10 @@ func (ja *JWTSessionAuthenticator) Login( AuthSource: schema.AuthViaToken, } - if err := repository.GetUserRepository().AddUser(user); err != nil { - log.Errorf("Error while adding user '%s' to DB", user.Username) + if ja.config.SyncUserOnLogin { + if err := repository.GetUserRepository().AddUser(user); err != nil { + log.Errorf("Error while adding user '%s' to DB", user.Username) + } } } diff --git a/internal/auth/ldap.go b/internal/auth/ldap.go index c3bde4a..a20e415 100644 --- a/internal/auth/ldap.go +++ b/internal/auth/ldap.go @@ -67,33 +67,34 @@ func (la *LdapAuthenticator) CanLogin( user *schema.User, username string, rw http.ResponseWriter, - r *http.Request) bool { + r *http.Request) (*schema.User, bool) { if user != nil && user.AuthSource == schema.AuthViaLDAP { - return true + return user, true } else { if la.config != nil && la.config.SyncUserOnLogin { l, err := la.getLdapConnection(true) if err != nil { log.Error("LDAP connection error") } + defer l.Close() // Search for the given username searchRequest := ldap.NewSearchRequest( la.config.UserBase, ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false, - fmt.Sprintf("(%s(uid=%s))", la.config.UserFilter, username), + fmt.Sprintf("(&%s(uid=%s))", la.config.UserFilter, username), []string{"dn", "uid", "gecos"}, nil) sr, err := l.Search(searchRequest) if err != nil { log.Warn(err) - return false + return user, false } if len(sr.Entries) != 1 { log.Warn("User does not exist or too many entries returned") - return false + return user, false } entry := sr.Entries[0] @@ -113,7 +114,7 @@ func (la *LdapAuthenticator) CanLogin( if err := repository.GetUserRepository().AddUser(user); err != nil { log.Errorf("User '%s' LDAP: Insert into DB failed", username) - return false + return nil, false } // if _, err := la.auth.db.Exec(`INSERT INTO user (username, ldap, name, roles) VALUES (?, ?, ?, ?)`, @@ -122,11 +123,11 @@ func (la *LdapAuthenticator) CanLogin( // return false // } - return true + return user, true } } - return false + return nil, false } func (la *LdapAuthenticator) Login( @@ -176,7 +177,7 @@ func (la *LdapAuthenticator) Sync() error { ldapResults, err := l.Search(ldap.NewSearchRequest( la.config.UserBase, ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false, - fmt.Sprintf("(%s(uid=%s))", la.config.UserFilter, "*"), + la.config.UserFilter, []string{"dn", "uid", "gecos"}, nil)) if err != nil { log.Warn("LDAP search error") diff --git a/internal/auth/local.go b/internal/auth/local.go index 0c6303a..dd6ec2c 100644 --- a/internal/auth/local.go +++ b/internal/auth/local.go @@ -29,9 +29,9 @@ func (la *LocalAuthenticator) CanLogin( user *schema.User, username string, rw http.ResponseWriter, - r *http.Request) bool { + r *http.Request) (*schema.User, bool) { - return user != nil && user.AuthSource == schema.AuthViaLocalPassword + return user, user != nil && user.AuthSource == schema.AuthViaLocalPassword } func (la *LocalAuthenticator) Login( From d51be5c308420f95c66cae484c9f252b9c7e7c18 Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Fri, 18 Aug 2023 08:49:25 +0200 Subject: [PATCH 41/95] Formatting and minor fixes --- internal/auth/auth.go | 28 +++++++++++------- internal/auth/jwt.go | 5 +--- internal/auth/jwtCookieSession.go | 18 ++++++++++-- internal/auth/jwtSession.go | 48 +++++++++++++++++++------------ internal/auth/ldap.go | 25 +++++++--------- 5 files changed, 74 insertions(+), 50 deletions(-) diff --git a/internal/auth/auth.go b/internal/auth/auth.go index 8da45da..b10c3bd 100644 --- a/internal/auth/auth.go +++ b/internal/auth/auth.go @@ -102,7 +102,7 @@ func Init(configs map[string]interface{}) (*Authentication, error) { } auth.JwtAuth = &JWTAuthenticator{} - if err := auth.JwtAuth.Init(configs["jwt"]); err != nil { + if err := auth.JwtAuth.Init(); err != nil { log.Error("Error while initializing authentication -> jwtAuth init failed") return nil, err } @@ -115,20 +115,26 @@ func Init(configs map[string]interface{}) (*Authentication, error) { auth.LdapAuth = ldapAuth auth.authenticators = append(auth.authenticators, auth.LdapAuth) } + } else { + log.Info("Missing LDAP configuration: No LDAP support!") } - jwtSessionAuth := &JWTSessionAuthenticator{} - if err := jwtSessionAuth.Init(configs["jwt"]); err != nil { - log.Warn("Error while initializing authentication -> jwtSessionAuth init failed") - } else { - auth.authenticators = append(auth.authenticators, jwtSessionAuth) - } + if config, ok := configs["jwt"]; ok { + jwtSessionAuth := &JWTSessionAuthenticator{} + if err := jwtSessionAuth.Init(config); err != nil { + log.Warn("Error while initializing authentication -> jwtSessionAuth init failed") + } else { + auth.authenticators = append(auth.authenticators, jwtSessionAuth) + } - jwtCookieSessionAuth := &JWTCookieSessionAuthenticator{} - if err := jwtCookieSessionAuth.Init(configs["jwt"]); err != nil { - log.Warn("Error while initializing authentication -> jwtCookieSessionAuth init failed") + jwtCookieSessionAuth := &JWTCookieSessionAuthenticator{} + if err := jwtCookieSessionAuth.Init(configs["jwt"]); err != nil { + log.Warn("Error while initializing authentication -> jwtCookieSessionAuth init failed") + } else { + auth.authenticators = append(auth.authenticators, jwtCookieSessionAuth) + } } else { - auth.authenticators = append(auth.authenticators, jwtCookieSessionAuth) + log.Info("Missing JWT configuration: No JWT token login support!") } auth.LocalAuth = &LocalAuthenticator{} diff --git a/internal/auth/jwt.go b/internal/auth/jwt.go index 9c0166d..4a1e4b8 100644 --- a/internal/auth/jwt.go +++ b/internal/auth/jwt.go @@ -22,12 +22,9 @@ import ( type JWTAuthenticator struct { publicKey ed25519.PublicKey privateKey ed25519.PrivateKey - config *schema.JWTAuthConfig } -func (ja *JWTAuthenticator) Init(conf interface{}) error { - ja.config = conf.(*schema.JWTAuthConfig) - +func (ja *JWTAuthenticator) Init() error { pubKey, privKey := os.Getenv("JWT_PUBLIC_KEY"), os.Getenv("JWT_PRIVATE_KEY") if pubKey == "" || privKey == "" { log.Warn("environment variables 'JWT_PUBLIC_KEY' or 'JWT_PRIVATE_KEY' not set (token based authentication will not work)") diff --git a/internal/auth/jwtCookieSession.go b/internal/auth/jwtCookieSession.go index 42ebcd2..9dcba57 100644 --- a/internal/auth/jwtCookieSession.go +++ b/internal/auth/jwtCookieSession.go @@ -8,6 +8,7 @@ import ( "crypto/ed25519" "encoding/base64" "errors" + "fmt" "net/http" "os" @@ -82,6 +83,7 @@ func (ja *JWTCookieSessionAuthenticator) Init(conf interface{}) error { return errors.New("config for JWTs not configured (cross login via JWT cookie will fail)") } + log.Info("JWT Cookie Session authenticator successfully registered") return nil } @@ -137,7 +139,7 @@ func (ja *JWTCookieSessionAuthenticator) Login( return ja.publicKey, nil }) if err != nil { - log.Warn("error while parsing token") + log.Warn("JWT cookie session: error while parsing token") return nil, err } @@ -151,8 +153,16 @@ func (ja *JWTCookieSessionAuthenticator) Login( sub, _ := claims["sub"].(string) var name string - if val, ok := claims["name"]; ok { - name, _ = val.(string) + if wrap, ok := claims["name"].(map[string]interface{}); ok { + if vals, ok := wrap["values"].([]interface{}); ok { + if len(vals) != 0 { + name = fmt.Sprintf("%v", vals[0]) + + for i := 1; i < len(vals); i++ { + name += fmt.Sprintf(" %v", vals[i]) + } + } + } } var roles []string @@ -188,10 +198,12 @@ func (ja *JWTCookieSessionAuthenticator) Login( http.SetCookie(rw, deletedCookie) if user == nil { + projects := make([]string, 0) user = &schema.User{ Username: sub, Name: name, Roles: roles, + Projects: projects, AuthType: schema.AuthSession, AuthSource: schema.AuthViaToken, } diff --git a/internal/auth/jwtSession.go b/internal/auth/jwtSession.go index d9dce85..f68de90 100644 --- a/internal/auth/jwtSession.go +++ b/internal/auth/jwtSession.go @@ -6,6 +6,7 @@ package auth import ( "encoding/base64" + "errors" "fmt" "net/http" "os" @@ -37,6 +38,7 @@ func (ja *JWTSessionAuthenticator) Init(conf interface{}) error { ja.loginTokenKey = bytes } + log.Info("JWT Session authenticator successfully registered") return nil } @@ -46,7 +48,8 @@ func (ja *JWTSessionAuthenticator) CanLogin( rw http.ResponseWriter, r *http.Request) (*schema.User, bool) { - return user, r.Header.Get("Authorization") != "" || r.URL.Query().Get("login-token") != "" + return user, r.Header.Get("Authorization") != "" || + r.URL.Query().Get("login-token") != "" } func (ja *JWTSessionAuthenticator) Login( @@ -79,29 +82,38 @@ func (ja *JWTSessionAuthenticator) Login( sub, _ := claims["sub"].(string) var name string - // Java/Grails Issued Token if wrap, ok := claims["name"].(map[string]interface{}); ok { if vals, ok := wrap["values"].([]interface{}); ok { - name = fmt.Sprintf("%v %v", vals[0], vals[1]) - } - } else if val, ok := claims["name"]; ok { - name, _ = val.(string) - } + if len(vals) != 0 { + name = fmt.Sprintf("%v", vals[0]) - var roles []string - // Java/Grails Issued Token - if rawroles, ok := claims["roles"].([]interface{}); ok { - for _, rr := range rawroles { - if r, ok := rr.(string); ok { - if schema.IsValidRole(r) { - roles = append(roles, r) + for i := 1; i < len(vals); i++ { + name += fmt.Sprintf(" %v", vals[i]) } } } - } else if rawroles, ok := claims["roles"]; ok { - for _, r := range rawroles.([]string) { - if schema.IsValidRole(r) { - roles = append(roles, r) + } + + var roles []string + + if ja.config.ValidateUser { + // Deny any logins for unknown usernames + if user == nil { + log.Warn("Could not find user from JWT in internal database.") + return nil, errors.New("unknown user") + } + + // Take user roles from database instead of trusting the JWT + roles = user.Roles + } else { + // Extract roles from JWT (if present) + if rawroles, ok := claims["roles"].([]interface{}); ok { + for _, rr := range rawroles { + if r, ok := rr.(string); ok { + if schema.IsValidRole(r) { + roles = append(roles, r) + } + } } } } diff --git a/internal/auth/ldap.go b/internal/auth/ldap.go index a20e415..529179e 100644 --- a/internal/auth/ldap.go +++ b/internal/auth/ldap.go @@ -57,7 +57,7 @@ func (la *LdapAuthenticator) Init(conf interface{}) error { } }() } else { - return fmt.Errorf("missing LDAP configuration") + log.Info("Missing LDAP configuration key sync_interval") } return nil @@ -69,10 +69,12 @@ func (la *LdapAuthenticator) CanLogin( rw http.ResponseWriter, r *http.Request) (*schema.User, bool) { - if user != nil && user.AuthSource == schema.AuthViaLDAP { - return user, true + if user != nil { + if user.AuthSource == schema.AuthViaLDAP { + return user, true + } } else { - if la.config != nil && la.config.SyncUserOnLogin { + if la.config.SyncUserOnLogin { l, err := la.getLdapConnection(true) if err != nil { log.Error("LDAP connection error") @@ -89,12 +91,12 @@ func (la *LdapAuthenticator) CanLogin( sr, err := l.Search(searchRequest) if err != nil { log.Warn(err) - return user, false + return nil, false } if len(sr.Entries) != 1 { - log.Warn("User does not exist or too many entries returned") - return user, false + log.Warn("LDAP: User does not exist or too many entries returned") + return nil, false } entry := sr.Entries[0] @@ -117,12 +119,6 @@ func (la *LdapAuthenticator) CanLogin( return nil, false } - // if _, err := la.auth.db.Exec(`INSERT INTO user (username, ldap, name, roles) VALUES (?, ?, ?, ?)`, - // username, 1, name, "[\""+schema.GetRoleString(schema.RoleUser)+"\"]"); err != nil { - // log.Errorf("User '%s' new in LDAP: Insert into DB failed", username) - // return false - // } - return user, true } } @@ -144,7 +140,8 @@ func (la *LdapAuthenticator) Login( userDn := strings.Replace(la.config.UserBind, "{username}", user.Username, -1) if err := l.Bind(userDn, r.FormValue("password")); err != nil { - log.Errorf("AUTH/LOCAL > Authentication for user %s failed: %v", user.Username, err) + log.Errorf("AUTH/LOCAL > Authentication for user %s failed: %v", + user.Username, err) return nil, fmt.Errorf("AUTH/LDAP > Authentication failed") } From cfcf939339c2af2cd84f4bac2f54ca83c951c03c Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Fri, 18 Aug 2023 08:57:56 +0200 Subject: [PATCH 42/95] Add config to jwt again --- internal/auth/auth.go | 12 ++++++------ internal/auth/jwt.go | 5 ++++- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/internal/auth/auth.go b/internal/auth/auth.go index b10c3bd..8c873ad 100644 --- a/internal/auth/auth.go +++ b/internal/auth/auth.go @@ -101,12 +101,6 @@ func Init(configs map[string]interface{}) (*Authentication, error) { auth.sessionStore = sessions.NewCookieStore(bytes) } - auth.JwtAuth = &JWTAuthenticator{} - if err := auth.JwtAuth.Init(); err != nil { - log.Error("Error while initializing authentication -> jwtAuth init failed") - return nil, err - } - if config, ok := configs["ldap"]; ok { ldapAuth := &LdapAuthenticator{} if err := ldapAuth.Init(config); err != nil { @@ -120,6 +114,12 @@ func Init(configs map[string]interface{}) (*Authentication, error) { } if config, ok := configs["jwt"]; ok { + auth.JwtAuth = &JWTAuthenticator{} + if err := auth.JwtAuth.Init(config); err != nil { + log.Error("Error while initializing authentication -> jwtAuth init failed") + return nil, err + } + jwtSessionAuth := &JWTSessionAuthenticator{} if err := jwtSessionAuth.Init(config); err != nil { log.Warn("Error while initializing authentication -> jwtSessionAuth init failed") diff --git a/internal/auth/jwt.go b/internal/auth/jwt.go index 4a1e4b8..9c0166d 100644 --- a/internal/auth/jwt.go +++ b/internal/auth/jwt.go @@ -22,9 +22,12 @@ import ( type JWTAuthenticator struct { publicKey ed25519.PublicKey privateKey ed25519.PrivateKey + config *schema.JWTAuthConfig } -func (ja *JWTAuthenticator) Init() error { +func (ja *JWTAuthenticator) Init(conf interface{}) error { + ja.config = conf.(*schema.JWTAuthConfig) + pubKey, privKey := os.Getenv("JWT_PUBLIC_KEY"), os.Getenv("JWT_PRIVATE_KEY") if pubKey == "" || privKey == "" { log.Warn("environment variables 'JWT_PUBLIC_KEY' or 'JWT_PRIVATE_KEY' not set (token based authentication will not work)") From 56d559fdd712fc04d2b4f3cda7ffd2b08d6d3a18 Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Fri, 18 Aug 2023 09:19:30 +0200 Subject: [PATCH 43/95] Fix bug with jwt max-age option --- internal/auth/jwt.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/internal/auth/jwt.go b/internal/auth/jwt.go index 9c0166d..3d87f68 100644 --- a/internal/auth/jwt.go +++ b/internal/auth/jwt.go @@ -130,8 +130,12 @@ func (ja *JWTAuthenticator) ProvideJWT(user *schema.User) (string, error) { "roles": user.Roles, "iat": now.Unix(), } - if ja.config != nil && ja.config.MaxAge != 0 { - claims["exp"] = now.Add(time.Duration(ja.config.MaxAge)).Unix() + if ja.config != nil && ja.config.MaxAge != "" { + d, err := time.ParseDuration(ja.config.MaxAge) + if err != nil { + return "", errors.New("cannot parse max-age config key") + } + claims["exp"] = now.Add(d).Unix() } return jwt.NewWithClaims(jwt.SigningMethodEdDSA, claims).SignedString(ja.privateKey) From 6185635aa9622e367de3c236fa652c87d352fb3b Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Fri, 18 Aug 2023 09:19:55 +0200 Subject: [PATCH 44/95] Extend config schema --- pkg/schema/config.go | 2 +- pkg/schema/schemas/config.schema.json | 32 ++++++++++++++++++++++++--- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/pkg/schema/config.go b/pkg/schema/config.go index efcd6f9..443fad7 100644 --- a/pkg/schema/config.go +++ b/pkg/schema/config.go @@ -25,7 +25,7 @@ type LdapConfig struct { type JWTAuthConfig struct { // Specifies for how long a JWT token shall be valid // as a string parsable by time.ParseDuration(). - MaxAge int64 `json:"max-age"` + MaxAge string `json:"max-age"` // Specifies which cookie should be checked for a JWT token (if no authorization header is present) CookieName string `json:"cookieName"` diff --git a/pkg/schema/schemas/config.schema.json b/pkg/schema/schemas/config.schema.json index 7505c1c..84983ec 100644 --- a/pkg/schema/schemas/config.schema.json +++ b/pkg/schema/schemas/config.schema.json @@ -127,9 +127,34 @@ "description": "Do not show running jobs shorter than X seconds.", "type": "integer" }, - "": { - "description": "", - "type": "string" + "jwts": { + "description": "For JWT token authentication.", + "type": "object", + "properties": { + "max-age": { + "description": "Configure how long a token is valid. As string parsable by time.ParseDuration()", + "type": "string" + }, + "cookieName": { + "description": "Cookie that should be checked for a JWT token.", + "type": "string" + }, + "validateUser": { + "description": "Deny login for users not in database (but defined in JWT). Overwrite roles in JWT with database roles.", + "type": "boolean" + }, + "trustedIssuer": { + "description": "Issuer that should be accepted when validating external JWTs ", + "type": "string" + }, + "syncUserOnLogin": { + "description": "Add non-existent user to DB at login attempt with values provided in JWT.", + "type": "boolean" + } + }, + "required": [ + "max-age" + ] }, "ldap": { "description": "For LDAP Authentication and user synchronisation.", @@ -398,6 +423,7 @@ } }, "required": [ + "jwts", "clusters" ] } From 14c487c9e49fc4bb63de61c3f692a5726976a1d4 Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Fri, 18 Aug 2023 09:31:57 +0200 Subject: [PATCH 45/95] Update test inputs --- configs/config-demo.json | 3 +++ configs/config.json | 2 +- internal/api/api_test.go | 3 +++ internal/importer/importer_test.go | 3 +++ internal/repository/userConfig_test.go | 3 +++ pkg/schema/validate_test.go | 7 ++++--- 6 files changed, 17 insertions(+), 4 deletions(-) diff --git a/configs/config-demo.json b/configs/config-demo.json index f48d224..578aa37 100644 --- a/configs/config-demo.json +++ b/configs/config-demo.json @@ -4,6 +4,9 @@ "kind": "file", "path": "./var/job-archive" }, + "jwts": { + "max-age": "2m" + }, "clusters": [ { "name": "fritz", diff --git a/configs/config.json b/configs/config.json index 6c4d4bd..3a2c64b 100644 --- a/configs/config.json +++ b/configs/config.json @@ -43,7 +43,7 @@ "jwts": { "cookieName": "", "validateUser": false, - "max-age": 0, + "max-age": "2m", "trustedIssuer": "" }, "short-running-jobs-duration": 300 diff --git a/internal/api/api_test.go b/internal/api/api_test.go index 9e11383..ecffc82 100644 --- a/internal/api/api_test.go +++ b/internal/api/api_test.go @@ -39,6 +39,9 @@ func setup(t *testing.T) *api.RestApi { "kind": "file", "path": "./var/job-archive" }, + "jwts": { + "max-age": "2m" + }, "clusters": [ { "name": "testcluster", diff --git a/internal/importer/importer_test.go b/internal/importer/importer_test.go index 83ba5eb..01ac2f2 100644 --- a/internal/importer/importer_test.go +++ b/internal/importer/importer_test.go @@ -42,6 +42,9 @@ func setup(t *testing.T) *repository.JobRepository { "kind": "file", "path": "./var/job-archive" }, + "jwts": { + "max-age": "2m" + }, "clusters": [ { "name": "testcluster", diff --git a/internal/repository/userConfig_test.go b/internal/repository/userConfig_test.go index 0beec7b..3526919 100644 --- a/internal/repository/userConfig_test.go +++ b/internal/repository/userConfig_test.go @@ -22,6 +22,9 @@ func setupUserTest(t *testing.T) *UserCfgRepo { "kind": "file", "path": "./var/job-archive" }, + "jwts": { + "max-age": "2m" + }, "clusters": [ { "name": "testcluster", diff --git a/pkg/schema/validate_test.go b/pkg/schema/validate_test.go index 195e044..c3e918f 100644 --- a/pkg/schema/validate_test.go +++ b/pkg/schema/validate_test.go @@ -11,6 +11,9 @@ import ( func TestValidateConfig(t *testing.T) { json := []byte(`{ + "jwts": { + "max-age": "2m" + }, "clusters": [ { "name": "testcluster", @@ -21,9 +24,7 @@ func TestValidateConfig(t *testing.T) { "numNodes": { "from": 1, "to": 64 }, "duration": { "from": 0, "to": 86400 }, "startTime": { "from": "2022-01-01T00:00:00Z", "to": null } - } - } - ] + }}] }`) if err := Validate(Config, bytes.NewReader(json)); err != nil { From 129e6a69b8fe1e214e4981183a23f38a9ba649ff Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Fri, 18 Aug 2023 10:15:07 +0200 Subject: [PATCH 46/95] fix: metric y-range render limit for data outliers --- web/frontend/src/plots/MetricPlot.svelte | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/web/frontend/src/plots/MetricPlot.svelte b/web/frontend/src/plots/MetricPlot.svelte index 7915c68..094122e 100644 --- a/web/frontend/src/plots/MetricPlot.svelte +++ b/web/frontend/src/plots/MetricPlot.svelte @@ -154,11 +154,18 @@ ? statisticsSeries.mean.length : series.reduce((n, series) => Math.max(n, series.data.length), 0) const maxX = longestSeries * timestep - const maxY = thresholds != null - ? useStatsSeries + let maxY = null + + if (thresholds !== null) { + maxY = useStatsSeries ? (statisticsSeries.max.reduce((max, x) => Math.max(max, x), thresholds.normal) || thresholds.normal) : (series.reduce((max, series) => Math.max(max, series.statistics?.max), thresholds.normal) || thresholds.normal) - : null + + if (maxY >= (10 * thresholds.normal)) { // Hard y-range render limit if outliers in series data + maxY = (10 * thresholds.normal) + } + } + const plotSeries = [{label: 'Runtime', value: (u, ts, sidx, didx) => didx == null ? null : formatTime(ts)}] const plotData = [new Array(longestSeries)] From 32b0c8bdd7cef2259caf647c06023fd2cb5fdeb5 Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Fri, 18 Aug 2023 10:43:06 +0200 Subject: [PATCH 47/95] Refactor and cleanup Auth configuration --- cmd/cc-backend/main.go | 5 +--- internal/auth/auth.go | 24 +++++++++---------- internal/auth/jwt.go | 12 ++++------ internal/auth/jwtCookieSession.go | 38 +++++++++++++++---------------- internal/auth/jwtSession.go | 11 ++++----- internal/auth/ldap.go | 38 ++++++++++++++++--------------- internal/auth/local.go | 4 +--- internal/config/config.go | 1 - 8 files changed, 62 insertions(+), 71 deletions(-) diff --git a/cmd/cc-backend/main.go b/cmd/cc-backend/main.go index dd00046..e165092 100644 --- a/cmd/cc-backend/main.go +++ b/cmd/cc-backend/main.go @@ -211,10 +211,7 @@ func main() { var authentication *auth.Authentication if !config.Keys.DisableAuthentication { var err error - if authentication, err = auth.Init(map[string]interface{}{ - "ldap": config.Keys.LdapConfig, - "jwt": config.Keys.JwtConfig, - }); err != nil { + if authentication, err = auth.Init(); err != nil { log.Fatalf("auth initialization failed: %v", err) } diff --git a/internal/auth/auth.go b/internal/auth/auth.go index 8c873ad..8c9beef 100644 --- a/internal/auth/auth.go +++ b/internal/auth/auth.go @@ -14,6 +14,7 @@ import ( "os" "time" + "github.com/ClusterCockpit/cc-backend/internal/config" "github.com/ClusterCockpit/cc-backend/internal/repository" "github.com/ClusterCockpit/cc-backend/pkg/log" "github.com/ClusterCockpit/cc-backend/pkg/schema" @@ -21,7 +22,6 @@ import ( ) type Authenticator interface { - Init(config interface{}) error CanLogin(user *schema.User, username string, rw http.ResponseWriter, r *http.Request) (*schema.User, bool) Login(user *schema.User, rw http.ResponseWriter, r *http.Request) (*schema.User, error) } @@ -80,7 +80,7 @@ func (auth *Authentication) AuthViaSession( }, nil } -func Init(configs map[string]interface{}) (*Authentication, error) { +func Init() (*Authentication, error) { auth := &Authentication{} sessKey := os.Getenv("SESSION_KEY") @@ -101,9 +101,9 @@ func Init(configs map[string]interface{}) (*Authentication, error) { auth.sessionStore = sessions.NewCookieStore(bytes) } - if config, ok := configs["ldap"]; ok { + if config.Keys.LdapConfig != nil { ldapAuth := &LdapAuthenticator{} - if err := ldapAuth.Init(config); err != nil { + if err := ldapAuth.Init(); err != nil { log.Warn("Error while initializing authentication -> ldapAuth init failed") } else { auth.LdapAuth = ldapAuth @@ -113,32 +113,32 @@ func Init(configs map[string]interface{}) (*Authentication, error) { log.Info("Missing LDAP configuration: No LDAP support!") } - if config, ok := configs["jwt"]; ok { + if config.Keys.JwtConfig != nil { auth.JwtAuth = &JWTAuthenticator{} - if err := auth.JwtAuth.Init(config); err != nil { + if err := auth.JwtAuth.Init(); err != nil { log.Error("Error while initializing authentication -> jwtAuth init failed") return nil, err } jwtSessionAuth := &JWTSessionAuthenticator{} - if err := jwtSessionAuth.Init(config); err != nil { - log.Warn("Error while initializing authentication -> jwtSessionAuth init failed") + if err := jwtSessionAuth.Init(); err != nil { + log.Info("jwtSessionAuth init failed: No JWT login support!") } else { auth.authenticators = append(auth.authenticators, jwtSessionAuth) } jwtCookieSessionAuth := &JWTCookieSessionAuthenticator{} - if err := jwtCookieSessionAuth.Init(configs["jwt"]); err != nil { - log.Warn("Error while initializing authentication -> jwtCookieSessionAuth init failed") + if err := jwtCookieSessionAuth.Init(); err != nil { + log.Info("jwtCookieSessionAuth init failed: No JWT cookie login support!") } else { auth.authenticators = append(auth.authenticators, jwtCookieSessionAuth) } } else { - log.Info("Missing JWT configuration: No JWT token login support!") + log.Info("Missing JWT configuration: No JWT token support!") } auth.LocalAuth = &LocalAuthenticator{} - if err := auth.LocalAuth.Init(nil); err != nil { + if err := auth.LocalAuth.Init(); err != nil { log.Error("Error while initializing authentication -> localAuth init failed") return nil, err } diff --git a/internal/auth/jwt.go b/internal/auth/jwt.go index 3d87f68..83bfee3 100644 --- a/internal/auth/jwt.go +++ b/internal/auth/jwt.go @@ -13,6 +13,7 @@ import ( "strings" "time" + "github.com/ClusterCockpit/cc-backend/internal/config" "github.com/ClusterCockpit/cc-backend/internal/repository" "github.com/ClusterCockpit/cc-backend/pkg/log" "github.com/ClusterCockpit/cc-backend/pkg/schema" @@ -22,12 +23,9 @@ import ( type JWTAuthenticator struct { publicKey ed25519.PublicKey privateKey ed25519.PrivateKey - config *schema.JWTAuthConfig } -func (ja *JWTAuthenticator) Init(conf interface{}) error { - ja.config = conf.(*schema.JWTAuthConfig) - +func (ja *JWTAuthenticator) Init() error { pubKey, privKey := os.Getenv("JWT_PUBLIC_KEY"), os.Getenv("JWT_PRIVATE_KEY") if pubKey == "" || privKey == "" { log.Warn("environment variables 'JWT_PUBLIC_KEY' or 'JWT_PRIVATE_KEY' not set (token based authentication will not work)") @@ -87,7 +85,7 @@ func (ja *JWTAuthenticator) AuthViaJWT( var roles []string // Validate user + roles from JWT against database? - if ja.config != nil && ja.config.ValidateUser { + if config.Keys.JwtConfig.ValidateUser { ur := repository.GetUserRepository() user, err := ur.GetUser(sub) @@ -130,8 +128,8 @@ func (ja *JWTAuthenticator) ProvideJWT(user *schema.User) (string, error) { "roles": user.Roles, "iat": now.Unix(), } - if ja.config != nil && ja.config.MaxAge != "" { - d, err := time.ParseDuration(ja.config.MaxAge) + if config.Keys.JwtConfig.MaxAge != "" { + d, err := time.ParseDuration(config.Keys.JwtConfig.MaxAge) if err != nil { return "", errors.New("cannot parse max-age config key") } diff --git a/internal/auth/jwtCookieSession.go b/internal/auth/jwtCookieSession.go index 9dcba57..bff08f2 100644 --- a/internal/auth/jwtCookieSession.go +++ b/internal/auth/jwtCookieSession.go @@ -12,6 +12,7 @@ import ( "net/http" "os" + "github.com/ClusterCockpit/cc-backend/internal/config" "github.com/ClusterCockpit/cc-backend/internal/repository" "github.com/ClusterCockpit/cc-backend/pkg/log" "github.com/ClusterCockpit/cc-backend/pkg/schema" @@ -22,15 +23,11 @@ type JWTCookieSessionAuthenticator struct { publicKey ed25519.PublicKey privateKey ed25519.PrivateKey publicKeyCrossLogin ed25519.PublicKey // For accepting externally generated JWTs - - config *schema.JWTAuthConfig } var _ Authenticator = (*JWTCookieSessionAuthenticator)(nil) -func (ja *JWTCookieSessionAuthenticator) Init(conf interface{}) error { - ja.config = conf.(*schema.JWTAuthConfig) - +func (ja *JWTCookieSessionAuthenticator) Init() error { pubKey, privKey := os.Getenv("JWT_PUBLIC_KEY"), os.Getenv("JWT_PRIVATE_KEY") if pubKey == "" || privKey == "" { log.Warn("environment variables 'JWT_PUBLIC_KEY' or 'JWT_PRIVATE_KEY' not set (token based authentication will not work)") @@ -65,17 +62,18 @@ func (ja *JWTCookieSessionAuthenticator) Init(conf interface{}) error { return errors.New("environment variable 'CROSS_LOGIN_JWT_PUBLIC_KEY' not set (cross login token based authentication will not work)") } + jc := config.Keys.JwtConfig // Warn if other necessary settings are not configured - if ja.config != nil { - if ja.config.CookieName == "" { - log.Warn("cookieName for JWTs not configured (cross login via JWT cookie will fail)") + if jc != nil { + if jc.CookieName == "" { + log.Info("cookieName for JWTs not configured (cross login via JWT cookie will fail)") return errors.New("cookieName for JWTs not configured (cross login via JWT cookie will fail)") } - if !ja.config.ValidateUser { - log.Warn("forceJWTValidationViaDatabase not set to true: CC will accept users and roles defined in JWTs regardless of its own database!") + if !jc.ValidateUser { + log.Info("forceJWTValidationViaDatabase not set to true: CC will accept users and roles defined in JWTs regardless of its own database!") } - if ja.config.TrustedIssuer == "" { - log.Warn("trustedExternalIssuer for JWTs not configured (cross login via JWT cookie will fail)") + if jc.TrustedIssuer == "" { + log.Info("trustedExternalIssuer for JWTs not configured (cross login via JWT cookie will fail)") return errors.New("trustedExternalIssuer for JWTs not configured (cross login via JWT cookie will fail)") } } else { @@ -93,9 +91,10 @@ func (ja *JWTCookieSessionAuthenticator) CanLogin( rw http.ResponseWriter, r *http.Request) (*schema.User, bool) { + jc := config.Keys.JwtConfig cookieName := "" - if ja.config != nil && ja.config.CookieName != "" { - cookieName = ja.config.CookieName + if jc.CookieName != "" { + cookieName = jc.CookieName } // Try to read the JWT cookie @@ -115,7 +114,8 @@ func (ja *JWTCookieSessionAuthenticator) Login( rw http.ResponseWriter, r *http.Request) (*schema.User, error) { - jwtCookie, err := r.Cookie(ja.config.CookieName) + jc := config.Keys.JwtConfig + jwtCookie, err := r.Cookie(jc.CookieName) var rawtoken string if err == nil && jwtCookie.Value != "" { @@ -128,7 +128,7 @@ func (ja *JWTCookieSessionAuthenticator) Login( } unvalidatedIssuer, success := t.Claims.(jwt.MapClaims)["iss"].(string) - if success && unvalidatedIssuer == ja.config.TrustedIssuer { + if success && unvalidatedIssuer == jc.TrustedIssuer { // The (unvalidated) issuer seems to be the expected one, // use public cross login key from config return ja.publicKeyCrossLogin, nil @@ -167,7 +167,7 @@ func (ja *JWTCookieSessionAuthenticator) Login( var roles []string - if ja.config.ValidateUser { + if jc.ValidateUser { // Deny any logins for unknown usernames if user == nil { log.Warn("Could not find user from JWT in internal database.") @@ -189,7 +189,7 @@ func (ja *JWTCookieSessionAuthenticator) Login( // (Ask browser to) Delete JWT cookie deletedCookie := &http.Cookie{ - Name: ja.config.CookieName, + Name: jc.CookieName, Value: "", Path: "/", MaxAge: -1, @@ -208,7 +208,7 @@ func (ja *JWTCookieSessionAuthenticator) Login( AuthSource: schema.AuthViaToken, } - if ja.config.SyncUserOnLogin { + if jc.SyncUserOnLogin { if err := repository.GetUserRepository().AddUser(user); err != nil { log.Errorf("Error while adding user '%s' to DB", user.Username) } diff --git a/internal/auth/jwtSession.go b/internal/auth/jwtSession.go index f68de90..2aa194d 100644 --- a/internal/auth/jwtSession.go +++ b/internal/auth/jwtSession.go @@ -12,6 +12,7 @@ import ( "os" "strings" + "github.com/ClusterCockpit/cc-backend/internal/config" "github.com/ClusterCockpit/cc-backend/internal/repository" "github.com/ClusterCockpit/cc-backend/pkg/log" "github.com/ClusterCockpit/cc-backend/pkg/schema" @@ -20,15 +21,11 @@ import ( type JWTSessionAuthenticator struct { loginTokenKey []byte // HS256 key - - config *schema.JWTAuthConfig } var _ Authenticator = (*JWTSessionAuthenticator)(nil) -func (ja *JWTSessionAuthenticator) Init(conf interface{}) error { - ja.config = conf.(*schema.JWTAuthConfig) - +func (ja *JWTSessionAuthenticator) Init() error { if pubKey := os.Getenv("CROSS_LOGIN_JWT_HS512_KEY"); pubKey != "" { bytes, err := base64.StdEncoding.DecodeString(pubKey) if err != nil { @@ -96,7 +93,7 @@ func (ja *JWTSessionAuthenticator) Login( var roles []string - if ja.config.ValidateUser { + if config.Keys.JwtConfig.ValidateUser { // Deny any logins for unknown usernames if user == nil { log.Warn("Could not find user from JWT in internal database.") @@ -142,7 +139,7 @@ func (ja *JWTSessionAuthenticator) Login( AuthSource: schema.AuthViaToken, } - if ja.config.SyncUserOnLogin { + if config.Keys.JwtConfig.SyncUserOnLogin { if err := repository.GetUserRepository().AddUser(user); err != nil { log.Errorf("Error while adding user '%s' to DB", user.Username) } diff --git a/internal/auth/ldap.go b/internal/auth/ldap.go index 529179e..6a8c483 100644 --- a/internal/auth/ldap.go +++ b/internal/auth/ldap.go @@ -12,6 +12,7 @@ import ( "strings" "time" + "github.com/ClusterCockpit/cc-backend/internal/config" "github.com/ClusterCockpit/cc-backend/internal/repository" "github.com/ClusterCockpit/cc-backend/pkg/log" "github.com/ClusterCockpit/cc-backend/pkg/schema" @@ -19,25 +20,22 @@ import ( ) type LdapAuthenticator struct { - config *schema.LdapConfig syncPassword string } var _ Authenticator = (*LdapAuthenticator)(nil) -func (la *LdapAuthenticator) Init(conf interface{}) error { - - la.config = conf.(*schema.LdapConfig) - +func (la *LdapAuthenticator) Init() error { la.syncPassword = os.Getenv("LDAP_ADMIN_PASSWORD") if la.syncPassword == "" { log.Warn("environment variable 'LDAP_ADMIN_PASSWORD' not set (ldap sync will not work)") } - if la.config != nil && la.config.SyncInterval != "" { - interval, err := time.ParseDuration(la.config.SyncInterval) + if config.Keys.LdapConfig.SyncInterval != "" { + interval, err := time.ParseDuration(config.Keys.LdapConfig.SyncInterval) if err != nil { - log.Warnf("Could not parse duration for sync interval: %v", la.config.SyncInterval) + log.Warnf("Could not parse duration for sync interval: %v", + config.Keys.LdapConfig.SyncInterval) return err } @@ -57,7 +55,7 @@ func (la *LdapAuthenticator) Init(conf interface{}) error { } }() } else { - log.Info("Missing LDAP configuration key sync_interval") + log.Info("LDAP configuration key sync_interval invalid") } return nil @@ -69,12 +67,14 @@ func (la *LdapAuthenticator) CanLogin( rw http.ResponseWriter, r *http.Request) (*schema.User, bool) { + lc := config.Keys.LdapConfig + if user != nil { if user.AuthSource == schema.AuthViaLDAP { return user, true } } else { - if la.config.SyncUserOnLogin { + if lc.SyncUserOnLogin { l, err := la.getLdapConnection(true) if err != nil { log.Error("LDAP connection error") @@ -83,9 +83,9 @@ func (la *LdapAuthenticator) CanLogin( // Search for the given username searchRequest := ldap.NewSearchRequest( - la.config.UserBase, + lc.UserBase, ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false, - fmt.Sprintf("(&%s(uid=%s))", la.config.UserFilter, username), + fmt.Sprintf("(&%s(uid=%s))", lc.UserFilter, username), []string{"dn", "uid", "gecos"}, nil) sr, err := l.Search(searchRequest) @@ -138,7 +138,7 @@ func (la *LdapAuthenticator) Login( } defer l.Close() - userDn := strings.Replace(la.config.UserBind, "{username}", user.Username, -1) + userDn := strings.Replace(config.Keys.LdapConfig.UserBind, "{username}", user.Username, -1) if err := l.Bind(userDn, r.FormValue("password")); err != nil { log.Errorf("AUTH/LOCAL > Authentication for user %s failed: %v", user.Username, err) @@ -153,6 +153,7 @@ func (la *LdapAuthenticator) Sync() error { const IN_LDAP int = 2 const IN_BOTH int = 3 ur := repository.GetUserRepository() + lc := config.Keys.LdapConfig users := map[string]int{} usernames, err := ur.GetLdapUsernames() @@ -172,9 +173,9 @@ func (la *LdapAuthenticator) Sync() error { defer l.Close() ldapResults, err := l.Search(ldap.NewSearchRequest( - la.config.UserBase, + lc.UserBase, ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false, - la.config.UserFilter, + lc.UserFilter, []string{"dn", "uid", "gecos"}, nil)) if err != nil { log.Warn("LDAP search error") @@ -198,7 +199,7 @@ func (la *LdapAuthenticator) Sync() error { } for username, where := range users { - if where == IN_DB && la.config.SyncDelOldUsers { + if where == IN_DB && lc.SyncDelOldUsers { ur.DelUser(username) log.Debugf("sync: remove %v (does not show up in LDAP anymore)", username) } else if where == IN_LDAP { @@ -231,14 +232,15 @@ func (la *LdapAuthenticator) Sync() error { // that so that connections can be reused/cached. func (la *LdapAuthenticator) getLdapConnection(admin bool) (*ldap.Conn, error) { - conn, err := ldap.DialURL(la.config.Url) + lc := config.Keys.LdapConfig + conn, err := ldap.DialURL(lc.Url) if err != nil { log.Warn("LDAP URL dial failed") return nil, err } if admin { - if err := conn.Bind(la.config.SearchDN, la.syncPassword); err != nil { + if err := conn.Bind(lc.SearchDN, la.syncPassword); err != nil { conn.Close() log.Warn("LDAP connection bind failed") return nil, err diff --git a/internal/auth/local.go b/internal/auth/local.go index dd6ec2c..002e676 100644 --- a/internal/auth/local.go +++ b/internal/auth/local.go @@ -19,9 +19,7 @@ type LocalAuthenticator struct { var _ Authenticator = (*LocalAuthenticator)(nil) -func (la *LocalAuthenticator) Init( - _ interface{}) error { - +func (la *LocalAuthenticator) Init() error { return nil } diff --git a/internal/config/config.go b/internal/config/config.go index 02a0ba6..08d01c6 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -22,7 +22,6 @@ var Keys schema.ProgramConfig = schema.ProgramConfig{ Archive: json.RawMessage(`{\"kind\":\"file\",\"path\":\"./var/job-archive\"}`), DisableArchive: false, Validate: false, - LdapConfig: nil, SessionMaxAge: "168h", StopJobsExceedingWalltime: 0, ShortRunningJobsDuration: 5 * 60, From da551a0bb4544b3bc6eab7b784cd4339fa0f3879 Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Fri, 18 Aug 2023 11:00:13 +0200 Subject: [PATCH 48/95] Repair broken error handlng --- internal/auth/auth.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/internal/auth/auth.go b/internal/auth/auth.go index 8c9beef..77f2165 100644 --- a/internal/auth/auth.go +++ b/internal/auth/auth.go @@ -122,14 +122,14 @@ func Init() (*Authentication, error) { jwtSessionAuth := &JWTSessionAuthenticator{} if err := jwtSessionAuth.Init(); err != nil { - log.Info("jwtSessionAuth init failed: No JWT login support!") + log.Info("jwtSessionAuth init failed: No JWT login support!") } else { auth.authenticators = append(auth.authenticators, jwtSessionAuth) } jwtCookieSessionAuth := &JWTCookieSessionAuthenticator{} if err := jwtCookieSessionAuth.Init(); err != nil { - log.Info("jwtCookieSessionAuth init failed: No JWT cookie login support!") + log.Info("jwtCookieSessionAuth init failed: No JWT cookie login support!") } else { auth.authenticators = append(auth.authenticators, jwtCookieSessionAuth) } @@ -152,11 +152,11 @@ func (auth *Authentication) Login( onfailure func(rw http.ResponseWriter, r *http.Request, loginErr error)) http.Handler { return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { - err := errors.New("no authenticator applied") username := r.FormValue("username") var dbUser *schema.User if username != "" { + var err error dbUser, err = repository.GetUserRepository().GetUser(username) if err != nil && err != sql.ErrNoRows { log.Errorf("Error while loading user '%v'", username) @@ -170,7 +170,7 @@ func (auth *Authentication) Login( continue } - user, err = authenticator.Login(user, rw, r) + user, err := authenticator.Login(user, rw, r) if err != nil { log.Warnf("user login failed: %s", err.Error()) onfailure(rw, r, err) @@ -203,7 +203,7 @@ func (auth *Authentication) Login( } log.Debugf("login failed: no authenticator applied") - onfailure(rw, r, err) + onfailure(rw, r, errors.New("no authenticator applied")) }) } From 57bda635069b9b4ff605c305ebc680729034dd5e Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Fri, 18 Aug 2023 11:17:31 +0200 Subject: [PATCH 49/95] Cleanup some error strings --- docs/dev-authentication.md | 6 +++--- internal/auth/jwtSession.go | 2 +- internal/auth/ldap.go | 4 ++-- internal/auth/local.go | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/dev-authentication.md b/docs/dev-authentication.md index 9b84c4b..4107d61 100644 --- a/docs/dev-authentication.md +++ b/docs/dev-authentication.md @@ -65,7 +65,7 @@ the user database table: ``` if e := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(r.FormValue("password"))); e != nil { log.Errorf("AUTH/LOCAL > Authentication for user %s failed!", user.Username) - return nil, fmt.Errorf("AUTH/LOCAL > Authentication failed") + return nil, fmt.Errorf("Authentication failed") } ``` @@ -79,8 +79,8 @@ return user != nil && user.AuthSource == AuthViaLDAP Gets the LDAP connection and tries a bind with the provided credentials: ``` if err := l.Bind(userDn, r.FormValue("password")); err != nil { - log.Errorf("AUTH/LOCAL > Authentication for user %s failed: %v", user.Username, err) - return nil, fmt.Errorf("AUTH/LDAP > Authentication failed") + log.Errorf("AUTH/LDAP > Authentication for user %s failed: %v", user.Username, err) + return nil, fmt.Errorf("Authentication failed") } ``` diff --git a/internal/auth/jwtSession.go b/internal/auth/jwtSession.go index f68de90..10c5719 100644 --- a/internal/auth/jwtSession.go +++ b/internal/auth/jwtSession.go @@ -66,7 +66,7 @@ func (ja *JWTSessionAuthenticator) Login( if t.Method == jwt.SigningMethodHS256 || t.Method == jwt.SigningMethodHS512 { return ja.loginTokenKey, nil } - return nil, fmt.Errorf("AUTH/JWT > unkown signing method for login token: %s (known: HS256, HS512, EdDSA)", t.Method.Alg()) + return nil, fmt.Errorf("unkown signing method for login token: %s (known: HS256, HS512, EdDSA)", t.Method.Alg()) }) if err != nil { log.Warn("Error while parsing jwt token") diff --git a/internal/auth/ldap.go b/internal/auth/ldap.go index 529179e..a55f6b7 100644 --- a/internal/auth/ldap.go +++ b/internal/auth/ldap.go @@ -140,9 +140,9 @@ func (la *LdapAuthenticator) Login( userDn := strings.Replace(la.config.UserBind, "{username}", user.Username, -1) if err := l.Bind(userDn, r.FormValue("password")); err != nil { - log.Errorf("AUTH/LOCAL > Authentication for user %s failed: %v", + log.Errorf("AUTH/LDAP > Authentication for user %s failed: %v", user.Username, err) - return nil, fmt.Errorf("AUTH/LDAP > Authentication failed") + return nil, fmt.Errorf("Authentication failed") } return user, nil diff --git a/internal/auth/local.go b/internal/auth/local.go index dd6ec2c..06a9219 100644 --- a/internal/auth/local.go +++ b/internal/auth/local.go @@ -42,7 +42,7 @@ func (la *LocalAuthenticator) Login( if e := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(r.FormValue("password"))); e != nil { log.Errorf("AUTH/LOCAL > Authentication for user %s failed!", user.Username) - return nil, fmt.Errorf("AUTH/LOCAL > Authentication failed") + return nil, fmt.Errorf("Authentication failed") } return user, nil From 3028f60807281e31609ba783fc1484598b1d825e Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Fri, 18 Aug 2023 11:59:16 +0200 Subject: [PATCH 50/95] Reformat and add debug output --- cmd/cc-backend/main.go | 22 ++++++++++++---------- internal/auth/auth.go | 2 ++ 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/cmd/cc-backend/main.go b/cmd/cc-backend/main.go index e165092..e51791f 100644 --- a/cmd/cc-backend/main.go +++ b/cmd/cc-backend/main.go @@ -342,6 +342,7 @@ func main() { // Those should be mounted to this subrouter. If authentication is enabled, a middleware will prevent // any unauthenticated accesses. secured := r.PathPrefix("/").Subrouter() + if !config.Keys.DisableAuthentication { r.Handle("/login", authentication.Login( // On success: @@ -359,16 +360,17 @@ func main() { }) })).Methods(http.MethodPost) - r.Handle("/logout", authentication.Logout(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { - rw.Header().Add("Content-Type", "text/html; charset=utf-8") - rw.WriteHeader(http.StatusOK) - web.RenderTemplate(rw, "login.tmpl", &web.Page{ - Title: "Bye - ClusterCockpit", - MsgType: "alert-info", - Message: "Logout successful", - Build: buildInfo, - }) - }))).Methods(http.MethodPost) + r.Handle("/logout", authentication.Logout( + http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { + rw.Header().Add("Content-Type", "text/html; charset=utf-8") + rw.WriteHeader(http.StatusOK) + web.RenderTemplate(rw, "login.tmpl", &web.Page{ + Title: "Bye - ClusterCockpit", + MsgType: "alert-info", + Message: "Logout successful", + Build: buildInfo, + }) + }))).Methods(http.MethodPost) secured.Use(func(next http.Handler) http.Handler { return authentication.Auth( diff --git a/internal/auth/auth.go b/internal/auth/auth.go index 77f2165..92b777b 100644 --- a/internal/auth/auth.go +++ b/internal/auth/auth.go @@ -168,6 +168,8 @@ func (auth *Authentication) Login( var user *schema.User if user, ok = authenticator.CanLogin(dbUser, username, rw, r); !ok { continue + } else { + log.Debugf("Can login with user %v", user) } user, err := authenticator.Login(user, rw, r) From cda46141cc639890b8ab68c586f790d976edc9df Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Fri, 18 Aug 2023 13:03:11 +0200 Subject: [PATCH 51/95] Cleanup and add wildcard for IP Filter --- internal/api/rest.go | 69 +++----------------------------------------- 1 file changed, 4 insertions(+), 65 deletions(-) diff --git a/internal/api/rest.go b/internal/api/rest.go index 0716514..23ae53a 100644 --- a/internal/api/rest.go +++ b/internal/api/rest.go @@ -193,6 +193,10 @@ func securedCheck(r *http.Request) error { return fmt.Errorf("missing configuration key ApiAllowedIPs") } + if config.Keys.ApiAllowedIPs[0] == "*" { + return nil + } + // extract IP address IPAddress := r.Header.Get("X-Real-Ip") if IPAddress == "" { @@ -1130,71 +1134,6 @@ func (api *RestApi) updateUser(rw http.ResponseWriter, r *http.Request) { } } -// func (api *RestApi) secureUpdateUser(rw http.ResponseWriter, r *http.Request) { -// if user := auth.GetUser(r.Context()); user != nil && !user.HasRole(auth.RoleApi) { -// handleError(fmt.Errorf("missing role: %v", auth.GetRoleString(auth.RoleApi)), http.StatusForbidden, rw) -// return -// } -// -// // IP CHECK HERE (WIP) -// // Probably better as private routine -// IPAddress := r.Header.Get("X-Real-Ip") -// if IPAddress == "" { -// IPAddress = r.Header.Get("X-Forwarded-For") -// } -// if IPAddress == "" { -// IPAddress = r.RemoteAddr -// } -// -// // Also This -// ipOk := false -// for _, a := range config.Keys.ApiAllowedAddrs { -// if a == IPAddress { -// ipOk = true -// } -// } -// -// if IPAddress == "" || ipOk == false { -// handleError(fmt.Errorf("unknown ip: %v", IPAddress), http.StatusForbidden, rw) -// return -// } -// // IP CHECK END -// -// // Get Values -// id := mux.Vars(r)["id"] -// newproj := mux.Vars(r)["project"] -// newrole := mux.Vars(r)["role"] -// -// // TODO: Handle anything but roles... -// if newrole != "" { -// if err := api.Authentication.AddRole(r.Context(), id, newrole); err != nil { -// handleError(errors.New(err.Error()), http.StatusUnprocessableEntity, rw) -// return -// } -// -// rw.Header().Add("Content-Type", "application/json") -// rw.WriteHeader(http.StatusOK) -// json.NewEncoder(rw).Encode(UpdateUserApiResponse{ -// Message: fmt.Sprintf("Successfully added role %s to %s", newrole, id), -// }) -// -// } else if newproj != "" { -// if err := api.Authentication.AddProject(r.Context(), id, newproj); err != nil { -// handleError(errors.New(err.Error()), http.StatusUnprocessableEntity, rw) -// return -// } -// -// rw.Header().Add("Content-Type", "application/json") -// rw.WriteHeader(http.StatusOK) -// json.NewEncoder(rw).Encode(UpdateUserApiResponse{ -// Message: fmt.Sprintf("Successfully added project %s to %s", newproj, id), -// }) -// -// } else { -// handleError(errors.New("Not Add [role|project]?"), http.StatusBadRequest, rw) -// } -// } - func (api *RestApi) updateConfiguration(rw http.ResponseWriter, r *http.Request) { rw.Header().Set("Content-Type", "text/plain") key, value := r.FormValue("key"), r.FormValue("value") From e99d1a1e90ec29c93796d55e7476b9746a80c57c Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Fri, 18 Aug 2023 14:02:21 +0200 Subject: [PATCH 52/95] Add endpoint for jwt session login --- cmd/cc-backend/main.go | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/cmd/cc-backend/main.go b/cmd/cc-backend/main.go index e51791f..5a50dce 100644 --- a/cmd/cc-backend/main.go +++ b/cmd/cc-backend/main.go @@ -109,6 +109,13 @@ var ( version string ) +// ErrorResponse model +type ErrorResponse struct { + // Statustext of Errorcode + Status string `json:"status"` + Error string `json:"error"` // Error Message +} + func initEnv() { if util.CheckFileExists("var") { fmt.Print("Directory ./var already exists. Exiting!\n") @@ -338,9 +345,6 @@ func main() { web.RenderTemplate(rw, "privacy.tmpl", &web.Page{Title: "Privacy", Build: buildInfo}) }) - // Some routes, such as /login or /query, should only be accessible to a user that is logged in. - // Those should be mounted to this subrouter. If authentication is enabled, a middleware will prevent - // any unauthenticated accesses. secured := r.PathPrefix("/").Subrouter() if !config.Keys.DisableAuthentication { @@ -360,6 +364,20 @@ func main() { }) })).Methods(http.MethodPost) + r.Handle("/jwt-login", authentication.Login( + // On success: + http.RedirectHandler("/", http.StatusTemporaryRedirect), + + // On failure: + func(rw http.ResponseWriter, r *http.Request, err error) { + rw.Header().Add("Content-Type", "application/json") + rw.WriteHeader(http.StatusForbidden) + json.NewEncoder(rw).Encode(ErrorResponse{ + Status: http.StatusText(http.StatusForbidden), + Error: err.Error(), + }) + })).Methods(http.MethodGet) + r.Handle("/logout", authentication.Logout( http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { rw.Header().Add("Content-Type", "text/html; charset=utf-8") From c87db1dfe6ed70e9834c9f7d4a9079d52b1d6d3c Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Fri, 18 Aug 2023 14:03:52 +0200 Subject: [PATCH 53/95] login for all Methods --- cmd/cc-backend/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/cc-backend/main.go b/cmd/cc-backend/main.go index 5a50dce..93786ca 100644 --- a/cmd/cc-backend/main.go +++ b/cmd/cc-backend/main.go @@ -376,7 +376,7 @@ func main() { Status: http.StatusText(http.StatusForbidden), Error: err.Error(), }) - })).Methods(http.MethodGet) + })) r.Handle("/logout", authentication.Logout( http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { From 9fec8a482234642f8aa2a01afb32bcd9165055d7 Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Fri, 18 Aug 2023 14:29:24 +0200 Subject: [PATCH 54/95] Change to html output for jwt-login --- cmd/cc-backend/main.go | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/cmd/cc-backend/main.go b/cmd/cc-backend/main.go index 93786ca..e956503 100644 --- a/cmd/cc-backend/main.go +++ b/cmd/cc-backend/main.go @@ -109,13 +109,6 @@ var ( version string ) -// ErrorResponse model -type ErrorResponse struct { - // Statustext of Errorcode - Status string `json:"status"` - Error string `json:"error"` // Error Message -} - func initEnv() { if util.CheckFileExists("var") { fmt.Print("Directory ./var already exists. Exiting!\n") @@ -370,11 +363,13 @@ func main() { // On failure: func(rw http.ResponseWriter, r *http.Request, err error) { - rw.Header().Add("Content-Type", "application/json") - rw.WriteHeader(http.StatusForbidden) - json.NewEncoder(rw).Encode(ErrorResponse{ - Status: http.StatusText(http.StatusForbidden), - Error: err.Error(), + rw.Header().Add("Content-Type", "text/html; charset=utf-8") + rw.WriteHeader(http.StatusUnauthorized) + web.RenderTemplate(rw, "login.tmpl", &web.Page{ + Title: "Login failed - ClusterCockpit", + MsgType: "alert-warning", + Message: err.Error(), + Build: buildInfo, }) })) From ebcae32e2310dd4b08dce0070f8110de1e921f70 Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Fri, 18 Aug 2023 15:56:11 +0200 Subject: [PATCH 55/95] Update docs and cleanup --- docs/dev-authentication.md | 44 +++++++++++++++++++++++++------------- internal/auth/auth.go | 22 ++----------------- internal/auth/ldap.go | 2 -- 3 files changed, 31 insertions(+), 37 deletions(-) diff --git a/docs/dev-authentication.md b/docs/dev-authentication.md index 4107d61..4346e97 100644 --- a/docs/dev-authentication.md +++ b/docs/dev-authentication.md @@ -16,6 +16,9 @@ The most important routines in auth are: The http router calls auth in the following cases: * `r.Handle("/login", authentication.Login( ... )).Methods(http.MethodPost)`: The POST request on the `/login` route will call the Login callback. +* `r.Handle("/jwt-login", authentication.Login( ... ))`: + Any request on the `/jwt-login` route will call the Login callback. Intended + for use for the JWT token based authenticators. * Any route in the secured subrouter will always call Auth(), on success it will call the next handler in the chain, on failure it will render the login template. @@ -50,7 +53,6 @@ The Login function (located in `auth.go`): object is returned. - Creates a new session object, stores the user attributes in the session and saves the session. - - If the user does not yet exist in the database try to add the user - Starts the `onSuccess` http handler ## Local authenticator @@ -71,11 +73,20 @@ if e := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(r.FormValue( ## LDAP authenticator -This authenticator is applied if +This authenticator is applied if the user was found in the database and its +AuthSource is LDAP: ``` -return user != nil && user.AuthSource == AuthViaLDAP +if user != nil { + if user.AuthSource == schema.AuthViaLDAP { + return user, true + } +} ``` +If the option `SyncUserOnLogin` is set it tried to sync the user from the LDAP +directory. In case this succeeds the user is persisted to the database and can +login. + Gets the LDAP connection and tries a bind with the provided credentials: ``` if err := l.Bind(userDn, r.FormValue("password")); err != nil { @@ -88,33 +99,34 @@ if err := l.Bind(userDn, r.FormValue("password")); err != nil { Login via JWT token will create a session without password. For login the `X-Auth-Token` header is not supported. This authenticator is -applied if the Authorization header is present: +applied if the Authorization header or query parameter login-token is present: ``` - return r.Header.Get("Authorization") != "" + return user, r.Header.Get("Authorization") != "" || + r.URL.Query().Get("login-token") != "" ``` The Login function: -* Parses the token +* Parses the token and checks if it is expired * Check if the signing method is EdDSA or HS256 or HS512 * Check if claims are valid and extracts the claims * The following claims have to be present: - `sub`: The subject, in this case this is the username - `exp`: Expiration in Unix epoch time - `roles`: String array with roles of user -* In case user is not yet set, which is usually the case: - - Try to fetch user from database - - In case user is not yet present add user to user database table with `AuthViaToken` AuthSource. +* In case user does not exist in the database and the option `SyncUserOnLogin` + is set add user to user database table with `AuthViaToken` AuthSource. * Return valid user object ## JWT Cookie Session authenticator Login via JWT cookie token will create a session without password. -It is first checked if the required configuration keys are set: -* `publicKeyCrossLogin` -* `TrustedExternalIssuer` +It is first checked if the required configuration options are set: +* `trustedIssuer` * `CookieName` - This authenticator is applied if the configured cookie is present: +and optionally the environment variable `CROSS_LOGIN_JWT_PUBLIC_KEY` is set. + +This authenticator is applied if the configured cookie is present: ``` jwtCookie, err := r.Cookie(cookieName) @@ -131,9 +143,11 @@ The Login function: - Return public cross login key - Otherwise return standard public key * Check if claims are valid -* Depending on the option `ForceJWTValidationViaDatabase ` the roles are +* Depending on the option `validateUser` the roles are extracted from JWT token or taken from user object fetched from database * Ask browser to delete the JWT cookie +* In case user does not exist in the database and the option `SyncUserOnLogin` + is set add user to user database table with `AuthViaToken` AuthSource. * Return valid user object # Auth @@ -154,7 +168,7 @@ Implemented in JWTAuthenticator: prefix * Parse token and check if it is valid. The Parse routine will also check if the token is expired. -* If the option `ForceJWTValidationViaDatabase` is set it will ensure the +* If the option `validateUser` is set it will ensure the user object exists in the database and takes the roles from the database user * Otherwise the roles are extracted from the roles claim * Returns a valid user object with AuthType set to AuthToken diff --git a/internal/auth/auth.go b/internal/auth/auth.go index 92b777b..e8f0db4 100644 --- a/internal/auth/auth.go +++ b/internal/auth/auth.go @@ -48,26 +48,8 @@ func (auth *Authentication) AuthViaSession( if session.IsNew { return nil, nil } - // - // var username string - // var projects, roles []string - // - // if val, ok := session.Values["username"]; ok { - // username, _ = val.(string) - // } else { - // return nil, errors.New("no key username in session") - // } - // if val, ok := session.Values["projects"]; ok { - // projects, _ = val.([]string) - // } else { - // return nil, errors.New("no key projects in session") - // } - // if val, ok := session.Values["projects"]; ok { - // roles, _ = val.([]string) - // } else { - // return nil, errors.New("no key roles in session") - // } - // + + // TODO: Check if session keys exist username, _ := session.Values["username"].(string) projects, _ := session.Values["projects"].([]string) roles, _ := session.Values["roles"].([]string) diff --git a/internal/auth/ldap.go b/internal/auth/ldap.go index be2aece..f89aede 100644 --- a/internal/auth/ldap.go +++ b/internal/auth/ldap.go @@ -228,8 +228,6 @@ func (la *LdapAuthenticator) Sync() error { return nil } -// TODO: Add a connection pool or something like -// that so that connections can be reused/cached. func (la *LdapAuthenticator) getLdapConnection(admin bool) (*ldap.Conn, error) { lc := config.Keys.LdapConfig From f6c4c963ec1360c51d05d8b3f504f5d435c6fd0a Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Fri, 18 Aug 2023 17:18:31 +0200 Subject: [PATCH 56/95] feat: Add users rest endpoint swagger docs --- README.md | 2 +- api/swagger.json | 312 ++++++++++++++++++++++++++++++++++++++++++- api/swagger.yaml | 213 ++++++++++++++++++++++++++++- internal/api/docs.go | 312 ++++++++++++++++++++++++++++++++++++++++++- internal/api/rest.go | 185 +++++++++++++++++-------- 5 files changed, 959 insertions(+), 65 deletions(-) diff --git a/README.md b/README.md index 81bc017..de3a2ea 100644 --- a/README.md +++ b/README.md @@ -165,7 +165,7 @@ If you start `cc-backend` with the `-dev` flag, the GraphQL Playground UI is ava This project integrates [swagger ui] (https://swagger.io/tools/swagger-ui/) to document and test its REST API. The swagger documentation files can be found in `./api/`. You can generate the swagger-ui configuration by running `go run github.com/swaggo/swag/cmd/swag init -d ./internal/api,./pkg/schema -g rest.go -o ./api `. -You need to move the created `./api/doc.go` to `./internal/api/doc.go`. +You need to move the created `./api/docs.go` to `./internal/api/docs.go`. If you start cc-backend with the `-dev` flag, the Swagger interface is available at http://localhost:8080/swagger/. You must enter a JWT key for a user with the API role. diff --git a/api/swagger.json b/api/swagger.json index 87a7de5..2a4c43a 100644 --- a/api/swagger.json +++ b/api/swagger.json @@ -12,7 +12,7 @@ "name": "MIT License", "url": "https://opensource.org/licenses/MIT" }, - "version": "1" + "version": "1.0.0" }, "host": "localhost:8080", "basePath": "/api", @@ -707,6 +707,314 @@ } } } + }, + "/user/{id}": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "Modifies user defined by username (id) in one of four possible ways.\nIf more than one formValue is set then only the highest priority field is used.", + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "text/plain" + ], + "tags": [ + "add and modify" + ], + "summary": "Updates an existing user", + "parameters": [ + { + "type": "string", + "description": "Database ID of User", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Priority 1: Role to add, one of: [admin, support, manager, user, api]", + "name": "add-role", + "in": "formData" + }, + { + "type": "string", + "description": "Priority 2: Role to remove, one of: [admin, support, manager, user, api]", + "name": "remove-role", + "in": "formData" + }, + { + "type": "string", + "description": "Priority 3: Project to add", + "name": "add-project", + "in": "formData" + }, + { + "type": "string", + "description": "Priority 4: Project to remove", + "name": "remove-project", + "in": "formData" + } + ], + "responses": { + "200": { + "description": "Task successful", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + }, + "403": { + "description": "Forbidden", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + }, + "422": { + "description": "Unprocessable Entity: The user could not be updated", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + } + } + } + }, + "/users/": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "Returns a JSON-encoded list of users.\nRequired query-parameter defines if all users or only users with additional special roles are returned.", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "query" + ], + "summary": "Returns a list of users", + "parameters": [ + { + "type": "boolean", + "description": "If returned list should contain all users or only users with additional special roles", + "name": "not-just-user", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "Users returned successfully", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + }, + "403": { + "description": "Forbidden", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + } + } + }, + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "User specified in form data will be saved to database.", + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "text/plain" + ], + "tags": [ + "add and modify" + ], + "summary": "Adds a new user", + "parameters": [ + { + "type": "string", + "description": "Unique user ID", + "name": "username", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "User password", + "name": "password", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "User role, one of: [admin, support, manager, user, api]", + "name": "role", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "Managed project, required for new manager role user", + "name": "project", + "in": "formData" + }, + { + "type": "string", + "description": "Users name", + "name": "name", + "in": "formData" + }, + { + "type": "string", + "description": "Users email", + "name": "email", + "in": "formData" + } + ], + "responses": { + "200": { + "description": "User added successfully", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + }, + "403": { + "description": "Forbidden", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + }, + "422": { + "description": "Unprocessable Entity: creating user failed", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + } + } + }, + "delete": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "User defined by username in form data will be deleted from database.", + "consumes": [ + "multipart/form-data" + ], + "tags": [ + "remove" + ], + "summary": "Deletes a user", + "parameters": [ + { + "type": "string", + "description": "User ID to delete", + "name": "username", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "User deleted successfully" + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + }, + "403": { + "description": "Forbidden", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + }, + "422": { + "description": "Unprocessable Entity: deleting user failed", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + } + } + } } }, "definitions": { @@ -1366,7 +1674,7 @@ "type": "object", "properties": { "id": { - "description": "The unique DB identifier of a tag\nThe unique DB identifier of a tag", + "description": "The unique DB identifier of a tag", "type": "integer" }, "name": { diff --git a/api/swagger.yaml b/api/swagger.yaml index 093266d..d19f79b 100644 --- a/api/swagger.yaml +++ b/api/swagger.yaml @@ -495,9 +495,7 @@ definitions: description: Defines a tag using name and type. properties: id: - description: |- - The unique DB identifier of a tag - The unique DB identifier of a tag + description: The unique DB identifier of a tag type: integer name: description: Tag Name @@ -526,7 +524,7 @@ info: name: MIT License url: https://opensource.org/licenses/MIT title: ClusterCockpit REST API - version: "1" + version: 1.0.0 paths: /jobs/: get: @@ -996,6 +994,213 @@ paths: summary: Adds one or more tags to a job tags: - add and modify + /user/{id}: + post: + consumes: + - multipart/form-data + description: |- + Modifies user defined by username (id) in one of four possible ways. + If more than one formValue is set then only the highest priority field is used. + parameters: + - description: Database ID of User + in: path + name: id + required: true + type: string + - description: 'Priority 1: Role to add, one of: [admin, support, manager, user, + api]' + in: formData + name: add-role + type: string + - description: 'Priority 2: Role to remove, one of: [admin, support, manager, + user, api]' + in: formData + name: remove-role + type: string + - description: 'Priority 3: Project to add' + in: formData + name: add-project + type: string + - description: 'Priority 4: Project to remove' + in: formData + name: remove-project + type: string + produces: + - text/plain + responses: + "200": + description: Task successful + schema: + type: string + "400": + description: Bad Request + schema: + $ref: '#/definitions/api.ErrorResponse' + "401": + description: Unauthorized + schema: + $ref: '#/definitions/api.ErrorResponse' + "403": + description: Forbidden + schema: + $ref: '#/definitions/api.ErrorResponse' + "422": + description: 'Unprocessable Entity: The user could not be updated' + schema: + $ref: '#/definitions/api.ErrorResponse' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/api.ErrorResponse' + security: + - ApiKeyAuth: [] + summary: Updates an existing user + tags: + - add and modify + /users/: + delete: + consumes: + - multipart/form-data + description: User defined by username in form data will be deleted from database. + parameters: + - description: User ID to delete + in: formData + name: username + required: true + type: string + responses: + "200": + description: User deleted successfully + "400": + description: Bad Request + schema: + $ref: '#/definitions/api.ErrorResponse' + "401": + description: Unauthorized + schema: + $ref: '#/definitions/api.ErrorResponse' + "403": + description: Forbidden + schema: + $ref: '#/definitions/api.ErrorResponse' + "422": + description: 'Unprocessable Entity: deleting user failed' + schema: + $ref: '#/definitions/api.ErrorResponse' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/api.ErrorResponse' + security: + - ApiKeyAuth: [] + summary: Deletes a user + tags: + - remove + get: + consumes: + - application/json + description: |- + Returns a JSON-encoded list of users. + Required query-parameter defines if all users or only users with additional special roles are returned. + parameters: + - description: If returned list should contain all users or only users with + additional special roles + in: query + name: not-just-user + required: true + type: boolean + produces: + - application/json + responses: + "200": + description: Users returned successfully + schema: + type: string + "400": + description: Bad Request + schema: + $ref: '#/definitions/api.ErrorResponse' + "401": + description: Unauthorized + schema: + $ref: '#/definitions/api.ErrorResponse' + "403": + description: Forbidden + schema: + $ref: '#/definitions/api.ErrorResponse' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/api.ErrorResponse' + security: + - ApiKeyAuth: [] + summary: Returns a list of users + tags: + - query + post: + consumes: + - multipart/form-data + description: User specified in form data will be saved to database. + parameters: + - description: Unique user ID + in: formData + name: username + required: true + type: string + - description: User password + in: formData + name: password + required: true + type: string + - description: 'User role, one of: [admin, support, manager, user, api]' + in: formData + name: role + required: true + type: string + - description: Managed project, required for new manager role user + in: formData + name: project + type: string + - description: Users name + in: formData + name: name + type: string + - description: Users email + in: formData + name: email + type: string + produces: + - text/plain + responses: + "200": + description: User added successfully + schema: + type: string + "400": + description: Bad Request + schema: + $ref: '#/definitions/api.ErrorResponse' + "401": + description: Unauthorized + schema: + $ref: '#/definitions/api.ErrorResponse' + "403": + description: Forbidden + schema: + $ref: '#/definitions/api.ErrorResponse' + "422": + description: 'Unprocessable Entity: creating user failed' + schema: + $ref: '#/definitions/api.ErrorResponse' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/api.ErrorResponse' + security: + - ApiKeyAuth: [] + summary: Adds a new user + tags: + - add and modify securityDefinitions: ApiKeyAuth: in: header diff --git a/internal/api/docs.go b/internal/api/docs.go index 85acc92..4f161e6 100644 --- a/internal/api/docs.go +++ b/internal/api/docs.go @@ -713,6 +713,314 @@ const docTemplate = `{ } } } + }, + "/user/{id}": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "Modifies user defined by username (id) in one of four possible ways.\nIf more than one formValue is set then only the highest priority field is used.", + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "text/plain" + ], + "tags": [ + "add and modify" + ], + "summary": "Updates an existing user", + "parameters": [ + { + "type": "string", + "description": "Database ID of User", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Priority 1: Role to add, one of: [admin, support, manager, user, api]", + "name": "add-role", + "in": "formData" + }, + { + "type": "string", + "description": "Priority 2: Role to remove, one of: [admin, support, manager, user, api]", + "name": "remove-role", + "in": "formData" + }, + { + "type": "string", + "description": "Priority 3: Project to add", + "name": "add-project", + "in": "formData" + }, + { + "type": "string", + "description": "Priority 4: Project to remove", + "name": "remove-project", + "in": "formData" + } + ], + "responses": { + "200": { + "description": "Task successful", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + }, + "403": { + "description": "Forbidden", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + }, + "422": { + "description": "Unprocessable Entity: The user could not be updated", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + } + } + } + }, + "/users/": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "Returns a JSON-encoded list of users.\nRequired query-parameter defines if all users or only users with additional special roles are returned.", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "query" + ], + "summary": "Returns a list of users", + "parameters": [ + { + "type": "boolean", + "description": "If returned list should contain all users or only users with additional special roles", + "name": "not-just-user", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "Users returned successfully", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + }, + "403": { + "description": "Forbidden", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + } + } + }, + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "User specified in form data will be saved to database.", + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "text/plain" + ], + "tags": [ + "add and modify" + ], + "summary": "Adds a new user", + "parameters": [ + { + "type": "string", + "description": "Unique user ID", + "name": "username", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "User password", + "name": "password", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "User role, one of: [admin, support, manager, user, api]", + "name": "role", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "Managed project, required for new manager role user", + "name": "project", + "in": "formData" + }, + { + "type": "string", + "description": "Users name", + "name": "name", + "in": "formData" + }, + { + "type": "string", + "description": "Users email", + "name": "email", + "in": "formData" + } + ], + "responses": { + "200": { + "description": "User added successfully", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + }, + "403": { + "description": "Forbidden", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + }, + "422": { + "description": "Unprocessable Entity: creating user failed", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + } + } + }, + "delete": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "User defined by username in form data will be deleted from database.", + "consumes": [ + "multipart/form-data" + ], + "tags": [ + "remove" + ], + "summary": "Deletes a user", + "parameters": [ + { + "type": "string", + "description": "User ID to delete", + "name": "username", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "User deleted successfully" + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + }, + "403": { + "description": "Forbidden", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + }, + "422": { + "description": "Unprocessable Entity: deleting user failed", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/api.ErrorResponse" + } + } + } + } } }, "definitions": { @@ -1372,7 +1680,7 @@ const docTemplate = `{ "type": "object", "properties": { "id": { - "description": "The unique DB identifier of a tag\nThe unique DB identifier of a tag", + "description": "The unique DB identifier of a tag", "type": "integer" }, "name": { @@ -1415,7 +1723,7 @@ const docTemplate = `{ // SwaggerInfo holds exported Swagger Info so clients can modify it var SwaggerInfo = &swag.Spec{ - Version: "1", + Version: "1.0.0", Host: "localhost:8080", BasePath: "/api", Schemes: []string{}, diff --git a/internal/api/rest.go b/internal/api/rest.go index 23ae53a..67e4dbe 100644 --- a/internal/api/rest.go +++ b/internal/api/rest.go @@ -77,8 +77,6 @@ func (api *RestApi) MountRoutes(r *mux.Router) { r.HandleFunc("/jobs/delete_job/", api.deleteJobByRequest).Methods(http.MethodDelete) r.HandleFunc("/jobs/delete_job/{id}", api.deleteJobById).Methods(http.MethodDelete) r.HandleFunc("/jobs/delete_job_before/{ts}", api.deleteJobBefore).Methods(http.MethodDelete) - // r.HandleFunc("/secured/addProject/{id}/{project}", api.secureUpdateUser).Methods(http.MethodPost) - // r.HandleFunc("/secured/addRole/{id}/{role}", api.secureUpdateUser).Methods(http.MethodPost) if api.MachineStateDir != "" { r.HandleFunc("/machine_state/{cluster}/{host}", api.getMachineState).Methods(http.MethodGet) @@ -947,43 +945,31 @@ func (api *RestApi) getJobMetrics(rw http.ResponseWriter, r *http.Request) { }) } -func (api *RestApi) getJWT(rw http.ResponseWriter, r *http.Request) { - err := securedCheck(r) - if err != nil { - http.Error(rw, err.Error(), http.StatusForbidden) - } - - rw.Header().Set("Content-Type", "text/plain") - username := r.FormValue("username") - me := repository.GetUserFromContext(r.Context()) - if !me.HasRole(schema.RoleAdmin) { - if username != me.Username { - http.Error(rw, "Only admins are allowed to sign JWTs not for themselves", - http.StatusForbidden) - return - } - } - - user, err := repository.GetUserRepository().GetUser(username) - if err != nil { - http.Error(rw, err.Error(), http.StatusUnprocessableEntity) - return - } - - jwt, err := api.Authentication.JwtAuth.ProvideJWT(user) - if err != nil { - http.Error(rw, err.Error(), http.StatusUnprocessableEntity) - return - } - - rw.WriteHeader(http.StatusOK) - rw.Write([]byte(jwt)) -} - +// createUser godoc +// @summary Adds a new user +// @tags add and modify +// @description User specified in form data will be saved to database. +// @accept mpfd +// @produce plain +// @param username formData string true "Unique user ID" +// @param password formData string true "User password" +// @param role formData string true "User role, one of: [admin, support, manager, user, api]" +// @param project formData string false "Managed project, required for new manager role user" +// @param name formData string false "Users name" +// @param email formData string false "Users email" +// @success 200 {string} string "User added successfully" +// @failure 400 {object} api.ErrorResponse "Bad Request" +// @failure 401 {object} api.ErrorResponse "Unauthorized" +// @failure 403 {object} api.ErrorResponse "Forbidden" +// @failure 422 {object} api.ErrorResponse "Unprocessable Entity: creating user failed" +// @failure 500 {object} api.ErrorResponse "Internal Server Error" +// @security ApiKeyAuth +// @router /users/ [post] func (api *RestApi) createUser(rw http.ResponseWriter, r *http.Request) { err := securedCheck(r) if err != nil { http.Error(rw, err.Error(), http.StatusForbidden) + return } rw.Header().Set("Content-Type", "text/plain") @@ -1026,10 +1012,25 @@ func (api *RestApi) createUser(rw http.ResponseWriter, r *http.Request) { rw.Write([]byte(fmt.Sprintf("User %v successfully created!\n", username))) } +// deleteUser godoc +// @summary Deletes a user +// @tags remove +// @description User defined by username in form data will be deleted from database. +// @accept mpfd +// @param username formData string true "User ID to delete" +// @success 200 "User deleted successfully" +// @failure 400 {object} api.ErrorResponse "Bad Request" +// @failure 401 {object} api.ErrorResponse "Unauthorized" +// @failure 403 {object} api.ErrorResponse "Forbidden" +// @failure 422 {object} api.ErrorResponse "Unprocessable Entity: deleting user failed" +// @failure 500 {object} api.ErrorResponse "Internal Server Error" +// @security ApiKeyAuth +// @router /users/ [delete] func (api *RestApi) deleteUser(rw http.ResponseWriter, r *http.Request) { err := securedCheck(r) if err != nil { http.Error(rw, err.Error(), http.StatusForbidden) + return } if user := repository.GetUserFromContext(r.Context()); !user.HasRole(schema.RoleAdmin) { @@ -1046,10 +1047,26 @@ func (api *RestApi) deleteUser(rw http.ResponseWriter, r *http.Request) { rw.WriteHeader(http.StatusOK) } +// getUsers godoc +// @summary Returns a list of users +// @tags query +// @description Returns a JSON-encoded list of users. +// @description Required query-parameter defines if all users or only users with additional special roles are returned. +// @accept json +// @produce json +// @param not-just-user query bool true "If returned list should contain all users or only users with additional special roles" +// @success 200 {string} json "Users returned successfully" +// @failure 400 {object} api.ErrorResponse "Bad Request" +// @failure 401 {object} api.ErrorResponse "Unauthorized" +// @failure 403 {object} api.ErrorResponse "Forbidden" +// @failure 500 {object} api.ErrorResponse "Internal Server Error" +// @security ApiKeyAuth +// @router /users/ [get] func (api *RestApi) getUsers(rw http.ResponseWriter, r *http.Request) { err := securedCheck(r) if err != nil { http.Error(rw, err.Error(), http.StatusForbidden) + return } if user := repository.GetUserFromContext(r.Context()); !user.HasRole(schema.RoleAdmin) { @@ -1066,31 +1083,31 @@ func (api *RestApi) getUsers(rw http.ResponseWriter, r *http.Request) { json.NewEncoder(rw).Encode(users) } -func (api *RestApi) getRoles(rw http.ResponseWriter, r *http.Request) { - err := securedCheck(r) - if err != nil { - http.Error(rw, err.Error(), http.StatusForbidden) - } - - user := repository.GetUserFromContext(r.Context()) - if !user.HasRole(schema.RoleAdmin) { - http.Error(rw, "only admins are allowed to fetch a list of roles", http.StatusForbidden) - return - } - - roles, err := schema.GetValidRoles(user) - if err != nil { - http.Error(rw, err.Error(), http.StatusInternalServerError) - return - } - - json.NewEncoder(rw).Encode(roles) -} - +// updateUser godoc +// @summary Updates an existing user +// @tags add and modify +// @description Modifies user defined by username (id) in one of four possible ways. +// @description If more than one formValue is set then only the highest priority field is used. +// @accept mpfd +// @produce plain +// @param id path string true "Database ID of User" +// @param add-role formData string false "Priority 1: Role to add, one of: [admin, support, manager, user, api]" +// @param remove-role formData string false "Priority 2: Role to remove, one of: [admin, support, manager, user, api]" +// @param add-project formData string false "Priority 3: Project to add" +// @param remove-project formData string false "Priority 4: Project to remove" +// @success 200 {string} string "Task successful" +// @failure 400 {object} api.ErrorResponse "Bad Request" +// @failure 401 {object} api.ErrorResponse "Unauthorized" +// @failure 403 {object} api.ErrorResponse "Forbidden" +// @failure 422 {object} api.ErrorResponse "Unprocessable Entity: The user could not be updated" +// @failure 500 {object} api.ErrorResponse "Internal Server Error" +// @security ApiKeyAuth +// @router /user/{id} [post] func (api *RestApi) updateUser(rw http.ResponseWriter, r *http.Request) { err := securedCheck(r) if err != nil { http.Error(rw, err.Error(), http.StatusForbidden) + return } if user := repository.GetUserFromContext(r.Context()); !user.HasRole(schema.RoleAdmin) { @@ -1134,6 +1151,62 @@ func (api *RestApi) updateUser(rw http.ResponseWriter, r *http.Request) { } } +func (api *RestApi) getJWT(rw http.ResponseWriter, r *http.Request) { + err := securedCheck(r) + if err != nil { + http.Error(rw, err.Error(), http.StatusForbidden) + return + } + + rw.Header().Set("Content-Type", "text/plain") + username := r.FormValue("username") + me := repository.GetUserFromContext(r.Context()) + if !me.HasRole(schema.RoleAdmin) { + if username != me.Username { + http.Error(rw, "Only admins are allowed to sign JWTs not for themselves", + http.StatusForbidden) + return + } + } + + user, err := repository.GetUserRepository().GetUser(username) + if err != nil { + http.Error(rw, err.Error(), http.StatusUnprocessableEntity) + return + } + + jwt, err := api.Authentication.JwtAuth.ProvideJWT(user) + if err != nil { + http.Error(rw, err.Error(), http.StatusUnprocessableEntity) + return + } + + rw.WriteHeader(http.StatusOK) + rw.Write([]byte(jwt)) +} + +func (api *RestApi) getRoles(rw http.ResponseWriter, r *http.Request) { + err := securedCheck(r) + if err != nil { + http.Error(rw, err.Error(), http.StatusForbidden) + return + } + + user := repository.GetUserFromContext(r.Context()) + if !user.HasRole(schema.RoleAdmin) { + http.Error(rw, "only admins are allowed to fetch a list of roles", http.StatusForbidden) + return + } + + roles, err := schema.GetValidRoles(user) + if err != nil { + http.Error(rw, err.Error(), http.StatusInternalServerError) + return + } + + json.NewEncoder(rw).Encode(roles) +} + func (api *RestApi) updateConfiguration(rw http.ResponseWriter, r *http.Request) { rw.Header().Set("Content-Type", "text/plain") key, value := r.FormValue("key"), r.FormValue("value") From dc67a1f1031ff8e88a0f0a8fe691424d0007f018 Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Mon, 21 Aug 2023 08:49:42 +0200 Subject: [PATCH 57/95] Update frontend and backend dependencies --- go.mod | 32 +- go.sum | 88 +- internal/graph/generated/generated.go | 1758 +++++++++++++++---------- internal/graph/model/models_gen.go | 64 +- internal/graph/schema.resolvers.go | 2 +- web/frontend/package-lock.json | 18 +- 6 files changed, 1154 insertions(+), 808 deletions(-) diff --git a/go.mod b/go.mod index 12fc2fd..b0ce960 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/ClusterCockpit/cc-backend go 1.18 require ( - github.com/99designs/gqlgen v0.17.24 + github.com/99designs/gqlgen v0.17.36 github.com/ClusterCockpit/cc-units v0.4.0 github.com/Masterminds/squirrel v1.5.3 github.com/go-co-op/gocron v1.25.0 @@ -23,9 +23,9 @@ require ( github.com/qustavo/sqlhooks/v2 v2.1.0 github.com/santhosh-tekuri/jsonschema/v5 v5.2.0 github.com/swaggo/http-swagger v1.3.3 - github.com/swaggo/swag v1.8.10 - github.com/vektah/gqlparser/v2 v2.5.1 - golang.org/x/crypto v0.6.0 + github.com/swaggo/swag v1.16.1 + github.com/vektah/gqlparser/v2 v2.5.8 + golang.org/x/crypto v0.12.0 golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea ) @@ -40,19 +40,18 @@ require ( github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/deepmap/oapi-codegen v1.12.4 // indirect github.com/felixge/httpsnoop v1.0.3 // indirect - github.com/ghodss/yaml v1.0.0 // indirect github.com/go-asn1-ber/asn1-ber v1.5.4 // indirect - github.com/go-openapi/jsonpointer v0.19.6 // indirect + github.com/go-openapi/jsonpointer v0.20.0 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect - github.com/go-openapi/spec v0.20.8 // indirect - github.com/go-openapi/swag v0.22.3 // indirect + github.com/go-openapi/spec v0.20.9 // indirect + github.com/go-openapi/swag v0.22.4 // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/google/uuid v1.3.0 // indirect github.com/gorilla/securecookie v1.1.1 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/golang-lru v0.5.4 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.3 // indirect github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf // indirect github.com/josharian/intern v1.0.0 // indirect github.com/jpillora/backoff v1.0.0 // indirect @@ -72,17 +71,18 @@ require ( github.com/robfig/cron/v3 v3.0.1 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/swaggo/files v1.0.0 // indirect - github.com/urfave/cli/v2 v2.24.4 // indirect + github.com/urfave/cli/v2 v2.25.7 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect go.uber.org/atomic v1.10.0 // indirect - golang.org/x/mod v0.8.0 // indirect - golang.org/x/net v0.7.0 // indirect + golang.org/x/mod v0.12.0 // indirect + golang.org/x/net v0.14.0 // indirect golang.org/x/oauth2 v0.5.0 // indirect - golang.org/x/sys v0.5.0 // indirect - golang.org/x/text v0.7.0 // indirect - golang.org/x/tools v0.6.0 // indirect + golang.org/x/sys v0.11.0 // indirect + golang.org/x/text v0.12.0 // indirect + golang.org/x/tools v0.12.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.28.1 // indirect + google.golang.org/protobuf v1.30.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + sigs.k8s.io/yaml v1.3.0 // indirect ) diff --git a/go.sum b/go.sum index 691fef1..379bda7 100644 --- a/go.sum +++ b/go.sum @@ -50,8 +50,8 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= -github.com/99designs/gqlgen v0.17.24 h1:pcd/HFIoSdRvyADYQG2dHvQN2KZqX/nXzlVm6TMMq7E= -github.com/99designs/gqlgen v0.17.24/go.mod h1:BMhYIhe4bp7OlCo5I2PnowSK/Wimpv/YlxfNkqZGwLo= +github.com/99designs/gqlgen v0.17.36 h1:u/o/rv2SZ9s5280dyUOOrkpIIkr/7kITMXYD3rkJ9go= +github.com/99designs/gqlgen v0.17.36/go.mod h1:6RdyY8puhCoWAQVr2qzF2OMVfudQzc8ACxzpzluoQm4= github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8/go.mod h1:CzsSbkDixRphAF5hS6wbMKq0eI6ccJRb7/A0M6JBnwg= github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= @@ -78,7 +78,6 @@ github.com/Azure/go-ntlmssp v0.0.0-20220621081337-cb9428e4ac1e/go.mod h1:chxPXzS github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 h1:mFRzDkZVAjdal+s7s0MwaRv9igoPqLRdzOLzw/8Xvq8= github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/ClickHouse/clickhouse-go v1.4.3/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI= github.com/ClusterCockpit/cc-units v0.4.0 h1:zP5DOu99GmErW0tCDf0gcLrlWt42RQ9dpoONEOh4cI0= @@ -120,7 +119,6 @@ github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdko github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= -github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= github.com/agnivade/levenshtein v1.1.1 h1:QY8M92nrzkmr798gCo3kmMyqXFzdQVpxLlGPRBij0P8= github.com/agnivade/levenshtein v1.1.1/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= @@ -355,7 +353,6 @@ github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfc github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= @@ -442,7 +439,6 @@ github.com/gabriel-vasile/mimetype v1.4.0/go.mod h1:fA8fi6KUiG7MgQQ+mEWotXoEOvmx github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-asn1-ber/asn1-ber v1.5.4 h1:vXT6d/FNDiELJnLb6hGNa309LMsrCoYFvpwHDF0+Y1A= github.com/go-asn1-ber/asn1-ber v1.5.4/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= @@ -477,8 +473,9 @@ github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+ github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonpointer v0.20.0 h1:ESKJdU9ASRfaPNOPRx12IUyA1vn3R9GiE3KYD14BXdQ= +github.com/go-openapi/jsonpointer v0.20.0/go.mod h1:6PGzBjjIIumbLYysB73Klnms1mwnU4G3YHOECG3CedA= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= @@ -488,15 +485,16 @@ github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2Kv github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/spec v0.20.8 h1:ubHmXNY3FCIOinT8RNrrPfGc9t7I1qhPtdOGoG2AxRU= -github.com/go-openapi/spec v0.20.8/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= +github.com/go-openapi/spec v0.20.9 h1:xnlYNQAwKd2VQRRfwTEI0DcK+2cbuvI/0c7jx3gA8/8= +github.com/go-openapi/spec v0.20.9/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= +github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= @@ -702,8 +700,8 @@ github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/v2 v2.0.3 h1:kmRrRLlInXvng0SmLxmQpQkpbYAvcXm7NPDrgxJa9mE= +github.com/hashicorp/golang-lru/v2 v2.0.3/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= @@ -808,7 +806,6 @@ github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALr github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/kevinmbeaulieu/eq-go v1.0.0/go.mod h1:G3S8ajA56gKBZm4UB9AOyoOS37JO3roToPzKNM8dtdM= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -827,7 +824,7 @@ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFB github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= @@ -847,7 +844,6 @@ github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.0 h1:Zx5DJFEYQXio93kgXnQ09fXNiUKsqv4OUEu2UtGcB1E= github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= -github.com/logrusorgru/aurora/v3 v3.0.0/go.mod h1:vsR12bk5grlLvLXAYrBsb5Oc/N+LxAlxggSjiwMnCUc= github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -862,12 +858,10 @@ github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsI github.com/markbates/pkger v0.15.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI= github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= -github.com/matryer/moq v0.2.7/go.mod h1:kITsx543GOENm48TUAQyJ9+SAvFSr7iGQXPoth/VUBk= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= @@ -876,7 +870,6 @@ github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= @@ -1090,8 +1083,8 @@ github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24 github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= -github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= +github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= @@ -1150,14 +1143,14 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/swaggo/files v1.0.0 h1:1gGXVIeUFCS/dta17rnP0iOpr6CXFwKD7EO5ID233e4= github.com/swaggo/files v1.0.0/go.mod h1:N59U6URJLyU1PQgFqPM7wXLMhJx7QAolnvfQkqO13kc= github.com/swaggo/http-swagger v1.3.3 h1:Hu5Z0L9ssyBLofaama21iYaF2VbWyA8jdohaaCGpHsc= github.com/swaggo/http-swagger v1.3.3/go.mod h1:sE+4PjD89IxMPm77FnkDz0sdO+p5lbXzrVWT6OTVVGo= -github.com/swaggo/swag v1.8.10 h1:eExW4bFa52WOjqRzRD58bgWsWfdFJso50lpbeTcmTfo= -github.com/swaggo/swag v1.8.10/go.mod h1:ezQVUUhly8dludpVk+/PuwJWvLLanB13ygV5Pr9enSk= +github.com/swaggo/swag v1.16.1 h1:fTNRhKstPKxcnoKsytm4sahr8FaYzUcT7i1/3nd/fBg= +github.com/swaggo/swag v1.16.1/go.mod h1:9/LMvHycG3NFHfR6LwvikHv5iFvmPADQ359cKikGxto= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= @@ -1172,11 +1165,10 @@ github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli/v2 v2.8.1/go.mod h1:Z41J9TPoffeoqP0Iza0YbAhGvymRdZAd2uPmZ5JxRdY= -github.com/urfave/cli/v2 v2.24.4 h1:0gyJJEBYtCV87zI/x2nZCPyDxD51K6xM8SkwjHFCNEU= -github.com/urfave/cli/v2 v2.24.4/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= -github.com/vektah/gqlparser/v2 v2.5.1 h1:ZGu+bquAY23jsxDRcYpWjttRZrUz07LbiY77gUOHcr4= -github.com/vektah/gqlparser/v2 v2.5.1/go.mod h1:mPgqFBu/woKTVYWyNk8cO3kh4S/f4aRFZrvOnp3hmCs= +github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= +github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= +github.com/vektah/gqlparser/v2 v2.5.8 h1:pm6WOnGdzFOCfcQo9L3+xzW51mKrlwTEg4Wr7AH1JW4= +github.com/vektah/gqlparser/v2 v2.5.8/go.mod h1:z8xXUff237NntSuH8mLFijZ+1tjV1swDbpDqjJmk6ME= github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= @@ -1204,7 +1196,6 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= @@ -1293,8 +1284,8 @@ golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc= -golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1344,10 +1335,9 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1410,7 +1400,6 @@ golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -1418,8 +1407,8 @@ golang.org/x/net v0.0.0-20220111093109-d55c255bac03/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/oauth2 v0.0.0-20180227000427-d7d64896b5ff/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1453,7 +1442,7 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sys v0.0.0-20180224232135-f6cff0780e54/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1567,7 +1556,6 @@ golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1577,10 +1565,9 @@ golang.org/x/sys v0.0.0-20220111092808-5a964db01320/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220317061510-51cd9980dadf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -1596,10 +1583,9 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1687,10 +1673,9 @@ golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.12.0 h1:YW6HUoUmYBpwSgyaGaZq1fHjrBjX1rlpZ54T6mu2kss= +golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1865,9 +1850,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -2002,3 +1986,5 @@ sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/internal/graph/generated/generated.go b/internal/graph/generated/generated.go index 229c6b5..1cb8b74 100644 --- a/internal/graph/generated/generated.go +++ b/internal/graph/generated/generated.go @@ -332,7 +332,7 @@ func (e *executableSchema) Schema() *ast.Schema { } func (e *executableSchema) Complexity(typeName, field string, childComplexity int, rawArgs map[string]interface{}) (int, bool) { - ec := executionContext{nil, e} + ec := executionContext{nil, e, 0, 0, nil} _ = ec switch typeName + "." + field { @@ -1439,7 +1439,7 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in func (e *executableSchema) Exec(ctx context.Context) graphql.ResponseHandler { rc := graphql.GetOperationContext(ctx) - ec := executionContext{rc, e} + ec := executionContext{rc, e, 0, 0, make(chan graphql.DeferredResult)} inputUnmarshalMap := graphql.BuildUnmarshalerMap( ec.unmarshalInputFloatRange, ec.unmarshalInputIntRange, @@ -1454,18 +1454,33 @@ func (e *executableSchema) Exec(ctx context.Context) graphql.ResponseHandler { switch rc.Operation.Operation { case ast.Query: return func(ctx context.Context) *graphql.Response { - if !first { - return nil + var response graphql.Response + var data graphql.Marshaler + if first { + first = false + ctx = graphql.WithUnmarshalerMap(ctx, inputUnmarshalMap) + data = ec._Query(ctx, rc.Operation.SelectionSet) + } else { + if atomic.LoadInt32(&ec.pendingDeferred) > 0 { + result := <-ec.deferredResults + atomic.AddInt32(&ec.pendingDeferred, -1) + data = result.Result + response.Path = result.Path + response.Label = result.Label + response.Errors = result.Errors + } else { + return nil + } } - first = false - ctx = graphql.WithUnmarshalerMap(ctx, inputUnmarshalMap) - data := ec._Query(ctx, rc.Operation.SelectionSet) var buf bytes.Buffer data.MarshalGQL(&buf) - - return &graphql.Response{ - Data: buf.Bytes(), + response.Data = buf.Bytes() + if atomic.LoadInt32(&ec.deferred) > 0 { + hasNext := atomic.LoadInt32(&ec.pendingDeferred) > 0 + response.HasNext = &hasNext } + + return &response } case ast.Mutation: return func(ctx context.Context) *graphql.Response { @@ -1491,6 +1506,28 @@ func (e *executableSchema) Exec(ctx context.Context) graphql.ResponseHandler { type executionContext struct { *graphql.OperationContext *executableSchema + deferred int32 + pendingDeferred int32 + deferredResults chan graphql.DeferredResult +} + +func (ec *executionContext) processDeferredGroup(dg graphql.DeferredGroup) { + atomic.AddInt32(&ec.pendingDeferred, 1) + go func() { + ctx := graphql.WithFreshResponseContext(dg.Context) + dg.FieldSet.Dispatch(ctx) + ds := graphql.DeferredResult{ + Path: dg.Path, + Label: dg.Label, + Result: dg.FieldSet, + Errors: graphql.GetErrors(ctx), + } + // null fields should bubble up + if dg.FieldSet.Invalids > 0 { + ds.Result = graphql.Null + } + ec.deferredResults <- ds + }() } func (ec *executionContext) introspectSchema() (*introspection.Schema, error) { @@ -6113,6 +6150,7 @@ func (ec *executionContext) _Mutation_createTag(ctx context.Context, field graph }) if err != nil { ec.Error(ctx, err) + return graphql.Null } if resTmp == nil { if !graphql.HasFieldError(ctx, fc) { @@ -6152,7 +6190,7 @@ func (ec *executionContext) fieldContext_Mutation_createTag(ctx context.Context, ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Mutation_createTag_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -6175,6 +6213,7 @@ func (ec *executionContext) _Mutation_deleteTag(ctx context.Context, field graph }) if err != nil { ec.Error(ctx, err) + return graphql.Null } if resTmp == nil { if !graphql.HasFieldError(ctx, fc) { @@ -6206,7 +6245,7 @@ func (ec *executionContext) fieldContext_Mutation_deleteTag(ctx context.Context, ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Mutation_deleteTag_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -6229,6 +6268,7 @@ func (ec *executionContext) _Mutation_addTagsToJob(ctx context.Context, field gr }) if err != nil { ec.Error(ctx, err) + return graphql.Null } if resTmp == nil { if !graphql.HasFieldError(ctx, fc) { @@ -6268,7 +6308,7 @@ func (ec *executionContext) fieldContext_Mutation_addTagsToJob(ctx context.Conte ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Mutation_addTagsToJob_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -6291,6 +6331,7 @@ func (ec *executionContext) _Mutation_removeTagsFromJob(ctx context.Context, fie }) if err != nil { ec.Error(ctx, err) + return graphql.Null } if resTmp == nil { if !graphql.HasFieldError(ctx, fc) { @@ -6330,7 +6371,7 @@ func (ec *executionContext) fieldContext_Mutation_removeTagsFromJob(ctx context. ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Mutation_removeTagsFromJob_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -6353,6 +6394,7 @@ func (ec *executionContext) _Mutation_updateConfiguration(ctx context.Context, f }) if err != nil { ec.Error(ctx, err) + return graphql.Null } if resTmp == nil { return graphql.Null @@ -6381,7 +6423,7 @@ func (ec *executionContext) fieldContext_Mutation_updateConfiguration(ctx contex ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Mutation_updateConfiguration_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -6544,6 +6586,7 @@ func (ec *executionContext) _Query_clusters(ctx context.Context, field graphql.C }) if err != nil { ec.Error(ctx, err) + return graphql.Null } if resTmp == nil { if !graphql.HasFieldError(ctx, fc) { @@ -6597,6 +6640,7 @@ func (ec *executionContext) _Query_tags(ctx context.Context, field graphql.Colle }) if err != nil { ec.Error(ctx, err) + return graphql.Null } if resTmp == nil { if !graphql.HasFieldError(ctx, fc) { @@ -6648,6 +6692,7 @@ func (ec *executionContext) _Query_user(ctx context.Context, field graphql.Colle }) if err != nil { ec.Error(ctx, err) + return graphql.Null } if resTmp == nil { return graphql.Null @@ -6684,7 +6729,7 @@ func (ec *executionContext) fieldContext_Query_user(ctx context.Context, field g ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_user_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -6707,6 +6752,7 @@ func (ec *executionContext) _Query_allocatedNodes(ctx context.Context, field gra }) if err != nil { ec.Error(ctx, err) + return graphql.Null } if resTmp == nil { if !graphql.HasFieldError(ctx, fc) { @@ -6744,7 +6790,7 @@ func (ec *executionContext) fieldContext_Query_allocatedNodes(ctx context.Contex ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_allocatedNodes_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -6767,6 +6813,7 @@ func (ec *executionContext) _Query_job(ctx context.Context, field graphql.Collec }) if err != nil { ec.Error(ctx, err) + return graphql.Null } if resTmp == nil { return graphql.Null @@ -6843,7 +6890,7 @@ func (ec *executionContext) fieldContext_Query_job(ctx context.Context, field gr ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_job_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -6866,6 +6913,7 @@ func (ec *executionContext) _Query_jobMetrics(ctx context.Context, field graphql }) if err != nil { ec.Error(ctx, err) + return graphql.Null } if resTmp == nil { if !graphql.HasFieldError(ctx, fc) { @@ -6905,7 +6953,7 @@ func (ec *executionContext) fieldContext_Query_jobMetrics(ctx context.Context, f ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_jobMetrics_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -6928,6 +6976,7 @@ func (ec *executionContext) _Query_jobsFootprints(ctx context.Context, field gra }) if err != nil { ec.Error(ctx, err) + return graphql.Null } if resTmp == nil { return graphql.Null @@ -6962,7 +7011,7 @@ func (ec *executionContext) fieldContext_Query_jobsFootprints(ctx context.Contex ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_jobsFootprints_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -6985,6 +7034,7 @@ func (ec *executionContext) _Query_jobs(ctx context.Context, field graphql.Colle }) if err != nil { ec.Error(ctx, err) + return graphql.Null } if resTmp == nil { if !graphql.HasFieldError(ctx, fc) { @@ -7026,7 +7076,7 @@ func (ec *executionContext) fieldContext_Query_jobs(ctx context.Context, field g ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_jobs_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -7049,6 +7099,7 @@ func (ec *executionContext) _Query_jobsStatistics(ctx context.Context, field gra }) if err != nil { ec.Error(ctx, err) + return graphql.Null } if resTmp == nil { if !graphql.HasFieldError(ctx, fc) { @@ -7104,7 +7155,7 @@ func (ec *executionContext) fieldContext_Query_jobsStatistics(ctx context.Contex ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_jobsStatistics_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -7127,6 +7178,7 @@ func (ec *executionContext) _Query_jobsCount(ctx context.Context, field graphql. }) if err != nil { ec.Error(ctx, err) + return graphql.Null } if resTmp == nil { if !graphql.HasFieldError(ctx, fc) { @@ -7164,7 +7216,7 @@ func (ec *executionContext) fieldContext_Query_jobsCount(ctx context.Context, fi ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_jobsCount_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -7187,6 +7239,7 @@ func (ec *executionContext) _Query_rooflineHeatmap(ctx context.Context, field gr }) if err != nil { ec.Error(ctx, err) + return graphql.Null } if resTmp == nil { if !graphql.HasFieldError(ctx, fc) { @@ -7218,7 +7271,7 @@ func (ec *executionContext) fieldContext_Query_rooflineHeatmap(ctx context.Conte ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_rooflineHeatmap_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -7241,6 +7294,7 @@ func (ec *executionContext) _Query_nodeMetrics(ctx context.Context, field graphq }) if err != nil { ec.Error(ctx, err) + return graphql.Null } if resTmp == nil { if !graphql.HasFieldError(ctx, fc) { @@ -7280,7 +7334,7 @@ func (ec *executionContext) fieldContext_Query_nodeMetrics(ctx context.Context, ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_nodeMetrics_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -7303,6 +7357,7 @@ func (ec *executionContext) _Query___type(ctx context.Context, field graphql.Col }) if err != nil { ec.Error(ctx, err) + return graphql.Null } if resTmp == nil { return graphql.Null @@ -7353,7 +7408,7 @@ func (ec *executionContext) fieldContext_Query___type(ctx context.Context, field ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query___type_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -7376,6 +7431,7 @@ func (ec *executionContext) _Query___schema(ctx context.Context, field graphql.C }) if err != nil { ec.Error(ctx, err) + return graphql.Null } if resTmp == nil { return graphql.Null @@ -10766,7 +10822,7 @@ func (ec *executionContext) fieldContext___Type_fields(ctx context.Context, fiel ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field___Type_fields_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -10954,7 +11010,7 @@ func (ec *executionContext) fieldContext___Type_enumValues(ctx context.Context, ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field___Type_enumValues_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -11136,18 +11192,20 @@ func (ec *executionContext) unmarshalInputFloatRange(ctx context.Context, obj in var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("from")) - it.From, err = ec.unmarshalNFloat2float64(ctx, v) + data, err := ec.unmarshalNFloat2float64(ctx, v) if err != nil { return it, err } + it.From = data case "to": var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("to")) - it.To, err = ec.unmarshalNFloat2float64(ctx, v) + data, err := ec.unmarshalNFloat2float64(ctx, v) if err != nil { return it, err } + it.To = data } } @@ -11172,18 +11230,20 @@ func (ec *executionContext) unmarshalInputIntRange(ctx context.Context, obj inte var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("from")) - it.From, err = ec.unmarshalNInt2int(ctx, v) + data, err := ec.unmarshalNInt2int(ctx, v) if err != nil { return it, err } + it.From = data case "to": var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("to")) - it.To, err = ec.unmarshalNInt2int(ctx, v) + data, err := ec.unmarshalNInt2int(ctx, v) if err != nil { return it, err } + it.To = data } } @@ -11208,170 +11268,191 @@ func (ec *executionContext) unmarshalInputJobFilter(ctx context.Context, obj int var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("tags")) - it.Tags, err = ec.unmarshalOID2ᚕstringᚄ(ctx, v) + data, err := ec.unmarshalOID2ᚕstringᚄ(ctx, v) if err != nil { return it, err } + it.Tags = data case "jobId": var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("jobId")) - it.JobID, err = ec.unmarshalOStringInput2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐStringInput(ctx, v) + data, err := ec.unmarshalOStringInput2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐStringInput(ctx, v) if err != nil { return it, err } + it.JobID = data case "arrayJobId": var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("arrayJobId")) - it.ArrayJobID, err = ec.unmarshalOInt2ᚖint(ctx, v) + data, err := ec.unmarshalOInt2ᚖint(ctx, v) if err != nil { return it, err } + it.ArrayJobID = data case "user": var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("user")) - it.User, err = ec.unmarshalOStringInput2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐStringInput(ctx, v) + data, err := ec.unmarshalOStringInput2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐStringInput(ctx, v) if err != nil { return it, err } + it.User = data case "project": var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("project")) - it.Project, err = ec.unmarshalOStringInput2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐStringInput(ctx, v) + data, err := ec.unmarshalOStringInput2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐStringInput(ctx, v) if err != nil { return it, err } + it.Project = data case "jobName": var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("jobName")) - it.JobName, err = ec.unmarshalOStringInput2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐStringInput(ctx, v) + data, err := ec.unmarshalOStringInput2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐStringInput(ctx, v) if err != nil { return it, err } + it.JobName = data case "cluster": var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("cluster")) - it.Cluster, err = ec.unmarshalOStringInput2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐStringInput(ctx, v) + data, err := ec.unmarshalOStringInput2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐStringInput(ctx, v) if err != nil { return it, err } + it.Cluster = data case "partition": var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("partition")) - it.Partition, err = ec.unmarshalOStringInput2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐStringInput(ctx, v) + data, err := ec.unmarshalOStringInput2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐStringInput(ctx, v) if err != nil { return it, err } + it.Partition = data case "duration": var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("duration")) - it.Duration, err = ec.unmarshalOIntRange2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐIntRange(ctx, v) + data, err := ec.unmarshalOIntRange2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐIntRange(ctx, v) if err != nil { return it, err } + it.Duration = data case "minRunningFor": var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("minRunningFor")) - it.MinRunningFor, err = ec.unmarshalOInt2ᚖint(ctx, v) + data, err := ec.unmarshalOInt2ᚖint(ctx, v) if err != nil { return it, err } + it.MinRunningFor = data case "numNodes": var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("numNodes")) - it.NumNodes, err = ec.unmarshalOIntRange2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐIntRange(ctx, v) + data, err := ec.unmarshalOIntRange2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐIntRange(ctx, v) if err != nil { return it, err } + it.NumNodes = data case "numAccelerators": var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("numAccelerators")) - it.NumAccelerators, err = ec.unmarshalOIntRange2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐIntRange(ctx, v) + data, err := ec.unmarshalOIntRange2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐIntRange(ctx, v) if err != nil { return it, err } + it.NumAccelerators = data case "numHWThreads": var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("numHWThreads")) - it.NumHWThreads, err = ec.unmarshalOIntRange2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐIntRange(ctx, v) + data, err := ec.unmarshalOIntRange2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐIntRange(ctx, v) if err != nil { return it, err } + it.NumHWThreads = data case "startTime": var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("startTime")) - it.StartTime, err = ec.unmarshalOTimeRange2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐTimeRange(ctx, v) + data, err := ec.unmarshalOTimeRange2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐTimeRange(ctx, v) if err != nil { return it, err } + it.StartTime = data case "state": var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("state")) - it.State, err = ec.unmarshalOJobState2ᚕgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐJobStateᚄ(ctx, v) + data, err := ec.unmarshalOJobState2ᚕgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐJobStateᚄ(ctx, v) if err != nil { return it, err } + it.State = data case "flopsAnyAvg": var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("flopsAnyAvg")) - it.FlopsAnyAvg, err = ec.unmarshalOFloatRange2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐFloatRange(ctx, v) + data, err := ec.unmarshalOFloatRange2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐFloatRange(ctx, v) if err != nil { return it, err } + it.FlopsAnyAvg = data case "memBwAvg": var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("memBwAvg")) - it.MemBwAvg, err = ec.unmarshalOFloatRange2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐFloatRange(ctx, v) + data, err := ec.unmarshalOFloatRange2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐFloatRange(ctx, v) if err != nil { return it, err } + it.MemBwAvg = data case "loadAvg": var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("loadAvg")) - it.LoadAvg, err = ec.unmarshalOFloatRange2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐFloatRange(ctx, v) + data, err := ec.unmarshalOFloatRange2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐFloatRange(ctx, v) if err != nil { return it, err } + it.LoadAvg = data case "memUsedMax": var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("memUsedMax")) - it.MemUsedMax, err = ec.unmarshalOFloatRange2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐFloatRange(ctx, v) + data, err := ec.unmarshalOFloatRange2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐFloatRange(ctx, v) if err != nil { return it, err } + it.MemUsedMax = data case "exclusive": var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("exclusive")) - it.Exclusive, err = ec.unmarshalOInt2ᚖint(ctx, v) + data, err := ec.unmarshalOInt2ᚖint(ctx, v) if err != nil { return it, err } + it.Exclusive = data case "node": var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("node")) - it.Node, err = ec.unmarshalOStringInput2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐStringInput(ctx, v) + data, err := ec.unmarshalOStringInput2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐStringInput(ctx, v) if err != nil { return it, err } + it.Node = data } } @@ -11400,18 +11481,20 @@ func (ec *executionContext) unmarshalInputOrderByInput(ctx context.Context, obj var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("field")) - it.Field, err = ec.unmarshalNString2string(ctx, v) + data, err := ec.unmarshalNString2string(ctx, v) if err != nil { return it, err } + it.Field = data case "order": var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("order")) - it.Order, err = ec.unmarshalNSortDirectionEnum2githubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐSortDirectionEnum(ctx, v) + data, err := ec.unmarshalNSortDirectionEnum2githubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐSortDirectionEnum(ctx, v) if err != nil { return it, err } + it.Order = data } } @@ -11436,18 +11519,20 @@ func (ec *executionContext) unmarshalInputPageRequest(ctx context.Context, obj i var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("itemsPerPage")) - it.ItemsPerPage, err = ec.unmarshalNInt2int(ctx, v) + data, err := ec.unmarshalNInt2int(ctx, v) if err != nil { return it, err } + it.ItemsPerPage = data case "page": var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("page")) - it.Page, err = ec.unmarshalNInt2int(ctx, v) + data, err := ec.unmarshalNInt2int(ctx, v) if err != nil { return it, err } + it.Page = data } } @@ -11472,50 +11557,56 @@ func (ec *executionContext) unmarshalInputStringInput(ctx context.Context, obj i var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("eq")) - it.Eq, err = ec.unmarshalOString2ᚖstring(ctx, v) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } + it.Eq = data case "neq": var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("neq")) - it.Neq, err = ec.unmarshalOString2ᚖstring(ctx, v) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } + it.Neq = data case "contains": var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("contains")) - it.Contains, err = ec.unmarshalOString2ᚖstring(ctx, v) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } + it.Contains = data case "startsWith": var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("startsWith")) - it.StartsWith, err = ec.unmarshalOString2ᚖstring(ctx, v) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } + it.StartsWith = data case "endsWith": var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("endsWith")) - it.EndsWith, err = ec.unmarshalOString2ᚖstring(ctx, v) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } + it.EndsWith = data case "in": var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("in")) - it.In, err = ec.unmarshalOString2ᚕstringᚄ(ctx, v) + data, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v) if err != nil { return it, err } + it.In = data } } @@ -11540,18 +11631,20 @@ func (ec *executionContext) unmarshalInputTimeRange(ctx context.Context, obj int var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("from")) - it.From, err = ec.unmarshalOTime2ᚖtimeᚐTime(ctx, v) + data, err := ec.unmarshalOTime2ᚖtimeᚐTime(ctx, v) if err != nil { return it, err } + it.From = data case "to": var err error ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("to")) - it.To, err = ec.unmarshalOTime2ᚖtimeᚐTime(ctx, v) + data, err := ec.unmarshalOTime2ᚖtimeᚐTime(ctx, v) if err != nil { return it, err } + it.To = data } } @@ -11570,41 +11663,48 @@ var acceleratorImplementors = []string{"Accelerator"} func (ec *executionContext) _Accelerator(ctx context.Context, sel ast.SelectionSet, obj *schema.Accelerator) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, acceleratorImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Accelerator") case "id": - out.Values[i] = ec._Accelerator_id(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "type": - out.Values[i] = ec._Accelerator_type(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "model": - out.Values[i] = ec._Accelerator_model(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + out.Dispatch(ctx) + if out.Invalids > 0 { return graphql.Null } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + return out } @@ -11612,23 +11712,22 @@ var clusterImplementors = []string{"Cluster"} func (ec *executionContext) _Cluster(ctx context.Context, sel ast.SelectionSet, obj *schema.Cluster) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, clusterImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Cluster") case "name": - out.Values[i] = ec._Cluster_name(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "partitions": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { defer func() { if r := recover(); r != nil { ec.Error(ctx, ec.Recover(ctx, r)) @@ -11636,37 +11735,61 @@ func (ec *executionContext) _Cluster(ctx context.Context, sel ast.SelectionSet, }() res = ec._Cluster_partitions(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(ctx) + if field.Deferrable != nil { + dfs, ok := deferred[field.Deferrable.Label] + di := 0 + if ok { + dfs.AddField(field) + di = len(dfs.Values) - 1 + } else { + dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) + deferred[field.Deferrable.Label] = dfs + } + dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { + return innerFunc(ctx, dfs) + }) - }) + // don't run the out.Concurrently() call below + out.Values[i] = graphql.Null + continue + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) case "metricConfig": - out.Values[i] = ec._Cluster_metricConfig(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "subClusters": - out.Values[i] = ec._Cluster_subClusters(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + out.Dispatch(ctx) + if out.Invalids > 0 { return graphql.Null } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + return out } @@ -11674,34 +11797,43 @@ var countImplementors = []string{"Count"} func (ec *executionContext) _Count(ctx context.Context, sel ast.SelectionSet, obj *model.Count) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, countImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Count") case "name": - out.Values[i] = ec._Count_name(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "count": - out.Values[i] = ec._Count_count(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + out.Dispatch(ctx) + if out.Invalids > 0 { return graphql.Null } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + return out } @@ -11709,34 +11841,43 @@ var footprintsImplementors = []string{"Footprints"} func (ec *executionContext) _Footprints(ctx context.Context, sel ast.SelectionSet, obj *model.Footprints) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, footprintsImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Footprints") case "nodehours": - out.Values[i] = ec._Footprints_nodehours(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "metrics": - out.Values[i] = ec._Footprints_metrics(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + out.Dispatch(ctx) + if out.Invalids > 0 { return graphql.Null } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + return out } @@ -11744,34 +11885,43 @@ var histoPointImplementors = []string{"HistoPoint"} func (ec *executionContext) _HistoPoint(ctx context.Context, sel ast.SelectionSet, obj *model.HistoPoint) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, histoPointImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("HistoPoint") case "count": - out.Values[i] = ec._HistoPoint_count(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "value": - out.Values[i] = ec._HistoPoint_value(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + out.Dispatch(ctx) + if out.Invalids > 0 { return graphql.Null } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + return out } @@ -11779,34 +11929,43 @@ var intRangeOutputImplementors = []string{"IntRangeOutput"} func (ec *executionContext) _IntRangeOutput(ctx context.Context, sel ast.SelectionSet, obj *model.IntRangeOutput) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, intRangeOutputImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("IntRangeOutput") case "from": - out.Values[i] = ec._IntRangeOutput_from(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "to": - out.Values[i] = ec._IntRangeOutput_to(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + out.Dispatch(ctx) + if out.Invalids > 0 { return graphql.Null } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + return out } @@ -11814,142 +11973,107 @@ var jobImplementors = []string{"Job"} func (ec *executionContext) _Job(ctx context.Context, sel ast.SelectionSet, obj *schema.Job) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, jobImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Job") case "id": - out.Values[i] = ec._Job_id(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "jobId": - out.Values[i] = ec._Job_jobId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "user": - out.Values[i] = ec._Job_user(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "project": - out.Values[i] = ec._Job_project(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "cluster": - out.Values[i] = ec._Job_cluster(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "subCluster": - out.Values[i] = ec._Job_subCluster(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "startTime": - out.Values[i] = ec._Job_startTime(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "duration": - out.Values[i] = ec._Job_duration(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "walltime": - out.Values[i] = ec._Job_walltime(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "numNodes": - out.Values[i] = ec._Job_numNodes(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "numHWThreads": - out.Values[i] = ec._Job_numHWThreads(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "numAcc": - out.Values[i] = ec._Job_numAcc(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "SMT": - out.Values[i] = ec._Job_SMT(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "exclusive": - out.Values[i] = ec._Job_exclusive(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "partition": - out.Values[i] = ec._Job_partition(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "arrayJobId": - out.Values[i] = ec._Job_arrayJobId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "monitoringStatus": - out.Values[i] = ec._Job_monitoringStatus(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "state": - out.Values[i] = ec._Job_state(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "tags": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { defer func() { if r := recover(); r != nil { ec.Error(ctx, ec.Recover(ctx, r)) @@ -11957,26 +12081,40 @@ func (ec *executionContext) _Job(ctx context.Context, sel ast.SelectionSet, obj }() res = ec._Job_tags(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(ctx) + if field.Deferrable != nil { + dfs, ok := deferred[field.Deferrable.Label] + di := 0 + if ok { + dfs.AddField(field) + di = len(dfs.Values) - 1 + } else { + dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) + deferred[field.Deferrable.Label] = dfs + } + dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { + return innerFunc(ctx, dfs) + }) - }) + // don't run the out.Concurrently() call below + out.Values[i] = graphql.Null + continue + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) case "resources": - out.Values[i] = ec._Job_resources(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "concurrentJobs": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { defer func() { if r := recover(); r != nil { ec.Error(ctx, ec.Recover(ctx, r)) @@ -11986,14 +12124,30 @@ func (ec *executionContext) _Job(ctx context.Context, sel ast.SelectionSet, obj return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(ctx) + if field.Deferrable != nil { + dfs, ok := deferred[field.Deferrable.Label] + di := 0 + if ok { + dfs.AddField(field) + di = len(dfs.Values) - 1 + } else { + dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) + deferred[field.Deferrable.Label] = dfs + } + dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { + return innerFunc(ctx, dfs) + }) - }) + // don't run the out.Concurrently() call below + out.Values[i] = graphql.Null + continue + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) case "metaData": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { defer func() { if r := recover(); r != nil { ec.Error(ctx, ec.Recover(ctx, r)) @@ -12003,14 +12157,30 @@ func (ec *executionContext) _Job(ctx context.Context, sel ast.SelectionSet, obj return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(ctx) + if field.Deferrable != nil { + dfs, ok := deferred[field.Deferrable.Label] + di := 0 + if ok { + dfs.AddField(field) + di = len(dfs.Values) - 1 + } else { + dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) + deferred[field.Deferrable.Label] = dfs + } + dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { + return innerFunc(ctx, dfs) + }) - }) + // don't run the out.Concurrently() call below + out.Values[i] = graphql.Null + continue + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) case "userData": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { defer func() { if r := recover(); r != nil { ec.Error(ctx, ec.Recover(ctx, r)) @@ -12020,18 +12190,46 @@ func (ec *executionContext) _Job(ctx context.Context, sel ast.SelectionSet, obj return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(ctx) + if field.Deferrable != nil { + dfs, ok := deferred[field.Deferrable.Label] + di := 0 + if ok { + dfs.AddField(field) + di = len(dfs.Values) - 1 + } else { + dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) + deferred[field.Deferrable.Label] = dfs + } + dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { + return innerFunc(ctx, dfs) + }) - }) + // don't run the out.Concurrently() call below + out.Values[i] = graphql.Null + continue + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + out.Dispatch(ctx) + if out.Invalids > 0 { return graphql.Null } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + return out } @@ -12039,34 +12237,43 @@ var jobLinkImplementors = []string{"JobLink"} func (ec *executionContext) _JobLink(ctx context.Context, sel ast.SelectionSet, obj *model.JobLink) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, jobLinkImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("JobLink") case "id": - out.Values[i] = ec._JobLink_id(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "jobId": - out.Values[i] = ec._JobLink_jobId(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + out.Dispatch(ctx) + if out.Invalids > 0 { return graphql.Null } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + return out } @@ -12074,35 +12281,42 @@ var jobLinkResultListImplementors = []string{"JobLinkResultList"} func (ec *executionContext) _JobLinkResultList(ctx context.Context, sel ast.SelectionSet, obj *model.JobLinkResultList) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, jobLinkResultListImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("JobLinkResultList") case "listQuery": - out.Values[i] = ec._JobLinkResultList_listQuery(ctx, field, obj) - case "items": - out.Values[i] = ec._JobLinkResultList_items(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "count": - out.Values[i] = ec._JobLinkResultList_count(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + out.Dispatch(ctx) + if out.Invalids > 0 { return graphql.Null } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + return out } @@ -12110,39 +12324,44 @@ var jobMetricImplementors = []string{"JobMetric"} func (ec *executionContext) _JobMetric(ctx context.Context, sel ast.SelectionSet, obj *schema.JobMetric) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, jobMetricImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("JobMetric") case "unit": - out.Values[i] = ec._JobMetric_unit(ctx, field, obj) - case "timestep": - out.Values[i] = ec._JobMetric_timestep(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "series": - out.Values[i] = ec._JobMetric_series(ctx, field, obj) - case "statisticsSeries": - out.Values[i] = ec._JobMetric_statisticsSeries(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + out.Dispatch(ctx) + if out.Invalids > 0 { return graphql.Null } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + return out } @@ -12150,41 +12369,48 @@ var jobMetricWithNameImplementors = []string{"JobMetricWithName"} func (ec *executionContext) _JobMetricWithName(ctx context.Context, sel ast.SelectionSet, obj *model.JobMetricWithName) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, jobMetricWithNameImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("JobMetricWithName") case "name": - out.Values[i] = ec._JobMetricWithName_name(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "scope": - out.Values[i] = ec._JobMetricWithName_scope(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "metric": - out.Values[i] = ec._JobMetricWithName_metric(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + out.Dispatch(ctx) + if out.Invalids > 0 { return graphql.Null } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + return out } @@ -12192,39 +12418,44 @@ var jobResultListImplementors = []string{"JobResultList"} func (ec *executionContext) _JobResultList(ctx context.Context, sel ast.SelectionSet, obj *model.JobResultList) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, jobResultListImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("JobResultList") case "items": - out.Values[i] = ec._JobResultList_items(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "offset": - out.Values[i] = ec._JobResultList_offset(ctx, field, obj) - case "limit": - out.Values[i] = ec._JobResultList_limit(ctx, field, obj) - case "count": - out.Values[i] = ec._JobResultList_count(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + out.Dispatch(ctx) + if out.Invalids > 0 { return graphql.Null } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + return out } @@ -12232,97 +12463,88 @@ var jobsStatisticsImplementors = []string{"JobsStatistics"} func (ec *executionContext) _JobsStatistics(ctx context.Context, sel ast.SelectionSet, obj *model.JobsStatistics) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, jobsStatisticsImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("JobsStatistics") case "id": - out.Values[i] = ec._JobsStatistics_id(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "name": - out.Values[i] = ec._JobsStatistics_name(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "totalJobs": - out.Values[i] = ec._JobsStatistics_totalJobs(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "runningJobs": - out.Values[i] = ec._JobsStatistics_runningJobs(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "shortJobs": - out.Values[i] = ec._JobsStatistics_shortJobs(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "totalWalltime": - out.Values[i] = ec._JobsStatistics_totalWalltime(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "totalNodeHours": - out.Values[i] = ec._JobsStatistics_totalNodeHours(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "totalCoreHours": - out.Values[i] = ec._JobsStatistics_totalCoreHours(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "totalAccHours": - out.Values[i] = ec._JobsStatistics_totalAccHours(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "histDuration": - out.Values[i] = ec._JobsStatistics_histDuration(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "histNumNodes": - out.Values[i] = ec._JobsStatistics_histNumNodes(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + out.Dispatch(ctx) + if out.Invalids > 0 { return graphql.Null } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + return out } @@ -12330,87 +12552,80 @@ var metricConfigImplementors = []string{"MetricConfig"} func (ec *executionContext) _MetricConfig(ctx context.Context, sel ast.SelectionSet, obj *schema.MetricConfig) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, metricConfigImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("MetricConfig") case "name": - out.Values[i] = ec._MetricConfig_name(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "unit": - out.Values[i] = ec._MetricConfig_unit(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "scope": - out.Values[i] = ec._MetricConfig_scope(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "aggregation": - out.Values[i] = ec._MetricConfig_aggregation(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "timestep": - out.Values[i] = ec._MetricConfig_timestep(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "peak": - out.Values[i] = ec._MetricConfig_peak(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "normal": - out.Values[i] = ec._MetricConfig_normal(ctx, field, obj) - case "caution": - out.Values[i] = ec._MetricConfig_caution(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "alert": - out.Values[i] = ec._MetricConfig_alert(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "subClusters": - out.Values[i] = ec._MetricConfig_subClusters(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + out.Dispatch(ctx) + if out.Invalids > 0 { return graphql.Null } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + return out } @@ -12418,34 +12633,43 @@ var metricFootprintsImplementors = []string{"MetricFootprints"} func (ec *executionContext) _MetricFootprints(ctx context.Context, sel ast.SelectionSet, obj *model.MetricFootprints) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, metricFootprintsImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("MetricFootprints") case "metric": - out.Values[i] = ec._MetricFootprints_metric(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "data": - out.Values[i] = ec._MetricFootprints_data(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + out.Dispatch(ctx) + if out.Invalids > 0 { return graphql.Null } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + return out } @@ -12453,41 +12677,48 @@ var metricStatisticsImplementors = []string{"MetricStatistics"} func (ec *executionContext) _MetricStatistics(ctx context.Context, sel ast.SelectionSet, obj *schema.MetricStatistics) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, metricStatisticsImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("MetricStatistics") case "avg": - out.Values[i] = ec._MetricStatistics_avg(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "min": - out.Values[i] = ec._MetricStatistics_min(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "max": - out.Values[i] = ec._MetricStatistics_max(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + out.Dispatch(ctx) + if out.Invalids > 0 { return graphql.Null } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + return out } @@ -12495,34 +12726,43 @@ var metricValueImplementors = []string{"MetricValue"} func (ec *executionContext) _MetricValue(ctx context.Context, sel ast.SelectionSet, obj *schema.MetricValue) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, metricValueImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("MetricValue") case "unit": - out.Values[i] = ec._MetricValue_unit(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "value": - out.Values[i] = ec._MetricValue_value(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + out.Dispatch(ctx) + if out.Invalids > 0 { return graphql.Null } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + return out } @@ -12535,6 +12775,7 @@ func (ec *executionContext) _Mutation(ctx context.Context, sel ast.SelectionSet) }) out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { innerCtx := graphql.WithRootFieldContext(ctx, &graphql.RootFieldContext{ Object: field.Name, @@ -12545,40 +12786,57 @@ func (ec *executionContext) _Mutation(ctx context.Context, sel ast.SelectionSet) case "__typename": out.Values[i] = graphql.MarshalString("Mutation") case "createTag": - out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { return ec._Mutation_createTag(ctx, field) }) - + if out.Values[i] == graphql.Null { + out.Invalids++ + } case "deleteTag": - out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { return ec._Mutation_deleteTag(ctx, field) }) - + if out.Values[i] == graphql.Null { + out.Invalids++ + } case "addTagsToJob": - out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { return ec._Mutation_addTagsToJob(ctx, field) }) - + if out.Values[i] == graphql.Null { + out.Invalids++ + } case "removeTagsFromJob": - out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { return ec._Mutation_removeTagsFromJob(ctx, field) }) - + if out.Values[i] == graphql.Null { + out.Invalids++ + } case "updateConfiguration": - out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { return ec._Mutation_updateConfiguration(ctx, field) }) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + return out } @@ -12586,41 +12844,48 @@ var nodeMetricsImplementors = []string{"NodeMetrics"} func (ec *executionContext) _NodeMetrics(ctx context.Context, sel ast.SelectionSet, obj *model.NodeMetrics) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, nodeMetricsImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("NodeMetrics") case "host": - out.Values[i] = ec._NodeMetrics_host(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "subCluster": - out.Values[i] = ec._NodeMetrics_subCluster(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "metrics": - out.Values[i] = ec._NodeMetrics_metrics(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + out.Dispatch(ctx) + if out.Invalids > 0 { return graphql.Null } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + return out } @@ -12633,6 +12898,7 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr }) out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { innerCtx := graphql.WithRootFieldContext(ctx, &graphql.RootFieldContext{ Object: field.Name, @@ -12645,47 +12911,51 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr case "clusters": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { defer func() { if r := recover(); r != nil { ec.Error(ctx, ec.Recover(ctx, r)) } }() res = ec._Query_clusters(ctx, field) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } return res } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "tags": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { defer func() { if r := recover(); r != nil { ec.Error(ctx, ec.Recover(ctx, r)) } }() res = ec._Query_tags(ctx, field) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } return res } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "user": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { defer func() { if r := recover(); r != nil { ec.Error(ctx, ec.Recover(ctx, r)) @@ -12696,36 +12966,37 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "allocatedNodes": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { defer func() { if r := recover(); r != nil { ec.Error(ctx, ec.Recover(ctx, r)) } }() res = ec._Query_allocatedNodes(ctx, field) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } return res } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "job": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { defer func() { if r := recover(); r != nil { ec.Error(ctx, ec.Recover(ctx, r)) @@ -12736,36 +13007,37 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "jobMetrics": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { defer func() { if r := recover(); r != nil { ec.Error(ctx, ec.Recover(ctx, r)) } }() res = ec._Query_jobMetrics(ctx, field) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } return res } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "jobsFootprints": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { defer func() { if r := recover(); r != nil { ec.Error(ctx, ec.Recover(ctx, r)) @@ -12776,129 +13048,149 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "jobs": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { defer func() { if r := recover(); r != nil { ec.Error(ctx, ec.Recover(ctx, r)) } }() res = ec._Query_jobs(ctx, field) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } return res } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "jobsStatistics": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { defer func() { if r := recover(); r != nil { ec.Error(ctx, ec.Recover(ctx, r)) } }() res = ec._Query_jobsStatistics(ctx, field) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } return res } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "jobsCount": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { defer func() { if r := recover(); r != nil { ec.Error(ctx, ec.Recover(ctx, r)) } }() res = ec._Query_jobsCount(ctx, field) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } return res } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "rooflineHeatmap": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { defer func() { if r := recover(); r != nil { ec.Error(ctx, ec.Recover(ctx, r)) } }() res = ec._Query_rooflineHeatmap(ctx, field) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } return res } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "nodeMetrics": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { defer func() { if r := recover(); r != nil { ec.Error(ctx, ec.Recover(ctx, r)) } }() res = ec._Query_nodeMetrics(ctx, field) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } return res } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "__type": - out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { return ec._Query___type(ctx, field) }) - case "__schema": - out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { return ec._Query___schema(ctx, field) }) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + return out } @@ -12906,39 +13198,44 @@ var resourceImplementors = []string{"Resource"} func (ec *executionContext) _Resource(ctx context.Context, sel ast.SelectionSet, obj *schema.Resource) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, resourceImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Resource") case "hostname": - out.Values[i] = ec._Resource_hostname(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "hwthreads": - out.Values[i] = ec._Resource_hwthreads(ctx, field, obj) - case "accelerators": - out.Values[i] = ec._Resource_accelerators(ctx, field, obj) - case "configuration": - out.Values[i] = ec._Resource_configuration(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + out.Dispatch(ctx) + if out.Invalids > 0 { return graphql.Null } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + return out } @@ -12946,42 +13243,47 @@ var seriesImplementors = []string{"Series"} func (ec *executionContext) _Series(ctx context.Context, sel ast.SelectionSet, obj *schema.Series) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, seriesImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Series") case "hostname": - out.Values[i] = ec._Series_hostname(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "id": - out.Values[i] = ec._Series_id(ctx, field, obj) - case "statistics": - out.Values[i] = ec._Series_statistics(ctx, field, obj) - case "data": - out.Values[i] = ec._Series_data(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + out.Dispatch(ctx) + if out.Invalids > 0 { return graphql.Null } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + return out } @@ -12989,41 +13291,48 @@ var statsSeriesImplementors = []string{"StatsSeries"} func (ec *executionContext) _StatsSeries(ctx context.Context, sel ast.SelectionSet, obj *schema.StatsSeries) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, statsSeriesImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("StatsSeries") case "mean": - out.Values[i] = ec._StatsSeries_mean(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "min": - out.Values[i] = ec._StatsSeries_min(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "max": - out.Values[i] = ec._StatsSeries_max(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + out.Dispatch(ctx) + if out.Invalids > 0 { return graphql.Null } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + return out } @@ -13031,30 +13340,27 @@ var subClusterImplementors = []string{"SubCluster"} func (ec *executionContext) _SubCluster(ctx context.Context, sel ast.SelectionSet, obj *schema.SubCluster) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, subClusterImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("SubCluster") case "name": - out.Values[i] = ec._SubCluster_name(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "nodes": - out.Values[i] = ec._SubCluster_nodes(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "numberOfNodes": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { defer func() { if r := recover(); r != nil { ec.Error(ctx, ec.Recover(ctx, r)) @@ -13062,79 +13368,91 @@ func (ec *executionContext) _SubCluster(ctx context.Context, sel ast.SelectionSe }() res = ec._SubCluster_numberOfNodes(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(ctx) + if field.Deferrable != nil { + dfs, ok := deferred[field.Deferrable.Label] + di := 0 + if ok { + dfs.AddField(field) + di = len(dfs.Values) - 1 + } else { + dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) + deferred[field.Deferrable.Label] = dfs + } + dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { + return innerFunc(ctx, dfs) + }) - }) + // don't run the out.Concurrently() call below + out.Values[i] = graphql.Null + continue + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) case "processorType": - out.Values[i] = ec._SubCluster_processorType(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "socketsPerNode": - out.Values[i] = ec._SubCluster_socketsPerNode(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "coresPerSocket": - out.Values[i] = ec._SubCluster_coresPerSocket(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "threadsPerCore": - out.Values[i] = ec._SubCluster_threadsPerCore(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "flopRateScalar": - out.Values[i] = ec._SubCluster_flopRateScalar(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "flopRateSimd": - out.Values[i] = ec._SubCluster_flopRateSimd(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "memoryBandwidth": - out.Values[i] = ec._SubCluster_memoryBandwidth(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "topology": - out.Values[i] = ec._SubCluster_topology(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + out.Dispatch(ctx) + if out.Invalids > 0 { return graphql.Null } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + return out } @@ -13142,47 +13460,48 @@ var subClusterConfigImplementors = []string{"SubClusterConfig"} func (ec *executionContext) _SubClusterConfig(ctx context.Context, sel ast.SelectionSet, obj *schema.SubClusterConfig) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, subClusterConfigImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("SubClusterConfig") case "name": - out.Values[i] = ec._SubClusterConfig_name(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "peak": - out.Values[i] = ec._SubClusterConfig_peak(ctx, field, obj) - case "normal": - out.Values[i] = ec._SubClusterConfig_normal(ctx, field, obj) - case "caution": - out.Values[i] = ec._SubClusterConfig_caution(ctx, field, obj) - case "alert": - out.Values[i] = ec._SubClusterConfig_alert(ctx, field, obj) - case "remove": - out.Values[i] = ec._SubClusterConfig_remove(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + out.Dispatch(ctx) + if out.Invalids > 0 { return graphql.Null } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + return out } @@ -13190,41 +13509,48 @@ var tagImplementors = []string{"Tag"} func (ec *executionContext) _Tag(ctx context.Context, sel ast.SelectionSet, obj *schema.Tag) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, tagImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Tag") case "id": - out.Values[i] = ec._Tag_id(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "type": - out.Values[i] = ec._Tag_type(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "name": - out.Values[i] = ec._Tag_name(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + out.Dispatch(ctx) + if out.Invalids > 0 { return graphql.Null } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + return out } @@ -13232,34 +13558,43 @@ var timeRangeOutputImplementors = []string{"TimeRangeOutput"} func (ec *executionContext) _TimeRangeOutput(ctx context.Context, sel ast.SelectionSet, obj *model.TimeRangeOutput) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, timeRangeOutputImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("TimeRangeOutput") case "from": - out.Values[i] = ec._TimeRangeOutput_from(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "to": - out.Values[i] = ec._TimeRangeOutput_to(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + out.Dispatch(ctx) + if out.Invalids > 0 { return graphql.Null } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + return out } @@ -13267,44 +13602,45 @@ var topologyImplementors = []string{"Topology"} func (ec *executionContext) _Topology(ctx context.Context, sel ast.SelectionSet, obj *schema.Topology) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, topologyImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Topology") case "node": - out.Values[i] = ec._Topology_node(ctx, field, obj) - case "socket": - out.Values[i] = ec._Topology_socket(ctx, field, obj) - case "memoryDomain": - out.Values[i] = ec._Topology_memoryDomain(ctx, field, obj) - case "die": - out.Values[i] = ec._Topology_die(ctx, field, obj) - case "core": - out.Values[i] = ec._Topology_core(ctx, field, obj) - case "accelerators": - out.Values[i] = ec._Topology_accelerators(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + out.Dispatch(ctx) + if out.Invalids > 0 { return graphql.Null } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + return out } @@ -13312,31 +13648,40 @@ var unitImplementors = []string{"Unit"} func (ec *executionContext) _Unit(ctx context.Context, sel ast.SelectionSet, obj *schema.Unit) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, unitImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Unit") case "base": - out.Values[i] = ec._Unit_base(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "prefix": - out.Values[i] = ec._Unit_prefix(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + out.Dispatch(ctx) + if out.Invalids > 0 { return graphql.Null } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + return out } @@ -13344,41 +13689,48 @@ var userImplementors = []string{"User"} func (ec *executionContext) _User(ctx context.Context, sel ast.SelectionSet, obj *model.User) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, userImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("User") case "username": - out.Values[i] = ec._User_username(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "name": - out.Values[i] = ec._User_name(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "email": - out.Values[i] = ec._User_email(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + out.Dispatch(ctx) + if out.Invalids > 0 { return graphql.Null } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + return out } @@ -13386,52 +13738,55 @@ var __DirectiveImplementors = []string{"__Directive"} func (ec *executionContext) ___Directive(ctx context.Context, sel ast.SelectionSet, obj *introspection.Directive) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, __DirectiveImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("__Directive") case "name": - out.Values[i] = ec.___Directive_name(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "description": - out.Values[i] = ec.___Directive_description(ctx, field, obj) - case "locations": - out.Values[i] = ec.___Directive_locations(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "args": - out.Values[i] = ec.___Directive_args(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "isRepeatable": - out.Values[i] = ec.___Directive_isRepeatable(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + out.Dispatch(ctx) + if out.Invalids > 0 { return graphql.Null } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + return out } @@ -13439,42 +13794,47 @@ var __EnumValueImplementors = []string{"__EnumValue"} func (ec *executionContext) ___EnumValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.EnumValue) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, __EnumValueImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("__EnumValue") case "name": - out.Values[i] = ec.___EnumValue_name(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "description": - out.Values[i] = ec.___EnumValue_description(ctx, field, obj) - case "isDeprecated": - out.Values[i] = ec.___EnumValue_isDeprecated(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "deprecationReason": - out.Values[i] = ec.___EnumValue_deprecationReason(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + out.Dispatch(ctx) + if out.Invalids > 0 { return graphql.Null } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + return out } @@ -13482,56 +13842,57 @@ var __FieldImplementors = []string{"__Field"} func (ec *executionContext) ___Field(ctx context.Context, sel ast.SelectionSet, obj *introspection.Field) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, __FieldImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("__Field") case "name": - out.Values[i] = ec.___Field_name(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "description": - out.Values[i] = ec.___Field_description(ctx, field, obj) - case "args": - out.Values[i] = ec.___Field_args(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "type": - out.Values[i] = ec.___Field_type(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "isDeprecated": - out.Values[i] = ec.___Field_isDeprecated(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "deprecationReason": - out.Values[i] = ec.___Field_deprecationReason(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + out.Dispatch(ctx) + if out.Invalids > 0 { return graphql.Null } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + return out } @@ -13539,42 +13900,47 @@ var __InputValueImplementors = []string{"__InputValue"} func (ec *executionContext) ___InputValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.InputValue) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, __InputValueImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("__InputValue") case "name": - out.Values[i] = ec.___InputValue_name(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "description": - out.Values[i] = ec.___InputValue_description(ctx, field, obj) - case "type": - out.Values[i] = ec.___InputValue_type(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "defaultValue": - out.Values[i] = ec.___InputValue_defaultValue(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + out.Dispatch(ctx) + if out.Invalids > 0 { return graphql.Null } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + return out } @@ -13582,53 +13948,54 @@ var __SchemaImplementors = []string{"__Schema"} func (ec *executionContext) ___Schema(ctx context.Context, sel ast.SelectionSet, obj *introspection.Schema) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, __SchemaImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("__Schema") case "description": - out.Values[i] = ec.___Schema_description(ctx, field, obj) - case "types": - out.Values[i] = ec.___Schema_types(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "queryType": - out.Values[i] = ec.___Schema_queryType(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "mutationType": - out.Values[i] = ec.___Schema_mutationType(ctx, field, obj) - case "subscriptionType": - out.Values[i] = ec.___Schema_subscriptionType(ctx, field, obj) - case "directives": - out.Values[i] = ec.___Schema_directives(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + out.Dispatch(ctx) + if out.Invalids > 0 { return graphql.Null } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + return out } @@ -13636,63 +14003,56 @@ var __TypeImplementors = []string{"__Type"} func (ec *executionContext) ___Type(ctx context.Context, sel ast.SelectionSet, obj *introspection.Type) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, __TypeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("__Type") case "kind": - out.Values[i] = ec.___Type_kind(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "name": - out.Values[i] = ec.___Type_name(ctx, field, obj) - case "description": - out.Values[i] = ec.___Type_description(ctx, field, obj) - case "fields": - out.Values[i] = ec.___Type_fields(ctx, field, obj) - case "interfaces": - out.Values[i] = ec.___Type_interfaces(ctx, field, obj) - case "possibleTypes": - out.Values[i] = ec.___Type_possibleTypes(ctx, field, obj) - case "enumValues": - out.Values[i] = ec.___Type_enumValues(ctx, field, obj) - case "inputFields": - out.Values[i] = ec.___Type_inputFields(ctx, field, obj) - case "ofType": - out.Values[i] = ec.___Type_ofType(ctx, field, obj) - case "specifiedByURL": - out.Values[i] = ec.___Type_specifiedByURL(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + out.Dispatch(ctx) + if out.Invalids > 0 { return graphql.Null } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + return out } diff --git a/internal/graph/model/models_gen.go b/internal/graph/model/models_gen.go index 8284051..44357d6 100644 --- a/internal/graph/model/models_gen.go +++ b/internal/graph/model/models_gen.go @@ -37,27 +37,27 @@ type IntRangeOutput struct { } type JobFilter struct { - Tags []string `json:"tags"` - JobID *StringInput `json:"jobId"` - ArrayJobID *int `json:"arrayJobId"` - User *StringInput `json:"user"` - Project *StringInput `json:"project"` - JobName *StringInput `json:"jobName"` - Cluster *StringInput `json:"cluster"` - Partition *StringInput `json:"partition"` - Duration *schema.IntRange `json:"duration"` - MinRunningFor *int `json:"minRunningFor"` - NumNodes *schema.IntRange `json:"numNodes"` - NumAccelerators *schema.IntRange `json:"numAccelerators"` - NumHWThreads *schema.IntRange `json:"numHWThreads"` - StartTime *schema.TimeRange `json:"startTime"` - State []schema.JobState `json:"state"` - FlopsAnyAvg *FloatRange `json:"flopsAnyAvg"` - MemBwAvg *FloatRange `json:"memBwAvg"` - LoadAvg *FloatRange `json:"loadAvg"` - MemUsedMax *FloatRange `json:"memUsedMax"` - Exclusive *int `json:"exclusive"` - Node *StringInput `json:"node"` + Tags []string `json:"tags,omitempty"` + JobID *StringInput `json:"jobId,omitempty"` + ArrayJobID *int `json:"arrayJobId,omitempty"` + User *StringInput `json:"user,omitempty"` + Project *StringInput `json:"project,omitempty"` + JobName *StringInput `json:"jobName,omitempty"` + Cluster *StringInput `json:"cluster,omitempty"` + Partition *StringInput `json:"partition,omitempty"` + Duration *schema.IntRange `json:"duration,omitempty"` + MinRunningFor *int `json:"minRunningFor,omitempty"` + NumNodes *schema.IntRange `json:"numNodes,omitempty"` + NumAccelerators *schema.IntRange `json:"numAccelerators,omitempty"` + NumHWThreads *schema.IntRange `json:"numHWThreads,omitempty"` + StartTime *schema.TimeRange `json:"startTime,omitempty"` + State []schema.JobState `json:"state,omitempty"` + FlopsAnyAvg *FloatRange `json:"flopsAnyAvg,omitempty"` + MemBwAvg *FloatRange `json:"memBwAvg,omitempty"` + LoadAvg *FloatRange `json:"loadAvg,omitempty"` + MemUsedMax *FloatRange `json:"memUsedMax,omitempty"` + Exclusive *int `json:"exclusive,omitempty"` + Node *StringInput `json:"node,omitempty"` } type JobLink struct { @@ -66,9 +66,9 @@ type JobLink struct { } type JobLinkResultList struct { - ListQuery *string `json:"listQuery"` + ListQuery *string `json:"listQuery,omitempty"` Items []*JobLink `json:"items"` - Count *int `json:"count"` + Count *int `json:"count,omitempty"` } type JobMetricWithName struct { @@ -79,9 +79,9 @@ type JobMetricWithName struct { type JobResultList struct { Items []*schema.Job `json:"items"` - Offset *int `json:"offset"` - Limit *int `json:"limit"` - Count *int `json:"count"` + Offset *int `json:"offset,omitempty"` + Limit *int `json:"limit,omitempty"` + Count *int `json:"count,omitempty"` } type JobsStatistics struct { @@ -120,12 +120,12 @@ type PageRequest struct { } type StringInput struct { - Eq *string `json:"eq"` - Neq *string `json:"neq"` - Contains *string `json:"contains"` - StartsWith *string `json:"startsWith"` - EndsWith *string `json:"endsWith"` - In []string `json:"in"` + Eq *string `json:"eq,omitempty"` + Neq *string `json:"neq,omitempty"` + Contains *string `json:"contains,omitempty"` + StartsWith *string `json:"startsWith,omitempty"` + EndsWith *string `json:"endsWith,omitempty"` + In []string `json:"in,omitempty"` } type TimeRangeOutput struct { diff --git a/internal/graph/schema.resolvers.go b/internal/graph/schema.resolvers.go index 1be455c..8d34fb3 100644 --- a/internal/graph/schema.resolvers.go +++ b/internal/graph/schema.resolvers.go @@ -2,7 +2,7 @@ package graph // This file will be automatically regenerated based on the schema, any resolver implementations // will be copied through when generating and any unknown code will be moved to the end. -// Code generated by github.com/99designs/gqlgen version v0.17.24 +// Code generated by github.com/99designs/gqlgen version v0.17.36 import ( "context" diff --git a/web/frontend/package-lock.json b/web/frontend/package-lock.json index 0d1e68d..7997e2e 100644 --- a/web/frontend/package-lock.json +++ b/web/frontend/package-lock.json @@ -138,9 +138,9 @@ } }, "node_modules/@rollup/plugin-node-resolve": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.1.0.tgz", - "integrity": "sha512-xeZHCgsiZ9pzYVgAo9580eCGqwh/XCEUM9q6iQfGNocjgkufHAqC3exA+45URvhiYV8sBF9RlBai650eNs7AsA==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.0.tgz", + "integrity": "sha512-mKur03xNGT8O9ODO6FtT43ITGqHWZbKPdVJHZb+iV9QYcdlhUUB0wgknvA4KCUmC5oHJF6O2W1EgmyOQyVUI4Q==", "dev": true, "dependencies": { "@rollup/pluginutils": "^5.0.1", @@ -205,9 +205,9 @@ } }, "node_modules/@rollup/pluginutils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", - "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.3.tgz", + "integrity": "sha512-hfllNN4a80rwNQ9QCxhxuHCGHMAvabXqxNdaChUSSadMre7t4iEUI6fFAhBOn/eIYTgYVhBv7vCLsAJ4u3lf3g==", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", @@ -385,9 +385,9 @@ } }, "node_modules/graphql": { - "version": "16.7.1", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.7.1.tgz", - "integrity": "sha512-DRYR9tf+UGU0KOsMcKAlXeFfX89UiiIZ0dRU3mR0yJfu6OjZqUcp68NnFLnqQU5RexygFoDy1EW+ccOYcPfmHg==", + "version": "16.8.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.8.0.tgz", + "integrity": "sha512-0oKGaR+y3qcS5mCu1vb7KG+a89vjn06C7Ihq/dDl3jA+A8B3TKomvi3CiEcVLJQGalbu8F52LxkOym7U5sSfbg==", "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" } From f36f62fb4776fc7a530fbb31bc0883964cb07530 Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Mon, 21 Aug 2023 12:12:28 +0200 Subject: [PATCH 58/95] Improve user endpoint swagger docs --- api/swagger.json | 108 +++++++++++++++++++++++++++++++------------ api/swagger.yaml | 95 +++++++++++++++++++++++++------------ internal/api/docs.go | 108 +++++++++++++++++++++++++++++++------------ internal/api/rest.go | 68 +++++++++++++++------------ 4 files changed, 261 insertions(+), 118 deletions(-) diff --git a/api/swagger.json b/api/swagger.json index 2a4c43a..dfc2f75 100644 --- a/api/swagger.json +++ b/api/swagger.json @@ -735,14 +735,28 @@ "required": true }, { + "enum": [ + "admin", + "support", + "manager", + "user", + "api" + ], "type": "string", - "description": "Priority 1: Role to add, one of: [admin, support, manager, user, api]", + "description": "Priority 1: Role to add", "name": "add-role", "in": "formData" }, { + "enum": [ + "admin", + "support", + "manager", + "user", + "api" + ], "type": "string", - "description": "Priority 2: Role to remove, one of: [admin, support, manager, user, api]", + "description": "Priority 2: Role to remove", "name": "remove-role", "in": "formData" }, @@ -761,7 +775,7 @@ ], "responses": { "200": { - "description": "Task successful", + "description": "Success Response Message", "schema": { "type": "string" } @@ -769,31 +783,31 @@ "400": { "description": "Bad Request", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } }, "401": { "description": "Unauthorized", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } }, "403": { "description": "Forbidden", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } }, "422": { "description": "Unprocessable Entity: The user could not be updated", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } }, "500": { "description": "Internal Server Error", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } } } @@ -807,9 +821,6 @@ } ], "description": "Returns a JSON-encoded list of users.\nRequired query-parameter defines if all users or only users with additional special roles are returned.", - "consumes": [ - "application/json" - ], "produces": [ "application/json" ], @@ -828,33 +839,36 @@ ], "responses": { "200": { - "description": "Users returned successfully", + "description": "List of users returned successfully", "schema": { - "type": "string" + "type": "array", + "items": { + "$ref": "#/definitions/api.ApiReturnedUser" + } } }, "400": { "description": "Bad Request", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } }, "401": { "description": "Unauthorized", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } }, "403": { "description": "Forbidden", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } }, "500": { "description": "Internal Server Error", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } } } @@ -892,8 +906,15 @@ "required": true }, { + "enum": [ + "admin", + "support", + "manager", + "user", + "api" + ], "type": "string", - "description": "User role, one of: [admin, support, manager, user, api]", + "description": "User role", "name": "role", "in": "formData", "required": true @@ -919,7 +940,7 @@ ], "responses": { "200": { - "description": "User added successfully", + "description": "Success Response", "schema": { "type": "string" } @@ -927,31 +948,31 @@ "400": { "description": "Bad Request", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } }, "401": { "description": "Unauthorized", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } }, "403": { "description": "Forbidden", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } }, "422": { "description": "Unprocessable Entity: creating user failed", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } }, "500": { "description": "Internal Server Error", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } } } @@ -966,6 +987,9 @@ "consumes": [ "multipart/form-data" ], + "produces": [ + "text/plain" + ], "tags": [ "remove" ], @@ -986,31 +1010,31 @@ "400": { "description": "Bad Request", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } }, "401": { "description": "Unauthorized", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } }, "403": { "description": "Forbidden", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } }, "422": { "description": "Unprocessable Entity: deleting user failed", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } }, "500": { "description": "Internal Server Error", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } } } @@ -1018,6 +1042,32 @@ } }, "definitions": { + "api.ApiReturnedUser": { + "type": "object", + "properties": { + "email": { + "type": "string" + }, + "name": { + "type": "string" + }, + "projects": { + "type": "array", + "items": { + "type": "string" + } + }, + "roles": { + "type": "array", + "items": { + "type": "string" + } + }, + "username": { + "type": "string" + } + } + }, "api.ApiTag": { "type": "object", "properties": { diff --git a/api/swagger.yaml b/api/swagger.yaml index d19f79b..2ba47a0 100644 --- a/api/swagger.yaml +++ b/api/swagger.yaml @@ -1,5 +1,22 @@ basePath: /api definitions: + api.ApiReturnedUser: + properties: + email: + type: string + name: + type: string + projects: + items: + type: string + type: array + roles: + items: + type: string + type: array + username: + type: string + type: object api.ApiTag: properties: name: @@ -1007,13 +1024,23 @@ paths: name: id required: true type: string - - description: 'Priority 1: Role to add, one of: [admin, support, manager, user, - api]' + - description: 'Priority 1: Role to add' + enum: + - admin + - support + - manager + - user + - api in: formData name: add-role type: string - - description: 'Priority 2: Role to remove, one of: [admin, support, manager, - user, api]' + - description: 'Priority 2: Role to remove' + enum: + - admin + - support + - manager + - user + - api in: formData name: remove-role type: string @@ -1029,29 +1056,29 @@ paths: - text/plain responses: "200": - description: Task successful + description: Success Response Message schema: type: string "400": description: Bad Request schema: - $ref: '#/definitions/api.ErrorResponse' + type: string "401": description: Unauthorized schema: - $ref: '#/definitions/api.ErrorResponse' + type: string "403": description: Forbidden schema: - $ref: '#/definitions/api.ErrorResponse' + type: string "422": description: 'Unprocessable Entity: The user could not be updated' schema: - $ref: '#/definitions/api.ErrorResponse' + type: string "500": description: Internal Server Error schema: - $ref: '#/definitions/api.ErrorResponse' + type: string security: - ApiKeyAuth: [] summary: Updates an existing user @@ -1068,37 +1095,37 @@ paths: name: username required: true type: string + produces: + - text/plain responses: "200": description: User deleted successfully "400": description: Bad Request schema: - $ref: '#/definitions/api.ErrorResponse' + type: string "401": description: Unauthorized schema: - $ref: '#/definitions/api.ErrorResponse' + type: string "403": description: Forbidden schema: - $ref: '#/definitions/api.ErrorResponse' + type: string "422": description: 'Unprocessable Entity: deleting user failed' schema: - $ref: '#/definitions/api.ErrorResponse' + type: string "500": description: Internal Server Error schema: - $ref: '#/definitions/api.ErrorResponse' + type: string security: - ApiKeyAuth: [] summary: Deletes a user tags: - remove get: - consumes: - - application/json description: |- Returns a JSON-encoded list of users. Required query-parameter defines if all users or only users with additional special roles are returned. @@ -1113,25 +1140,27 @@ paths: - application/json responses: "200": - description: Users returned successfully + description: List of users returned successfully schema: - type: string + items: + $ref: '#/definitions/api.ApiReturnedUser' + type: array "400": description: Bad Request schema: - $ref: '#/definitions/api.ErrorResponse' + type: string "401": description: Unauthorized schema: - $ref: '#/definitions/api.ErrorResponse' + type: string "403": description: Forbidden schema: - $ref: '#/definitions/api.ErrorResponse' + type: string "500": description: Internal Server Error schema: - $ref: '#/definitions/api.ErrorResponse' + type: string security: - ApiKeyAuth: [] summary: Returns a list of users @@ -1152,7 +1181,13 @@ paths: name: password required: true type: string - - description: 'User role, one of: [admin, support, manager, user, api]' + - description: User role + enum: + - admin + - support + - manager + - user + - api in: formData name: role required: true @@ -1173,29 +1208,29 @@ paths: - text/plain responses: "200": - description: User added successfully + description: Success Response schema: type: string "400": description: Bad Request schema: - $ref: '#/definitions/api.ErrorResponse' + type: string "401": description: Unauthorized schema: - $ref: '#/definitions/api.ErrorResponse' + type: string "403": description: Forbidden schema: - $ref: '#/definitions/api.ErrorResponse' + type: string "422": description: 'Unprocessable Entity: creating user failed' schema: - $ref: '#/definitions/api.ErrorResponse' + type: string "500": description: Internal Server Error schema: - $ref: '#/definitions/api.ErrorResponse' + type: string security: - ApiKeyAuth: [] summary: Adds a new user diff --git a/internal/api/docs.go b/internal/api/docs.go index 4f161e6..f3bcf5e 100644 --- a/internal/api/docs.go +++ b/internal/api/docs.go @@ -741,14 +741,28 @@ const docTemplate = `{ "required": true }, { + "enum": [ + "admin", + "support", + "manager", + "user", + "api" + ], "type": "string", - "description": "Priority 1: Role to add, one of: [admin, support, manager, user, api]", + "description": "Priority 1: Role to add", "name": "add-role", "in": "formData" }, { + "enum": [ + "admin", + "support", + "manager", + "user", + "api" + ], "type": "string", - "description": "Priority 2: Role to remove, one of: [admin, support, manager, user, api]", + "description": "Priority 2: Role to remove", "name": "remove-role", "in": "formData" }, @@ -767,7 +781,7 @@ const docTemplate = `{ ], "responses": { "200": { - "description": "Task successful", + "description": "Success Response Message", "schema": { "type": "string" } @@ -775,31 +789,31 @@ const docTemplate = `{ "400": { "description": "Bad Request", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } }, "401": { "description": "Unauthorized", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } }, "403": { "description": "Forbidden", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } }, "422": { "description": "Unprocessable Entity: The user could not be updated", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } }, "500": { "description": "Internal Server Error", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } } } @@ -813,9 +827,6 @@ const docTemplate = `{ } ], "description": "Returns a JSON-encoded list of users.\nRequired query-parameter defines if all users or only users with additional special roles are returned.", - "consumes": [ - "application/json" - ], "produces": [ "application/json" ], @@ -834,33 +845,36 @@ const docTemplate = `{ ], "responses": { "200": { - "description": "Users returned successfully", + "description": "List of users returned successfully", "schema": { - "type": "string" + "type": "array", + "items": { + "$ref": "#/definitions/api.ApiReturnedUser" + } } }, "400": { "description": "Bad Request", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } }, "401": { "description": "Unauthorized", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } }, "403": { "description": "Forbidden", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } }, "500": { "description": "Internal Server Error", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } } } @@ -898,8 +912,15 @@ const docTemplate = `{ "required": true }, { + "enum": [ + "admin", + "support", + "manager", + "user", + "api" + ], "type": "string", - "description": "User role, one of: [admin, support, manager, user, api]", + "description": "User role", "name": "role", "in": "formData", "required": true @@ -925,7 +946,7 @@ const docTemplate = `{ ], "responses": { "200": { - "description": "User added successfully", + "description": "Success Response", "schema": { "type": "string" } @@ -933,31 +954,31 @@ const docTemplate = `{ "400": { "description": "Bad Request", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } }, "401": { "description": "Unauthorized", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } }, "403": { "description": "Forbidden", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } }, "422": { "description": "Unprocessable Entity: creating user failed", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } }, "500": { "description": "Internal Server Error", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } } } @@ -972,6 +993,9 @@ const docTemplate = `{ "consumes": [ "multipart/form-data" ], + "produces": [ + "text/plain" + ], "tags": [ "remove" ], @@ -992,31 +1016,31 @@ const docTemplate = `{ "400": { "description": "Bad Request", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } }, "401": { "description": "Unauthorized", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } }, "403": { "description": "Forbidden", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } }, "422": { "description": "Unprocessable Entity: deleting user failed", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } }, "500": { "description": "Internal Server Error", "schema": { - "$ref": "#/definitions/api.ErrorResponse" + "type": "string" } } } @@ -1024,6 +1048,32 @@ const docTemplate = `{ } }, "definitions": { + "api.ApiReturnedUser": { + "type": "object", + "properties": { + "email": { + "type": "string" + }, + "name": { + "type": "string" + }, + "projects": { + "type": "array", + "items": { + "type": "string" + } + }, + "roles": { + "type": "array", + "items": { + "type": "string" + } + }, + "username": { + "type": "string" + } + } + }, "api.ApiTag": { "type": "object", "properties": { diff --git a/internal/api/rest.go b/internal/api/rest.go index 67e4dbe..0d4ddb4 100644 --- a/internal/api/rest.go +++ b/internal/api/rest.go @@ -163,6 +163,14 @@ type JobMetricWithName struct { Metric *schema.JobMetric `json:"metric"` } +type ApiReturnedUser struct { + Username string `json:"username"` + Name string `json:"name"` + Roles []string `json:"roles"` + Email string `json:"email"` + Projects []string `json:"projects"` +} + func handleError(err error, statusCode int, rw http.ResponseWriter) { log.Warnf("REST ERROR : %s", err.Error()) rw.Header().Add("Content-Type", "application/json") @@ -953,16 +961,16 @@ func (api *RestApi) getJobMetrics(rw http.ResponseWriter, r *http.Request) { // @produce plain // @param username formData string true "Unique user ID" // @param password formData string true "User password" -// @param role formData string true "User role, one of: [admin, support, manager, user, api]" +// @param role formData string true "User role" Enums(admin, support, manager, user, api) // @param project formData string false "Managed project, required for new manager role user" // @param name formData string false "Users name" // @param email formData string false "Users email" -// @success 200 {string} string "User added successfully" -// @failure 400 {object} api.ErrorResponse "Bad Request" -// @failure 401 {object} api.ErrorResponse "Unauthorized" -// @failure 403 {object} api.ErrorResponse "Forbidden" -// @failure 422 {object} api.ErrorResponse "Unprocessable Entity: creating user failed" -// @failure 500 {object} api.ErrorResponse "Internal Server Error" +// @success 200 {string} string "Success Response" +// @failure 400 {string} string "Bad Request" +// @failure 401 {string} string "Unauthorized" +// @failure 403 {string} string "Forbidden" +// @failure 422 {string} string "Unprocessable Entity: creating user failed" +// @failure 500 {string} string "Internal Server Error" // @security ApiKeyAuth // @router /users/ [post] func (api *RestApi) createUser(rw http.ResponseWriter, r *http.Request) { @@ -1017,13 +1025,14 @@ func (api *RestApi) createUser(rw http.ResponseWriter, r *http.Request) { // @tags remove // @description User defined by username in form data will be deleted from database. // @accept mpfd -// @param username formData string true "User ID to delete" +// @produce plain +// @param username formData string true "User ID to delete" // @success 200 "User deleted successfully" -// @failure 400 {object} api.ErrorResponse "Bad Request" -// @failure 401 {object} api.ErrorResponse "Unauthorized" -// @failure 403 {object} api.ErrorResponse "Forbidden" -// @failure 422 {object} api.ErrorResponse "Unprocessable Entity: deleting user failed" -// @failure 500 {object} api.ErrorResponse "Internal Server Error" +// @failure 400 {string} string "Bad Request" +// @failure 401 {string} string "Unauthorized" +// @failure 403 {string} string "Forbidden" +// @failure 422 {string} string "Unprocessable Entity: deleting user failed" +// @failure 500 {string} string "Internal Server Error" // @security ApiKeyAuth // @router /users/ [delete] func (api *RestApi) deleteUser(rw http.ResponseWriter, r *http.Request) { @@ -1052,14 +1061,13 @@ func (api *RestApi) deleteUser(rw http.ResponseWriter, r *http.Request) { // @tags query // @description Returns a JSON-encoded list of users. // @description Required query-parameter defines if all users or only users with additional special roles are returned. -// @accept json // @produce json // @param not-just-user query bool true "If returned list should contain all users or only users with additional special roles" -// @success 200 {string} json "Users returned successfully" -// @failure 400 {object} api.ErrorResponse "Bad Request" -// @failure 401 {object} api.ErrorResponse "Unauthorized" -// @failure 403 {object} api.ErrorResponse "Forbidden" -// @failure 500 {object} api.ErrorResponse "Internal Server Error" +// @success 200 {array} api.ApiReturnedUser "List of users returned successfully" +// @failure 400 {string} string "Bad Request" +// @failure 401 {string} string "Unauthorized" +// @failure 403 {string} string "Forbidden" +// @failure 500 {string} string "Internal Server Error" // @security ApiKeyAuth // @router /users/ [get] func (api *RestApi) getUsers(rw http.ResponseWriter, r *http.Request) { @@ -1090,17 +1098,17 @@ func (api *RestApi) getUsers(rw http.ResponseWriter, r *http.Request) { // @description If more than one formValue is set then only the highest priority field is used. // @accept mpfd // @produce plain -// @param id path string true "Database ID of User" -// @param add-role formData string false "Priority 1: Role to add, one of: [admin, support, manager, user, api]" -// @param remove-role formData string false "Priority 2: Role to remove, one of: [admin, support, manager, user, api]" -// @param add-project formData string false "Priority 3: Project to add" -// @param remove-project formData string false "Priority 4: Project to remove" -// @success 200 {string} string "Task successful" -// @failure 400 {object} api.ErrorResponse "Bad Request" -// @failure 401 {object} api.ErrorResponse "Unauthorized" -// @failure 403 {object} api.ErrorResponse "Forbidden" -// @failure 422 {object} api.ErrorResponse "Unprocessable Entity: The user could not be updated" -// @failure 500 {object} api.ErrorResponse "Internal Server Error" +// @param id path string true "Database ID of User" +// @param add-role formData string false "Priority 1: Role to add" Enums(admin, support, manager, user, api) +// @param remove-role formData string false "Priority 2: Role to remove" Enums(admin, support, manager, user, api) +// @param add-project formData string false "Priority 3: Project to add" +// @param remove-project formData string false "Priority 4: Project to remove" +// @success 200 {string} string "Success Response Message" +// @failure 400 {string} string "Bad Request" +// @failure 401 {string} string "Unauthorized" +// @failure 403 {string} string "Forbidden" +// @failure 422 {string} string "Unprocessable Entity: The user could not be updated" +// @failure 500 {string} string "Internal Server Error" // @security ApiKeyAuth // @router /user/{id} [post] func (api *RestApi) updateUser(rw http.ResponseWriter, r *http.Request) { From 61c83c375d3744312ff9781a871b413f1613ec9e Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Wed, 23 Aug 2023 16:29:46 +0200 Subject: [PATCH 59/95] enable forNode special handling --- web/frontend/src/Node.root.svelte | 1 + web/frontend/src/Systems.root.svelte | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/web/frontend/src/Node.root.svelte b/web/frontend/src/Node.root.svelte index d07e752..b23c71e 100644 --- a/web/frontend/src/Node.root.svelte +++ b/web/frontend/src/Node.root.svelte @@ -212,6 +212,7 @@ .subCluster} series={item.metric.series} resources={[{hostname: hostname}]} + forNode={true} /> {:else if item.disabled === true && item.metric} c.name == cluster)} subCluster={item.subCluster} - resources={[{hostname: item.host}]}/> + resources={[{hostname: item.host}]} + forNode={true}/> {:else if item.disabled === true && item.data} Metric disabled for subcluster {selectedMetric}:{item.subCluster} {:else} From 80be78604f066b64837170d0f41d4e54f8bf3a94 Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Wed, 23 Aug 2023 21:15:49 +0200 Subject: [PATCH 60/95] fix: Responsive Navbar Missing Burger menu icon --- web/frontend/package-lock.json | 20 +- web/frontend/package.json | 2 +- web/frontend/src/Header.svelte | 357 +++++++++++++++++++++++++-------- 3 files changed, 281 insertions(+), 98 deletions(-) diff --git a/web/frontend/package-lock.json b/web/frontend/package-lock.json index 7997e2e..eb80726 100644 --- a/web/frontend/package-lock.json +++ b/web/frontend/package-lock.json @@ -14,7 +14,7 @@ "chart.js": "^4.3.3", "graphql": "^16.6.0", "svelte-chartjs": "^3.1.2", - "sveltestrap": "^5.10.0", + "sveltestrap": "^5.11.1", "uplot": "^1.6.24", "wonka": "^6.3.2" }, @@ -138,9 +138,9 @@ } }, "node_modules/@rollup/plugin-node-resolve": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.0.tgz", - "integrity": "sha512-mKur03xNGT8O9ODO6FtT43ITGqHWZbKPdVJHZb+iV9QYcdlhUUB0wgknvA4KCUmC5oHJF6O2W1EgmyOQyVUI4Q==", + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.1.tgz", + "integrity": "sha512-nsbUg588+GDSu8/NS8T4UAshO6xeaOfINNuXeVHcKV02LJtoRaM1SiOacClw4kws1SFiNhdLGxlbMY9ga/zs/w==", "dev": true, "dependencies": { "@rollup/pluginutils": "^5.0.1", @@ -346,9 +346,9 @@ "dev": true }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -547,9 +547,9 @@ } }, "node_modules/rollup": { - "version": "3.28.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.0.tgz", - "integrity": "sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==", + "version": "3.28.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.1.tgz", + "integrity": "sha512-R9OMQmIHJm9znrU3m3cpE8uhN0fGdXiawME7aZIpQqvpS/85+Vt1Hq1/yVIcYfOmaQiHjvXkQAoJukvLpau6Yw==", "devOptional": true, "bin": { "rollup": "dist/bin/rollup" diff --git a/web/frontend/package.json b/web/frontend/package.json index 4ef7314..b0bb5af 100644 --- a/web/frontend/package.json +++ b/web/frontend/package.json @@ -21,7 +21,7 @@ "chart.js": "^4.3.3", "graphql": "^16.6.0", "svelte-chartjs": "^3.1.2", - "sveltestrap": "^5.10.0", + "sveltestrap": "^5.11.1", "uplot": "^1.6.24", "wonka": "^6.3.2" } diff --git a/web/frontend/src/Header.svelte b/web/frontend/src/Header.svelte index 164a592..443f1d7 100644 --- a/web/frontend/src/Header.svelte +++ b/web/frontend/src/Header.svelte @@ -1,110 +1,293 @@ - + + - ClusterCockpit Logo + ClusterCockpit Logo (isOpen = !isOpen)} /> - (isOpen = detail.isOpen)}> - + From 204901189d1ea15522f74eab610fe73e01959aa5 Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Thu, 24 Aug 2023 09:22:12 +0200 Subject: [PATCH 61/95] Add NavbarLinks component --- web/frontend/src/Header.svelte | 140 ++++++++-------------------- web/frontend/src/NavbarLinks.svelte | 39 ++++++++ 2 files changed, 78 insertions(+), 101 deletions(-) create mode 100644 web/frontend/src/NavbarLinks.svelte diff --git a/web/frontend/src/Header.svelte b/web/frontend/src/Header.svelte index 443f1d7..eec8beb 100644 --- a/web/frontend/src/Header.svelte +++ b/web/frontend/src/Header.svelte @@ -17,6 +17,7 @@ DropdownItem, InputGroupText, } from "sveltestrap"; + import NavbarLinks from "./NavbarLinks.svelte"; export let username; // empty string if auth. is disabled, otherwise the username as string export let authlevel; // Integer @@ -118,122 +119,60 @@ > - diff --git a/web/frontend/src/NavbarLinks.svelte b/web/frontend/src/NavbarLinks.svelte new file mode 100644 index 0000000..6861da5 --- /dev/null +++ b/web/frontend/src/NavbarLinks.svelte @@ -0,0 +1,39 @@ + + +{#each links as item} + {#if !item.perCluster} + {item.title} + {:else} + + + + {item.title} + + + {#each clusters as cluster} + + {cluster.name} + + {/each} + + + {/if} +{/each} From 69b3f767f66d0c39664c708f9e4ff759604ce26a Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Thu, 24 Aug 2023 09:38:12 +0200 Subject: [PATCH 62/95] Make menu flat if collapsed --- web/frontend/src/Header.svelte | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/web/frontend/src/Header.svelte b/web/frontend/src/Header.svelte index eec8beb..abef959 100644 --- a/web/frontend/src/Header.svelte +++ b/web/frontend/src/Header.svelte @@ -9,12 +9,10 @@ NavbarBrand, Nav, NavItem, - NavLink, NavbarToggler, Dropdown, DropdownToggle, DropdownMenu, - DropdownItem, InputGroupText, } from "sveltestrap"; import NavbarLinks from "./NavbarLinks.svelte"; @@ -118,7 +116,7 @@ on:update={({ detail }) => (isOpen = detail.isOpen)} >
-

Current utilization of cluster "{cluster}"

+

Current utilization of cluster "{cluster}"

{#if $initq.fetching || $mainQuery.fetching} - + {:else if $initq.error} {$initq.error.message} {:else} @@ -84,10 +184,13 @@ {/if} - { - from = new Date(Date.now() - 5 * 60 * 1000) - to = new Date(Date.now()) - }} /> + { + from = new Date(Date.now() - 5 * 60 * 1000); + to = new Date(Date.now()); + }} + /> {#if $mainQuery.error} @@ -98,43 +201,85 @@ {/if} -
+
{#if $initq.data && $mainQuery.data} - {#each $initq.data.clusters.find(c => c.name == cluster).subClusters as subCluster, i} - -
+ {#each $initq.data.clusters.find((c) => c.name == cluster).subClusters as subCluster, i} + + - SubCluster "{subCluster.name}" + SubCluster "{subCluster.name}"
User NameNode Hours
LegendUser NameNode Hours
{name} {count}
- - + + - - + + - +
Allocated Nodes
{allocatedNodes[subCluster.name]} / {subCluster.numberOfNodes} Nodes
+ +
{allocatedNodes[subCluster.name]} / {subCluster.numberOfNodes} + Nodes
Flop Rate (Any)
Flop Rate (Any)
+ +
- {scaleNumbers(flopRate[subCluster.name], - (subCluster.flopRateSimd.value * subCluster.numberOfNodes), - flopRateUnitPrefix[subCluster.name]) - }{flopRateUnitBase[subCluster.name]} [Max] + {scaleNumbers( + flopRate[subCluster.name], + subCluster.flopRateSimd.value * + subCluster.numberOfNodes, + flopRateUnitPrefix[subCluster.name] + )}{flopRateUnitBase[subCluster.name]} [Max]
MemBw Rate
+ +
- {scaleNumbers(memBwRate[subCluster.name], - (subCluster.memoryBandwidth.value * subCluster.numberOfNodes), - memBwRateUnitPrefix[subCluster.name]) - }{memBwRateUnitBase[subCluster.name]} [Max] + {scaleNumbers( + memBwRate[subCluster.name], + subCluster.memoryBandwidth.value * + subCluster.numberOfNodes, + memBwRateUnitPrefix[subCluster.name] + )}{memBwRateUnitBase[subCluster.name]} [Max]
@@ -145,40 +290,65 @@
{#key $mainQuery.data.nodeMetrics} data.subCluster == subCluster.name))} /> + width={plotWidths[i] - 10} + height={300} + colorDots={true} + showTime={false} + cluster={subCluster} + data={transformPerNodeData( + $mainQuery.data.nodeMetrics.filter( + (data) => data.subCluster == subCluster.name + ) + )} + /> {/key}
{/each} -
+
- +

Top Users

{#key $mainQuery.data} b.count - a.count).map((tu) => tu.count)} - entities={$mainQuery.data.topUsers.sort((a, b) => b.count - a.count).map((tu) => tu.name)} - + sliceLabel="Jobs" + quantities={$mainQuery.data.topUsers + .sort((a, b) => b.count - a.count) + .map((tu) => tu.count)} + entities={$mainQuery.data.topUsers + .sort((a, b) => b.count - a.count) + .map((tu) => tu.name)} /> {/key}
- + {#each $mainQuery.data.topUsers.sort((a, b) => b.count - a.count) as { name, count }, i} - - + + {/each} @@ -189,38 +359,58 @@ {#key $mainQuery.data} b.count - a.count).map((tp) => tp.count)} - entities={$mainQuery.data.topProjects.sort((a, b) => b.count - a.count).map((tp) => tp.name)} + sliceLabel="Jobs" + quantities={$mainQuery.data.topProjects + .sort((a, b) => b.count - a.count) + .map((tp) => tp.count)} + entities={$mainQuery.data.topProjects + .sort((a, b) => b.count - a.count) + .map((tp) => tp.name)} /> {/key}
LegendUser NameNumber of Nodes
LegendUser NameNumber of Nodes
{name}{name} {count}
- + {#each $mainQuery.data.topProjects.sort((a, b) => b.count - a.count) as { name, count }, i} - - + + {/each}
LegendProject CodeNumber of Nodes
LegendProject CodeNumber of Nodes
{name}{name} {count}
-
- +
+
{#key $mainQuery.data.stats} + yunit="Jobs" + /> {/key}
@@ -231,10 +421,12 @@ width={colWidth2 - 25} title="Number of Nodes Distribution" xlabel="Allocated Nodes" - xunit="Nodes" + xunit="Nodes" ylabel="Number of Jobs" - yunit="Jobs"/> + yunit="Jobs" + /> {/key}
-{/if} \ No newline at end of file +{/if} + From 6a1e35107ff57a116b8ad3986fd96b4b2518b8d8 Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Thu, 24 Aug 2023 11:52:36 +0200 Subject: [PATCH 64/95] fix: analysis metric histogram normalized by scope - native acc metrics normalized by accHours - native core metrics normalized by coreHours --- api/schema.graphqls | 10 +- internal/graph/generated/generated.go | 270 ++++++++++++++++++++++++-- internal/graph/model/models_gen.go | 14 +- internal/graph/util.go | 44 ++++- internal/metricdata/metricdata.go | 2 +- web/frontend/src/Analysis.root.svelte | 18 +- web/frontend/src/utils.js | 28 ++- 7 files changed, 336 insertions(+), 50 deletions(-) diff --git a/api/schema.graphqls b/api/schema.graphqls index 4802117..bd5d7db 100644 --- a/api/schema.graphqls +++ b/api/schema.graphqls @@ -156,12 +156,18 @@ type MetricFootprints { } type Footprints { - timeweights: [NullableFloat!]! + timeWeights: TimeWeights! metrics: [MetricFootprints!]! } +type TimeWeights { + nodeHours: [NullableFloat!]! + accHours: [NullableFloat!]! + coreHours: [NullableFloat!]! +} + enum Aggregate { USER, PROJECT, CLUSTER } -enum Weights { NODE_COUNT, NODE_HOURS } +enum Weights { NODE_COUNT, NODE_HOURS, CORE_COUNT, CORE_HOURS } type NodeMetrics { host: String! diff --git a/internal/graph/generated/generated.go b/internal/graph/generated/generated.go index 5f5bacc..278e8f2 100644 --- a/internal/graph/generated/generated.go +++ b/internal/graph/generated/generated.go @@ -69,7 +69,7 @@ type ComplexityRoot struct { Footprints struct { Metrics func(childComplexity int) int - Timeweights func(childComplexity int) int + TimeWeights func(childComplexity int) int } HistoPoint struct { @@ -265,6 +265,12 @@ type ComplexityRoot struct { To func(childComplexity int) int } + TimeWeights struct { + AccHours func(childComplexity int) int + CoreHours func(childComplexity int) int + NodeHours func(childComplexity int) int + } + Topology struct { Accelerators func(childComplexity int) int Core func(childComplexity int) int @@ -406,12 +412,12 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.Footprints.Metrics(childComplexity), true - case "Footprints.timeweights": - if e.complexity.Footprints.Timeweights == nil { + case "Footprints.timeWeights": + if e.complexity.Footprints.TimeWeights == nil { break } - return e.complexity.Footprints.Timeweights(childComplexity), true + return e.complexity.Footprints.TimeWeights(childComplexity), true case "HistoPoint.count": if e.complexity.HistoPoint.Count == nil { @@ -1356,6 +1362,27 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.TimeRangeOutput.To(childComplexity), true + case "TimeWeights.accHours": + if e.complexity.TimeWeights.AccHours == nil { + break + } + + return e.complexity.TimeWeights.AccHours(childComplexity), true + + case "TimeWeights.coreHours": + if e.complexity.TimeWeights.CoreHours == nil { + break + } + + return e.complexity.TimeWeights.CoreHours(childComplexity), true + + case "TimeWeights.nodeHours": + if e.complexity.TimeWeights.NodeHours == nil { + break + } + + return e.complexity.TimeWeights.NodeHours(childComplexity), true + case "Topology.accelerators": if e.complexity.Topology.Accelerators == nil { break @@ -1703,12 +1730,18 @@ type MetricFootprints { } type Footprints { - timeweights: [NullableFloat!]! + timeWeights: TimeWeights! metrics: [MetricFootprints!]! } +type TimeWeights { + nodeHours: [NullableFloat!]! + accHours: [NullableFloat!]! + coreHours: [NullableFloat!]! +} + enum Aggregate { USER, PROJECT, CLUSTER } -enum Weights { NODE_COUNT, NODE_HOURS } +enum Weights { NODE_COUNT, NODE_HOURS, CORE_COUNT, CORE_HOURS } type NodeMetrics { host: String! @@ -1836,7 +1869,7 @@ type JobsStatistics { shortJobs: Int! # Number of jobs with a duration of less than duration totalWalltime: Int! # Sum of the duration of all matched jobs in hours totalNodeHours: Int! # Sum of the node hours of all matched jobs - totalCoreHours: Int! # Sum of the core hours of all matched jobs + totalCoreHours: Int! # Sum of the core hours of all matched jobs <-- Das nehmen statt totaljobs in hsitograms mit totaljobs + bei analysis metric histos weighted totalAccHours: Int! # Sum of the gpu hours of all matched jobs histDuration: [HistoPoint!]! # value: hour, count: number of jobs with a rounded duration of value histNumNodes: [HistoPoint!]! # value: number of nodes, count: number of jobs with that number of nodes @@ -2790,8 +2823,8 @@ func (ec *executionContext) fieldContext_Count_count(ctx context.Context, field return fc, nil } -func (ec *executionContext) _Footprints_timeweights(ctx context.Context, field graphql.CollectedField, obj *model.Footprints) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Footprints_timeweights(ctx, field) +func (ec *executionContext) _Footprints_timeWeights(ctx context.Context, field graphql.CollectedField, obj *model.Footprints) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Footprints_timeWeights(ctx, field) if err != nil { return graphql.Null } @@ -2804,7 +2837,7 @@ func (ec *executionContext) _Footprints_timeweights(ctx context.Context, field g }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return obj.Timeweights, nil + return obj.TimeWeights, nil }) if err != nil { ec.Error(ctx, err) @@ -2816,19 +2849,27 @@ func (ec *executionContext) _Footprints_timeweights(ctx context.Context, field g } return graphql.Null } - res := resTmp.([]schema.Float) + res := resTmp.(*model.TimeWeights) fc.Result = res - return ec.marshalNNullableFloat2ᚕgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐFloatᚄ(ctx, field.Selections, res) + return ec.marshalNTimeWeights2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐTimeWeights(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Footprints_timeweights(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Footprints_timeWeights(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Footprints", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type NullableFloat does not have child fields") + switch field.Name { + case "nodeHours": + return ec.fieldContext_TimeWeights_nodeHours(ctx, field) + case "accHours": + return ec.fieldContext_TimeWeights_accHours(ctx, field) + case "coreHours": + return ec.fieldContext_TimeWeights_coreHours(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type TimeWeights", field.Name) }, } return fc, nil @@ -6994,8 +7035,8 @@ func (ec *executionContext) fieldContext_Query_jobsFootprints(ctx context.Contex IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { - case "timeweights": - return ec.fieldContext_Footprints_timeweights(ctx, field) + case "timeWeights": + return ec.fieldContext_Footprints_timeWeights(ctx, field) case "metrics": return ec.fieldContext_Footprints_metrics(ctx, field) } @@ -8930,6 +8971,138 @@ func (ec *executionContext) fieldContext_TimeRangeOutput_to(ctx context.Context, return fc, nil } +func (ec *executionContext) _TimeWeights_nodeHours(ctx context.Context, field graphql.CollectedField, obj *model.TimeWeights) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_TimeWeights_nodeHours(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.NodeHours, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.([]schema.Float) + fc.Result = res + return ec.marshalNNullableFloat2ᚕgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐFloatᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_TimeWeights_nodeHours(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "TimeWeights", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type NullableFloat does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _TimeWeights_accHours(ctx context.Context, field graphql.CollectedField, obj *model.TimeWeights) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_TimeWeights_accHours(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.AccHours, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.([]schema.Float) + fc.Result = res + return ec.marshalNNullableFloat2ᚕgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐFloatᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_TimeWeights_accHours(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "TimeWeights", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type NullableFloat does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _TimeWeights_coreHours(ctx context.Context, field graphql.CollectedField, obj *model.TimeWeights) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_TimeWeights_coreHours(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.CoreHours, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.([]schema.Float) + fc.Result = res + return ec.marshalNNullableFloat2ᚕgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐFloatᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_TimeWeights_coreHours(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "TimeWeights", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type NullableFloat does not have child fields") + }, + } + return fc, nil +} + func (ec *executionContext) _Topology_node(ctx context.Context, field graphql.CollectedField, obj *schema.Topology) (ret graphql.Marshaler) { fc, err := ec.fieldContext_Topology_node(ctx, field) if err != nil { @@ -11848,10 +12021,8 @@ func (ec *executionContext) _Footprints(ctx context.Context, sel ast.SelectionSe switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Footprints") - case "timeweights": - - out.Values[i] = ec._Footprints_timeweights(ctx, field, obj) - + case "timeWeights": + out.Values[i] = ec._Footprints_timeWeights(ctx, field, obj) if out.Values[i] == graphql.Null { out.Invalids++ } @@ -13600,6 +13771,55 @@ func (ec *executionContext) _TimeRangeOutput(ctx context.Context, sel ast.Select return out } +var timeWeightsImplementors = []string{"TimeWeights"} + +func (ec *executionContext) _TimeWeights(ctx context.Context, sel ast.SelectionSet, obj *model.TimeWeights) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, timeWeightsImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("TimeWeights") + case "nodeHours": + out.Values[i] = ec._TimeWeights_nodeHours(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "accHours": + out.Values[i] = ec._TimeWeights_accHours(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "coreHours": + out.Values[i] = ec._TimeWeights_coreHours(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + var topologyImplementors = []string{"Topology"} func (ec *executionContext) _Topology(ctx context.Context, sel ast.SelectionSet, obj *schema.Topology) graphql.Marshaler { @@ -15333,6 +15553,16 @@ func (ec *executionContext) marshalNTime2timeᚐTime(ctx context.Context, sel as return res } +func (ec *executionContext) marshalNTimeWeights2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐTimeWeights(ctx context.Context, sel ast.SelectionSet, v *model.TimeWeights) graphql.Marshaler { + if v == nil { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "the requested element is null which the schema does not allow") + } + return graphql.Null + } + return ec._TimeWeights(ctx, sel, v) +} + func (ec *executionContext) marshalNTopology2githubᚗcomᚋClusterCockpitᚋccᚑbackendᚋpkgᚋschemaᚐTopology(ctx context.Context, sel ast.SelectionSet, v schema.Topology) graphql.Marshaler { return ec._Topology(ctx, sel, &v) } diff --git a/internal/graph/model/models_gen.go b/internal/graph/model/models_gen.go index 3f0cca5..faffae7 100644 --- a/internal/graph/model/models_gen.go +++ b/internal/graph/model/models_gen.go @@ -22,7 +22,7 @@ type FloatRange struct { } type Footprints struct { - Timeweights []schema.Float `json:"timeweights"` + TimeWeights *TimeWeights `json:"timeWeights"` Metrics []*MetricFootprints `json:"metrics"` } @@ -133,6 +133,12 @@ type TimeRangeOutput struct { To time.Time `json:"to"` } +type TimeWeights struct { + NodeHours []schema.Float `json:"nodeHours"` + AccHours []schema.Float `json:"accHours"` + CoreHours []schema.Float `json:"coreHours"` +} + type User struct { Username string `json:"username"` Name string `json:"name"` @@ -228,16 +234,20 @@ type Weights string const ( WeightsNodeCount Weights = "NODE_COUNT" WeightsNodeHours Weights = "NODE_HOURS" + WeightsCoreCount Weights = "CORE_COUNT" + WeightsCoreHours Weights = "CORE_HOURS" ) var AllWeights = []Weights{ WeightsNodeCount, WeightsNodeHours, + WeightsCoreCount, + WeightsCoreHours, } func (e Weights) IsValid() bool { switch e { - case WeightsNodeCount, WeightsNodeHours: + case WeightsNodeCount, WeightsNodeHours, WeightsCoreCount, WeightsCoreHours: return true } return false diff --git a/internal/graph/util.go b/internal/graph/util.go index 64676c8..b3a0080 100644 --- a/internal/graph/util.go +++ b/internal/graph/util.go @@ -13,6 +13,7 @@ import ( "github.com/99designs/gqlgen/graphql" "github.com/ClusterCockpit/cc-backend/internal/graph/model" "github.com/ClusterCockpit/cc-backend/internal/metricdata" + "github.com/ClusterCockpit/cc-backend/pkg/archive" "github.com/ClusterCockpit/cc-backend/pkg/log" "github.com/ClusterCockpit/cc-backend/pkg/schema" ) @@ -106,9 +107,11 @@ func (r *queryResolver) jobsFootprints(ctx context.Context, filter []*model.JobF avgs[i] = make([]schema.Float, 0, len(jobs)) } - nodehours := make([]schema.Float, 0, len(jobs)) - acchours := make([]schema.Float, 0, len(jobs)) - hwthours := make([]schema.Float, 0, len(jobs)) + timeweights := new(model.TimeWeights) + timeweights.NodeHours = make([]schema.Float, 0, len(jobs)) + timeweights.AccHours = make([]schema.Float, 0, len(jobs)) + timeweights.CoreHours = make([]schema.Float, 0, len(jobs)) + for _, job := range jobs { if job.MonitoringStatus == schema.MonitoringStatusDisabled || job.MonitoringStatus == schema.MonitoringStatusArchivingFailed { continue @@ -120,16 +123,16 @@ func (r *queryResolver) jobsFootprints(ctx context.Context, filter []*model.JobF } // #166 collect arrays: Null values or no null values? - nodehours = append(nodehours, schema.Float(float64(job.Duration)/60.0*float64(job.NumNodes))) + timeweights.NodeHours = append(timeweights.NodeHours, schema.Float(float64(job.Duration)/60.0*float64(job.NumNodes))) if job.NumAcc > 0 { - acchours = append(acchours, schema.Float(float64(job.Duration)/60.0*float64(job.NumAcc))) + timeweights.AccHours = append(timeweights.AccHours, schema.Float(float64(job.Duration)/60.0*float64(job.NumAcc))) } else { - acchours = append(acchours, schema.Float(0.0)) + timeweights.AccHours = append(timeweights.AccHours, schema.Float(1.0)) } if job.NumHWThreads > 0 { - hwthours = append(hwthours, schema.Float(float64(job.Duration)/60.0*float64(job.NumHWThreads))) + timeweights.CoreHours = append(timeweights.CoreHours, schema.Float(float64(job.Duration)/60.0*float64(numCoresForJob(job)))) } else { - hwthours = append(hwthours, schema.Float(0.0)) + timeweights.CoreHours = append(timeweights.CoreHours, schema.Float(1.0)) } } @@ -142,11 +145,34 @@ func (r *queryResolver) jobsFootprints(ctx context.Context, filter []*model.JobF } return &model.Footprints{ - Timeweights: nodehours, + TimeWeights: timeweights, Metrics: res, }, nil } +func numCoresForJob(job *schema.Job) (numCores int) { + + subcluster, scerr := archive.GetSubCluster(job.Cluster, job.SubCluster) + if scerr != nil { + return 1 + } + + totalJobCores := 0 + topology := subcluster.Topology + + for _, host := range job.Resources { + hwthreads := host.HWThreads + if hwthreads == nil { + hwthreads = topology.Node + } + + hostCores, _ := topology.GetCoresFromHWThreads(hwthreads) + totalJobCores += len(hostCores) + } + + return totalJobCores +} + func requireField(ctx context.Context, name string) bool { fields := graphql.CollectAllFields(ctx) diff --git a/internal/metricdata/metricdata.go b/internal/metricdata/metricdata.go index fc91e7d..3117f8c 100644 --- a/internal/metricdata/metricdata.go +++ b/internal/metricdata/metricdata.go @@ -182,7 +182,7 @@ func LoadAverages( ctx context.Context) error { if job.State != schema.JobStateRunning && useArchive { - return archive.LoadAveragesFromArchive(job, metrics, data) // #166 change also here + return archive.LoadAveragesFromArchive(job, metrics, data) // #166 change also here? } repo, ok := metricDataRepos[job.Cluster] diff --git a/web/frontend/src/Analysis.root.svelte b/web/frontend/src/Analysis.root.svelte index 9df1282..4022826 100644 --- a/web/frontend/src/Analysis.root.svelte +++ b/web/frontend/src/Analysis.root.svelte @@ -78,7 +78,7 @@ query: gql` query($jobFilters: [JobFilter!]!, $metrics: [String!]!) { footprints: jobsFootprints(filter: $jobFilters, metrics: $metrics) { - timeweights, + timeWeights { nodeHours, accHours, coreHours }, metrics { metric, data } } }`, @@ -244,8 +244,9 @@ - These histograms show the distribution of the averages of all jobs matching the filters. Each job/average is weighted by its node hours. - Note that some metrics could be disabled for specific subclusters as per metriConfig and thus could affect shown average values. + These histograms show the distribution of the averages of all jobs matching the filters. Each job/average is weighted by its node hours by default + (Accelerator hours for native accelerator scope metrics, coreHours for native core scope metrics). + Note that some metrics could be disabled for specific subclusters as per metricConfig and thus could affect shown average values.
@@ -257,7 +258,8 @@ let:width renderFor="analysis" items={metricsInHistograms.map(metric => ({ metric, ...binsFromFootprint( - $footprintsQuery.data.footprints.timeweights, + $footprintsQuery.data.footprints.timeWeights, + metricConfig(cluster.name, metric)?.scope, $footprintsQuery.data.footprints.metrics.find(f => f.metric == metric).data, numBins) }))} itemsPerRow={ccconfig.plot_view_plotsPerRow}> @@ -265,11 +267,11 @@ data={convert2uplot(item.bins)} width={width} height={250} title="Average Distribution of '{item.metric}'" - xlabel={`${item.metric} average [${(metricConfig(cluster.name, item.metric)?.unit?.prefix ? metricConfig(cluster.name, item.metric)?.unit?.prefix : '') + + xlabel={`${item.metric} bin maximum [${(metricConfig(cluster.name, item.metric)?.unit?.prefix ? metricConfig(cluster.name, item.metric)?.unit?.prefix : '') + (metricConfig(cluster.name, item.metric)?.unit?.base ? metricConfig(cluster.name, item.metric)?.unit?.base : '')}]`} xunit={`${(metricConfig(cluster.name, item.metric)?.unit?.prefix ? metricConfig(cluster.name, item.metric)?.unit?.prefix : '') + (metricConfig(cluster.name, item.metric)?.unit?.base ? metricConfig(cluster.name, item.metric)?.unit?.base : '')}`} - ylabel="Node Hours" + ylabel="Normalized Hours" yunit="Hours"/> @@ -279,7 +281,7 @@ Each circle represents one job. The size of a circle is proportional to its node hours. Darker circles mean multiple jobs have the same averages for the respective metrics. - Note that some metrics could be disabled for specific subclusters as per metriConfig and thus could affect shown average values. + Note that some metrics could be disabled for specific subclusters as per metricConfig and thus could affect shown average values.
@@ -301,7 +303,7 @@ (metricConfig(cluster.name, item.m1)?.unit?.base ? metricConfig(cluster.name, item.m1)?.unit?.base : '')}]`} yLabel={`${item.m2} [${(metricConfig(cluster.name, item.m2)?.unit?.prefix ? metricConfig(cluster.name, item.m2)?.unit?.prefix : '') + (metricConfig(cluster.name, item.m2)?.unit?.base ? metricConfig(cluster.name, item.m2)?.unit?.base : '')}]`} - X={item.f1} Y={item.f2} S={$footprintsQuery.data.footprints.timeweights} /> + X={item.f1} Y={item.f2} S={$footprintsQuery.data.footprints.timeWeights.nodeHours} />
diff --git a/web/frontend/src/utils.js b/web/frontend/src/utils.js index f68fec4..5e9cdae 100644 --- a/web/frontend/src/utils.js +++ b/web/frontend/src/utils.js @@ -325,7 +325,7 @@ export function convert2uplot(canvasData) { return uplotData } -export function binsFromFootprint(weights, values, numBins) { +export function binsFromFootprint(weights, scope, values, numBins) { let min = 0, max = 0 if (values.length != 0) { for (let x of values) { @@ -338,10 +338,23 @@ export function binsFromFootprint(weights, values, numBins) { if (numBins == null || numBins < 3) numBins = 3 + let scopeWeights + switch (scope) { + case 'core': + scopeWeights = weights.coreHours + break + case 'accelerator': + scopeWeights = weights.accHours + break + default: // every other scope: use 'node' + scopeWeights = weights.nodeHours + } + const bins = new Array(numBins).fill(0) for (let i = 0; i < values.length; i++) - bins[Math.floor(((values[i] - min) / (max - min)) * numBins)] += weights ? weights[i] : 1 + bins[Math.floor(((values[i] - min) / (max - min)) * numBins)] += scopeWeights ? scopeWeights[i] : 1 + // Manual Canvas Original // return { // label: idx => { // let start = min + (idx / numBins) * (max - min) @@ -355,14 +368,13 @@ export function binsFromFootprint(weights, values, numBins) { return { bins: bins.map((count, idx) => ({ - value: idx => { // Get rounded down next integer to bins' Start-Stop Mean Value - let start = min + (idx / numBins) * (max - min) + value: idx => { // Use bins' max value instead of mean + // let start = min + (idx / numBins) * (max - min) let stop = min + ((idx + 1) / numBins) * (max - min) - return `${formatNumber(Math.floor((start+stop)/2))}` + // return `${formatNumber(Math.floor((start+stop)/2))}` + return Math.floor(stop) }, count: count - })), - min: min, - max: max + })) } } From 4eceab4dc7c909f6cf1dbb3c95b870211eb2a028 Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Thu, 24 Aug 2023 12:51:55 +0200 Subject: [PATCH 65/95] fix: change analysis top users to core hours --- internal/repository/job.go | 6 ++++++ web/frontend/src/Analysis.root.svelte | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/internal/repository/job.go b/internal/repository/job.go index 449c267..b14fd53 100644 --- a/internal/repository/job.go +++ b/internal/repository/job.go @@ -478,6 +478,12 @@ func (r *JobRepository) CountGroupedJobs( now := time.Now().Unix() count = fmt.Sprintf(`sum(job.num_nodes * (CASE WHEN job.job_state = "running" THEN %d - job.start_time ELSE job.duration END)) as count`, now) runner = r.DB + case model.WeightsCoreCount: + count = "sum(job.num_hwthreads) as count" + case model.WeightsCoreHours: + now := time.Now().Unix() + count = fmt.Sprintf(`sum(job.num_hwthreads * (CASE WHEN job.job_state = "running" THEN %d - job.start_time ELSE job.duration END)) as count`, now) + runner = r.DB default: log.Debugf("CountGroupedJobs() Weight %v unknown.", *weight) } diff --git a/web/frontend/src/Analysis.root.svelte b/web/frontend/src/Analysis.root.svelte index 4022826..c6e4575 100644 --- a/web/frontend/src/Analysis.root.svelte +++ b/web/frontend/src/Analysis.root.svelte @@ -67,7 +67,7 @@ histNumNodes { count, value } } - topUsers: jobsCount(filter: $jobFilters, groupBy: USER, weight: NODE_HOURS, limit: 5) { name, count } + topUsers: jobsCount(filter: $jobFilters, groupBy: USER, weight: CORE_HOURS, limit: 5) { name, count } } `, variables: { jobFilters } @@ -172,7 +172,7 @@ - + {#each $statsQuery.data.topUsers.sort((a, b) => b.count - a.count) as { name, count }, i} From 28609a33722a4ce02e8e7d511bd411d4adea0176 Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Thu, 24 Aug 2023 12:56:35 +0200 Subject: [PATCH 66/95] adapt core timeweight to sqlite name logic --- internal/graph/util.go | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/internal/graph/util.go b/internal/graph/util.go index b3a0080..b61bcc7 100644 --- a/internal/graph/util.go +++ b/internal/graph/util.go @@ -13,9 +13,9 @@ import ( "github.com/99designs/gqlgen/graphql" "github.com/ClusterCockpit/cc-backend/internal/graph/model" "github.com/ClusterCockpit/cc-backend/internal/metricdata" - "github.com/ClusterCockpit/cc-backend/pkg/archive" "github.com/ClusterCockpit/cc-backend/pkg/log" "github.com/ClusterCockpit/cc-backend/pkg/schema" + // "github.com/ClusterCockpit/cc-backend/pkg/archive" ) const MAX_JOBS_FOR_ANALYSIS = 500 @@ -130,7 +130,7 @@ func (r *queryResolver) jobsFootprints(ctx context.Context, filter []*model.JobF timeweights.AccHours = append(timeweights.AccHours, schema.Float(1.0)) } if job.NumHWThreads > 0 { - timeweights.CoreHours = append(timeweights.CoreHours, schema.Float(float64(job.Duration)/60.0*float64(numCoresForJob(job)))) + timeweights.CoreHours = append(timeweights.CoreHours, schema.Float(float64(job.Duration)/60.0*float64(job.NumHWThreads))) // SQLite HWThreads == Cores; numCoresForJob(job) } else { timeweights.CoreHours = append(timeweights.CoreHours, schema.Float(1.0)) } @@ -150,28 +150,28 @@ func (r *queryResolver) jobsFootprints(ctx context.Context, filter []*model.JobF }, nil } -func numCoresForJob(job *schema.Job) (numCores int) { +// func numCoresForJob(job *schema.Job) (numCores int) { - subcluster, scerr := archive.GetSubCluster(job.Cluster, job.SubCluster) - if scerr != nil { - return 1 - } +// subcluster, scerr := archive.GetSubCluster(job.Cluster, job.SubCluster) +// if scerr != nil { +// return 1 +// } - totalJobCores := 0 - topology := subcluster.Topology +// totalJobCores := 0 +// topology := subcluster.Topology - for _, host := range job.Resources { - hwthreads := host.HWThreads - if hwthreads == nil { - hwthreads = topology.Node - } +// for _, host := range job.Resources { +// hwthreads := host.HWThreads +// if hwthreads == nil { +// hwthreads = topology.Node +// } - hostCores, _ := topology.GetCoresFromHWThreads(hwthreads) - totalJobCores += len(hostCores) - } +// hostCores, _ := topology.GetCoresFromHWThreads(hwthreads) +// totalJobCores += len(hostCores) +// } - return totalJobCores -} +// return totalJobCores +// } func requireField(ctx context.Context, name string) bool { fields := graphql.CollectAllFields(ctx) From 77677a9f1b741e81b1c9a81cb350a38ed907c433 Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Thu, 24 Aug 2023 13:11:46 +0200 Subject: [PATCH 67/95] specify label --- web/frontend/src/Analysis.root.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/frontend/src/Analysis.root.svelte b/web/frontend/src/Analysis.root.svelte index c6e4575..f60b2b9 100644 --- a/web/frontend/src/Analysis.root.svelte +++ b/web/frontend/src/Analysis.root.svelte @@ -163,7 +163,7 @@ {#key $statsQuery.data.topUsers} b.count - a.count).map((tu) => tu.count)} entities={$statsQuery.data.topUsers.sort((a, b) => b.count - a.count).map((tu) => tu.name)} /> From a7dd3fbc0b531ce73311d2fe937321672e79d333 Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Thu, 24 Aug 2023 14:26:23 +0200 Subject: [PATCH 68/95] fix bug in stats AddJobCount --- internal/repository/stats.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/internal/repository/stats.go b/internal/repository/stats.go index 8a74008..ee48ee1 100644 --- a/internal/repository/stats.go +++ b/internal/repository/stats.go @@ -321,7 +321,7 @@ func (r *JobRepository) AddJobCount( return nil, err } - counts := make(map[string]int) + var count int for rows.Next() { var cnt sql.NullInt64 @@ -329,20 +329,22 @@ func (r *JobRepository) AddJobCount( log.Warn("Error while scanning rows") return nil, err } + + count = int(cnt.Int64) } switch kind { case "running": for _, s := range stats { - s.RunningJobs = counts[s.ID] + s.RunningJobs = count } case "short": for _, s := range stats { - s.ShortJobs = counts[s.ID] + s.ShortJobs = count } } - log.Debugf("Timer JobJobCount %s", time.Since(start)) + log.Debugf("Timer AddJobCount %s", time.Since(start)) return stats, nil } From 3b8bcf7b32374857568be7128629001ef192ee76 Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Thu, 24 Aug 2023 14:51:26 +0200 Subject: [PATCH 69/95] Remove obsolete jobsCount resolver --- api/schema.graphqls | 1 - internal/graph/generated/generated.go | 193 +------------------------- internal/graph/schema.resolvers.go | 18 --- internal/repository/job.go | 69 --------- 4 files changed, 1 insertion(+), 280 deletions(-) diff --git a/api/schema.graphqls b/api/schema.graphqls index bd5d7db..7f427af 100644 --- a/api/schema.graphqls +++ b/api/schema.graphqls @@ -199,7 +199,6 @@ type Query { jobs(filter: [JobFilter!], page: PageRequest, order: OrderByInput): JobResultList! jobsStatistics(filter: [JobFilter!], groupBy: Aggregate): [JobsStatistics!]! - jobsCount(filter: [JobFilter]!, groupBy: Aggregate!, weight: Weights, limit: Int): [Count!]! rooflineHeatmap(filter: [JobFilter!]!, rows: Int!, cols: Int!, minX: Float!, minY: Float!, maxX: Float!, maxY: Float!): [[Float!]!]! diff --git a/internal/graph/generated/generated.go b/internal/graph/generated/generated.go index 278e8f2..7544148 100644 --- a/internal/graph/generated/generated.go +++ b/internal/graph/generated/generated.go @@ -202,7 +202,6 @@ type ComplexityRoot struct { Job func(childComplexity int, id string) int JobMetrics func(childComplexity int, id string, metrics []string, scopes []schema.MetricScope) int Jobs func(childComplexity int, filter []*model.JobFilter, page *model.PageRequest, order *model.OrderByInput) int - JobsCount func(childComplexity int, filter []*model.JobFilter, groupBy model.Aggregate, weight *model.Weights, limit *int) int JobsFootprints func(childComplexity int, filter []*model.JobFilter, metrics []string) int JobsStatistics func(childComplexity int, filter []*model.JobFilter, groupBy *model.Aggregate) int NodeMetrics func(childComplexity int, cluster string, nodes []string, scopes []schema.MetricScope, metrics []string, from time.Time, to time.Time) int @@ -319,7 +318,6 @@ type QueryResolver interface { JobsFootprints(ctx context.Context, filter []*model.JobFilter, metrics []string) (*model.Footprints, error) Jobs(ctx context.Context, filter []*model.JobFilter, page *model.PageRequest, order *model.OrderByInput) (*model.JobResultList, error) JobsStatistics(ctx context.Context, filter []*model.JobFilter, groupBy *model.Aggregate) ([]*model.JobsStatistics, error) - JobsCount(ctx context.Context, filter []*model.JobFilter, groupBy model.Aggregate, weight *model.Weights, limit *int) ([]*model.Count, error) RooflineHeatmap(ctx context.Context, filter []*model.JobFilter, rows int, cols int, minX float64, minY float64, maxX float64, maxY float64) ([][]float64, error) NodeMetrics(ctx context.Context, cluster string, nodes []string, scopes []schema.MetricScope, metrics []string, from time.Time, to time.Time) ([]*model.NodeMetrics, error) } @@ -1052,18 +1050,6 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.Query.Jobs(childComplexity, args["filter"].([]*model.JobFilter), args["page"].(*model.PageRequest), args["order"].(*model.OrderByInput)), true - case "Query.jobsCount": - if e.complexity.Query.JobsCount == nil { - break - } - - args, err := ec.field_Query_jobsCount_args(context.TODO(), rawArgs) - if err != nil { - return 0, false - } - - return e.complexity.Query.JobsCount(childComplexity, args["filter"].([]*model.JobFilter), args["groupBy"].(model.Aggregate), args["weight"].(*model.Weights), args["limit"].(*int)), true - case "Query.jobsFootprints": if e.complexity.Query.JobsFootprints == nil { break @@ -1773,7 +1759,6 @@ type Query { jobs(filter: [JobFilter!], page: PageRequest, order: OrderByInput): JobResultList! jobsStatistics(filter: [JobFilter!], groupBy: Aggregate): [JobsStatistics!]! - jobsCount(filter: [JobFilter]!, groupBy: Aggregate!, weight: Weights, limit: Int): [Count!]! rooflineHeatmap(filter: [JobFilter!]!, rows: Int!, cols: Int!, minX: Float!, minY: Float!, maxX: Float!, maxY: Float!): [[Float!]!]! @@ -1869,7 +1854,7 @@ type JobsStatistics { shortJobs: Int! # Number of jobs with a duration of less than duration totalWalltime: Int! # Sum of the duration of all matched jobs in hours totalNodeHours: Int! # Sum of the node hours of all matched jobs - totalCoreHours: Int! # Sum of the core hours of all matched jobs <-- Das nehmen statt totaljobs in hsitograms mit totaljobs + bei analysis metric histos weighted + totalCoreHours: Int! # Sum of the core hours of all matched jobs totalAccHours: Int! # Sum of the gpu hours of all matched jobs histDuration: [HistoPoint!]! # value: hour, count: number of jobs with a rounded duration of value histNumNodes: [HistoPoint!]! # value: number of nodes, count: number of jobs with that number of nodes @@ -2076,48 +2061,6 @@ func (ec *executionContext) field_Query_job_args(ctx context.Context, rawArgs ma return args, nil } -func (ec *executionContext) field_Query_jobsCount_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { - var err error - args := map[string]interface{}{} - var arg0 []*model.JobFilter - if tmp, ok := rawArgs["filter"]; ok { - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("filter")) - arg0, err = ec.unmarshalNJobFilter2ᚕᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐJobFilter(ctx, tmp) - if err != nil { - return nil, err - } - } - args["filter"] = arg0 - var arg1 model.Aggregate - if tmp, ok := rawArgs["groupBy"]; ok { - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("groupBy")) - arg1, err = ec.unmarshalNAggregate2githubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐAggregate(ctx, tmp) - if err != nil { - return nil, err - } - } - args["groupBy"] = arg1 - var arg2 *model.Weights - if tmp, ok := rawArgs["weight"]; ok { - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("weight")) - arg2, err = ec.unmarshalOWeights2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐWeights(ctx, tmp) - if err != nil { - return nil, err - } - } - args["weight"] = arg2 - var arg3 *int - if tmp, ok := rawArgs["limit"]; ok { - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("limit")) - arg3, err = ec.unmarshalOInt2ᚖint(ctx, tmp) - if err != nil { - return nil, err - } - } - args["limit"] = arg3 - return args, nil -} - func (ec *executionContext) field_Query_jobsFootprints_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { var err error args := map[string]interface{}{} @@ -7201,67 +7144,6 @@ func (ec *executionContext) fieldContext_Query_jobsStatistics(ctx context.Contex return fc, nil } -func (ec *executionContext) _Query_jobsCount(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Query_jobsCount(ctx, field) - if err != nil { - return graphql.Null - } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return ec.resolvers.Query().JobsCount(rctx, fc.Args["filter"].([]*model.JobFilter), fc.Args["groupBy"].(model.Aggregate), fc.Args["weight"].(*model.Weights), fc.Args["limit"].(*int)) - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.([]*model.Count) - fc.Result = res - return ec.marshalNCount2ᚕᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐCountᚄ(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext_Query_jobsCount(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Query", - Field: field, - IsMethod: true, - IsResolver: true, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "name": - return ec.fieldContext_Count_name(ctx, field) - case "count": - return ec.fieldContext_Count_count(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Count", field.Name) - }, - } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Query_jobsCount_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } - return fc, nil -} - func (ec *executionContext) _Query_rooflineHeatmap(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { fc, err := ec.fieldContext_Query_rooflineHeatmap(ctx, field) if err != nil { @@ -13269,28 +13151,6 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) - case "jobsCount": - field := field - - innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - } - }() - res = ec._Query_jobsCount(ctx, field) - if res == graphql.Null { - atomic.AddUint32(&fs.Invalids, 1) - } - return res - } - - rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, - func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) - } - out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "rooflineHeatmap": field := field @@ -14292,16 +14152,6 @@ func (ec *executionContext) marshalNAccelerator2ᚖgithubᚗcomᚋClusterCockpit return ec._Accelerator(ctx, sel, v) } -func (ec *executionContext) unmarshalNAggregate2githubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐAggregate(ctx context.Context, v interface{}) (model.Aggregate, error) { - var res model.Aggregate - err := res.UnmarshalGQL(v) - return res, graphql.ErrorOnPath(ctx, err) -} - -func (ec *executionContext) marshalNAggregate2githubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐAggregate(ctx context.Context, sel ast.SelectionSet, v model.Aggregate) graphql.Marshaler { - return v -} - func (ec *executionContext) unmarshalNBoolean2bool(ctx context.Context, v interface{}) (bool, error) { res, err := graphql.UnmarshalBoolean(v) return res, graphql.ErrorOnPath(ctx, err) @@ -14804,23 +14654,6 @@ func (ec *executionContext) marshalNJob2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑ return ec._Job(ctx, sel, v) } -func (ec *executionContext) unmarshalNJobFilter2ᚕᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐJobFilter(ctx context.Context, v interface{}) ([]*model.JobFilter, error) { - var vSlice []interface{} - if v != nil { - vSlice = graphql.CoerceList(v) - } - var err error - res := make([]*model.JobFilter, len(vSlice)) - for i := range vSlice { - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i)) - res[i], err = ec.unmarshalOJobFilter2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐJobFilter(ctx, vSlice[i]) - if err != nil { - return nil, err - } - } - return res, nil -} - func (ec *executionContext) unmarshalNJobFilter2ᚕᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐJobFilterᚄ(ctx context.Context, v interface{}) ([]*model.JobFilter, error) { var vSlice []interface{} if v != nil { @@ -16157,14 +15990,6 @@ func (ec *executionContext) unmarshalOJobFilter2ᚕᚖgithubᚗcomᚋClusterCock return res, nil } -func (ec *executionContext) unmarshalOJobFilter2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐJobFilter(ctx context.Context, v interface{}) (*model.JobFilter, error) { - if v == nil { - return nil, nil - } - res, err := ec.unmarshalInputJobFilter(ctx, v) - return &res, graphql.ErrorOnPath(ctx, err) -} - func (ec *executionContext) marshalOJobLinkResultList2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐJobLinkResultList(ctx context.Context, sel ast.SelectionSet, v *model.JobLinkResultList) graphql.Marshaler { if v == nil { return graphql.Null @@ -16429,22 +16254,6 @@ func (ec *executionContext) marshalOUser2ᚖgithubᚗcomᚋClusterCockpitᚋcc return ec._User(ctx, sel, v) } -func (ec *executionContext) unmarshalOWeights2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐWeights(ctx context.Context, v interface{}) (*model.Weights, error) { - if v == nil { - return nil, nil - } - var res = new(model.Weights) - err := res.UnmarshalGQL(v) - return res, graphql.ErrorOnPath(ctx, err) -} - -func (ec *executionContext) marshalOWeights2ᚖgithubᚗcomᚋClusterCockpitᚋccᚑbackendᚋinternalᚋgraphᚋmodelᚐWeights(ctx context.Context, sel ast.SelectionSet, v *model.Weights) graphql.Marshaler { - if v == nil { - return graphql.Null - } - return v -} - func (ec *executionContext) marshalO__EnumValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐEnumValueᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.EnumValue) graphql.Marshaler { if v == nil { return graphql.Null diff --git a/internal/graph/schema.resolvers.go b/internal/graph/schema.resolvers.go index 8d34fb3..a19ed8b 100644 --- a/internal/graph/schema.resolvers.go +++ b/internal/graph/schema.resolvers.go @@ -294,24 +294,6 @@ func (r *queryResolver) JobsStatistics(ctx context.Context, filter []*model.JobF return stats, nil } -// JobsCount is the resolver for the jobsCount field. -func (r *queryResolver) JobsCount(ctx context.Context, filter []*model.JobFilter, groupBy model.Aggregate, weight *model.Weights, limit *int) ([]*model.Count, error) { - counts, err := r.Repo.CountGroupedJobs(ctx, groupBy, filter, weight, limit) - if err != nil { - log.Warn("Error while counting grouped jobs") - return nil, err - } - - res := make([]*model.Count, 0, len(counts)) - for name, count := range counts { - res = append(res, &model.Count{ - Name: name, - Count: count, - }) - } - return res, nil -} - // RooflineHeatmap is the resolver for the rooflineHeatmap field. func (r *queryResolver) RooflineHeatmap(ctx context.Context, filter []*model.JobFilter, rows int, cols int, minX float64, minY float64, maxX float64, maxY float64) ([][]float64, error) { return r.rooflineHeatmap(ctx, filter, rows, cols, minX, minY, maxX, maxY) diff --git a/internal/repository/job.go b/internal/repository/job.go index b14fd53..76834d1 100644 --- a/internal/repository/job.go +++ b/internal/repository/job.go @@ -455,75 +455,6 @@ func (r *JobRepository) DeleteJobById(id int64) error { return err } -// TODO: Use node hours instead: SELECT job.user, sum(job.num_nodes * (CASE WHEN job.job_state = "running" THEN CAST(strftime('%s', 'now') AS INTEGER) - job.start_time ELSE job.duration END)) as x FROM job GROUP BY user ORDER BY x DESC; -func (r *JobRepository) CountGroupedJobs( - ctx context.Context, - aggreg model.Aggregate, - filters []*model.JobFilter, - weight *model.Weights, - limit *int) (map[string]int, error) { - - start := time.Now() - if !aggreg.IsValid() { - return nil, errors.New("invalid aggregate") - } - - runner := (sq.BaseRunner)(r.stmtCache) - count := "count(*) as count" - if weight != nil { - switch *weight { - case model.WeightsNodeCount: - count = "sum(job.num_nodes) as count" - case model.WeightsNodeHours: - now := time.Now().Unix() - count = fmt.Sprintf(`sum(job.num_nodes * (CASE WHEN job.job_state = "running" THEN %d - job.start_time ELSE job.duration END)) as count`, now) - runner = r.DB - case model.WeightsCoreCount: - count = "sum(job.num_hwthreads) as count" - case model.WeightsCoreHours: - now := time.Now().Unix() - count = fmt.Sprintf(`sum(job.num_hwthreads * (CASE WHEN job.job_state = "running" THEN %d - job.start_time ELSE job.duration END)) as count`, now) - runner = r.DB - default: - log.Debugf("CountGroupedJobs() Weight %v unknown.", *weight) - } - } - - q, qerr := SecurityCheck(ctx, sq.Select("job."+string(aggreg), count).From("job").GroupBy("job."+string(aggreg)).OrderBy("count DESC")) - - if qerr != nil { - return nil, qerr - } - - for _, f := range filters { - q = BuildWhereClause(f, q) - } - if limit != nil { - q = q.Limit(uint64(*limit)) - } - - counts := map[string]int{} - rows, err := q.RunWith(runner).Query() - if err != nil { - log.Error("Error while running query") - return nil, err - } - - for rows.Next() { - var group string - var count int - if err := rows.Scan(&group, &count); err != nil { - log.Warn("Error while scanning rows") - return nil, err - } - - counts[group] = count - } - - log.Debugf("Timer CountGroupedJobs %s", time.Since(start)) - return counts, nil -} - func (r *JobRepository) UpdateMonitoringStatus(job int64, monitoringStatus int32) (err error) { stmt := sq.Update("job"). Set("monitoring_status", monitoringStatus). From 13d99a6ae0706a1493f9eca947249d87075d1cc0 Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Thu, 24 Aug 2023 14:55:49 +0200 Subject: [PATCH 70/95] Fix typo in Jobstats resolver --- internal/graph/schema.resolvers.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/internal/graph/schema.resolvers.go b/internal/graph/schema.resolvers.go index a19ed8b..f2a3c65 100644 --- a/internal/graph/schema.resolvers.go +++ b/internal/graph/schema.resolvers.go @@ -256,22 +256,21 @@ func (r *queryResolver) JobsStatistics(ctx context.Context, filter []*model.JobF } } else { stats = make([]*model.JobsStatistics, 0, 1) - stats = append(stats, - &model.JobsStatistics{}) + stats = append(stats, &model.JobsStatistics{}) } if groupBy != nil { if requireField(ctx, "shortJobs") { stats, err = r.Repo.AddJobCountGrouped(ctx, filter, groupBy, stats, "short") } - if requireField(ctx, "RunningJobs") { + if requireField(ctx, "runningJobs") { stats, err = r.Repo.AddJobCountGrouped(ctx, filter, groupBy, stats, "running") } } else { if requireField(ctx, "shortJobs") { stats, err = r.Repo.AddJobCount(ctx, filter, stats, "short") } - if requireField(ctx, "RunningJobs") { + if requireField(ctx, "runningJobs") { stats, err = r.Repo.AddJobCount(ctx, filter, stats, "running") } } From ba42f4efc0b1871630fb7b82fb85efdbe3f9ded8 Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Thu, 24 Aug 2023 16:20:52 +0200 Subject: [PATCH 71/95] del obsolete enum --- api/schema.graphqls | 1 - 1 file changed, 1 deletion(-) diff --git a/api/schema.graphqls b/api/schema.graphqls index 7f427af..081cab6 100644 --- a/api/schema.graphqls +++ b/api/schema.graphqls @@ -167,7 +167,6 @@ type TimeWeights { } enum Aggregate { USER, PROJECT, CLUSTER } -enum Weights { NODE_COUNT, NODE_HOURS, CORE_COUNT, CORE_HOURS } type NodeMetrics { host: String! From c84a0fb8c3953d4aa4d93448804e5af72e6875bf Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Thu, 24 Aug 2023 16:36:59 +0200 Subject: [PATCH 72/95] fix: push bootstrap to v5.3.1 and icons to v1.10.5 --- web/frontend/public/bootstrap-icons.css | 311 +++++++++++++++++- web/frontend/public/bootstrap.min.css | 7 +- web/frontend/public/bootstrap.min.css.map | 2 +- .../public/fonts/bootstrap-icons.woff | Bin 137124 -> 164360 bytes .../public/fonts/bootstrap-icons.woff2 | Bin 102536 -> 121340 bytes 5 files changed, 298 insertions(+), 22 deletions(-) diff --git a/web/frontend/public/bootstrap-icons.css b/web/frontend/public/bootstrap-icons.css index 5712315..8bda018 100644 --- a/web/frontend/public/bootstrap-icons.css +++ b/web/frontend/public/bootstrap-icons.css @@ -1,7 +1,14 @@ +/*! + * Bootstrap Icons v1.10.5 (https://icons.getbootstrap.com/) + * Copyright 2019-2023 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/icons/blob/main/LICENSE) + */ + @font-face { + font-display: block; font-family: "bootstrap-icons"; - src: url("./fonts/bootstrap-icons.woff2?524846017b983fc8ded9325d94ed40f3") format("woff2"), -url("./fonts/bootstrap-icons.woff?524846017b983fc8ded9325d94ed40f3") format("woff"); + src: url("./fonts/bootstrap-icons.woff2?1fa40e8900654d2863d011707b9fb6f2") format("woff2"), +url("./fonts/bootstrap-icons.woff?1fa40e8900654d2863d011707b9fb6f2") format("woff"); } .bi::before, @@ -440,7 +447,6 @@ url("./fonts/bootstrap-icons.woff?524846017b983fc8ded9325d94ed40f3") format("wof .bi-cloud-fog2::before { content: "\f2a2"; } .bi-cloud-hail-fill::before { content: "\f2a3"; } .bi-cloud-hail::before { content: "\f2a4"; } -.bi-cloud-haze-1::before { content: "\f2a5"; } .bi-cloud-haze-fill::before { content: "\f2a6"; } .bi-cloud-haze::before { content: "\f2a7"; } .bi-cloud-haze2-fill::before { content: "\f2a8"; } @@ -1436,21 +1442,16 @@ url("./fonts/bootstrap-icons.woff?524846017b983fc8ded9325d94ed40f3") format("wof .bi-dpad::before { content: "\f687"; } .bi-ear-fill::before { content: "\f688"; } .bi-ear::before { content: "\f689"; } -.bi-envelope-check-1::before { content: "\f68a"; } .bi-envelope-check-fill::before { content: "\f68b"; } .bi-envelope-check::before { content: "\f68c"; } -.bi-envelope-dash-1::before { content: "\f68d"; } .bi-envelope-dash-fill::before { content: "\f68e"; } .bi-envelope-dash::before { content: "\f68f"; } -.bi-envelope-exclamation-1::before { content: "\f690"; } .bi-envelope-exclamation-fill::before { content: "\f691"; } .bi-envelope-exclamation::before { content: "\f692"; } .bi-envelope-plus-fill::before { content: "\f693"; } .bi-envelope-plus::before { content: "\f694"; } -.bi-envelope-slash-1::before { content: "\f695"; } .bi-envelope-slash-fill::before { content: "\f696"; } .bi-envelope-slash::before { content: "\f697"; } -.bi-envelope-x-1::before { content: "\f698"; } .bi-envelope-x-fill::before { content: "\f699"; } .bi-envelope-x::before { content: "\f69a"; } .bi-explicit-fill::before { content: "\f69b"; } @@ -1460,8 +1461,6 @@ url("./fonts/bootstrap-icons.woff?524846017b983fc8ded9325d94ed40f3") format("wof .bi-list-columns-reverse::before { content: "\f69f"; } .bi-list-columns::before { content: "\f6a0"; } .bi-meta::before { content: "\f6a1"; } -.bi-mortorboard-fill::before { content: "\f6a2"; } -.bi-mortorboard::before { content: "\f6a3"; } .bi-nintendo-switch::before { content: "\f6a4"; } .bi-pc-display-horizontal::before { content: "\f6a5"; } .bi-pc-display::before { content: "\f6a6"; } @@ -1480,7 +1479,6 @@ url("./fonts/bootstrap-icons.woff?524846017b983fc8ded9325d94ed40f3") format("wof .bi-send-check::before { content: "\f6b3"; } .bi-send-dash-fill::before { content: "\f6b4"; } .bi-send-dash::before { content: "\f6b5"; } -.bi-send-exclamation-1::before { content: "\f6b6"; } .bi-send-exclamation-fill::before { content: "\f6b7"; } .bi-send-exclamation::before { content: "\f6b8"; } .bi-send-fill::before { content: "\f6b9"; } @@ -1492,7 +1490,6 @@ url("./fonts/bootstrap-icons.woff?524846017b983fc8ded9325d94ed40f3") format("wof .bi-send-x::before { content: "\f6bf"; } .bi-send::before { content: "\f6c0"; } .bi-steam::before { content: "\f6c1"; } -.bi-terminal-dash-1::before { content: "\f6c2"; } .bi-terminal-dash::before { content: "\f6c3"; } .bi-terminal-plus::before { content: "\f6c4"; } .bi-terminal-split::before { content: "\f6c5"; } @@ -1522,7 +1519,6 @@ url("./fonts/bootstrap-icons.woff?524846017b983fc8ded9325d94ed40f3") format("wof .bi-usb-symbol::before { content: "\f6dd"; } .bi-usb::before { content: "\f6de"; } .bi-boombox-fill::before { content: "\f6df"; } -.bi-displayport-1::before { content: "\f6e0"; } .bi-displayport::before { content: "\f6e1"; } .bi-gpu-card::before { content: "\f6e2"; } .bi-memory::before { content: "\f6e3"; } @@ -1535,8 +1531,6 @@ url("./fonts/bootstrap-icons.woff?524846017b983fc8ded9325d94ed40f3") format("wof .bi-pci-card::before { content: "\f6ea"; } .bi-router-fill::before { content: "\f6eb"; } .bi-router::before { content: "\f6ec"; } -.bi-ssd-fill::before { content: "\f6ed"; } -.bi-ssd::before { content: "\f6ee"; } .bi-thunderbolt-fill::before { content: "\f6ef"; } .bi-thunderbolt::before { content: "\f6f0"; } .bi-usb-drive-fill::before { content: "\f6f1"; } @@ -1643,7 +1637,6 @@ url("./fonts/bootstrap-icons.woff?524846017b983fc8ded9325d94ed40f3") format("wof .bi-filetype-pdf::before { content: "\f756"; } .bi-filetype-php::before { content: "\f757"; } .bi-filetype-png::before { content: "\f758"; } -.bi-filetype-ppt-1::before { content: "\f759"; } .bi-filetype-ppt::before { content: "\f75a"; } .bi-filetype-psd::before { content: "\f75b"; } .bi-filetype-py::before { content: "\f75c"; } @@ -1659,7 +1652,6 @@ url("./fonts/bootstrap-icons.woff?524846017b983fc8ded9325d94ed40f3") format("wof .bi-filetype-txt::before { content: "\f766"; } .bi-filetype-wav::before { content: "\f767"; } .bi-filetype-woff::before { content: "\f768"; } -.bi-filetype-xls-1::before { content: "\f769"; } .bi-filetype-xls::before { content: "\f76a"; } .bi-filetype-xml::before { content: "\f76b"; } .bi-filetype-yml::before { content: "\f76c"; } @@ -1702,3 +1694,288 @@ url("./fonts/bootstrap-icons.woff?524846017b983fc8ded9325d94ed40f3") format("wof .bi-filetype-json::before { content: "\f791"; } .bi-filetype-pptx::before { content: "\f792"; } .bi-filetype-xlsx::before { content: "\f793"; } +.bi-1-circle-fill::before { content: "\f796"; } +.bi-1-circle::before { content: "\f797"; } +.bi-1-square-fill::before { content: "\f798"; } +.bi-1-square::before { content: "\f799"; } +.bi-2-circle-fill::before { content: "\f79c"; } +.bi-2-circle::before { content: "\f79d"; } +.bi-2-square-fill::before { content: "\f79e"; } +.bi-2-square::before { content: "\f79f"; } +.bi-3-circle-fill::before { content: "\f7a2"; } +.bi-3-circle::before { content: "\f7a3"; } +.bi-3-square-fill::before { content: "\f7a4"; } +.bi-3-square::before { content: "\f7a5"; } +.bi-4-circle-fill::before { content: "\f7a8"; } +.bi-4-circle::before { content: "\f7a9"; } +.bi-4-square-fill::before { content: "\f7aa"; } +.bi-4-square::before { content: "\f7ab"; } +.bi-5-circle-fill::before { content: "\f7ae"; } +.bi-5-circle::before { content: "\f7af"; } +.bi-5-square-fill::before { content: "\f7b0"; } +.bi-5-square::before { content: "\f7b1"; } +.bi-6-circle-fill::before { content: "\f7b4"; } +.bi-6-circle::before { content: "\f7b5"; } +.bi-6-square-fill::before { content: "\f7b6"; } +.bi-6-square::before { content: "\f7b7"; } +.bi-7-circle-fill::before { content: "\f7ba"; } +.bi-7-circle::before { content: "\f7bb"; } +.bi-7-square-fill::before { content: "\f7bc"; } +.bi-7-square::before { content: "\f7bd"; } +.bi-8-circle-fill::before { content: "\f7c0"; } +.bi-8-circle::before { content: "\f7c1"; } +.bi-8-square-fill::before { content: "\f7c2"; } +.bi-8-square::before { content: "\f7c3"; } +.bi-9-circle-fill::before { content: "\f7c6"; } +.bi-9-circle::before { content: "\f7c7"; } +.bi-9-square-fill::before { content: "\f7c8"; } +.bi-9-square::before { content: "\f7c9"; } +.bi-airplane-engines-fill::before { content: "\f7ca"; } +.bi-airplane-engines::before { content: "\f7cb"; } +.bi-airplane-fill::before { content: "\f7cc"; } +.bi-airplane::before { content: "\f7cd"; } +.bi-alexa::before { content: "\f7ce"; } +.bi-alipay::before { content: "\f7cf"; } +.bi-android::before { content: "\f7d0"; } +.bi-android2::before { content: "\f7d1"; } +.bi-box-fill::before { content: "\f7d2"; } +.bi-box-seam-fill::before { content: "\f7d3"; } +.bi-browser-chrome::before { content: "\f7d4"; } +.bi-browser-edge::before { content: "\f7d5"; } +.bi-browser-firefox::before { content: "\f7d6"; } +.bi-browser-safari::before { content: "\f7d7"; } +.bi-c-circle-fill::before { content: "\f7da"; } +.bi-c-circle::before { content: "\f7db"; } +.bi-c-square-fill::before { content: "\f7dc"; } +.bi-c-square::before { content: "\f7dd"; } +.bi-capsule-pill::before { content: "\f7de"; } +.bi-capsule::before { content: "\f7df"; } +.bi-car-front-fill::before { content: "\f7e0"; } +.bi-car-front::before { content: "\f7e1"; } +.bi-cassette-fill::before { content: "\f7e2"; } +.bi-cassette::before { content: "\f7e3"; } +.bi-cc-circle-fill::before { content: "\f7e6"; } +.bi-cc-circle::before { content: "\f7e7"; } +.bi-cc-square-fill::before { content: "\f7e8"; } +.bi-cc-square::before { content: "\f7e9"; } +.bi-cup-hot-fill::before { content: "\f7ea"; } +.bi-cup-hot::before { content: "\f7eb"; } +.bi-currency-rupee::before { content: "\f7ec"; } +.bi-dropbox::before { content: "\f7ed"; } +.bi-escape::before { content: "\f7ee"; } +.bi-fast-forward-btn-fill::before { content: "\f7ef"; } +.bi-fast-forward-btn::before { content: "\f7f0"; } +.bi-fast-forward-circle-fill::before { content: "\f7f1"; } +.bi-fast-forward-circle::before { content: "\f7f2"; } +.bi-fast-forward-fill::before { content: "\f7f3"; } +.bi-fast-forward::before { content: "\f7f4"; } +.bi-filetype-sql::before { content: "\f7f5"; } +.bi-fire::before { content: "\f7f6"; } +.bi-google-play::before { content: "\f7f7"; } +.bi-h-circle-fill::before { content: "\f7fa"; } +.bi-h-circle::before { content: "\f7fb"; } +.bi-h-square-fill::before { content: "\f7fc"; } +.bi-h-square::before { content: "\f7fd"; } +.bi-indent::before { content: "\f7fe"; } +.bi-lungs-fill::before { content: "\f7ff"; } +.bi-lungs::before { content: "\f800"; } +.bi-microsoft-teams::before { content: "\f801"; } +.bi-p-circle-fill::before { content: "\f804"; } +.bi-p-circle::before { content: "\f805"; } +.bi-p-square-fill::before { content: "\f806"; } +.bi-p-square::before { content: "\f807"; } +.bi-pass-fill::before { content: "\f808"; } +.bi-pass::before { content: "\f809"; } +.bi-prescription::before { content: "\f80a"; } +.bi-prescription2::before { content: "\f80b"; } +.bi-r-circle-fill::before { content: "\f80e"; } +.bi-r-circle::before { content: "\f80f"; } +.bi-r-square-fill::before { content: "\f810"; } +.bi-r-square::before { content: "\f811"; } +.bi-repeat-1::before { content: "\f812"; } +.bi-repeat::before { content: "\f813"; } +.bi-rewind-btn-fill::before { content: "\f814"; } +.bi-rewind-btn::before { content: "\f815"; } +.bi-rewind-circle-fill::before { content: "\f816"; } +.bi-rewind-circle::before { content: "\f817"; } +.bi-rewind-fill::before { content: "\f818"; } +.bi-rewind::before { content: "\f819"; } +.bi-train-freight-front-fill::before { content: "\f81a"; } +.bi-train-freight-front::before { content: "\f81b"; } +.bi-train-front-fill::before { content: "\f81c"; } +.bi-train-front::before { content: "\f81d"; } +.bi-train-lightrail-front-fill::before { content: "\f81e"; } +.bi-train-lightrail-front::before { content: "\f81f"; } +.bi-truck-front-fill::before { content: "\f820"; } +.bi-truck-front::before { content: "\f821"; } +.bi-ubuntu::before { content: "\f822"; } +.bi-unindent::before { content: "\f823"; } +.bi-unity::before { content: "\f824"; } +.bi-universal-access-circle::before { content: "\f825"; } +.bi-universal-access::before { content: "\f826"; } +.bi-virus::before { content: "\f827"; } +.bi-virus2::before { content: "\f828"; } +.bi-wechat::before { content: "\f829"; } +.bi-yelp::before { content: "\f82a"; } +.bi-sign-stop-fill::before { content: "\f82b"; } +.bi-sign-stop-lights-fill::before { content: "\f82c"; } +.bi-sign-stop-lights::before { content: "\f82d"; } +.bi-sign-stop::before { content: "\f82e"; } +.bi-sign-turn-left-fill::before { content: "\f82f"; } +.bi-sign-turn-left::before { content: "\f830"; } +.bi-sign-turn-right-fill::before { content: "\f831"; } +.bi-sign-turn-right::before { content: "\f832"; } +.bi-sign-turn-slight-left-fill::before { content: "\f833"; } +.bi-sign-turn-slight-left::before { content: "\f834"; } +.bi-sign-turn-slight-right-fill::before { content: "\f835"; } +.bi-sign-turn-slight-right::before { content: "\f836"; } +.bi-sign-yield-fill::before { content: "\f837"; } +.bi-sign-yield::before { content: "\f838"; } +.bi-ev-station-fill::before { content: "\f839"; } +.bi-ev-station::before { content: "\f83a"; } +.bi-fuel-pump-diesel-fill::before { content: "\f83b"; } +.bi-fuel-pump-diesel::before { content: "\f83c"; } +.bi-fuel-pump-fill::before { content: "\f83d"; } +.bi-fuel-pump::before { content: "\f83e"; } +.bi-0-circle-fill::before { content: "\f83f"; } +.bi-0-circle::before { content: "\f840"; } +.bi-0-square-fill::before { content: "\f841"; } +.bi-0-square::before { content: "\f842"; } +.bi-rocket-fill::before { content: "\f843"; } +.bi-rocket-takeoff-fill::before { content: "\f844"; } +.bi-rocket-takeoff::before { content: "\f845"; } +.bi-rocket::before { content: "\f846"; } +.bi-stripe::before { content: "\f847"; } +.bi-subscript::before { content: "\f848"; } +.bi-superscript::before { content: "\f849"; } +.bi-trello::before { content: "\f84a"; } +.bi-envelope-at-fill::before { content: "\f84b"; } +.bi-envelope-at::before { content: "\f84c"; } +.bi-regex::before { content: "\f84d"; } +.bi-text-wrap::before { content: "\f84e"; } +.bi-sign-dead-end-fill::before { content: "\f84f"; } +.bi-sign-dead-end::before { content: "\f850"; } +.bi-sign-do-not-enter-fill::before { content: "\f851"; } +.bi-sign-do-not-enter::before { content: "\f852"; } +.bi-sign-intersection-fill::before { content: "\f853"; } +.bi-sign-intersection-side-fill::before { content: "\f854"; } +.bi-sign-intersection-side::before { content: "\f855"; } +.bi-sign-intersection-t-fill::before { content: "\f856"; } +.bi-sign-intersection-t::before { content: "\f857"; } +.bi-sign-intersection-y-fill::before { content: "\f858"; } +.bi-sign-intersection-y::before { content: "\f859"; } +.bi-sign-intersection::before { content: "\f85a"; } +.bi-sign-merge-left-fill::before { content: "\f85b"; } +.bi-sign-merge-left::before { content: "\f85c"; } +.bi-sign-merge-right-fill::before { content: "\f85d"; } +.bi-sign-merge-right::before { content: "\f85e"; } +.bi-sign-no-left-turn-fill::before { content: "\f85f"; } +.bi-sign-no-left-turn::before { content: "\f860"; } +.bi-sign-no-parking-fill::before { content: "\f861"; } +.bi-sign-no-parking::before { content: "\f862"; } +.bi-sign-no-right-turn-fill::before { content: "\f863"; } +.bi-sign-no-right-turn::before { content: "\f864"; } +.bi-sign-railroad-fill::before { content: "\f865"; } +.bi-sign-railroad::before { content: "\f866"; } +.bi-building-add::before { content: "\f867"; } +.bi-building-check::before { content: "\f868"; } +.bi-building-dash::before { content: "\f869"; } +.bi-building-down::before { content: "\f86a"; } +.bi-building-exclamation::before { content: "\f86b"; } +.bi-building-fill-add::before { content: "\f86c"; } +.bi-building-fill-check::before { content: "\f86d"; } +.bi-building-fill-dash::before { content: "\f86e"; } +.bi-building-fill-down::before { content: "\f86f"; } +.bi-building-fill-exclamation::before { content: "\f870"; } +.bi-building-fill-gear::before { content: "\f871"; } +.bi-building-fill-lock::before { content: "\f872"; } +.bi-building-fill-slash::before { content: "\f873"; } +.bi-building-fill-up::before { content: "\f874"; } +.bi-building-fill-x::before { content: "\f875"; } +.bi-building-fill::before { content: "\f876"; } +.bi-building-gear::before { content: "\f877"; } +.bi-building-lock::before { content: "\f878"; } +.bi-building-slash::before { content: "\f879"; } +.bi-building-up::before { content: "\f87a"; } +.bi-building-x::before { content: "\f87b"; } +.bi-buildings-fill::before { content: "\f87c"; } +.bi-buildings::before { content: "\f87d"; } +.bi-bus-front-fill::before { content: "\f87e"; } +.bi-bus-front::before { content: "\f87f"; } +.bi-ev-front-fill::before { content: "\f880"; } +.bi-ev-front::before { content: "\f881"; } +.bi-globe-americas::before { content: "\f882"; } +.bi-globe-asia-australia::before { content: "\f883"; } +.bi-globe-central-south-asia::before { content: "\f884"; } +.bi-globe-europe-africa::before { content: "\f885"; } +.bi-house-add-fill::before { content: "\f886"; } +.bi-house-add::before { content: "\f887"; } +.bi-house-check-fill::before { content: "\f888"; } +.bi-house-check::before { content: "\f889"; } +.bi-house-dash-fill::before { content: "\f88a"; } +.bi-house-dash::before { content: "\f88b"; } +.bi-house-down-fill::before { content: "\f88c"; } +.bi-house-down::before { content: "\f88d"; } +.bi-house-exclamation-fill::before { content: "\f88e"; } +.bi-house-exclamation::before { content: "\f88f"; } +.bi-house-gear-fill::before { content: "\f890"; } +.bi-house-gear::before { content: "\f891"; } +.bi-house-lock-fill::before { content: "\f892"; } +.bi-house-lock::before { content: "\f893"; } +.bi-house-slash-fill::before { content: "\f894"; } +.bi-house-slash::before { content: "\f895"; } +.bi-house-up-fill::before { content: "\f896"; } +.bi-house-up::before { content: "\f897"; } +.bi-house-x-fill::before { content: "\f898"; } +.bi-house-x::before { content: "\f899"; } +.bi-person-add::before { content: "\f89a"; } +.bi-person-down::before { content: "\f89b"; } +.bi-person-exclamation::before { content: "\f89c"; } +.bi-person-fill-add::before { content: "\f89d"; } +.bi-person-fill-check::before { content: "\f89e"; } +.bi-person-fill-dash::before { content: "\f89f"; } +.bi-person-fill-down::before { content: "\f8a0"; } +.bi-person-fill-exclamation::before { content: "\f8a1"; } +.bi-person-fill-gear::before { content: "\f8a2"; } +.bi-person-fill-lock::before { content: "\f8a3"; } +.bi-person-fill-slash::before { content: "\f8a4"; } +.bi-person-fill-up::before { content: "\f8a5"; } +.bi-person-fill-x::before { content: "\f8a6"; } +.bi-person-gear::before { content: "\f8a7"; } +.bi-person-lock::before { content: "\f8a8"; } +.bi-person-slash::before { content: "\f8a9"; } +.bi-person-up::before { content: "\f8aa"; } +.bi-scooter::before { content: "\f8ab"; } +.bi-taxi-front-fill::before { content: "\f8ac"; } +.bi-taxi-front::before { content: "\f8ad"; } +.bi-amd::before { content: "\f8ae"; } +.bi-database-add::before { content: "\f8af"; } +.bi-database-check::before { content: "\f8b0"; } +.bi-database-dash::before { content: "\f8b1"; } +.bi-database-down::before { content: "\f8b2"; } +.bi-database-exclamation::before { content: "\f8b3"; } +.bi-database-fill-add::before { content: "\f8b4"; } +.bi-database-fill-check::before { content: "\f8b5"; } +.bi-database-fill-dash::before { content: "\f8b6"; } +.bi-database-fill-down::before { content: "\f8b7"; } +.bi-database-fill-exclamation::before { content: "\f8b8"; } +.bi-database-fill-gear::before { content: "\f8b9"; } +.bi-database-fill-lock::before { content: "\f8ba"; } +.bi-database-fill-slash::before { content: "\f8bb"; } +.bi-database-fill-up::before { content: "\f8bc"; } +.bi-database-fill-x::before { content: "\f8bd"; } +.bi-database-fill::before { content: "\f8be"; } +.bi-database-gear::before { content: "\f8bf"; } +.bi-database-lock::before { content: "\f8c0"; } +.bi-database-slash::before { content: "\f8c1"; } +.bi-database-up::before { content: "\f8c2"; } +.bi-database-x::before { content: "\f8c3"; } +.bi-database::before { content: "\f8c4"; } +.bi-houses-fill::before { content: "\f8c5"; } +.bi-houses::before { content: "\f8c6"; } +.bi-nvidia::before { content: "\f8c7"; } +.bi-person-vcard-fill::before { content: "\f8c8"; } +.bi-person-vcard::before { content: "\f8c9"; } +.bi-sina-weibo::before { content: "\f8ca"; } +.bi-tencent-qq::before { content: "\f8cb"; } +.bi-wikipedia::before { content: "\f8cc"; } diff --git a/web/frontend/public/bootstrap.min.css b/web/frontend/public/bootstrap.min.css index 1472dec..a89937c 100644 --- a/web/frontend/public/bootstrap.min.css +++ b/web/frontend/public/bootstrap.min.css @@ -1,7 +1,6 @@ @charset "UTF-8";/*! - * Bootstrap v5.1.3 (https://getbootstrap.com/) - * Copyright 2011-2021 The Bootstrap Authors - * Copyright 2011-2021 Twitter, Inc. + * Bootstrap v5.3.1 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-body-color-rgb:33,37,41;--bs-body-bg-rgb:255,255,255;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-bg:#fff}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::-webkit-file-upload-button{font:inherit}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#6c757d}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{width:100%;padding-right:var(--bs-gutter-x,.75rem);padding-left:var(--bs-gutter-x,.75rem);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-bg:transparent;--bs-table-accent-bg:transparent;--bs-table-striped-color:#212529;--bs-table-striped-bg:rgba(0, 0, 0, 0.05);--bs-table-active-color:#212529;--bs-table-active-bg:rgba(0, 0, 0, 0.1);--bs-table-hover-color:#212529;--bs-table-hover-bg:rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;color:#212529;vertical-align:top;border-color:#dee2e6}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table>:not(:first-child){border-top:2px solid currentColor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg:var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover>*{--bs-table-accent-bg:var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-bg:#cfe2ff;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:#000;border-color:#bacbe6}.table-secondary{--bs-table-bg:#e2e3e5;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:#000;border-color:#cbccce}.table-success{--bs-table-bg:#d1e7dd;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:#000;border-color:#bcd0c7}.table-info{--bs-table-bg:#cff4fc;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:#000;border-color:#badce3}.table-warning{--bs-table-bg:#fff3cd;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:#000;border-color:#e6dbb9}.table-danger{--bs-table-bg:#f8d7da;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:#000;border-color:#dfc2c4}.table-light{--bs-table-bg:#f8f9fa;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:#000;border-color:#dfe0e1}.table-dark{--bs-table-bg:#212529;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:#fff;border-color:#373b3e}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + 2px)}textarea.form-control-sm{min-height:calc(1.5em + .5rem + 2px)}textarea.form-control-lg{min-height:calc(1.5em + 1rem + 2px)}.form-control-color{width:3rem;height:auto;padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{height:1.5em;border-radius:.25rem}.form-control-color::-webkit-color-swatch{height:1.5em;border-radius:.25rem}.form-select{display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;-moz-padding-start:calc(0.75rem - 3px);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem;border-radius:.2rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:.3rem}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#0d6efd;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#0d6efd;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control{padding:1rem .75rem}.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus{z-index:3}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:3}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#198754}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(25,135,84,.9);border-radius:.25rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#198754;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:#198754}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:#198754}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:#198754}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#198754}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group .form-control.is-valid,.input-group .form-select.is-valid,.was-validated .input-group .form-control:valid,.was-validated .input-group .form-select:valid{z-index:1}.input-group .form-control.is-valid:focus,.input-group .form-select.is-valid:focus,.was-validated .input-group .form-control:valid:focus,.was-validated .input-group .form-select:valid:focus{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:#dc3545}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:#dc3545}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:#dc3545}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group .form-control.is-invalid,.input-group .form-select.is-invalid,.was-validated .input-group .form-control:invalid,.was-validated .input-group .form-select:invalid{z-index:2}.input-group .form-control.is-invalid:focus,.input-group .form-select.is-invalid:focus,.was-validated .input-group .form-control:invalid:focus,.was-validated .input-group .form-select:invalid:focus{z-index:3}.btn{display:inline-block;font-weight:400;line-height:1.5;color:#212529;text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529}.btn-check:focus+.btn,.btn:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{pointer-events:none;opacity:.65}.btn-primary{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-primary:hover{color:#fff;background-color:#0b5ed7;border-color:#0a58ca}.btn-check:focus+.btn-primary,.btn-primary:focus{color:#fff;background-color:#0b5ed7;border-color:#0a58ca;box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-check:active+.btn-primary,.btn-check:checked+.btn-primary,.btn-primary.active,.btn-primary:active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0a58ca;border-color:#0a53be}.btn-check:active+.btn-primary:focus,.btn-check:checked+.btn-primary:focus,.btn-primary.active:focus,.btn-primary:active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5c636a;border-color:#565e64}.btn-check:focus+.btn-secondary,.btn-secondary:focus{color:#fff;background-color:#5c636a;border-color:#565e64;box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-check:active+.btn-secondary,.btn-check:checked+.btn-secondary,.btn-secondary.active,.btn-secondary:active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#565e64;border-color:#51585e}.btn-check:active+.btn-secondary:focus,.btn-check:checked+.btn-secondary:focus,.btn-secondary.active:focus,.btn-secondary:active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-success{color:#fff;background-color:#198754;border-color:#198754}.btn-success:hover{color:#fff;background-color:#157347;border-color:#146c43}.btn-check:focus+.btn-success,.btn-success:focus{color:#fff;background-color:#157347;border-color:#146c43;box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-check:active+.btn-success,.btn-check:checked+.btn-success,.btn-success.active,.btn-success:active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#146c43;border-color:#13653f}.btn-check:active+.btn-success:focus,.btn-check:checked+.btn-success:focus,.btn-success.active:focus,.btn-success:active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#198754;border-color:#198754}.btn-info{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-info:hover{color:#000;background-color:#31d2f2;border-color:#25cff2}.btn-check:focus+.btn-info,.btn-info:focus{color:#000;background-color:#31d2f2;border-color:#25cff2;box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-check:active+.btn-info,.btn-check:checked+.btn-info,.btn-info.active,.btn-info:active,.show>.btn-info.dropdown-toggle{color:#000;background-color:#3dd5f3;border-color:#25cff2}.btn-check:active+.btn-info:focus,.btn-check:checked+.btn-info:focus,.btn-info.active:focus,.btn-info:active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-info.disabled,.btn-info:disabled{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-warning{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#000;background-color:#ffca2c;border-color:#ffc720}.btn-check:focus+.btn-warning,.btn-warning:focus{color:#000;background-color:#ffca2c;border-color:#ffc720;box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-check:active+.btn-warning,.btn-check:checked+.btn-warning,.btn-warning.active,.btn-warning:active,.show>.btn-warning.dropdown-toggle{color:#000;background-color:#ffcd39;border-color:#ffc720}.btn-check:active+.btn-warning:focus,.btn-check:checked+.btn-warning:focus,.btn-warning.active:focus,.btn-warning:active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.btn-check:focus+.btn-danger,.btn-danger:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-check:active+.btn-danger,.btn-check:checked+.btn-danger,.btn-danger.active,.btn-danger:active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#b02a37;border-color:#a52834}.btn-check:active+.btn-danger:focus,.btn-check:checked+.btn-danger:focus,.btn-danger.active:focus,.btn-danger:active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-light{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:focus+.btn-light,.btn-light:focus{color:#000;background-color:#f9fafb;border-color:#f9fafb;box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-check:active+.btn-light,.btn-check:checked+.btn-light,.btn-light.active,.btn-light:active,.show>.btn-light.dropdown-toggle{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:active+.btn-light:focus,.btn-check:checked+.btn-light:focus,.btn-light.active:focus,.btn-light:active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-light.disabled,.btn-light:disabled{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-dark{color:#fff;background-color:#212529;border-color:#212529}.btn-dark:hover{color:#fff;background-color:#1c1f23;border-color:#1a1e21}.btn-check:focus+.btn-dark,.btn-dark:focus{color:#fff;background-color:#1c1f23;border-color:#1a1e21;box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-check:active+.btn-dark,.btn-check:checked+.btn-dark,.btn-dark.active,.btn-dark:active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1a1e21;border-color:#191c1f}.btn-check:active+.btn-dark:focus,.btn-check:checked+.btn-dark:focus,.btn-dark.active:focus,.btn-dark:active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#212529;border-color:#212529}.btn-outline-primary{color:#0d6efd;border-color:#0d6efd}.btn-outline-primary:hover{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:focus+.btn-outline-primary,.btn-outline-primary:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-check:active+.btn-outline-primary,.btn-check:checked+.btn-outline-primary,.btn-outline-primary.active,.btn-outline-primary.dropdown-toggle.show,.btn-outline-primary:active{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:active+.btn-outline-primary:focus,.btn-check:checked+.btn-outline-primary:focus,.btn-outline-primary.active:focus,.btn-outline-primary.dropdown-toggle.show:focus,.btn-outline-primary:active:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#0d6efd;background-color:transparent}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:focus+.btn-outline-secondary,.btn-outline-secondary:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-check:active+.btn-outline-secondary,.btn-check:checked+.btn-outline-secondary,.btn-outline-secondary.active,.btn-outline-secondary.dropdown-toggle.show,.btn-outline-secondary:active{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:active+.btn-outline-secondary:focus,.btn-check:checked+.btn-outline-secondary:focus,.btn-outline-secondary.active:focus,.btn-outline-secondary.dropdown-toggle.show:focus,.btn-outline-secondary:active:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-success{color:#198754;border-color:#198754}.btn-outline-success:hover{color:#fff;background-color:#198754;border-color:#198754}.btn-check:focus+.btn-outline-success,.btn-outline-success:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-check:active+.btn-outline-success,.btn-check:checked+.btn-outline-success,.btn-outline-success.active,.btn-outline-success.dropdown-toggle.show,.btn-outline-success:active{color:#fff;background-color:#198754;border-color:#198754}.btn-check:active+.btn-outline-success:focus,.btn-check:checked+.btn-outline-success:focus,.btn-outline-success.active:focus,.btn-outline-success.dropdown-toggle.show:focus,.btn-outline-success:active:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#198754;background-color:transparent}.btn-outline-info{color:#0dcaf0;border-color:#0dcaf0}.btn-outline-info:hover{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:focus+.btn-outline-info,.btn-outline-info:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-check:active+.btn-outline-info,.btn-check:checked+.btn-outline-info,.btn-outline-info.active,.btn-outline-info.dropdown-toggle.show,.btn-outline-info:active{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:active+.btn-outline-info:focus,.btn-check:checked+.btn-outline-info:focus,.btn-outline-info.active:focus,.btn-outline-info.dropdown-toggle.show:focus,.btn-outline-info:active:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#0dcaf0;background-color:transparent}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:focus+.btn-outline-warning,.btn-outline-warning:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-check:active+.btn-outline-warning,.btn-check:checked+.btn-outline-warning,.btn-outline-warning.active,.btn-outline-warning.dropdown-toggle.show,.btn-outline-warning:active{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:active+.btn-outline-warning:focus,.btn-check:checked+.btn-outline-warning:focus,.btn-outline-warning.active:focus,.btn-outline-warning.dropdown-toggle.show:focus,.btn-outline-warning:active:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:focus+.btn-outline-danger,.btn-outline-danger:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-check:active+.btn-outline-danger,.btn-check:checked+.btn-outline-danger,.btn-outline-danger.active,.btn-outline-danger.dropdown-toggle.show,.btn-outline-danger:active{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:active+.btn-outline-danger:focus,.btn-check:checked+.btn-outline-danger:focus,.btn-outline-danger.active:focus,.btn-outline-danger.dropdown-toggle.show:focus,.btn-outline-danger:active:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:focus+.btn-outline-light,.btn-outline-light:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-check:active+.btn-outline-light,.btn-check:checked+.btn-outline-light,.btn-outline-light.active,.btn-outline-light.dropdown-toggle.show,.btn-outline-light:active{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:active+.btn-outline-light:focus,.btn-check:checked+.btn-outline-light:focus,.btn-outline-light.active:focus,.btn-outline-light.dropdown-toggle.show:focus,.btn-outline-light:active:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-dark{color:#212529;border-color:#212529}.btn-outline-dark:hover{color:#fff;background-color:#212529;border-color:#212529}.btn-check:focus+.btn-outline-dark,.btn-outline-dark:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-check:active+.btn-outline-dark,.btn-check:checked+.btn-outline-dark,.btn-outline-dark.active,.btn-outline-dark.dropdown-toggle.show,.btn-outline-dark:active{color:#fff;background-color:#212529;border-color:#212529}.btn-check:active+.btn-outline-dark:focus,.btn-check:checked+.btn-outline-dark:focus,.btn-outline-dark.active:focus,.btn-outline-dark.dropdown-toggle.show:focus,.btn-outline-dark:active:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#212529;background-color:transparent}.btn-link{font-weight:400;color:#0d6efd;text-decoration:underline}.btn-link:hover{color:#0a58ca}.btn-link.disabled,.btn-link:disabled{color:#6c757d}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropend,.dropstart,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;z-index:1000;display:none;min-width:10rem;padding:.5rem 0;margin:0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:.125rem}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid rgba(0,0,0,.15)}.dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;font-weight:400;color:#212529;text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#1e2125;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#0d6efd}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1rem;color:#212529}.dropdown-menu-dark{color:#dee2e6;background-color:#343a40;border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item{color:#dee2e6}.dropdown-menu-dark .dropdown-item:focus,.dropdown-menu-dark .dropdown-item:hover{color:#fff;background-color:rgba(255,255,255,.15)}.dropdown-menu-dark .dropdown-item.active,.dropdown-menu-dark .dropdown-item:active{color:#fff;background-color:#0d6efd}.dropdown-menu-dark .dropdown-item.disabled,.dropdown-menu-dark .dropdown-item:disabled{color:#adb5bd}.dropdown-menu-dark .dropdown-divider{border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item-text{color:#dee2e6}.dropdown-menu-dark .dropdown-header{color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem;color:#0d6efd;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:#0a58ca}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background:0 0;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6;isolation:isolate}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:0 0;border:0;border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#0d6efd}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding-top:.5rem;padding-bottom:.5rem}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;text-decoration:none;white-space:nowrap}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem;transition:box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 .25rem}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas-header{display:none}.navbar-expand-sm .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-sm .offcanvas-bottom,.navbar-expand-sm .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas-header{display:none}.navbar-expand-md .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-md .offcanvas-bottom,.navbar-expand-md .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas-header{display:none}.navbar-expand-lg .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-lg .offcanvas-bottom,.navbar-expand-lg .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas-header{display:none}.navbar-expand-xl .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-xl .offcanvas-bottom,.navbar-expand-xl .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-xxl .offcanvas-bottom,.navbar-expand-xxl .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas-header{display:none}.navbar-expand .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand .offcanvas-bottom,.navbar-expand .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.55)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.55);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.55)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.55)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.55);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.55)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:1rem 1rem}.card-title{margin-bottom:.5rem}.card-subtitle{margin-top:-.25rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:1rem}.card-header{padding:.5rem 1rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.5rem 1rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.5rem;margin-bottom:-.5rem;margin-left:-.5rem;border-bottom:0}.card-header-pills{margin-right:-.5rem;margin-left:-.5rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-group>.card{margin-bottom:.75rem}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:1rem 1.25rem;font-size:1rem;color:#212529;text-align:left;background-color:#fff;border:0;border-radius:0;overflow-anchor:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:#0c63e4;background-color:#e7f1ff;box-shadow:inset 0 -1px 0 rgba(0,0,0,.125)}.accordion-button:not(.collapsed)::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");transform:rotate(-180deg)}.accordion-button::after{flex-shrink:0;width:1.25rem;height:1.25rem;margin-left:auto;content:"";background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:1.25rem;transition:transform .2s ease-in-out}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.accordion-header{margin-bottom:0}.accordion-item{background-color:#fff;border:1px solid rgba(0,0,0,.125)}.accordion-item:first-of-type{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.accordion-item:first-of-type .accordion-button{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-body{padding:1rem 1.25rem}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button{border-radius:0}.breadcrumb{display:flex;flex-wrap:wrap;padding:0 0;margin-bottom:1rem;list-style:none}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;color:#0d6efd;text-decoration:none;background-color:#fff;border:1px solid #dee2e6;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:#0a58ca;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;color:#0a58ca;background-color:#e9ecef;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item.active .page-link{z-index:3;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;background-color:#fff;border-color:#dee2e6}.page-link{padding:.375rem .75rem}.page-item:first-child .page-link{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{position:relative;padding:1rem 1rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{color:#084298;background-color:#cfe2ff;border-color:#b6d4fe}.alert-primary .alert-link{color:#06357a}.alert-secondary{color:#41464b;background-color:#e2e3e5;border-color:#d3d6d8}.alert-secondary .alert-link{color:#34383c}.alert-success{color:#0f5132;background-color:#d1e7dd;border-color:#badbcc}.alert-success .alert-link{color:#0c4128}.alert-info{color:#055160;background-color:#cff4fc;border-color:#b6effb}.alert-info .alert-link{color:#04414d}.alert-warning{color:#664d03;background-color:#fff3cd;border-color:#ffecb5}.alert-warning .alert-link{color:#523e02}.alert-danger{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}.alert-danger .alert-link{color:#6a1a21}.alert-light{color:#636464;background-color:#fefefe;border-color:#fdfdfe}.alert-light .alert-link{color:#4f5050}.alert-dark{color:#141619;background-color:#d3d3d4;border-color:#bcbebf}.alert-dark .alert-link{color:#101214}@-webkit-keyframes progress-bar-stripes{0%{background-position-x:1rem}}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#0d6efd;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:1s linear infinite progress-bar-stripes;animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>li::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.5rem 1rem;color:#212529;text-decoration:none;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#084298;background-color:#cfe2ff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#084298;background-color:#bacbe6}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#084298;border-color:#084298}.list-group-item-secondary{color:#41464b;background-color:#e2e3e5}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#41464b;background-color:#cbccce}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#41464b;border-color:#41464b}.list-group-item-success{color:#0f5132;background-color:#d1e7dd}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#0f5132;background-color:#bcd0c7}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}.list-group-item-info{color:#055160;background-color:#cff4fc}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#055160;background-color:#badce3}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#055160;border-color:#055160}.list-group-item-warning{color:#664d03;background-color:#fff3cd}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#664d03;background-color:#e6dbb9}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}.list-group-item-danger{color:#842029;background-color:#f8d7da}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#842029;background-color:#dfc2c4}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}.list-group-item-light{color:#636464;background-color:#fefefe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#636464;background-color:#e5e5e5}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#636464;border-color:#636464}.list-group-item-dark{color:#141619;background-color:#d3d3d4}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#141619;background-color:#bebebf}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#141619;border-color:#141619}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:.25rem;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25);opacity:1}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{width:350px;max-width:100%;font-size:.875rem;pointer-events:auto;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .5rem 1rem rgba(0,0,0,.15);border-radius:.25rem}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:.75rem}.toast-header{display:flex;align-items:center;padding:.5rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-header .btn-close{margin-right:-.375rem;margin-left:.75rem}.toast-body{padding:.75rem;word-wrap:break-word}.modal{position:fixed;top:0;left:0;z-index:1055;display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1050;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .btn-close{padding:.5rem .5rem;margin:-.5rem -.5rem -.5rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;flex-shrink:0;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{height:calc(100% - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}.modal-fullscreen .modal-footer{border-radius:0}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}.modal-fullscreen-sm-down .modal-footer{border-radius:0}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}.modal-fullscreen-md-down .modal-footer{border-radius:0}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}.modal-fullscreen-lg-down .modal-footer{border-radius:0}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}.modal-fullscreen-xl-down .modal-footer{border-radius:0}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}.modal-fullscreen-xxl-down .modal-footer{border-radius:0}}.tooltip{position:absolute;z-index:1080;display:block;margin:0;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[data-popper-placement^=right],.bs-tooltip-end{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[data-popper-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[data-popper-placement^=left],.bs-tooltip-start{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1070;display:block;max-width:276px;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f0f0f0}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;background-color:#f0f0f0;border-bottom:1px solid rgba(0,0,0,.2);border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:1rem 1rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}@-webkit-keyframes spinner-border{to{transform:rotate(360deg)}}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:.75s linear infinite spinner-border;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:.75s linear infinite spinner-grow;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.offcanvas{position:fixed;bottom:0;z-index:1045;display:flex;flex-direction:column;max-width:100%;visibility:hidden;background-color:#fff;background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:1rem 1rem}.offcanvas-header .btn-close{padding:.5rem .5rem;margin-top:-.5rem;margin-right:-.5rem;margin-bottom:-.5rem}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;padding:1rem 1rem;overflow-y:auto}.offcanvas-start{top:0;left:0;width:400px;border-right:1px solid rgba(0,0,0,.2);transform:translateX(-100%)}.offcanvas-end{top:0;right:0;width:400px;border-left:1px solid rgba(0,0,0,.2);transform:translateX(100%)}.offcanvas-top{top:0;right:0;left:0;height:30vh;max-height:100%;border-bottom:1px solid rgba(0,0,0,.2);transform:translateY(-100%)}.offcanvas-bottom{right:0;left:0;height:30vh;max-height:100%;border-top:1px solid rgba(0,0,0,.2);transform:translateY(100%)}.offcanvas.show{transform:none}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentColor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{-webkit-animation:placeholder-glow 2s ease-in-out infinite;animation:placeholder-glow 2s ease-in-out infinite}@-webkit-keyframes placeholder-glow{50%{opacity:.2}}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;-webkit-animation:placeholder-wave 2s linear infinite;animation:placeholder-wave 2s linear infinite}@-webkit-keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}@keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.link-primary{color:#0d6efd}.link-primary:focus,.link-primary:hover{color:#0a58ca}.link-secondary{color:#6c757d}.link-secondary:focus,.link-secondary:hover{color:#565e64}.link-success{color:#198754}.link-success:focus,.link-success:hover{color:#146c43}.link-info{color:#0dcaf0}.link-info:focus,.link-info:hover{color:#3dd5f3}.link-warning{color:#ffc107}.link-warning:focus,.link-warning:hover{color:#ffcd39}.link-danger{color:#dc3545}.link-danger:focus,.link-danger:hover{color:#b02a37}.link-light{color:#f8f9fa}.link-light:focus,.link-light:hover{color:#f9fafb}.link-dark{color:#212529}.link-dark:focus,.link-dark:hover{color:#1a1e21}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:75%}.ratio-16x9{--bs-aspect-ratio:56.25%}.ratio-21x9{--bs-aspect-ratio:42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:1px;min-height:1em;background-color:currentColor;opacity:.25}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:1px solid #dee2e6!important}.border-0{border:0!important}.border-top{border-top:1px solid #dee2e6!important}.border-top-0{border-top:0!important}.border-end{border-right:1px solid #dee2e6!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:1px solid #dee2e6!important}.border-start-0{border-left:0!important}.border-primary{border-color:#0d6efd!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#198754!important}.border-info{border-color:#0dcaf0!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#212529!important}.border-white{border-color:#fff!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-color-rgb),var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:#6c757d!important}.text-black-50{--bs-text-opacity:1;color:rgba(0,0,0,.5)!important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.5)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:0.25}.text-opacity-50{--bs-text-opacity:0.5}.text-opacity-75{--bs-text-opacity:0.75}.text-opacity-100{--bs-text-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-bg-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:transparent!important}.bg-opacity-10{--bs-bg-opacity:0.1}.bg-opacity-25{--bs-bg-opacity:0.25}.bg-opacity-50{--bs-bg-opacity:0.5}.bg-opacity-75{--bs-bg-opacity:0.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:.25rem!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:.2rem!important}.rounded-2{border-radius:.25rem!important}.rounded-3{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-end{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-start{border-bottom-left-radius:.25rem!important;border-top-left-radius:.25rem!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}} + */:root,[data-bs-theme=light]{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-primary-text-emphasis:#052c65;--bs-secondary-text-emphasis:#2b2f32;--bs-success-text-emphasis:#0a3622;--bs-info-text-emphasis:#055160;--bs-warning-text-emphasis:#664d03;--bs-danger-text-emphasis:#58151c;--bs-light-text-emphasis:#495057;--bs-dark-text-emphasis:#495057;--bs-primary-bg-subtle:#cfe2ff;--bs-secondary-bg-subtle:#e2e3e5;--bs-success-bg-subtle:#d1e7dd;--bs-info-bg-subtle:#cff4fc;--bs-warning-bg-subtle:#fff3cd;--bs-danger-bg-subtle:#f8d7da;--bs-light-bg-subtle:#fcfcfd;--bs-dark-bg-subtle:#ced4da;--bs-primary-border-subtle:#9ec5fe;--bs-secondary-border-subtle:#c4c8cb;--bs-success-border-subtle:#a3cfbb;--bs-info-border-subtle:#9eeaf9;--bs-warning-border-subtle:#ffe69c;--bs-danger-border-subtle:#f1aeb5;--bs-light-border-subtle:#e9ecef;--bs-dark-border-subtle:#adb5bd;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-color-rgb:33,37,41;--bs-body-bg:#fff;--bs-body-bg-rgb:255,255,255;--bs-emphasis-color:#000;--bs-emphasis-color-rgb:0,0,0;--bs-secondary-color:rgba(33, 37, 41, 0.75);--bs-secondary-color-rgb:33,37,41;--bs-secondary-bg:#e9ecef;--bs-secondary-bg-rgb:233,236,239;--bs-tertiary-color:rgba(33, 37, 41, 0.5);--bs-tertiary-color-rgb:33,37,41;--bs-tertiary-bg:#f8f9fa;--bs-tertiary-bg-rgb:248,249,250;--bs-heading-color:inherit;--bs-link-color:#0d6efd;--bs-link-color-rgb:13,110,253;--bs-link-decoration:underline;--bs-link-hover-color:#0a58ca;--bs-link-hover-color-rgb:10,88,202;--bs-code-color:#d63384;--bs-highlight-bg:#fff3cd;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-xxl:2rem;--bs-border-radius-2xl:var(--bs-border-radius-xxl);--bs-border-radius-pill:50rem;--bs-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg:0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset:inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width:0.25rem;--bs-focus-ring-opacity:0.25;--bs-focus-ring-color:rgba(13, 110, 253, 0.25);--bs-form-valid-color:#198754;--bs-form-valid-border-color:#198754;--bs-form-invalid-color:#dc3545;--bs-form-invalid-border-color:#dc3545}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color:#dee2e6;--bs-body-color-rgb:222,226,230;--bs-body-bg:#212529;--bs-body-bg-rgb:33,37,41;--bs-emphasis-color:#fff;--bs-emphasis-color-rgb:255,255,255;--bs-secondary-color:rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb:222,226,230;--bs-secondary-bg:#343a40;--bs-secondary-bg-rgb:52,58,64;--bs-tertiary-color:rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb:222,226,230;--bs-tertiary-bg:#2b3035;--bs-tertiary-bg-rgb:43,48,53;--bs-primary-text-emphasis:#6ea8fe;--bs-secondary-text-emphasis:#a7acb1;--bs-success-text-emphasis:#75b798;--bs-info-text-emphasis:#6edff6;--bs-warning-text-emphasis:#ffda6a;--bs-danger-text-emphasis:#ea868f;--bs-light-text-emphasis:#f8f9fa;--bs-dark-text-emphasis:#dee2e6;--bs-primary-bg-subtle:#031633;--bs-secondary-bg-subtle:#161719;--bs-success-bg-subtle:#051b11;--bs-info-bg-subtle:#032830;--bs-warning-bg-subtle:#332701;--bs-danger-bg-subtle:#2c0b0e;--bs-light-bg-subtle:#343a40;--bs-dark-bg-subtle:#1a1d20;--bs-primary-border-subtle:#084298;--bs-secondary-border-subtle:#41464b;--bs-success-border-subtle:#0f5132;--bs-info-border-subtle:#087990;--bs-warning-border-subtle:#997404;--bs-danger-border-subtle:#842029;--bs-light-border-subtle:#495057;--bs-dark-border-subtle:#343a40;--bs-heading-color:inherit;--bs-link-color:#6ea8fe;--bs-link-hover-color:#8bb9fe;--bs-link-color-rgb:110,168,254;--bs-link-hover-color-rgb:139,185,254;--bs-code-color:#e685b5;--bs-border-color:#495057;--bs-border-color-translucent:rgba(255, 255, 255, 0.15);--bs-form-valid-color:#75b798;--bs-form-valid-border-color:#75b798;--bs-form-invalid-color:#ea868f;--bs-form-invalid-border-color:#ea868f}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;border:0;border-top:var(--bs-border-width) solid;opacity:.25}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color)}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.1875em;background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,1));text-decoration:underline}a:hover{--bs-link-color-rgb:var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:var(--bs-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:.875em;color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-secondary-color);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:var(--bs-body-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:var(--bs-secondary-color)}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}:root{--bs-breakpoint-xs:0;--bs-breakpoint-sm:576px;--bs-breakpoint-md:768px;--bs-breakpoint-lg:992px;--bs-breakpoint-xl:1200px;--bs-breakpoint-xxl:1400px}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-color-type:initial;--bs-table-bg-type:initial;--bs-table-color-state:initial;--bs-table-bg-state:initial;--bs-table-color:var(--bs-body-color);--bs-table-bg:var(--bs-body-bg);--bs-table-border-color:var(--bs-border-color);--bs-table-accent-bg:transparent;--bs-table-striped-color:var(--bs-body-color);--bs-table-striped-bg:rgba(0, 0, 0, 0.05);--bs-table-active-color:var(--bs-body-color);--bs-table-active-bg:rgba(0, 0, 0, 0.1);--bs-table-hover-color:var(--bs-body-color);--bs-table-hover-bg:rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state,var(--bs-table-color-type,var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:var(--bs-border-width);box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state,var(--bs-table-bg-type,var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(var(--bs-border-width) * 2) solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:var(--bs-border-width) 0}.table-bordered>:not(caption)>*>*{border-width:0 var(--bs-border-width)}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(2n){--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.table-active{--bs-table-color-state:var(--bs-table-active-color);--bs-table-bg-state:var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state:var(--bs-table-hover-color);--bs-table-bg-state:var(--bs-table-hover-bg)}.table-primary{--bs-table-color:#000;--bs-table-bg:#cfe2ff;--bs-table-border-color:#bacbe6;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color:#000;--bs-table-bg:#e2e3e5;--bs-table-border-color:#cbccce;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color:#000;--bs-table-bg:#d1e7dd;--bs-table-border-color:#bcd0c7;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color:#000;--bs-table-bg:#cff4fc;--bs-table-border-color:#badce3;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color:#000;--bs-table-bg:#fff3cd;--bs-table-border-color:#e6dbb9;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color:#000;--bs-table-bg:#f8d7da;--bs-table-border-color:#dfc2c4;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color:#000;--bs-table-bg:#f8f9fa;--bs-table-border-color:#dfe0e1;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color:#fff;--bs-table-bg:#212529;--bs-table-border-color:#373b3e;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + var(--bs-border-width));padding-bottom:calc(.375rem + var(--bs-border-width));margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + var(--bs-border-width));padding-bottom:calc(.5rem + var(--bs-border-width));font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + var(--bs-border-width));padding-bottom:calc(.25rem + var(--bs-border-width));font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:var(--bs-secondary-color)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-body-bg);background-clip:padding-box;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:var(--bs-body-color);background-color:var(--bs-body-bg);border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::-moz-placeholder{color:var(--bs-secondary-color);opacity:1}.form-control::placeholder{color:var(--bs-secondary-color);opacity:1}.form-control:disabled{background-color:var(--bs-secondary-bg);opacity:1}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:var(--bs-secondary-bg)}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:var(--bs-secondary-bg)}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:var(--bs-body-color);background-color:transparent;border:solid transparent;border-width:var(--bs-border-width) 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2));padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2))}textarea.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-control-color{width:3rem;height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0!important;border-radius:var(--bs-border-radius)}.form-control-color::-webkit-color-swatch{border:0!important;border-radius:var(--bs-border-radius)}.form-control-color.form-control-sm{height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-body-bg);background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon,none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:var(--bs-secondary-bg)}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 var(--bs-body-color)}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-reverse{padding-right:1.5em;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:-1.5em;margin-left:0}.form-check-input{--bs-form-check-bg:var(--bs-body-bg);width:1em;height:1em;margin-top:.25em;vertical-align:top;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:var(--bs-border-width) solid var(--bs-border-color);-webkit-print-color-adjust:exact;color-adjust:exact;print-color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{cursor:default;opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;-webkit-appearance:none;appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-tertiary-bg);border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;-moz-appearance:none;appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-tertiary-bg);border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:var(--bs-secondary-color)}.form-range:disabled::-moz-range-thumb{background-color:var(--bs-secondary-color)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(var(--bs-border-width) * 2));min-height:calc(3.5rem + calc(var(--bs-border-width) * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:var(--bs-border-width) solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control-plaintext::-moz-placeholder,.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control-plaintext::placeholder,.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control-plaintext:not(:-moz-placeholder-shown),.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown),.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:-webkit-autofill,.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label,.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:not(:-moz-placeholder-shown)~label::after{position:absolute;inset:1rem 0.375rem;z-index:-1;height:1.5em;content:"";background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius)}.form-floating>.form-control-plaintext~label::after,.form-floating>.form-control:focus~label::after,.form-floating>.form-control:not(:placeholder-shown)~label::after,.form-floating>.form-select~label::after{position:absolute;inset:1rem 0.375rem;z-index:-1;height:1.5em;content:"";background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius)}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label{border-width:var(--bs-border-width) 0}.form-floating>.form-control:disabled~label,.form-floating>:disabled~label{color:#6c757d}.form-floating>.form-control:disabled~label::after,.form-floating>:disabled~label::after{background-color:var(--bs-secondary-bg)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-floating,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-floating:focus-within,.input-group>.form-select:focus{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);text-align:center;white-space:nowrap;background-color:var(--bs-tertiary-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius)}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select,.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select,.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(var(--bs-border-width) * -1);border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-valid-color)}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:var(--bs-success);border-radius:var(--bs-border-radius)}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:var(--bs-form-valid-border-color);padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:var(--bs-form-valid-border-color)}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.form-control-color.is-valid,.was-validated .form-control-color:valid{width:calc(3rem + calc(1.5em + .75rem))}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:var(--bs-form-valid-border-color)}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:var(--bs-form-valid-color)}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:var(--bs-form-valid-color)}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-valid,.input-group>.form-floating:not(:focus-within).is-valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-control:not(:focus):valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.was-validated .input-group>.form-select:not(:focus):valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-invalid-color)}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:var(--bs-danger);border-radius:var(--bs-border-radius)}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:var(--bs-form-invalid-border-color);padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:var(--bs-form-invalid-border-color)}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.form-control-color.is-invalid,.was-validated .form-control-color:invalid{width:calc(3rem + calc(1.5em + .75rem))}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:var(--bs-form-invalid-border-color)}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:var(--bs-form-invalid-color)}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:var(--bs-form-invalid-color)}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-invalid,.input-group>.form-floating:not(:focus-within).is-invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-control:not(:focus):invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.was-validated .input-group>.form-select:not(:focus):invalid{z-index:4}.btn{--bs-btn-padding-x:0.75rem;--bs-btn-padding-y:0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight:400;--bs-btn-line-height:1.5;--bs-btn-color:var(--bs-body-color);--bs-btn-bg:transparent;--bs-btn-border-width:var(--bs-border-width);--bs-btn-border-color:transparent;--bs-btn-border-radius:var(--bs-border-radius);--bs-btn-hover-border-color:transparent;--bs-btn-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.15),0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity:0.65;--bs-btn-focus-box-shadow:0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,.btn.active,.btn.show,.btn:first-child:active,:not(.btn-check)+.btn:active{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible,.btn:first-child:active:focus-visible,:not(.btn-check)+.btn:active:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0b5ed7;--bs-btn-hover-border-color:#0a58ca;--bs-btn-focus-shadow-rgb:49,132,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0a58ca;--bs-btn-active-border-color:#0a53be;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#0d6efd;--bs-btn-disabled-border-color:#0d6efd}.btn-secondary{--bs-btn-color:#fff;--bs-btn-bg:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#5c636a;--bs-btn-hover-border-color:#565e64;--bs-btn-focus-shadow-rgb:130,138,145;--bs-btn-active-color:#fff;--bs-btn-active-bg:#565e64;--bs-btn-active-border-color:#51585e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#6c757d;--bs-btn-disabled-border-color:#6c757d}.btn-success{--bs-btn-color:#fff;--bs-btn-bg:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#157347;--bs-btn-hover-border-color:#146c43;--bs-btn-focus-shadow-rgb:60,153,110;--bs-btn-active-color:#fff;--bs-btn-active-bg:#146c43;--bs-btn-active-border-color:#13653f;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#198754;--bs-btn-disabled-border-color:#198754}.btn-info{--bs-btn-color:#000;--bs-btn-bg:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#31d2f2;--bs-btn-hover-border-color:#25cff2;--bs-btn-focus-shadow-rgb:11,172,204;--bs-btn-active-color:#000;--bs-btn-active-bg:#3dd5f3;--bs-btn-active-border-color:#25cff2;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#0dcaf0;--bs-btn-disabled-border-color:#0dcaf0}.btn-warning{--bs-btn-color:#000;--bs-btn-bg:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffca2c;--bs-btn-hover-border-color:#ffc720;--bs-btn-focus-shadow-rgb:217,164,6;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffcd39;--bs-btn-active-border-color:#ffc720;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#ffc107;--bs-btn-disabled-border-color:#ffc107}.btn-danger{--bs-btn-color:#fff;--bs-btn-bg:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#bb2d3b;--bs-btn-hover-border-color:#b02a37;--bs-btn-focus-shadow-rgb:225,83,97;--bs-btn-active-color:#fff;--bs-btn-active-bg:#b02a37;--bs-btn-active-border-color:#a52834;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#dc3545;--bs-btn-disabled-border-color:#dc3545}.btn-light{--bs-btn-color:#000;--bs-btn-bg:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#d3d4d5;--bs-btn-hover-border-color:#c6c7c8;--bs-btn-focus-shadow-rgb:211,212,213;--bs-btn-active-color:#000;--bs-btn-active-bg:#c6c7c8;--bs-btn-active-border-color:#babbbc;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#f8f9fa;--bs-btn-disabled-border-color:#f8f9fa}.btn-dark{--bs-btn-color:#fff;--bs-btn-bg:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#424649;--bs-btn-hover-border-color:#373b3e;--bs-btn-focus-shadow-rgb:66,70,73;--bs-btn-active-color:#fff;--bs-btn-active-bg:#4d5154;--bs-btn-active-border-color:#373b3e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#212529;--bs-btn-disabled-border-color:#212529}.btn-outline-primary{--bs-btn-color:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0d6efd;--bs-btn-hover-border-color:#0d6efd;--bs-btn-focus-shadow-rgb:13,110,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0d6efd;--bs-btn-active-border-color:#0d6efd;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#0d6efd;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0d6efd;--bs-gradient:none}.btn-outline-secondary{--bs-btn-color:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#6c757d;--bs-btn-hover-border-color:#6c757d;--bs-btn-focus-shadow-rgb:108,117,125;--bs-btn-active-color:#fff;--bs-btn-active-bg:#6c757d;--bs-btn-active-border-color:#6c757d;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#6c757d;--bs-gradient:none}.btn-outline-success{--bs-btn-color:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#198754;--bs-btn-hover-border-color:#198754;--bs-btn-focus-shadow-rgb:25,135,84;--bs-btn-active-color:#fff;--bs-btn-active-bg:#198754;--bs-btn-active-border-color:#198754;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#198754;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#198754;--bs-gradient:none}.btn-outline-info{--bs-btn-color:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#0dcaf0;--bs-btn-hover-border-color:#0dcaf0;--bs-btn-focus-shadow-rgb:13,202,240;--bs-btn-active-color:#000;--bs-btn-active-bg:#0dcaf0;--bs-btn-active-border-color:#0dcaf0;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#0dcaf0;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0dcaf0;--bs-gradient:none}.btn-outline-warning{--bs-btn-color:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffc107;--bs-btn-hover-border-color:#ffc107;--bs-btn-focus-shadow-rgb:255,193,7;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffc107;--bs-btn-active-border-color:#ffc107;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#ffc107;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#ffc107;--bs-gradient:none}.btn-outline-danger{--bs-btn-color:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#dc3545;--bs-btn-hover-border-color:#dc3545;--bs-btn-focus-shadow-rgb:220,53,69;--bs-btn-active-color:#fff;--bs-btn-active-bg:#dc3545;--bs-btn-active-border-color:#dc3545;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#dc3545;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#dc3545;--bs-gradient:none}.btn-outline-light{--bs-btn-color:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#f8f9fa;--bs-btn-hover-border-color:#f8f9fa;--bs-btn-focus-shadow-rgb:248,249,250;--bs-btn-active-color:#000;--bs-btn-active-bg:#f8f9fa;--bs-btn-active-border-color:#f8f9fa;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#f8f9fa;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#f8f9fa;--bs-gradient:none}.btn-outline-dark{--bs-btn-color:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#212529;--bs-btn-hover-border-color:#212529;--bs-btn-focus-shadow-rgb:33,37,41;--bs-btn-active-color:#fff;--bs-btn-active-bg:#212529;--bs-btn-active-border-color:#212529;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#212529;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#212529;--bs-gradient:none}.btn-link{--bs-btn-font-weight:400;--bs-btn-color:var(--bs-link-color);--bs-btn-bg:transparent;--bs-btn-border-color:transparent;--bs-btn-hover-color:var(--bs-link-hover-color);--bs-btn-hover-border-color:transparent;--bs-btn-active-color:var(--bs-link-hover-color);--bs-btn-active-border-color:transparent;--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-border-color:transparent;--bs-btn-box-shadow:0 0 0 #000;--bs-btn-focus-shadow-rgb:49,132,253;text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-group-lg>.btn,.btn-lg{--bs-btn-padding-y:0.5rem;--bs-btn-padding-x:1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius:var(--bs-border-radius-lg)}.btn-group-sm>.btn,.btn-sm{--bs-btn-padding-y:0.25rem;--bs-btn-padding-x:0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius:var(--bs-border-radius-sm)}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropdown-center,.dropend,.dropstart,.dropup,.dropup-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex:1000;--bs-dropdown-min-width:10rem;--bs-dropdown-padding-x:0;--bs-dropdown-padding-y:0.5rem;--bs-dropdown-spacer:0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color:var(--bs-body-color);--bs-dropdown-bg:var(--bs-body-bg);--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-border-radius:var(--bs-border-radius);--bs-dropdown-border-width:var(--bs-border-width);--bs-dropdown-inner-border-radius:calc(var(--bs-border-radius) - var(--bs-border-width));--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-divider-margin-y:0.5rem;--bs-dropdown-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-dropdown-link-color:var(--bs-body-color);--bs-dropdown-link-hover-color:var(--bs-body-color);--bs-dropdown-link-hover-bg:var(--bs-tertiary-bg);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:var(--bs-tertiary-color);--bs-dropdown-item-padding-x:1rem;--bs-dropdown-item-padding-y:0.25rem;--bs-dropdown-header-color:#6c757d;--bs-dropdown-header-padding-x:1rem;--bs-dropdown-header-padding-y:0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0;border-radius:var(--bs-dropdown-item-border-radius,0)}.dropdown-item:focus,.dropdown-item:hover{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color:#dee2e6;--bs-dropdown-bg:#343a40;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color:#dee2e6;--bs-dropdown-link-hover-color:#fff;--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-link-hover-bg:rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-header-color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:var(--bs-border-radius)}.btn-group>.btn-group:not(:first-child),.btn-group>:not(.btn-check:first-child)+.btn{margin-left:calc(var(--bs-border-width) * -1)}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:calc(var(--bs-border-width) * -1)}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x:1rem;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-link-color);--bs-nav-link-hover-color:var(--bs-link-hover-color);--bs-nav-link-disabled-color:var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;background:0 0;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width:var(--bs-border-width);--bs-nav-tabs-border-color:var(--bs-border-color);--bs-nav-tabs-border-radius:var(--bs-border-radius);--bs-nav-tabs-link-hover-border-color:var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color);--bs-nav-tabs-link-active-color:var(--bs-emphasis-color);--bs-nav-tabs-link-active-bg:var(--bs-body-bg);--bs-nav-tabs-link-active-border-color:var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg);border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1 * var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid transparent;border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1 * var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius:var(--bs-border-radius);--bs-nav-pills-link-active-color:#fff;--bs-nav-pills-link-active-bg:#0d6efd}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap:1rem;--bs-nav-underline-border-width:0.125rem;--bs-nav-underline-link-active-color:var(--bs-emphasis-color);gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid transparent}.nav-underline .nav-link:focus,.nav-underline .nav-link:hover{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x:0;--bs-navbar-padding-y:0.5rem;--bs-navbar-color:rgba(var(--bs-emphasis-color-rgb), 0.65);--bs-navbar-hover-color:rgba(var(--bs-emphasis-color-rgb), 0.8);--bs-navbar-disabled-color:rgba(var(--bs-emphasis-color-rgb), 0.3);--bs-navbar-active-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-padding-y:0.3125rem;--bs-navbar-brand-margin-end:1rem;--bs-navbar-brand-font-size:1.25rem;--bs-navbar-brand-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-hover-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-nav-link-padding-x:0.5rem;--bs-navbar-toggler-padding-y:0.25rem;--bs-navbar-toggler-padding-x:0.75rem;--bs-navbar-toggler-font-size:1.25rem;--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color:rgba(var(--bs-emphasis-color-rgb), 0.15);--bs-navbar-toggler-border-radius:var(--bs-border-radius);--bs-navbar-toggler-focus-width:0.25rem;--bs-navbar-toggler-transition:box-shadow 0.15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x:0;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-navbar-color);--bs-nav-link-hover-color:var(--bs-navbar-hover-color);--bs-nav-link-disabled-color:var(--bs-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:focus,.navbar-text a:hover{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:transparent;border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color:rgba(255, 255, 255, 0.55);--bs-navbar-hover-color:rgba(255, 255, 255, 0.75);--bs-navbar-disabled-color:rgba(255, 255, 255, 0.25);--bs-navbar-active-color:#fff;--bs-navbar-brand-color:#fff;--bs-navbar-brand-hover-color:#fff;--bs-navbar-toggler-border-color:rgba(255, 255, 255, 0.1);--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y:1rem;--bs-card-spacer-x:1rem;--bs-card-title-spacer-y:0.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width:var(--bs-border-width);--bs-card-border-color:var(--bs-border-color-translucent);--bs-card-border-radius:var(--bs-border-radius);--bs-card-box-shadow: ;--bs-card-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-card-cap-padding-y:0.5rem;--bs-card-cap-padding-x:1rem;--bs-card-cap-bg:rgba(var(--bs-body-color-rgb), 0.03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg:var(--bs-body-bg);--bs-card-img-overlay-padding:1rem;--bs-card-group-margin:0.75rem;position:relative;display:flex;flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-.5 * var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-bottom:calc(-1 * var(--bs-card-cap-padding-y));margin-left:calc(-.5 * var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-left:calc(-.5 * var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion{--bs-accordion-color:var(--bs-body-color);--bs-accordion-bg:var(--bs-body-bg);--bs-accordion-transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out,border-radius 0.15s ease;--bs-accordion-border-color:var(--bs-border-color);--bs-accordion-border-width:var(--bs-border-width);--bs-accordion-border-radius:var(--bs-border-radius);--bs-accordion-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-accordion-btn-padding-x:1.25rem;--bs-accordion-btn-padding-y:1rem;--bs-accordion-btn-color:var(--bs-body-color);--bs-accordion-btn-bg:var(--bs-accordion-bg);--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width:1.25rem;--bs-accordion-btn-icon-transform:rotate(-180deg);--bs-accordion-btn-icon-transition:transform 0.2s ease-in-out;--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23052c65'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-focus-border-color:#86b7fe;--bs-accordion-btn-focus-box-shadow:0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-accordion-body-padding-x:1.25rem;--bs-accordion-body-padding-y:1rem;--bs-accordion-active-color:var(--bs-primary-text-emphasis);--bs-accordion-active-bg:var(--bs-primary-bg-subtle)}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button,.accordion-flush .accordion-item .accordion-button.collapsed{border-radius:0}[data-bs-theme=dark] .accordion-button::after{--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x:0;--bs-breadcrumb-padding-y:0;--bs-breadcrumb-margin-bottom:1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color:var(--bs-secondary-color);--bs-breadcrumb-item-padding-x:0.5rem;--bs-breadcrumb-item-active-color:var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x:0.75rem;--bs-pagination-padding-y:0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color:var(--bs-link-color);--bs-pagination-bg:var(--bs-body-bg);--bs-pagination-border-width:var(--bs-border-width);--bs-pagination-border-color:var(--bs-border-color);--bs-pagination-border-radius:var(--bs-border-radius);--bs-pagination-hover-color:var(--bs-link-hover-color);--bs-pagination-hover-bg:var(--bs-tertiary-bg);--bs-pagination-hover-border-color:var(--bs-border-color);--bs-pagination-focus-color:var(--bs-link-hover-color);--bs-pagination-focus-bg:var(--bs-secondary-bg);--bs-pagination-focus-box-shadow:0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-pagination-active-color:#fff;--bs-pagination-active-bg:#0d6efd;--bs-pagination-active-border-color:#0d6efd;--bs-pagination-disabled-color:var(--bs-secondary-color);--bs-pagination-disabled-bg:var(--bs-secondary-bg);--bs-pagination-disabled-border-color:var(--bs-border-color);display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.active>.page-link,.page-link.active{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.disabled>.page-link,.page-link.disabled{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(var(--bs-border-width) * -1)}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x:1.5rem;--bs-pagination-padding-y:0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius:var(--bs-border-radius-lg)}.pagination-sm{--bs-pagination-padding-x:0.5rem;--bs-pagination-padding-y:0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius:var(--bs-border-radius-sm)}.badge{--bs-badge-padding-x:0.65em;--bs-badge-padding-y:0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight:700;--bs-badge-color:#fff;--bs-badge-border-radius:var(--bs-border-radius);display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg:transparent;--bs-alert-padding-x:1rem;--bs-alert-padding-y:1rem;--bs-alert-margin-bottom:1rem;--bs-alert-color:inherit;--bs-alert-border-color:transparent;--bs-alert-border:var(--bs-border-width) solid var(--bs-alert-border-color);--bs-alert-border-radius:var(--bs-border-radius);--bs-alert-link-color:inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{--bs-alert-color:var(--bs-primary-text-emphasis);--bs-alert-bg:var(--bs-primary-bg-subtle);--bs-alert-border-color:var(--bs-primary-border-subtle);--bs-alert-link-color:var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color:var(--bs-secondary-text-emphasis);--bs-alert-bg:var(--bs-secondary-bg-subtle);--bs-alert-border-color:var(--bs-secondary-border-subtle);--bs-alert-link-color:var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color:var(--bs-success-text-emphasis);--bs-alert-bg:var(--bs-success-bg-subtle);--bs-alert-border-color:var(--bs-success-border-subtle);--bs-alert-link-color:var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color:var(--bs-info-text-emphasis);--bs-alert-bg:var(--bs-info-bg-subtle);--bs-alert-border-color:var(--bs-info-border-subtle);--bs-alert-link-color:var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color:var(--bs-warning-text-emphasis);--bs-alert-bg:var(--bs-warning-bg-subtle);--bs-alert-border-color:var(--bs-warning-border-subtle);--bs-alert-link-color:var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color:var(--bs-danger-text-emphasis);--bs-alert-bg:var(--bs-danger-bg-subtle);--bs-alert-border-color:var(--bs-danger-border-subtle);--bs-alert-link-color:var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color:var(--bs-light-text-emphasis);--bs-alert-bg:var(--bs-light-bg-subtle);--bs-alert-border-color:var(--bs-light-border-subtle);--bs-alert-link-color:var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color:var(--bs-dark-text-emphasis);--bs-alert-bg:var(--bs-dark-bg-subtle);--bs-alert-border-color:var(--bs-dark-border-subtle);--bs-alert-link-color:var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress,.progress-stacked{--bs-progress-height:1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg:var(--bs-secondary-bg);--bs-progress-border-radius:var(--bs-border-radius);--bs-progress-box-shadow:var(--bs-box-shadow-inset);--bs-progress-bar-color:#fff;--bs-progress-bar-bg:#0d6efd;--bs-progress-bar-transition:width 0.6s ease;display:flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color:var(--bs-body-color);--bs-list-group-bg:var(--bs-body-bg);--bs-list-group-border-color:var(--bs-border-color);--bs-list-group-border-width:var(--bs-border-width);--bs-list-group-border-radius:var(--bs-border-radius);--bs-list-group-item-padding-x:1rem;--bs-list-group-item-padding-y:0.5rem;--bs-list-group-action-color:var(--bs-secondary-color);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-tertiary-bg);--bs-list-group-action-active-color:var(--bs-body-color);--bs-list-group-action-active-bg:var(--bs-secondary-bg);--bs-list-group-disabled-color:var(--bs-secondary-color);--bs-list-group-disabled-bg:var(--bs-body-bg);--bs-list-group-active-color:#fff;--bs-list-group-active-bg:#0d6efd;--bs-list-group-active-border-color:#0d6efd;display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1 * var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{--bs-list-group-color:var(--bs-primary-text-emphasis);--bs-list-group-bg:var(--bs-primary-bg-subtle);--bs-list-group-border-color:var(--bs-primary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-primary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-primary-border-subtle);--bs-list-group-active-color:var(--bs-primary-bg-subtle);--bs-list-group-active-bg:var(--bs-primary-text-emphasis);--bs-list-group-active-border-color:var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color:var(--bs-secondary-text-emphasis);--bs-list-group-bg:var(--bs-secondary-bg-subtle);--bs-list-group-border-color:var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-secondary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-secondary-border-subtle);--bs-list-group-active-color:var(--bs-secondary-bg-subtle);--bs-list-group-active-bg:var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color:var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color:var(--bs-success-text-emphasis);--bs-list-group-bg:var(--bs-success-bg-subtle);--bs-list-group-border-color:var(--bs-success-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-success-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-success-border-subtle);--bs-list-group-active-color:var(--bs-success-bg-subtle);--bs-list-group-active-bg:var(--bs-success-text-emphasis);--bs-list-group-active-border-color:var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color:var(--bs-info-text-emphasis);--bs-list-group-bg:var(--bs-info-bg-subtle);--bs-list-group-border-color:var(--bs-info-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-info-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-info-border-subtle);--bs-list-group-active-color:var(--bs-info-bg-subtle);--bs-list-group-active-bg:var(--bs-info-text-emphasis);--bs-list-group-active-border-color:var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color:var(--bs-warning-text-emphasis);--bs-list-group-bg:var(--bs-warning-bg-subtle);--bs-list-group-border-color:var(--bs-warning-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-warning-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-warning-border-subtle);--bs-list-group-active-color:var(--bs-warning-bg-subtle);--bs-list-group-active-bg:var(--bs-warning-text-emphasis);--bs-list-group-active-border-color:var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color:var(--bs-danger-text-emphasis);--bs-list-group-bg:var(--bs-danger-bg-subtle);--bs-list-group-border-color:var(--bs-danger-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-danger-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-danger-border-subtle);--bs-list-group-active-color:var(--bs-danger-bg-subtle);--bs-list-group-active-bg:var(--bs-danger-text-emphasis);--bs-list-group-active-border-color:var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color:var(--bs-light-text-emphasis);--bs-list-group-bg:var(--bs-light-bg-subtle);--bs-list-group-border-color:var(--bs-light-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-light-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-light-border-subtle);--bs-list-group-active-color:var(--bs-light-bg-subtle);--bs-list-group-active-bg:var(--bs-light-text-emphasis);--bs-list-group-active-border-color:var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color:var(--bs-dark-text-emphasis);--bs-list-group-bg:var(--bs-dark-bg-subtle);--bs-list-group-border-color:var(--bs-dark-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-dark-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-dark-border-subtle);--bs-list-group-active-color:var(--bs-dark-bg-subtle);--bs-list-group-active-bg:var(--bs-dark-text-emphasis);--bs-list-group-active-border-color:var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color:#000;--bs-btn-close-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity:0.5;--bs-btn-close-hover-opacity:0.75;--bs-btn-close-focus-shadow:0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-btn-close-focus-opacity:1;--bs-btn-close-disabled-opacity:0.25;--bs-btn-close-white-filter:invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:var(--bs-btn-close-color);background:transparent var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;border-radius:.375rem;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{filter:var(--bs-btn-close-white-filter)}[data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex:1090;--bs-toast-padding-x:0.75rem;--bs-toast-padding-y:0.5rem;--bs-toast-spacing:1.5rem;--bs-toast-max-width:350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg:rgba(var(--bs-body-bg-rgb), 0.85);--bs-toast-border-width:var(--bs-border-width);--bs-toast-border-color:var(--bs-border-color-translucent);--bs-toast-border-radius:var(--bs-border-radius);--bs-toast-box-shadow:var(--bs-box-shadow);--bs-toast-header-color:var(--bs-secondary-color);--bs-toast-header-bg:rgba(var(--bs-body-bg-rgb), 0.85);--bs-toast-header-border-color:var(--bs-border-color-translucent);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex:1090;position:absolute;z-index:var(--bs-toast-zindex);width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(-.5 * var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex:1055;--bs-modal-width:500px;--bs-modal-padding:1rem;--bs-modal-margin:0.5rem;--bs-modal-color: ;--bs-modal-bg:var(--bs-body-bg);--bs-modal-border-color:var(--bs-border-color-translucent);--bs-modal-border-width:var(--bs-border-width);--bs-modal-border-radius:var(--bs-border-radius-lg);--bs-modal-box-shadow:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-modal-inner-border-radius:calc(var(--bs-border-radius-lg) - (var(--bs-border-width)));--bs-modal-header-padding-x:1rem;--bs-modal-header-padding-y:1rem;--bs-modal-header-padding:1rem 1rem;--bs-modal-header-border-color:var(--bs-border-color);--bs-modal-header-border-width:var(--bs-border-width);--bs-modal-title-line-height:1.5;--bs-modal-footer-gap:0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color:var(--bs-border-color);--bs-modal-footer-border-width:var(--bs-border-width);position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin) * 2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - var(--bs-modal-margin) * 2)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex:1050;--bs-backdrop-bg:#000;--bs-backdrop-opacity:0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y) * .5) calc(var(--bs-modal-header-padding-x) * .5);margin:calc(-.5 * var(--bs-modal-header-padding-y)) calc(-.5 * var(--bs-modal-header-padding-x)) calc(-.5 * var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;flex-shrink:0;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * .5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap) * .5)}@media (min-width:576px){.modal{--bs-modal-margin:1.75rem;--bs-modal-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{--bs-modal-width:800px}}@media (min-width:1200px){.modal-xl{--bs-modal-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-footer,.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-footer,.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-footer,.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-footer,.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-footer,.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-footer,.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex:1080;--bs-tooltip-max-width:200px;--bs-tooltip-padding-x:0.5rem;--bs-tooltip-padding-y:0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color:var(--bs-body-bg);--bs-tooltip-bg:var(--bs-emphasis-color);--bs-tooltip-border-radius:var(--bs-border-radius);--bs-tooltip-opacity:0.9;--bs-tooltip-arrow-width:0.8rem;--bs-tooltip-arrow-height:0.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex:1070;--bs-popover-max-width:276px;--bs-popover-font-size:0.875rem;--bs-popover-bg:var(--bs-body-bg);--bs-popover-border-width:var(--bs-border-width);--bs-popover-border-color:var(--bs-border-color-translucent);--bs-popover-border-radius:var(--bs-border-radius-lg);--bs-popover-inner-border-radius:calc(var(--bs-border-radius-lg) - var(--bs-border-width));--bs-popover-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-popover-header-padding-x:1rem;--bs-popover-header-padding-y:0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color:inherit;--bs-popover-header-bg:var(--bs-secondary-bg);--bs-popover-body-padding-x:1rem;--bs-popover-body-padding-y:1rem;--bs-popover-body-color:var(--bs-body-color);--bs-popover-arrow-width:1rem;--bs-popover-arrow-height:0.5rem;--bs-popover-arrow-border:var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid;border-width:0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-top>.popover-arrow::before{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-end>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::before{border-width:0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-.5 * var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-start>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) 0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon{filter:invert(1) grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-border,.spinner-grow{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-border-width:0.25em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:transparent}.spinner-border-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem;--bs-spinner-border-width:0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed:1.5s}}.offcanvas,.offcanvas-lg,.offcanvas-md,.offcanvas-sm,.offcanvas-xl,.offcanvas-xxl{--bs-offcanvas-zindex:1045;--bs-offcanvas-width:400px;--bs-offcanvas-height:30vh;--bs-offcanvas-padding-x:1rem;--bs-offcanvas-padding-y:1rem;--bs-offcanvas-color:var(--bs-body-color);--bs-offcanvas-bg:var(--bs-body-bg);--bs-offcanvas-border-width:var(--bs-border-width);--bs-offcanvas-border-color:var(--bs-border-color-translucent);--bs-offcanvas-box-shadow:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-offcanvas-transition:transform 0.3s ease-in-out;--bs-offcanvas-title-line-height:1.5}@media (max-width:575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:575.98px) and (prefers-reduced-motion:reduce){.offcanvas-sm{transition:none}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.show:not(.hiding),.offcanvas-sm.showing{transform:none}.offcanvas-sm.hiding,.offcanvas-sm.show,.offcanvas-sm.showing{visibility:visible}}@media (min-width:576px){.offcanvas-sm{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:767.98px) and (prefers-reduced-motion:reduce){.offcanvas-md{transition:none}}@media (max-width:767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.show:not(.hiding),.offcanvas-md.showing{transform:none}.offcanvas-md.hiding,.offcanvas-md.show,.offcanvas-md.showing{visibility:visible}}@media (min-width:768px){.offcanvas-md{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:991.98px) and (prefers-reduced-motion:reduce){.offcanvas-lg{transition:none}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.show:not(.hiding),.offcanvas-lg.showing{transform:none}.offcanvas-lg.hiding,.offcanvas-lg.show,.offcanvas-lg.showing{visibility:visible}}@media (min-width:992px){.offcanvas-lg{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:1199.98px) and (prefers-reduced-motion:reduce){.offcanvas-xl{transition:none}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.show:not(.hiding),.offcanvas-xl.showing{transform:none}.offcanvas-xl.hiding,.offcanvas-xl.show,.offcanvas-xl.showing{visibility:visible}}@media (min-width:1200px){.offcanvas-xl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:1399.98px) and (prefers-reduced-motion:reduce){.offcanvas-xxl{transition:none}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.show:not(.hiding),.offcanvas-xxl.showing{transform:none}.offcanvas-xxl.hiding,.offcanvas-xxl.show,.offcanvas-xxl.showing{visibility:visible}}@media (min-width:1400px){.offcanvas-xxl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.show:not(.hiding),.offcanvas.showing{transform:none}.offcanvas.hiding,.offcanvas.show,.offcanvas.showing{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y) * .5) calc(var(--bs-offcanvas-padding-x) * .5);margin-top:calc(-.5 * var(--bs-offcanvas-padding-y));margin-right:calc(-.5 * var(--bs-offcanvas-padding-x));margin-bottom:calc(-.5 * var(--bs-offcanvas-padding-y))}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-primary{color:#fff!important;background-color:RGBA(var(--bs-primary-rgb),var(--bs-bg-opacity,1))!important}.text-bg-secondary{color:#fff!important;background-color:RGBA(var(--bs-secondary-rgb),var(--bs-bg-opacity,1))!important}.text-bg-success{color:#fff!important;background-color:RGBA(var(--bs-success-rgb),var(--bs-bg-opacity,1))!important}.text-bg-info{color:#000!important;background-color:RGBA(var(--bs-info-rgb),var(--bs-bg-opacity,1))!important}.text-bg-warning{color:#000!important;background-color:RGBA(var(--bs-warning-rgb),var(--bs-bg-opacity,1))!important}.text-bg-danger{color:#fff!important;background-color:RGBA(var(--bs-danger-rgb),var(--bs-bg-opacity,1))!important}.text-bg-light{color:#000!important;background-color:RGBA(var(--bs-light-rgb),var(--bs-bg-opacity,1))!important}.text-bg-dark{color:#fff!important;background-color:RGBA(var(--bs-dark-rgb),var(--bs-bg-opacity,1))!important}.link-primary{color:RGBA(var(--bs-primary-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important}.link-primary:focus,.link-primary:hover{color:RGBA(10,88,202,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(10,88,202,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(10,88,202,var(--bs-link-underline-opacity,1))!important}.link-secondary{color:RGBA(var(--bs-secondary-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important}.link-secondary:focus,.link-secondary:hover{color:RGBA(86,94,100,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(86,94,100,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(86,94,100,var(--bs-link-underline-opacity,1))!important}.link-success{color:RGBA(var(--bs-success-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important}.link-success:focus,.link-success:hover{color:RGBA(20,108,67,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(20,108,67,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(20,108,67,var(--bs-link-underline-opacity,1))!important}.link-info{color:RGBA(var(--bs-info-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important}.link-info:focus,.link-info:hover{color:RGBA(61,213,243,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(61,213,243,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(61,213,243,var(--bs-link-underline-opacity,1))!important}.link-warning{color:RGBA(var(--bs-warning-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important}.link-warning:focus,.link-warning:hover{color:RGBA(255,205,57,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(255,205,57,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(255,205,57,var(--bs-link-underline-opacity,1))!important}.link-danger{color:RGBA(var(--bs-danger-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important}.link-danger:focus,.link-danger:hover{color:RGBA(176,42,55,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(176,42,55,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(176,42,55,var(--bs-link-underline-opacity,1))!important}.link-light{color:RGBA(var(--bs-light-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important}.link-light:focus,.link-light:hover{color:RGBA(249,250,251,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(249,250,251,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(249,250,251,var(--bs-link-underline-opacity,1))!important}.link-dark{color:RGBA(var(--bs-dark-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important}.link-dark:focus,.link-dark:hover{color:RGBA(26,30,33,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(26,30,33,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(26,30,33,var(--bs-link-underline-opacity,1))!important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1))!important}.link-body-emphasis:focus,.link-body-emphasis:hover{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,.75))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,0.75))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,0.75))!important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x,0) var(--bs-focus-ring-y,0) var(--bs-focus-ring-blur,0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,0.5));text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,0.5));text-underline-offset:0.25em;-webkit-backface-visibility:hidden;backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media (prefers-reduced-motion:reduce){.icon-link>.bi{transition:none}}.icon-link-hover:focus-visible>.bi,.icon-link-hover:hover>.bi{transform:var(--bs-icon-link-transform,translate3d(.25em,0,0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:75%}.ratio-16x9{--bs-aspect-ratio:56.25%}.ratio-21x9{--bs-aspect-ratio:42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption),.visually-hidden:not(caption){position:absolute!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:var(--bs-border-width);min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.object-fit-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-none{-o-object-fit:none!important;object-fit:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.overflow-x-auto{overflow-x:auto!important}.overflow-x-hidden{overflow-x:hidden!important}.overflow-x-visible{overflow-x:visible!important}.overflow-x-scroll{overflow-x:scroll!important}.overflow-y-auto{overflow-y:auto!important}.overflow-y-hidden{overflow-y:hidden!important}.overflow-y-visible{overflow-y:visible!important}.overflow-y-scroll{overflow-y:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-inline-grid{display:inline-grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.focus-ring-primary{--bs-focus-ring-color:rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color:rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color:rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color:rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color:rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color:rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color:rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color:rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-0{border:0!important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-top-0{border-top:0!important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-start-0{border-left:0!important}.border-primary{--bs-border-opacity:1;border-color:rgba(var(--bs-primary-rgb),var(--bs-border-opacity))!important}.border-secondary{--bs-border-opacity:1;border-color:rgba(var(--bs-secondary-rgb),var(--bs-border-opacity))!important}.border-success{--bs-border-opacity:1;border-color:rgba(var(--bs-success-rgb),var(--bs-border-opacity))!important}.border-info{--bs-border-opacity:1;border-color:rgba(var(--bs-info-rgb),var(--bs-border-opacity))!important}.border-warning{--bs-border-opacity:1;border-color:rgba(var(--bs-warning-rgb),var(--bs-border-opacity))!important}.border-danger{--bs-border-opacity:1;border-color:rgba(var(--bs-danger-rgb),var(--bs-border-opacity))!important}.border-light{--bs-border-opacity:1;border-color:rgba(var(--bs-light-rgb),var(--bs-border-opacity))!important}.border-dark{--bs-border-opacity:1;border-color:rgba(var(--bs-dark-rgb),var(--bs-border-opacity))!important}.border-black{--bs-border-opacity:1;border-color:rgba(var(--bs-black-rgb),var(--bs-border-opacity))!important}.border-white{--bs-border-opacity:1;border-color:rgba(var(--bs-white-rgb),var(--bs-border-opacity))!important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle)!important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle)!important}.border-success-subtle{border-color:var(--bs-success-border-subtle)!important}.border-info-subtle{border-color:var(--bs-info-border-subtle)!important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle)!important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle)!important}.border-light-subtle{border-color:var(--bs-light-border-subtle)!important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle)!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.border-opacity-10{--bs-border-opacity:0.1}.border-opacity-25{--bs-border-opacity:0.25}.border-opacity-50{--bs-border-opacity:0.5}.border-opacity-75{--bs-border-opacity:0.75}.border-opacity-100{--bs-border-opacity:1}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.row-gap-0{row-gap:0!important}.row-gap-1{row-gap:.25rem!important}.row-gap-2{row-gap:.5rem!important}.row-gap-3{row-gap:1rem!important}.row-gap-4{row-gap:1.5rem!important}.row-gap-5{row-gap:3rem!important}.column-gap-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-lighter{font-weight:lighter!important}.fw-light{font-weight:300!important}.fw-normal{font-weight:400!important}.fw-medium{font-weight:500!important}.fw-semibold{font-weight:600!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-color-rgb),var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.text-black-50{--bs-text-opacity:1;color:rgba(0,0,0,.5)!important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.5)!important}.text-body-secondary{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.text-body-tertiary{--bs-text-opacity:1;color:var(--bs-tertiary-color)!important}.text-body-emphasis{--bs-text-opacity:1;color:var(--bs-emphasis-color)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:0.25}.text-opacity-50{--bs-text-opacity:0.5}.text-opacity-75{--bs-text-opacity:0.75}.text-opacity-100{--bs-text-opacity:1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis)!important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis)!important}.text-success-emphasis{color:var(--bs-success-text-emphasis)!important}.text-info-emphasis{color:var(--bs-info-text-emphasis)!important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis)!important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis)!important}.text-light-emphasis{color:var(--bs-light-text-emphasis)!important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis)!important}.link-opacity-10{--bs-link-opacity:0.1}.link-opacity-10-hover:hover{--bs-link-opacity:0.1}.link-opacity-25{--bs-link-opacity:0.25}.link-opacity-25-hover:hover{--bs-link-opacity:0.25}.link-opacity-50{--bs-link-opacity:0.5}.link-opacity-50-hover:hover{--bs-link-opacity:0.5}.link-opacity-75{--bs-link-opacity:0.75}.link-opacity-75-hover:hover{--bs-link-opacity:0.75}.link-opacity-100{--bs-link-opacity:1}.link-opacity-100-hover:hover{--bs-link-opacity:1}.link-offset-1{text-underline-offset:0.125em!important}.link-offset-1-hover:hover{text-underline-offset:0.125em!important}.link-offset-2{text-underline-offset:0.25em!important}.link-offset-2-hover:hover{text-underline-offset:0.25em!important}.link-offset-3{text-underline-offset:0.375em!important}.link-offset-3-hover:hover{text-underline-offset:0.375em!important}.link-underline-primary{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-secondary{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-success{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important}.link-underline-info{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important}.link-underline-warning{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important}.link-underline-danger{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important}.link-underline-light{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important}.link-underline-dark{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important}.link-underline{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important}.link-underline-opacity-0{--bs-link-underline-opacity:0}.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity:0}.link-underline-opacity-10{--bs-link-underline-opacity:0.1}.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity:0.1}.link-underline-opacity-25{--bs-link-underline-opacity:0.25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity:0.25}.link-underline-opacity-50{--bs-link-underline-opacity:0.5}.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity:0.5}.link-underline-opacity-75{--bs-link-underline-opacity:0.75}.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity:0.75}.link-underline-opacity-100{--bs-link-underline-opacity:1}.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-bg-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:transparent!important}.bg-body-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-bg-rgb),var(--bs-bg-opacity))!important}.bg-body-tertiary{--bs-bg-opacity:1;background-color:rgba(var(--bs-tertiary-bg-rgb),var(--bs-bg-opacity))!important}.bg-opacity-10{--bs-bg-opacity:0.1}.bg-opacity-25{--bs-bg-opacity:0.25}.bg-opacity-50{--bs-bg-opacity:0.5}.bg-opacity-75{--bs-bg-opacity:0.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle)!important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle)!important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle)!important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle)!important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle)!important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle)!important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle)!important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle)!important}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:var(--bs-border-radius)!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:var(--bs-border-radius-sm)!important}.rounded-2{border-radius:var(--bs-border-radius)!important}.rounded-3{border-radius:var(--bs-border-radius-lg)!important}.rounded-4{border-radius:var(--bs-border-radius-xl)!important}.rounded-5{border-radius:var(--bs-border-radius-xxl)!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:var(--bs-border-radius-pill)!important}.rounded-top{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-0{border-top-left-radius:0!important;border-top-right-radius:0!important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm)!important;border-top-right-radius:var(--bs-border-radius-sm)!important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg)!important;border-top-right-radius:var(--bs-border-radius-lg)!important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl)!important;border-top-right-radius:var(--bs-border-radius-xl)!important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl)!important;border-top-right-radius:var(--bs-border-radius-xxl)!important}.rounded-top-circle{border-top-left-radius:50%!important;border-top-right-radius:50%!important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill)!important;border-top-right-radius:var(--bs-border-radius-pill)!important}.rounded-end{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-0{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm)!important;border-bottom-right-radius:var(--bs-border-radius-sm)!important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg)!important;border-bottom-right-radius:var(--bs-border-radius-lg)!important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl)!important;border-bottom-right-radius:var(--bs-border-radius-xl)!important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-right-radius:var(--bs-border-radius-xxl)!important}.rounded-end-circle{border-top-right-radius:50%!important;border-bottom-right-radius:50%!important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill)!important;border-bottom-right-radius:var(--bs-border-radius-pill)!important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-0{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm)!important;border-bottom-left-radius:var(--bs-border-radius-sm)!important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg)!important;border-bottom-left-radius:var(--bs-border-radius-lg)!important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl)!important;border-bottom-left-radius:var(--bs-border-radius-xl)!important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-left-radius:var(--bs-border-radius-xxl)!important}.rounded-bottom-circle{border-bottom-right-radius:50%!important;border-bottom-left-radius:50%!important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill)!important;border-bottom-left-radius:var(--bs-border-radius-pill)!important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-0{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm)!important;border-top-left-radius:var(--bs-border-radius-sm)!important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg)!important;border-top-left-radius:var(--bs-border-radius-lg)!important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl)!important;border-top-left-radius:var(--bs-border-radius-xl)!important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl)!important;border-top-left-radius:var(--bs-border-radius-xxl)!important}.rounded-start-circle{border-bottom-left-radius:50%!important;border-top-left-radius:50%!important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill)!important;border-top-left-radius:var(--bs-border-radius-pill)!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.z-n1{z-index:-1!important}.z-0{z-index:0!important}.z-1{z-index:1!important}.z-2{z-index:2!important}.z-3{z-index:3!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.object-fit-sm-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-sm-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-sm-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-sm-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-sm-none{-o-object-fit:none!important;object-fit:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-inline-grid{display:inline-grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.row-gap-sm-0{row-gap:0!important}.row-gap-sm-1{row-gap:.25rem!important}.row-gap-sm-2{row-gap:.5rem!important}.row-gap-sm-3{row-gap:1rem!important}.row-gap-sm-4{row-gap:1.5rem!important}.row-gap-sm-5{row-gap:3rem!important}.column-gap-sm-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-sm-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-sm-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-sm-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-sm-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-sm-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.object-fit-md-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-md-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-md-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-md-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-md-none{-o-object-fit:none!important;object-fit:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-inline-grid{display:inline-grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.row-gap-md-0{row-gap:0!important}.row-gap-md-1{row-gap:.25rem!important}.row-gap-md-2{row-gap:.5rem!important}.row-gap-md-3{row-gap:1rem!important}.row-gap-md-4{row-gap:1.5rem!important}.row-gap-md-5{row-gap:3rem!important}.column-gap-md-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-md-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-md-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-md-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-md-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-md-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.object-fit-lg-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-lg-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-lg-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-lg-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-lg-none{-o-object-fit:none!important;object-fit:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-inline-grid{display:inline-grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.row-gap-lg-0{row-gap:0!important}.row-gap-lg-1{row-gap:.25rem!important}.row-gap-lg-2{row-gap:.5rem!important}.row-gap-lg-3{row-gap:1rem!important}.row-gap-lg-4{row-gap:1.5rem!important}.row-gap-lg-5{row-gap:3rem!important}.column-gap-lg-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-lg-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-lg-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-lg-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-lg-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-lg-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.object-fit-xl-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-xl-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-xl-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-xl-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-xl-none{-o-object-fit:none!important;object-fit:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-inline-grid{display:inline-grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.row-gap-xl-0{row-gap:0!important}.row-gap-xl-1{row-gap:.25rem!important}.row-gap-xl-2{row-gap:.5rem!important}.row-gap-xl-3{row-gap:1rem!important}.row-gap-xl-4{row-gap:1.5rem!important}.row-gap-xl-5{row-gap:3rem!important}.column-gap-xl-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-xl-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-xl-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-xl-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-xl-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-xl-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.object-fit-xxl-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-xxl-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-xxl-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-xxl-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-xxl-none{-o-object-fit:none!important;object-fit:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-inline-grid{display:inline-grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.row-gap-xxl-0{row-gap:0!important}.row-gap-xxl-1{row-gap:.25rem!important}.row-gap-xxl-2{row-gap:.5rem!important}.row-gap-xxl-3{row-gap:1rem!important}.row-gap-xxl-4{row-gap:1.5rem!important}.row-gap-xxl-5{row-gap:3rem!important}.column-gap-xxl-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-xxl-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-xxl-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-xxl-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-xxl-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-xxl-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-inline-grid{display:inline-grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}} /*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/web/frontend/public/bootstrap.min.css.map b/web/frontend/public/bootstrap.min.css.map index c84afa4..816a51a 100644 --- a/web/frontend/public/bootstrap.min.css.map +++ b/web/frontend/public/bootstrap.min.css.map @@ -1 +1 @@ -{"version":3,"sources":["../../scss/bootstrap.scss","../../scss/_root.scss","../../scss/_reboot.scss","dist/css/bootstrap.css","../../scss/vendor/_rfs.scss","../../scss/mixins/_border-radius.scss","../../scss/_type.scss","../../scss/mixins/_lists.scss","../../scss/_images.scss","../../scss/mixins/_image.scss","../../scss/_containers.scss","../../scss/mixins/_container.scss","../../scss/mixins/_breakpoints.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/_tables.scss","../../scss/mixins/_table-variants.scss","../../scss/forms/_labels.scss","../../scss/forms/_form-text.scss","../../scss/forms/_form-control.scss","../../scss/mixins/_transition.scss","../../scss/mixins/_gradients.scss","../../scss/forms/_form-select.scss","../../scss/forms/_form-check.scss","../../scss/forms/_form-range.scss","../../scss/forms/_floating-labels.scss","../../scss/forms/_input-group.scss","../../scss/mixins/_forms.scss","../../scss/_buttons.scss","../../scss/mixins/_buttons.scss","../../scss/_transitions.scss","../../scss/_dropdown.scss","../../scss/mixins/_caret.scss","../../scss/_button-group.scss","../../scss/_nav.scss","../../scss/_navbar.scss","../../scss/_card.scss","../../scss/_accordion.scss","../../scss/_breadcrumb.scss","../../scss/_pagination.scss","../../scss/mixins/_pagination.scss","../../scss/_badge.scss","../../scss/_alert.scss","../../scss/mixins/_alert.scss","../../scss/_progress.scss","../../scss/_list-group.scss","../../scss/mixins/_list-group.scss","../../scss/_close.scss","../../scss/_toasts.scss","../../scss/_modal.scss","../../scss/mixins/_backdrop.scss","../../scss/_tooltip.scss","../../scss/mixins/_reset-text.scss","../../scss/_popover.scss","../../scss/_carousel.scss","../../scss/mixins/_clearfix.scss","../../scss/_spinners.scss","../../scss/_offcanvas.scss","../../scss/_placeholders.scss","../../scss/helpers/_colored-links.scss","../../scss/helpers/_ratio.scss","../../scss/helpers/_position.scss","../../scss/helpers/_stacks.scss","../../scss/helpers/_visually-hidden.scss","../../scss/mixins/_visually-hidden.scss","../../scss/helpers/_stretched-link.scss","../../scss/helpers/_text-truncation.scss","../../scss/mixins/_text-truncate.scss","../../scss/helpers/_vr.scss","../../scss/mixins/_utilities.scss","../../scss/utilities/_api.scss"],"names":[],"mappings":"iBAAA;;;;;ACAA,MAQI,UAAA,QAAA,YAAA,QAAA,YAAA,QAAA,UAAA,QAAA,SAAA,QAAA,YAAA,QAAA,YAAA,QAAA,WAAA,QAAA,UAAA,QAAA,UAAA,QAAA,WAAA,KAAA,UAAA,QAAA,eAAA,QAIA,cAAA,QAAA,cAAA,QAAA,cAAA,QAAA,cAAA,QAAA,cAAA,QAAA,cAAA,QAAA,cAAA,QAAA,cAAA,QAAA,cAAA,QAIA,aAAA,QAAA,eAAA,QAAA,aAAA,QAAA,UAAA,QAAA,aAAA,QAAA,YAAA,QAAA,WAAA,QAAA,UAAA,QAIA,iBAAA,EAAA,CAAA,GAAA,CAAA,IAAA,mBAAA,GAAA,CAAA,GAAA,CAAA,IAAA,iBAAA,EAAA,CAAA,GAAA,CAAA,GAAA,cAAA,EAAA,CAAA,GAAA,CAAA,IAAA,iBAAA,GAAA,CAAA,GAAA,CAAA,EAAA,gBAAA,GAAA,CAAA,EAAA,CAAA,GAAA,eAAA,GAAA,CAAA,GAAA,CAAA,IAAA,cAAA,EAAA,CAAA,EAAA,CAAA,GAGF,eAAA,GAAA,CAAA,GAAA,CAAA,IACA,eAAA,CAAA,CAAA,CAAA,CAAA,EACA,oBAAA,EAAA,CAAA,EAAA,CAAA,GACA,iBAAA,GAAA,CAAA,GAAA,CAAA,IAMA,qBAAA,SAAA,CAAA,aAAA,CAAA,UAAA,CAAA,MAAA,CAAA,gBAAA,CAAA,KAAA,CAAA,WAAA,CAAA,iBAAA,CAAA,UAAA,CAAA,mBAAA,CAAA,gBAAA,CAAA,iBAAA,CAAA,mBACA,oBAAA,cAAA,CAAA,KAAA,CAAA,MAAA,CAAA,QAAA,CAAA,iBAAA,CAAA,aAAA,CAAA,UACA,cAAA,2EAQA,sBAAA,0BACA,oBAAA,KACA,sBAAA,IACA,sBAAA,IACA,gBAAA,QAIA,aAAA,KCnCF,ECgDA,QADA,SD5CE,WAAA,WAeE,8CANJ,MAOM,gBAAA,QAcN,KACE,OAAA,EACA,YAAA,2BEmPI,UAAA,yBFjPJ,YAAA,2BACA,YAAA,2BACA,MAAA,qBACA,WAAA,0BACA,iBAAA,kBACA,yBAAA,KACA,4BAAA,YAUF,GACE,OAAA,KAAA,EACA,MAAA,QACA,iBAAA,aACA,OAAA,EACA,QAAA,IAGF,eACE,OAAA,IAUF,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,GAAA,GAAA,GAAA,GAAA,GAAA,GACE,WAAA,EACA,cAAA,MAGA,YAAA,IACA,YAAA,IAIF,IAAA,GEwMQ,UAAA,uBAlKJ,0BFtCJ,IAAA,GE+MQ,UAAA,QF1MR,IAAA,GEmMQ,UAAA,sBAlKJ,0BFjCJ,IAAA,GE0MQ,UAAA,MFrMR,IAAA,GE8LQ,UAAA,oBAlKJ,0BF5BJ,IAAA,GEqMQ,UAAA,SFhMR,IAAA,GEyLQ,UAAA,sBAlKJ,0BFvBJ,IAAA,GEgMQ,UAAA,QF3LR,IAAA,GEgLM,UAAA,QF3KN,IAAA,GE2KM,UAAA,KFhKN,EACE,WAAA,EACA,cAAA,KCoBF,6BDTA,YAEE,wBAAA,UAAA,OAAA,gBAAA,UAAA,OACA,OAAA,KACA,iCAAA,KAAA,yBAAA,KAMF,QACE,cAAA,KACA,WAAA,OACA,YAAA,QAMF,GCKA,GDHE,aAAA,KCSF,GDNA,GCKA,GDFE,WAAA,EACA,cAAA,KAGF,MCMA,MACA,MAFA,MDDE,cAAA,EAGF,GACE,YAAA,IAKF,GACE,cAAA,MACA,YAAA,EAMF,WACE,OAAA,EAAA,EAAA,KAQF,ECLA,ODOE,YAAA,OAQF,OAAA,ME4EM,UAAA,OFrEN,MAAA,KACE,QAAA,KACA,iBAAA,QASF,ICnBA,IDqBE,SAAA,SEwDI,UAAA,MFtDJ,YAAA,EACA,eAAA,SAGF,IAAM,OAAA,OACN,IAAM,IAAA,MAKN,EACE,MAAA,QACA,gBAAA,UAEA,QACE,MAAA,QAWF,2BAAA,iCAEE,MAAA,QACA,gBAAA,KCvBJ,KACA,ID6BA,IC5BA,KDgCE,YAAA,yBEcI,UAAA,IFZJ,UAAA,IACA,aAAA,cAOF,IACE,QAAA,MACA,WAAA,EACA,cAAA,KACA,SAAA,KEAI,UAAA,OFKJ,SELI,UAAA,QFOF,MAAA,QACA,WAAA,OAIJ,KEZM,UAAA,OFcJ,MAAA,QACA,UAAA,WAGA,OACE,MAAA,QAIJ,IACE,QAAA,MAAA,MExBI,UAAA,OF0BJ,MAAA,KACA,iBAAA,QG7SE,cAAA,MHgTF,QACE,QAAA,EE/BE,UAAA,IFiCF,YAAA,IASJ,OACE,OAAA,EAAA,EAAA,KAMF,IChDA,IDkDE,eAAA,OAQF,MACE,aAAA,OACA,gBAAA,SAGF,QACE,YAAA,MACA,eAAA,MACA,MAAA,QACA,WAAA,KAOF,GAEE,WAAA,QACA,WAAA,qBCvDF,MAGA,GAFA,MAGA,GDsDA,MCxDA,GD8DE,aAAA,QACA,aAAA,MACA,aAAA,EAQF,MACE,QAAA,aAMF,OAEE,cAAA,EAQF,iCACE,QAAA,ECrEF,OD0EA,MCxEA,SADA,OAEA,SD4EE,OAAA,EACA,YAAA,QE9HI,UAAA,QFgIJ,YAAA,QAIF,OC3EA,OD6EE,eAAA,KAKF,cACE,OAAA,QAGF,OAGE,UAAA,OAGA,gBACE,QAAA,EAOJ,0CACE,QAAA,KCjFF,cACA,aACA,cDuFA,OAIE,mBAAA,OCvFF,6BACA,4BACA,6BDwFI,sBACE,OAAA,QAON,mBACE,QAAA,EACA,aAAA,KAKF,SACE,OAAA,SAUF,SACE,UAAA,EACA,QAAA,EACA,OAAA,EACA,OAAA,EAQF,OACE,MAAA,KACA,MAAA,KACA,QAAA,EACA,cAAA,MEnNM,UAAA,sBFsNN,YAAA,QExXE,0BFiXJ,OExMQ,UAAA,QFiNN,SACE,MAAA,KC/FJ,kCDsGA,uCCvGA,mCADA,+BAGA,oCAJA,6BAKA,mCD2GE,QAAA,EAGF,4BACE,OAAA,KASF,cACE,eAAA,KACA,mBAAA,UAmBF,4BACE,mBAAA,KAKF,+BACE,QAAA,EAMF,6BACE,KAAA,QADF,uBACE,KAAA,QAMF,6BACE,KAAA,QACA,mBAAA,OAKF,OACE,QAAA,aAKF,OACE,OAAA,EAOF,QACE,QAAA,UACA,OAAA,QAQF,SACE,eAAA,SAQF,SACE,QAAA,eInlBF,MFyQM,UAAA,QEvQJ,YAAA,IAKA,WFsQM,UAAA,uBEpQJ,YAAA,IACA,YAAA,IFiGA,0BEpGF,WF6QM,UAAA,ME7QN,WFsQM,UAAA,uBEpQJ,YAAA,IACA,YAAA,IFiGA,0BEpGF,WF6QM,UAAA,QE7QN,WFsQM,UAAA,uBEpQJ,YAAA,IACA,YAAA,IFiGA,0BEpGF,WF6QM,UAAA,ME7QN,WFsQM,UAAA,uBEpQJ,YAAA,IACA,YAAA,IFiGA,0BEpGF,WF6QM,UAAA,QE7QN,WFsQM,UAAA,uBEpQJ,YAAA,IACA,YAAA,IFiGA,0BEpGF,WF6QM,UAAA,ME7QN,WFsQM,UAAA,uBEpQJ,YAAA,IACA,YAAA,IFiGA,0BEpGF,WF6QM,UAAA,QEvPR,eCrDE,aAAA,EACA,WAAA,KDyDF,aC1DE,aAAA,EACA,WAAA,KD4DF,kBACE,QAAA,aAEA,mCACE,aAAA,MAUJ,YFsNM,UAAA,OEpNJ,eAAA,UAIF,YACE,cAAA,KF+MI,UAAA,QE5MJ,wBACE,cAAA,EAIJ,mBACE,WAAA,MACA,cAAA,KFqMI,UAAA,OEnMJ,MAAA,QAEA,2BACE,QAAA,KE9FJ,WCIE,UAAA,KAGA,OAAA,KDDF,eACE,QAAA,OACA,iBAAA,KACA,OAAA,IAAA,MAAA,QHGE,cAAA,OIRF,UAAA,KAGA,OAAA,KDcF,QAEE,QAAA,aAGF,YACE,cAAA,MACA,YAAA,EAGF,gBJ+PM,UAAA,OI7PJ,MAAA,QElCA,WP0mBF,iBAGA,cACA,cACA,cAHA,cADA,eQ9mBE,MAAA,KACA,cAAA,0BACA,aAAA,0BACA,aAAA,KACA,YAAA,KCwDE,yBF5CE,WAAA,cACE,UAAA,OE2CJ,yBF5CE,WAAA,cAAA,cACE,UAAA,OE2CJ,yBF5CE,WAAA,cAAA,cAAA,cACE,UAAA,OE2CJ,0BF5CE,WAAA,cAAA,cAAA,cAAA,cACE,UAAA,QE2CJ,0BF5CE,WAAA,cAAA,cAAA,cAAA,cAAA,eACE,UAAA,QGfN,KCAA,cAAA,OACA,cAAA,EACA,QAAA,KACA,UAAA,KAEA,WAAA,8BACA,aAAA,+BACA,YAAA,+BDJE,OCaF,YAAA,EACA,MAAA,KACA,UAAA,KACA,cAAA,8BACA,aAAA,8BACA,WAAA,mBA+CI,KACE,KAAA,EAAA,EAAA,GAGF,iBApCJ,KAAA,EAAA,EAAA,KACA,MAAA,KAcA,cACE,KAAA,EAAA,EAAA,KACA,MAAA,KAFF,cACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,cACE,KAAA,EAAA,EAAA,KACA,MAAA,eAFF,cACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,cACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,cACE,KAAA,EAAA,EAAA,KACA,MAAA,eA+BE,UAhDJ,KAAA,EAAA,EAAA,KACA,MAAA,KAqDQ,OAhEN,KAAA,EAAA,EAAA,KACA,MAAA,YA+DM,OAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,OAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,OAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,OAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,OAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,OAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,OAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,OAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,QAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,QAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,QAhEN,KAAA,EAAA,EAAA,KACA,MAAA,KAuEQ,UAxDV,YAAA,YAwDU,UAxDV,YAAA,aAwDU,UAxDV,YAAA,IAwDU,UAxDV,YAAA,aAwDU,UAxDV,YAAA,aAwDU,UAxDV,YAAA,IAwDU,UAxDV,YAAA,aAwDU,UAxDV,YAAA,aAwDU,UAxDV,YAAA,IAwDU,WAxDV,YAAA,aAwDU,WAxDV,YAAA,aAmEM,KX2sBR,MWzsBU,cAAA,EAGF,KX2sBR,MWzsBU,cAAA,EAPF,KXqtBR,MWntBU,cAAA,QAGF,KXqtBR,MWntBU,cAAA,QAPF,KX+tBR,MW7tBU,cAAA,OAGF,KX+tBR,MW7tBU,cAAA,OAPF,KXyuBR,MWvuBU,cAAA,KAGF,KXyuBR,MWvuBU,cAAA,KAPF,KXmvBR,MWjvBU,cAAA,OAGF,KXmvBR,MWjvBU,cAAA,OAPF,KX6vBR,MW3vBU,cAAA,KAGF,KX6vBR,MW3vBU,cAAA,KF1DN,yBEUE,QACE,KAAA,EAAA,EAAA,GAGF,oBApCJ,KAAA,EAAA,EAAA,KACA,MAAA,KAcA,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,KAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,eAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,eA+BE,aAhDJ,KAAA,EAAA,EAAA,KACA,MAAA,KAqDQ,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,YA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,KAuEQ,aAxDV,YAAA,EAwDU,aAxDV,YAAA,YAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,IAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,IAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,IAwDU,cAxDV,YAAA,aAwDU,cAxDV,YAAA,aAmEM,QXg6BR,SW95BU,cAAA,EAGF,QXg6BR,SW95BU,cAAA,EAPF,QX06BR,SWx6BU,cAAA,QAGF,QX06BR,SWx6BU,cAAA,QAPF,QXo7BR,SWl7BU,cAAA,OAGF,QXo7BR,SWl7BU,cAAA,OAPF,QX87BR,SW57BU,cAAA,KAGF,QX87BR,SW57BU,cAAA,KAPF,QXw8BR,SWt8BU,cAAA,OAGF,QXw8BR,SWt8BU,cAAA,OAPF,QXk9BR,SWh9BU,cAAA,KAGF,QXk9BR,SWh9BU,cAAA,MF1DN,yBEUE,QACE,KAAA,EAAA,EAAA,GAGF,oBApCJ,KAAA,EAAA,EAAA,KACA,MAAA,KAcA,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,KAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,eAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,eA+BE,aAhDJ,KAAA,EAAA,EAAA,KACA,MAAA,KAqDQ,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,YA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,KAuEQ,aAxDV,YAAA,EAwDU,aAxDV,YAAA,YAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,IAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,IAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,IAwDU,cAxDV,YAAA,aAwDU,cAxDV,YAAA,aAmEM,QXqnCR,SWnnCU,cAAA,EAGF,QXqnCR,SWnnCU,cAAA,EAPF,QX+nCR,SW7nCU,cAAA,QAGF,QX+nCR,SW7nCU,cAAA,QAPF,QXyoCR,SWvoCU,cAAA,OAGF,QXyoCR,SWvoCU,cAAA,OAPF,QXmpCR,SWjpCU,cAAA,KAGF,QXmpCR,SWjpCU,cAAA,KAPF,QX6pCR,SW3pCU,cAAA,OAGF,QX6pCR,SW3pCU,cAAA,OAPF,QXuqCR,SWrqCU,cAAA,KAGF,QXuqCR,SWrqCU,cAAA,MF1DN,yBEUE,QACE,KAAA,EAAA,EAAA,GAGF,oBApCJ,KAAA,EAAA,EAAA,KACA,MAAA,KAcA,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,KAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,eAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,eA+BE,aAhDJ,KAAA,EAAA,EAAA,KACA,MAAA,KAqDQ,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,YA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,KAuEQ,aAxDV,YAAA,EAwDU,aAxDV,YAAA,YAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,IAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,IAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,IAwDU,cAxDV,YAAA,aAwDU,cAxDV,YAAA,aAmEM,QX00CR,SWx0CU,cAAA,EAGF,QX00CR,SWx0CU,cAAA,EAPF,QXo1CR,SWl1CU,cAAA,QAGF,QXo1CR,SWl1CU,cAAA,QAPF,QX81CR,SW51CU,cAAA,OAGF,QX81CR,SW51CU,cAAA,OAPF,QXw2CR,SWt2CU,cAAA,KAGF,QXw2CR,SWt2CU,cAAA,KAPF,QXk3CR,SWh3CU,cAAA,OAGF,QXk3CR,SWh3CU,cAAA,OAPF,QX43CR,SW13CU,cAAA,KAGF,QX43CR,SW13CU,cAAA,MF1DN,0BEUE,QACE,KAAA,EAAA,EAAA,GAGF,oBApCJ,KAAA,EAAA,EAAA,KACA,MAAA,KAcA,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,KAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,eAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,eA+BE,aAhDJ,KAAA,EAAA,EAAA,KACA,MAAA,KAqDQ,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,YA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,KAuEQ,aAxDV,YAAA,EAwDU,aAxDV,YAAA,YAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,IAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,IAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,IAwDU,cAxDV,YAAA,aAwDU,cAxDV,YAAA,aAmEM,QX+hDR,SW7hDU,cAAA,EAGF,QX+hDR,SW7hDU,cAAA,EAPF,QXyiDR,SWviDU,cAAA,QAGF,QXyiDR,SWviDU,cAAA,QAPF,QXmjDR,SWjjDU,cAAA,OAGF,QXmjDR,SWjjDU,cAAA,OAPF,QX6jDR,SW3jDU,cAAA,KAGF,QX6jDR,SW3jDU,cAAA,KAPF,QXukDR,SWrkDU,cAAA,OAGF,QXukDR,SWrkDU,cAAA,OAPF,QXilDR,SW/kDU,cAAA,KAGF,QXilDR,SW/kDU,cAAA,MF1DN,0BEUE,SACE,KAAA,EAAA,EAAA,GAGF,qBApCJ,KAAA,EAAA,EAAA,KACA,MAAA,KAcA,kBACE,KAAA,EAAA,EAAA,KACA,MAAA,KAFF,kBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,kBACE,KAAA,EAAA,EAAA,KACA,MAAA,eAFF,kBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,kBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,kBACE,KAAA,EAAA,EAAA,KACA,MAAA,eA+BE,cAhDJ,KAAA,EAAA,EAAA,KACA,MAAA,KAqDQ,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,YA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,YAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,YAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,YAhEN,KAAA,EAAA,EAAA,KACA,MAAA,KAuEQ,cAxDV,YAAA,EAwDU,cAxDV,YAAA,YAwDU,cAxDV,YAAA,aAwDU,cAxDV,YAAA,IAwDU,cAxDV,YAAA,aAwDU,cAxDV,YAAA,aAwDU,cAxDV,YAAA,IAwDU,cAxDV,YAAA,aAwDU,cAxDV,YAAA,aAwDU,cAxDV,YAAA,IAwDU,eAxDV,YAAA,aAwDU,eAxDV,YAAA,aAmEM,SXovDR,UWlvDU,cAAA,EAGF,SXovDR,UWlvDU,cAAA,EAPF,SX8vDR,UW5vDU,cAAA,QAGF,SX8vDR,UW5vDU,cAAA,QAPF,SXwwDR,UWtwDU,cAAA,OAGF,SXwwDR,UWtwDU,cAAA,OAPF,SXkxDR,UWhxDU,cAAA,KAGF,SXkxDR,UWhxDU,cAAA,KAPF,SX4xDR,UW1xDU,cAAA,OAGF,SX4xDR,UW1xDU,cAAA,OAPF,SXsyDR,UWpyDU,cAAA,KAGF,SXsyDR,UWpyDU,cAAA,MCrHV,OACE,cAAA,YACA,qBAAA,YACA,yBAAA,QACA,sBAAA,oBACA,wBAAA,QACA,qBAAA,mBACA,uBAAA,QACA,oBAAA,qBAEA,MAAA,KACA,cAAA,KACA,MAAA,QACA,eAAA,IACA,aAAA,QAOA,yBACE,QAAA,MAAA,MACA,iBAAA,mBACA,oBAAA,IACA,WAAA,MAAA,EAAA,EAAA,EAAA,OAAA,0BAGF,aACE,eAAA,QAGF,aACE,eAAA,OAIF,0BACE,WAAA,IAAA,MAAA,aASJ,aACE,aAAA,IAUA,4BACE,QAAA,OAAA,OAeF,gCACE,aAAA,IAAA,EAGA,kCACE,aAAA,EAAA,IAOJ,oCACE,oBAAA,EAGF,qCACE,iBAAA,EASF,2CACE,qBAAA,2BACA,MAAA,8BAQJ,cACE,qBAAA,0BACA,MAAA,6BAQA,8BACE,qBAAA,yBACA,MAAA,4BC5HF,eAME,cAAA,QACA,sBAAA,QACA,yBAAA,KACA,qBAAA,QACA,wBAAA,KACA,oBAAA,QACA,uBAAA,KAEA,MAAA,KACA,aAAA,QAfF,iBAME,cAAA,QACA,sBAAA,QACA,yBAAA,KACA,qBAAA,QACA,wBAAA,KACA,oBAAA,QACA,uBAAA,KAEA,MAAA,KACA,aAAA,QAfF,eAME,cAAA,QACA,sBAAA,QACA,yBAAA,KACA,qBAAA,QACA,wBAAA,KACA,oBAAA,QACA,uBAAA,KAEA,MAAA,KACA,aAAA,QAfF,YAME,cAAA,QACA,sBAAA,QACA,yBAAA,KACA,qBAAA,QACA,wBAAA,KACA,oBAAA,QACA,uBAAA,KAEA,MAAA,KACA,aAAA,QAfF,eAME,cAAA,QACA,sBAAA,QACA,yBAAA,KACA,qBAAA,QACA,wBAAA,KACA,oBAAA,QACA,uBAAA,KAEA,MAAA,KACA,aAAA,QAfF,cAME,cAAA,QACA,sBAAA,QACA,yBAAA,KACA,qBAAA,QACA,wBAAA,KACA,oBAAA,QACA,uBAAA,KAEA,MAAA,KACA,aAAA,QAfF,aAME,cAAA,QACA,sBAAA,QACA,yBAAA,KACA,qBAAA,QACA,wBAAA,KACA,oBAAA,QACA,uBAAA,KAEA,MAAA,KACA,aAAA,QAfF,YAME,cAAA,QACA,sBAAA,QACA,yBAAA,KACA,qBAAA,QACA,wBAAA,KACA,oBAAA,QACA,uBAAA,KAEA,MAAA,KACA,aAAA,QDoIA,kBACE,WAAA,KACA,2BAAA,MH3EF,4BGyEA,qBACE,WAAA,KACA,2BAAA,OH3EF,4BGyEA,qBACE,WAAA,KACA,2BAAA,OH3EF,4BGyEA,qBACE,WAAA,KACA,2BAAA,OH3EF,6BGyEA,qBACE,WAAA,KACA,2BAAA,OH3EF,6BGyEA,sBACE,WAAA,KACA,2BAAA,OEnJN,YACE,cAAA,MASF,gBACE,YAAA,oBACA,eAAA,oBACA,cAAA,EboRI,UAAA,QahRJ,YAAA,IAIF,mBACE,YAAA,kBACA,eAAA,kBb0QI,UAAA,QatQN,mBACE,YAAA,mBACA,eAAA,mBboQI,UAAA,QcjSN,WACE,WAAA,OdgSI,UAAA,Oc5RJ,MAAA,QCLF,cACE,QAAA,MACA,MAAA,KACA,QAAA,QAAA,Of8RI,UAAA,Ke3RJ,YAAA,IACA,YAAA,IACA,MAAA,QACA,iBAAA,KACA,gBAAA,YACA,OAAA,IAAA,MAAA,QACA,mBAAA,KAAA,gBAAA,KAAA,WAAA,KdGE,cAAA,OeHE,WAAA,aAAA,KAAA,WAAA,CAAA,WAAA,KAAA,YAIA,uCDhBN,cCiBQ,WAAA,MDGN,yBACE,SAAA,OAEA,wDACE,OAAA,QAKJ,oBACE,MAAA,QACA,iBAAA,KACA,aAAA,QACA,QAAA,EAKE,WAAA,EAAA,EAAA,EAAA,OAAA,qBAOJ,2CAEE,OAAA,MAIF,gCACE,MAAA,QAEA,QAAA,EAHF,2BACE,MAAA,QAEA,QAAA,EAQF,uBAAA,wBAEE,iBAAA,QAGA,QAAA,EAIF,0CACE,QAAA,QAAA,OACA,OAAA,SAAA,QACA,mBAAA,OAAA,kBAAA,OACA,MAAA,QE3EF,iBAAA,QF6EE,eAAA,KACA,aAAA,QACA,aAAA,MACA,aAAA,EACA,wBAAA,IACA,cAAA,ECtEE,mBAAA,MAAA,KAAA,WAAA,CAAA,iBAAA,KAAA,WAAA,CAAA,aAAA,KAAA,WAAA,CAAA,WAAA,KAAA,YAAA,WAAA,MAAA,KAAA,WAAA,CAAA,iBAAA,KAAA,WAAA,CAAA,aAAA,KAAA,WAAA,CAAA,WAAA,KAAA,YD2DJ,oCACE,QAAA,QAAA,OACA,OAAA,SAAA,QACA,mBAAA,OAAA,kBAAA,OACA,MAAA,QE3EF,iBAAA,QF6EE,eAAA,KACA,aAAA,QACA,aAAA,MACA,aAAA,EACA,wBAAA,IACA,cAAA,ECtEE,WAAA,MAAA,KAAA,WAAA,CAAA,iBAAA,KAAA,WAAA,CAAA,aAAA,KAAA,WAAA,CAAA,WAAA,KAAA,YAIA,uCDuDJ,0CCtDM,mBAAA,KAAA,WAAA,KDsDN,oCCtDM,WAAA,MDqEN,+EACE,iBAAA,QADF,yEACE,iBAAA,QAGF,0CACE,QAAA,QAAA,OACA,OAAA,SAAA,QACA,mBAAA,OAAA,kBAAA,OACA,MAAA,QE9FF,iBAAA,QFgGE,eAAA,KACA,aAAA,QACA,aAAA,MACA,aAAA,EACA,wBAAA,IACA,cAAA,ECzFE,mBAAA,MAAA,KAAA,WAAA,CAAA,iBAAA,KAAA,WAAA,CAAA,aAAA,KAAA,WAAA,CAAA,WAAA,KAAA,YAAA,WAAA,MAAA,KAAA,WAAA,CAAA,iBAAA,KAAA,WAAA,CAAA,aAAA,KAAA,WAAA,CAAA,WAAA,KAAA,YAIA,uCD0EJ,0CCzEM,mBAAA,KAAA,WAAA,MDwFN,+EACE,iBAAA,QASJ,wBACE,QAAA,MACA,MAAA,KACA,QAAA,QAAA,EACA,cAAA,EACA,YAAA,IACA,MAAA,QACA,iBAAA,YACA,OAAA,MAAA,YACA,aAAA,IAAA,EAEA,wCAAA,wCAEE,cAAA,EACA,aAAA,EAWJ,iBACE,WAAA,0BACA,QAAA,OAAA,MfmJI,UAAA,QClRF,cAAA,McmIF,6CACE,QAAA,OAAA,MACA,OAAA,QAAA,OACA,mBAAA,MAAA,kBAAA,MAHF,uCACE,QAAA,OAAA,MACA,OAAA,QAAA,OACA,mBAAA,MAAA,kBAAA,MAGF,6CACE,QAAA,OAAA,MACA,OAAA,QAAA,OACA,mBAAA,MAAA,kBAAA,MAIJ,iBACE,WAAA,yBACA,QAAA,MAAA,KfgII,UAAA,QClRF,cAAA,McsJF,6CACE,QAAA,MAAA,KACA,OAAA,OAAA,MACA,mBAAA,KAAA,kBAAA,KAHF,uCACE,QAAA,MAAA,KACA,OAAA,OAAA,MACA,mBAAA,KAAA,kBAAA,KAGF,6CACE,QAAA,MAAA,KACA,OAAA,OAAA,MACA,mBAAA,KAAA,kBAAA,KAQF,sBACE,WAAA,2BAGF,yBACE,WAAA,0BAGF,yBACE,WAAA,yBAKJ,oBACE,MAAA,KACA,OAAA,KACA,QAAA,QAEA,mDACE,OAAA,QAGF,uCACE,OAAA,Md/LA,cAAA,OcmMF,0CACE,OAAA,MdpMA,cAAA,OiBdJ,aACE,QAAA,MACA,MAAA,KACA,QAAA,QAAA,QAAA,QAAA,OAEA,mBAAA,oBlB2RI,UAAA,KkBxRJ,YAAA,IACA,YAAA,IACA,MAAA,QACA,iBAAA,KACA,iBAAA,gOACA,kBAAA,UACA,oBAAA,MAAA,OAAA,OACA,gBAAA,KAAA,KACA,OAAA,IAAA,MAAA,QjBFE,cAAA,OeHE,WAAA,aAAA,KAAA,WAAA,CAAA,WAAA,KAAA,YESJ,mBAAA,KAAA,gBAAA,KAAA,WAAA,KFLI,uCEfN,aFgBQ,WAAA,MEMN,mBACE,aAAA,QACA,QAAA,EAKE,WAAA,EAAA,EAAA,EAAA,OAAA,qBAIJ,uBAAA,mCAEE,cAAA,OACA,iBAAA,KAGF,sBAEE,iBAAA,QAKF,4BACE,MAAA,YACA,YAAA,EAAA,EAAA,EAAA,QAIJ,gBACE,YAAA,OACA,eAAA,OACA,aAAA,MlByOI,UAAA,QClRF,cAAA,MiB8CJ,gBACE,YAAA,MACA,eAAA,MACA,aAAA,KlBiOI,UAAA,QClRF,cAAA,MkBfJ,YACE,QAAA,MACA,WAAA,OACA,aAAA,MACA,cAAA,QAEA,8BACE,MAAA,KACA,YAAA,OAIJ,kBACE,MAAA,IACA,OAAA,IACA,WAAA,MACA,eAAA,IACA,iBAAA,KACA,kBAAA,UACA,oBAAA,OACA,gBAAA,QACA,OAAA,IAAA,MAAA,gBACA,mBAAA,KAAA,gBAAA,KAAA,WAAA,KACA,2BAAA,MAAA,aAAA,MAGA,iClBXE,cAAA,MkBeF,8BAEE,cAAA,IAGF,yBACE,OAAA,gBAGF,wBACE,aAAA,QACA,QAAA,EACA,WAAA,EAAA,EAAA,EAAA,OAAA,qBAGF,0BACE,iBAAA,QACA,aAAA,QAEA,yCAII,iBAAA,8NAIJ,sCAII,iBAAA,sIAKN,+CACE,iBAAA,QACA,aAAA,QAKE,iBAAA,wNAIJ,2BACE,eAAA,KACA,OAAA,KACA,QAAA,GAOA,6CAAA,8CACE,QAAA,GAcN,aACE,aAAA,MAEA,+BACE,MAAA,IACA,YAAA,OACA,iBAAA,uJACA,oBAAA,KAAA,OlB9FA,cAAA,IeHE,WAAA,oBAAA,KAAA,YAIA,uCGyFJ,+BHxFM,WAAA,MGgGJ,qCACE,iBAAA,yIAGF,uCACE,oBAAA,MAAA,OAKE,iBAAA,sIAMR,mBACE,QAAA,aACA,aAAA,KAGF,WACE,SAAA,SACA,KAAA,cACA,eAAA,KAIE,yBAAA,0BACE,eAAA,KACA,OAAA,KACA,QAAA,IC9IN,YACE,MAAA,KACA,OAAA,OACA,QAAA,EACA,iBAAA,YACA,mBAAA,KAAA,gBAAA,KAAA,WAAA,KAEA,kBACE,QAAA,EAIA,wCAA0B,WAAA,EAAA,EAAA,EAAA,IAAA,IAAA,CAAA,EAAA,EAAA,EAAA,OAAA,qBAC1B,oCAA0B,WAAA,EAAA,EAAA,EAAA,IAAA,IAAA,CAAA,EAAA,EAAA,EAAA,OAAA,qBAG5B,8BACE,OAAA,EAGF,kCACE,MAAA,KACA,OAAA,KACA,WAAA,QHzBF,iBAAA,QG2BE,OAAA,EnBZA,cAAA,KeHE,mBAAA,iBAAA,KAAA,WAAA,CAAA,aAAA,KAAA,WAAA,CAAA,WAAA,KAAA,YAAA,WAAA,iBAAA,KAAA,WAAA,CAAA,aAAA,KAAA,WAAA,CAAA,WAAA,KAAA,YImBF,mBAAA,KAAA,WAAA,KJfE,uCIMJ,kCJLM,mBAAA,KAAA,WAAA,MIgBJ,yCHjCF,iBAAA,QGsCA,2CACE,MAAA,KACA,OAAA,MACA,MAAA,YACA,OAAA,QACA,iBAAA,QACA,aAAA,YnB7BA,cAAA,KmBkCF,8BACE,MAAA,KACA,OAAA,KHnDF,iBAAA,QGqDE,OAAA,EnBtCA,cAAA,KeHE,gBAAA,iBAAA,KAAA,WAAA,CAAA,aAAA,KAAA,WAAA,CAAA,WAAA,KAAA,YAAA,WAAA,iBAAA,KAAA,WAAA,CAAA,aAAA,KAAA,WAAA,CAAA,WAAA,KAAA,YI6CF,gBAAA,KAAA,WAAA,KJzCE,uCIiCJ,8BJhCM,gBAAA,KAAA,WAAA,MI0CJ,qCH3DF,iBAAA,QGgEA,8BACE,MAAA,KACA,OAAA,MACA,MAAA,YACA,OAAA,QACA,iBAAA,QACA,aAAA,YnBvDA,cAAA,KmB4DF,qBACE,eAAA,KAEA,2CACE,iBAAA,QAGF,uCACE,iBAAA,QCvFN,eACE,SAAA,SAEA,6BtB4lFF,4BsB1lFI,OAAA,mBACA,YAAA,KAGF,qBACE,SAAA,SACA,IAAA,EACA,KAAA,EACA,OAAA,KACA,QAAA,KAAA,OACA,eAAA,KACA,OAAA,IAAA,MAAA,YACA,iBAAA,EAAA,ELDE,WAAA,QAAA,IAAA,WAAA,CAAA,UAAA,IAAA,YAIA,uCKXJ,qBLYM,WAAA,MKCN,6BACE,QAAA,KAAA,OAEA,+CACE,MAAA,YADF,0CACE,MAAA,YAGF,0DAEE,YAAA,SACA,eAAA,QAHF,mCAAA,qDAEE,YAAA,SACA,eAAA,QAGF,8CACE,YAAA,SACA,eAAA,QAIJ,4BACE,YAAA,SACA,eAAA,QAMA,gEACE,QAAA,IACA,UAAA,WAAA,mBAAA,mBAFF,yCtBgmFJ,2DACA,kCsBhmFM,QAAA,IACA,UAAA,WAAA,mBAAA,mBAKF,oDACE,QAAA,IACA,UAAA,WAAA,mBAAA,mBCtDN,aACE,SAAA,SACA,QAAA,KACA,UAAA,KACA,YAAA,QACA,MAAA,KAEA,2BvBwpFF,0BuBtpFI,SAAA,SACA,KAAA,EAAA,EAAA,KACA,MAAA,GACA,UAAA,EAIF,iCvBspFF,gCuBppFI,QAAA,EAMF,kBACE,SAAA,SACA,QAAA,EAEA,wBACE,QAAA,EAWN,kBACE,QAAA,KACA,YAAA,OACA,QAAA,QAAA,OtBsPI,UAAA,KsBpPJ,YAAA,IACA,YAAA,IACA,MAAA,QACA,WAAA,OACA,YAAA,OACA,iBAAA,QACA,OAAA,IAAA,MAAA,QrBpCE,cAAA,OForFJ,qBuBtoFA,8BvBooFA,6BACA,kCuBjoFE,QAAA,MAAA,KtBgOI,UAAA,QClRF,cAAA,MF6rFJ,qBuBtoFA,8BvBooFA,6BACA,kCuBjoFE,QAAA,OAAA,MtBuNI,UAAA,QClRF,cAAA,MqBgEJ,6BvBooFA,6BuBloFE,cAAA,KvBuoFF,uEuB1nFI,8FrB/DA,wBAAA,EACA,2BAAA,EF6rFJ,iEuBxnFI,2FrBtEA,wBAAA,EACA,2BAAA,EqBgFF,0IACE,YAAA,KrBpEA,uBAAA,EACA,0BAAA,EsBzBF,gBACE,QAAA,KACA,MAAA,KACA,WAAA,OvByQE,UAAA,OuBtQF,MAAA,QAGF,eACE,SAAA,SACA,IAAA,KACA,QAAA,EACA,QAAA,KACA,UAAA,KACA,QAAA,OAAA,MACA,WAAA,MvB4PE,UAAA,QuBzPF,MAAA,KACA,iBAAA,mBtB1BA,cAAA,OFgvFJ,0BACA,yBwBltFI,sCxBgtFJ,qCwB9sFM,QAAA,MA9CF,uBAAA,mCAoDE,aAAA,QAGE,cAAA,qBACA,iBAAA,2OACA,kBAAA,UACA,oBAAA,MAAA,wBAAA,OACA,gBAAA,sBAAA,sBAGF,6BAAA,yCACE,aAAA,QACA,WAAA,EAAA,EAAA,EAAA,OAAA,oBAhEJ,2CAAA,+BAyEI,cAAA,qBACA,oBAAA,IAAA,wBAAA,MAAA,wBA1EJ,sBAAA,kCAiFE,aAAA,QAGE,kDAAA,gDAAA,8DAAA,4DAEE,cAAA,SACA,iBAAA,+NAAA,CAAA,2OACA,oBAAA,MAAA,OAAA,MAAA,CAAA,OAAA,MAAA,QACA,gBAAA,KAAA,IAAA,CAAA,sBAAA,sBAIJ,4BAAA,wCACE,aAAA,QACA,WAAA,EAAA,EAAA,EAAA,OAAA,oBA/FJ,2BAAA,uCAsGE,aAAA,QAEA,mCAAA,+CACE,iBAAA,QAGF,iCAAA,6CACE,WAAA,EAAA,EAAA,EAAA,OAAA,oBAGF,6CAAA,yDACE,MAAA,QAKJ,qDACE,YAAA,KAvHF,oCxBqzFJ,mCwBrzFI,gDxBozFJ,+CwBrrFQ,QAAA,EAIF,0CxBurFN,yCwBvrFM,sDxBsrFN,qDwBrrFQ,QAAA,EAjHN,kBACE,QAAA,KACA,MAAA,KACA,WAAA,OvByQE,UAAA,OuBtQF,MAAA,QAGF,iBACE,SAAA,SACA,IAAA,KACA,QAAA,EACA,QAAA,KACA,UAAA,KACA,QAAA,OAAA,MACA,WAAA,MvB4PE,UAAA,QuBzPF,MAAA,KACA,iBAAA,mBtB1BA,cAAA,OFy0FJ,8BACA,6BwB3yFI,0CxByyFJ,yCwBvyFM,QAAA,MA9CF,yBAAA,qCAoDE,aAAA,QAGE,cAAA,qBACA,iBAAA,2TACA,kBAAA,UACA,oBAAA,MAAA,wBAAA,OACA,gBAAA,sBAAA,sBAGF,+BAAA,2CACE,aAAA,QACA,WAAA,EAAA,EAAA,EAAA,OAAA,oBAhEJ,6CAAA,iCAyEI,cAAA,qBACA,oBAAA,IAAA,wBAAA,MAAA,wBA1EJ,wBAAA,oCAiFE,aAAA,QAGE,oDAAA,kDAAA,gEAAA,8DAEE,cAAA,SACA,iBAAA,+NAAA,CAAA,2TACA,oBAAA,MAAA,OAAA,MAAA,CAAA,OAAA,MAAA,QACA,gBAAA,KAAA,IAAA,CAAA,sBAAA,sBAIJ,8BAAA,0CACE,aAAA,QACA,WAAA,EAAA,EAAA,EAAA,OAAA,oBA/FJ,6BAAA,yCAsGE,aAAA,QAEA,qCAAA,iDACE,iBAAA,QAGF,mCAAA,+CACE,WAAA,EAAA,EAAA,EAAA,OAAA,oBAGF,+CAAA,2DACE,MAAA,QAKJ,uDACE,YAAA,KAvHF,sCxB84FJ,qCwB94FI,kDxB64FJ,iDwB5wFQ,QAAA,EAEF,4CxBgxFN,2CwBhxFM,wDxB+wFN,uDwB9wFQ,QAAA,ECtIR,KACE,QAAA,aAEA,YAAA,IACA,YAAA,IACA,MAAA,QACA,WAAA,OACA,gBAAA,KAEA,eAAA,OACA,OAAA,QACA,oBAAA,KAAA,iBAAA,KAAA,YAAA,KACA,iBAAA,YACA,OAAA,IAAA,MAAA,YC8GA,QAAA,QAAA,OzBsKI,UAAA,KClRF,cAAA,OeHE,WAAA,MAAA,KAAA,WAAA,CAAA,iBAAA,KAAA,WAAA,CAAA,aAAA,KAAA,WAAA,CAAA,WAAA,KAAA,YAIA,uCQhBN,KRiBQ,WAAA,MQAN,WACE,MAAA,QAIF,sBAAA,WAEE,QAAA,EACA,WAAA,EAAA,EAAA,EAAA,OAAA,qBAcF,cAAA,cAAA,uBAGE,eAAA,KACA,QAAA,IAYF,aCvCA,MAAA,KRhBA,iBAAA,QQkBA,aAAA,QAGA,mBACE,MAAA,KRtBF,iBAAA,QQwBE,aAAA,QAGF,8BAAA,mBAEE,MAAA,KR7BF,iBAAA,QQ+BE,aAAA,QAKE,WAAA,EAAA,EAAA,EAAA,OAAA,oBAIJ,+BAAA,gCAAA,oBAAA,oBAAA,mCAKE,MAAA,KACA,iBAAA,QAGA,aAAA,QAEA,qCAAA,sCAAA,0BAAA,0BAAA,yCAKI,WAAA,EAAA,EAAA,EAAA,OAAA,oBAKN,sBAAA,sBAEE,MAAA,KACA,iBAAA,QAGA,aAAA,QDZF,eCvCA,MAAA,KRhBA,iBAAA,QQkBA,aAAA,QAGA,qBACE,MAAA,KRtBF,iBAAA,QQwBE,aAAA,QAGF,gCAAA,qBAEE,MAAA,KR7BF,iBAAA,QQ+BE,aAAA,QAKE,WAAA,EAAA,EAAA,EAAA,OAAA,qBAIJ,iCAAA,kCAAA,sBAAA,sBAAA,qCAKE,MAAA,KACA,iBAAA,QAGA,aAAA,QAEA,uCAAA,wCAAA,4BAAA,4BAAA,2CAKI,WAAA,EAAA,EAAA,EAAA,OAAA,qBAKN,wBAAA,wBAEE,MAAA,KACA,iBAAA,QAGA,aAAA,QDZF,aCvCA,MAAA,KRhBA,iBAAA,QQkBA,aAAA,QAGA,mBACE,MAAA,KRtBF,iBAAA,QQwBE,aAAA,QAGF,8BAAA,mBAEE,MAAA,KR7BF,iBAAA,QQ+BE,aAAA,QAKE,WAAA,EAAA,EAAA,EAAA,OAAA,oBAIJ,+BAAA,gCAAA,oBAAA,oBAAA,mCAKE,MAAA,KACA,iBAAA,QAGA,aAAA,QAEA,qCAAA,sCAAA,0BAAA,0BAAA,yCAKI,WAAA,EAAA,EAAA,EAAA,OAAA,oBAKN,sBAAA,sBAEE,MAAA,KACA,iBAAA,QAGA,aAAA,QDZF,UCvCA,MAAA,KRhBA,iBAAA,QQkBA,aAAA,QAGA,gBACE,MAAA,KRtBF,iBAAA,QQwBE,aAAA,QAGF,2BAAA,gBAEE,MAAA,KR7BF,iBAAA,QQ+BE,aAAA,QAKE,WAAA,EAAA,EAAA,EAAA,OAAA,oBAIJ,4BAAA,6BAAA,iBAAA,iBAAA,gCAKE,MAAA,KACA,iBAAA,QAGA,aAAA,QAEA,kCAAA,mCAAA,uBAAA,uBAAA,sCAKI,WAAA,EAAA,EAAA,EAAA,OAAA,oBAKN,mBAAA,mBAEE,MAAA,KACA,iBAAA,QAGA,aAAA,QDZF,aCvCA,MAAA,KRhBA,iBAAA,QQkBA,aAAA,QAGA,mBACE,MAAA,KRtBF,iBAAA,QQwBE,aAAA,QAGF,8BAAA,mBAEE,MAAA,KR7BF,iBAAA,QQ+BE,aAAA,QAKE,WAAA,EAAA,EAAA,EAAA,OAAA,mBAIJ,+BAAA,gCAAA,oBAAA,oBAAA,mCAKE,MAAA,KACA,iBAAA,QAGA,aAAA,QAEA,qCAAA,sCAAA,0BAAA,0BAAA,yCAKI,WAAA,EAAA,EAAA,EAAA,OAAA,mBAKN,sBAAA,sBAEE,MAAA,KACA,iBAAA,QAGA,aAAA,QDZF,YCvCA,MAAA,KRhBA,iBAAA,QQkBA,aAAA,QAGA,kBACE,MAAA,KRtBF,iBAAA,QQwBE,aAAA,QAGF,6BAAA,kBAEE,MAAA,KR7BF,iBAAA,QQ+BE,aAAA,QAKE,WAAA,EAAA,EAAA,EAAA,OAAA,mBAIJ,8BAAA,+BAAA,mBAAA,mBAAA,kCAKE,MAAA,KACA,iBAAA,QAGA,aAAA,QAEA,oCAAA,qCAAA,yBAAA,yBAAA,wCAKI,WAAA,EAAA,EAAA,EAAA,OAAA,mBAKN,qBAAA,qBAEE,MAAA,KACA,iBAAA,QAGA,aAAA,QDZF,WCvCA,MAAA,KRhBA,iBAAA,QQkBA,aAAA,QAGA,iBACE,MAAA,KRtBF,iBAAA,QQwBE,aAAA,QAGF,4BAAA,iBAEE,MAAA,KR7BF,iBAAA,QQ+BE,aAAA,QAKE,WAAA,EAAA,EAAA,EAAA,OAAA,qBAIJ,6BAAA,8BAAA,kBAAA,kBAAA,iCAKE,MAAA,KACA,iBAAA,QAGA,aAAA,QAEA,mCAAA,oCAAA,wBAAA,wBAAA,uCAKI,WAAA,EAAA,EAAA,EAAA,OAAA,qBAKN,oBAAA,oBAEE,MAAA,KACA,iBAAA,QAGA,aAAA,QDZF,UCvCA,MAAA,KRhBA,iBAAA,QQkBA,aAAA,QAGA,gBACE,MAAA,KRtBF,iBAAA,QQwBE,aAAA,QAGF,2BAAA,gBAEE,MAAA,KR7BF,iBAAA,QQ+BE,aAAA,QAKE,WAAA,EAAA,EAAA,EAAA,OAAA,kBAIJ,4BAAA,6BAAA,iBAAA,iBAAA,gCAKE,MAAA,KACA,iBAAA,QAGA,aAAA,QAEA,kCAAA,mCAAA,uBAAA,uBAAA,sCAKI,WAAA,EAAA,EAAA,EAAA,OAAA,kBAKN,mBAAA,mBAEE,MAAA,KACA,iBAAA,QAGA,aAAA,QDNF,qBCmBA,MAAA,QACA,aAAA,QAEA,2BACE,MAAA,KACA,iBAAA,QACA,aAAA,QAGF,sCAAA,2BAEE,WAAA,EAAA,EAAA,EAAA,OAAA,oBAGF,uCAAA,wCAAA,4BAAA,0CAAA,4BAKE,MAAA,KACA,iBAAA,QACA,aAAA,QAEA,6CAAA,8CAAA,kCAAA,gDAAA,kCAKI,WAAA,EAAA,EAAA,EAAA,OAAA,oBAKN,8BAAA,8BAEE,MAAA,QACA,iBAAA,YDvDF,uBCmBA,MAAA,QACA,aAAA,QAEA,6BACE,MAAA,KACA,iBAAA,QACA,aAAA,QAGF,wCAAA,6BAEE,WAAA,EAAA,EAAA,EAAA,OAAA,qBAGF,yCAAA,0CAAA,8BAAA,4CAAA,8BAKE,MAAA,KACA,iBAAA,QACA,aAAA,QAEA,+CAAA,gDAAA,oCAAA,kDAAA,oCAKI,WAAA,EAAA,EAAA,EAAA,OAAA,qBAKN,gCAAA,gCAEE,MAAA,QACA,iBAAA,YDvDF,qBCmBA,MAAA,QACA,aAAA,QAEA,2BACE,MAAA,KACA,iBAAA,QACA,aAAA,QAGF,sCAAA,2BAEE,WAAA,EAAA,EAAA,EAAA,OAAA,mBAGF,uCAAA,wCAAA,4BAAA,0CAAA,4BAKE,MAAA,KACA,iBAAA,QACA,aAAA,QAEA,6CAAA,8CAAA,kCAAA,gDAAA,kCAKI,WAAA,EAAA,EAAA,EAAA,OAAA,mBAKN,8BAAA,8BAEE,MAAA,QACA,iBAAA,YDvDF,kBCmBA,MAAA,QACA,aAAA,QAEA,wBACE,MAAA,KACA,iBAAA,QACA,aAAA,QAGF,mCAAA,wBAEE,WAAA,EAAA,EAAA,EAAA,OAAA,oBAGF,oCAAA,qCAAA,yBAAA,uCAAA,yBAKE,MAAA,KACA,iBAAA,QACA,aAAA,QAEA,0CAAA,2CAAA,+BAAA,6CAAA,+BAKI,WAAA,EAAA,EAAA,EAAA,OAAA,oBAKN,2BAAA,2BAEE,MAAA,QACA,iBAAA,YDvDF,qBCmBA,MAAA,QACA,aAAA,QAEA,2BACE,MAAA,KACA,iBAAA,QACA,aAAA,QAGF,sCAAA,2BAEE,WAAA,EAAA,EAAA,EAAA,OAAA,mBAGF,uCAAA,wCAAA,4BAAA,0CAAA,4BAKE,MAAA,KACA,iBAAA,QACA,aAAA,QAEA,6CAAA,8CAAA,kCAAA,gDAAA,kCAKI,WAAA,EAAA,EAAA,EAAA,OAAA,mBAKN,8BAAA,8BAEE,MAAA,QACA,iBAAA,YDvDF,oBCmBA,MAAA,QACA,aAAA,QAEA,0BACE,MAAA,KACA,iBAAA,QACA,aAAA,QAGF,qCAAA,0BAEE,WAAA,EAAA,EAAA,EAAA,OAAA,mBAGF,sCAAA,uCAAA,2BAAA,yCAAA,2BAKE,MAAA,KACA,iBAAA,QACA,aAAA,QAEA,4CAAA,6CAAA,iCAAA,+CAAA,iCAKI,WAAA,EAAA,EAAA,EAAA,OAAA,mBAKN,6BAAA,6BAEE,MAAA,QACA,iBAAA,YDvDF,mBCmBA,MAAA,QACA,aAAA,QAEA,yBACE,MAAA,KACA,iBAAA,QACA,aAAA,QAGF,oCAAA,yBAEE,WAAA,EAAA,EAAA,EAAA,OAAA,qBAGF,qCAAA,sCAAA,0BAAA,wCAAA,0BAKE,MAAA,KACA,iBAAA,QACA,aAAA,QAEA,2CAAA,4CAAA,gCAAA,8CAAA,gCAKI,WAAA,EAAA,EAAA,EAAA,OAAA,qBAKN,4BAAA,4BAEE,MAAA,QACA,iBAAA,YDvDF,kBCmBA,MAAA,QACA,aAAA,QAEA,wBACE,MAAA,KACA,iBAAA,QACA,aAAA,QAGF,mCAAA,wBAEE,WAAA,EAAA,EAAA,EAAA,OAAA,kBAGF,oCAAA,qCAAA,yBAAA,uCAAA,yBAKE,MAAA,KACA,iBAAA,QACA,aAAA,QAEA,0CAAA,2CAAA,+BAAA,6CAAA,+BAKI,WAAA,EAAA,EAAA,EAAA,OAAA,kBAKN,2BAAA,2BAEE,MAAA,QACA,iBAAA,YD3CJ,UACE,YAAA,IACA,MAAA,QACA,gBAAA,UAEA,gBACE,MAAA,QAQF,mBAAA,mBAEE,MAAA,QAWJ,mBAAA,QCuBE,QAAA,MAAA,KzBsKI,UAAA,QClRF,cAAA,MuByFJ,mBAAA,QCmBE,QAAA,OAAA,MzBsKI,UAAA,QClRF,cAAA,MyBnBJ,MVgBM,WAAA,QAAA,KAAA,OAIA,uCUpBN,MVqBQ,WAAA,MUlBN,iBACE,QAAA,EAMF,qBACE,QAAA,KAIJ,YACE,OAAA,EACA,SAAA,OVDI,WAAA,OAAA,KAAA,KAIA,uCULN,YVMQ,WAAA,MUDN,gCACE,MAAA,EACA,OAAA,KVNE,WAAA,MAAA,KAAA,KAIA,uCUAJ,gCVCM,WAAA,MjBm6GR,UADA,SAEA,W4Bx7GA,QAIE,SAAA,SAGF,iBACE,YAAA,OCqBE,wBACE,QAAA,aACA,YAAA,OACA,eAAA,OACA,QAAA,GAhCJ,WAAA,KAAA,MACA,aAAA,KAAA,MAAA,YACA,cAAA,EACA,YAAA,KAAA,MAAA,YAqDE,8BACE,YAAA,ED3CN,eACE,SAAA,SACA,QAAA,KACA,QAAA,KACA,UAAA,MACA,QAAA,MAAA,EACA,OAAA,E3B+QI,UAAA,K2B7QJ,MAAA,QACA,WAAA,KACA,WAAA,KACA,iBAAA,KACA,gBAAA,YACA,OAAA,IAAA,MAAA,gB1BVE,cAAA,O0BcF,+BACE,IAAA,KACA,KAAA,EACA,WAAA,QAYA,qBACE,cAAA,MAEA,qCACE,MAAA,KACA,KAAA,EAIJ,mBACE,cAAA,IAEA,mCACE,MAAA,EACA,KAAA,KnBCJ,yBmBfA,wBACE,cAAA,MAEA,wCACE,MAAA,KACA,KAAA,EAIJ,sBACE,cAAA,IAEA,sCACE,MAAA,EACA,KAAA,MnBCJ,yBmBfA,wBACE,cAAA,MAEA,wCACE,MAAA,KACA,KAAA,EAIJ,sBACE,cAAA,IAEA,sCACE,MAAA,EACA,KAAA,MnBCJ,yBmBfA,wBACE,cAAA,MAEA,wCACE,MAAA,KACA,KAAA,EAIJ,sBACE,cAAA,IAEA,sCACE,MAAA,EACA,KAAA,MnBCJ,0BmBfA,wBACE,cAAA,MAEA,wCACE,MAAA,KACA,KAAA,EAIJ,sBACE,cAAA,IAEA,sCACE,MAAA,EACA,KAAA,MnBCJ,0BmBfA,yBACE,cAAA,MAEA,yCACE,MAAA,KACA,KAAA,EAIJ,uBACE,cAAA,IAEA,uCACE,MAAA,EACA,KAAA,MAUN,uCACE,IAAA,KACA,OAAA,KACA,WAAA,EACA,cAAA,QC9CA,gCACE,QAAA,aACA,YAAA,OACA,eAAA,OACA,QAAA,GAzBJ,WAAA,EACA,aAAA,KAAA,MAAA,YACA,cAAA,KAAA,MACA,YAAA,KAAA,MAAA,YA8CE,sCACE,YAAA,ED0BJ,wCACE,IAAA,EACA,MAAA,KACA,KAAA,KACA,WAAA,EACA,YAAA,QC5DA,iCACE,QAAA,aACA,YAAA,OACA,eAAA,OACA,QAAA,GAlBJ,WAAA,KAAA,MAAA,YACA,aAAA,EACA,cAAA,KAAA,MAAA,YACA,YAAA,KAAA,MAuCE,uCACE,YAAA,EDoCF,iCACE,eAAA,EAMJ,0CACE,IAAA,EACA,MAAA,KACA,KAAA,KACA,WAAA,EACA,aAAA,QC7EA,mCACE,QAAA,aACA,YAAA,OACA,eAAA,OACA,QAAA,GAWA,mCACE,QAAA,KAGF,oCACE,QAAA,aACA,aAAA,OACA,eAAA,OACA,QAAA,GA9BN,WAAA,KAAA,MAAA,YACA,aAAA,KAAA,MACA,cAAA,KAAA,MAAA,YAiCE,yCACE,YAAA,EDqDF,oCACE,eAAA,EAON,kBACE,OAAA,EACA,OAAA,MAAA,EACA,SAAA,OACA,WAAA,IAAA,MAAA,gBAMF,eACE,QAAA,MACA,MAAA,KACA,QAAA,OAAA,KACA,MAAA,KACA,YAAA,IACA,MAAA,QACA,WAAA,QACA,gBAAA,KACA,YAAA,OACA,iBAAA,YACA,OAAA,EAcA,qBAAA,qBAEE,MAAA,QVzJF,iBAAA,QU8JA,sBAAA,sBAEE,MAAA,KACA,gBAAA,KVjKF,iBAAA,QUqKA,wBAAA,wBAEE,MAAA,QACA,eAAA,KACA,iBAAA,YAMJ,oBACE,QAAA,MAIF,iBACE,QAAA,MACA,QAAA,MAAA,KACA,cAAA,E3B0GI,UAAA,Q2BxGJ,MAAA,QACA,YAAA,OAIF,oBACE,QAAA,MACA,QAAA,OAAA,KACA,MAAA,QAIF,oBACE,MAAA,QACA,iBAAA,QACA,aAAA,gBAGA,mCACE,MAAA,QAEA,yCAAA,yCAEE,MAAA,KVhNJ,iBAAA,sBUoNE,0CAAA,0CAEE,MAAA,KVtNJ,iBAAA,QU0NE,4CAAA,4CAEE,MAAA,QAIJ,sCACE,aAAA,gBAGF,wCACE,MAAA,QAGF,qCACE,MAAA,QE5OJ,W9BwuHA,oB8BtuHE,SAAA,SACA,QAAA,YACA,eAAA,O9B0uHF,yB8BxuHE,gBACE,SAAA,SACA,KAAA,EAAA,EAAA,K9BgvHJ,4CACA,0CAIA,gCADA,gCADA,+BADA,+B8B7uHE,mC9BsuHF,iCAIA,uBADA,uBADA,sBADA,sB8BjuHI,QAAA,EAKJ,aACE,QAAA,KACA,UAAA,KACA,gBAAA,WAEA,0BACE,MAAA,K9B6uHJ,wC8BvuHE,kCAEE,YAAA,K9ByuHJ,4C8BruHE,uD5BRE,wBAAA,EACA,2BAAA,EFkvHJ,6C8BluHE,+B9BiuHF,iCEpuHI,uBAAA,EACA,0BAAA,E4BqBJ,uBACE,cAAA,SACA,aAAA,SAEA,8BAAA,uCAAA,sCAGE,YAAA,EAGF,0CACE,aAAA,EAIJ,0CAAA,+BACE,cAAA,QACA,aAAA,QAGF,0CAAA,+BACE,cAAA,OACA,aAAA,OAoBF,oBACE,eAAA,OACA,YAAA,WACA,gBAAA,OAEA,yB9BgsHF,+B8B9rHI,MAAA,K9BksHJ,iD8B/rHE,2CAEE,WAAA,K9BisHJ,qD8B7rHE,gE5BvFE,2BAAA,EACA,0BAAA,EFwxHJ,sD8B7rHE,8B5B1GE,uBAAA,EACA,wBAAA,E6BxBJ,KACE,QAAA,KACA,UAAA,KACA,aAAA,EACA,cAAA,EACA,WAAA,KAGF,UACE,QAAA,MACA,QAAA,MAAA,KAGA,MAAA,QACA,gBAAA,KdHI,WAAA,MAAA,KAAA,WAAA,CAAA,iBAAA,KAAA,WAAA,CAAA,aAAA,KAAA,YAIA,uCcPN,UdQQ,WAAA,McCN,gBAAA,gBAEE,MAAA,QAKF,mBACE,MAAA,QACA,eAAA,KACA,OAAA,QAQJ,UACE,cAAA,IAAA,MAAA,QAEA,oBACE,cAAA,KACA,WAAA,IACA,OAAA,IAAA,MAAA,Y7BlBA,uBAAA,OACA,wBAAA,O6BoBA,0BAAA,0BAEE,aAAA,QAAA,QAAA,QAEA,UAAA,QAGF,6BACE,MAAA,QACA,iBAAA,YACA,aAAA,Y/B8zHN,mC+B1zHE,2BAEE,MAAA,QACA,iBAAA,KACA,aAAA,QAAA,QAAA,KAGF,yBAEE,WAAA,K7B5CA,uBAAA,EACA,wBAAA,E6BuDF,qBACE,WAAA,IACA,OAAA,E7BnEA,cAAA,O6BuEF,4B/BgzHF,2B+B9yHI,MAAA,KbxFF,iBAAA,QlB44HF,oB+BzyHE,oBAEE,KAAA,EAAA,EAAA,KACA,WAAA,O/B4yHJ,yB+BvyHE,yBAEE,WAAA,EACA,UAAA,EACA,WAAA,OAMF,8B/BoyHF,mC+BnyHI,MAAA,KAUF,uBACE,QAAA,KAEF,qBACE,QAAA,MCxHJ,QACE,SAAA,SACA,QAAA,KACA,UAAA,KACA,YAAA,OACA,gBAAA,cACA,YAAA,MAEA,eAAA,MAOA,mBhCm5HF,yBAGA,sBADA,sBADA,sBAGA,sBACA,uBgCv5HI,QAAA,KACA,UAAA,QACA,YAAA,OACA,gBAAA,cAoBJ,cACE,YAAA,SACA,eAAA,SACA,aAAA,K/B2OI,UAAA,Q+BzOJ,gBAAA,KACA,YAAA,OAaF,YACE,QAAA,KACA,eAAA,OACA,aAAA,EACA,cAAA,EACA,WAAA,KAEA,sBACE,cAAA,EACA,aAAA,EAGF,2BACE,SAAA,OASJ,aACE,YAAA,MACA,eAAA,MAYF,iBACE,WAAA,KACA,UAAA,EAGA,YAAA,OAIF,gBACE,QAAA,OAAA,O/B6KI,UAAA,Q+B3KJ,YAAA,EACA,iBAAA,YACA,OAAA,IAAA,MAAA,Y9BzGE,cAAA,OeHE,WAAA,WAAA,KAAA,YAIA,uCemGN,gBflGQ,WAAA,Me2GN,sBACE,gBAAA,KAGF,sBACE,gBAAA,KACA,QAAA,EACA,WAAA,EAAA,EAAA,EAAA,OAMJ,qBACE,QAAA,aACA,MAAA,MACA,OAAA,MACA,eAAA,OACA,kBAAA,UACA,oBAAA,OACA,gBAAA,KAGF,mBACE,WAAA,6BACA,WAAA,KvB1FE,yBuBsGA,kBAEI,UAAA,OACA,gBAAA,WAEA,8BACE,eAAA,IAEA,6CACE,SAAA,SAGF,wCACE,cAAA,MACA,aAAA,MAIJ,qCACE,SAAA,QAGF,mCACE,QAAA,eACA,WAAA,KAGF,kCACE,QAAA,KAGF,oCACE,QAAA,KAGF,6BACE,SAAA,QACA,OAAA,EACA,QAAA,KACA,UAAA,EACA,WAAA,kBACA,iBAAA,YACA,aAAA,EACA,YAAA,EfhMJ,WAAA,KekMI,UAAA,KhC41HV,oCgC11HQ,iCAEE,OAAA,KACA,WAAA,EACA,cAAA,EAGF,kCACE,QAAA,KACA,UAAA,EACA,QAAA,EACA,WAAA,SvBhKN,yBuBsGA,kBAEI,UAAA,OACA,gBAAA,WAEA,8BACE,eAAA,IAEA,6CACE,SAAA,SAGF,wCACE,cAAA,MACA,aAAA,MAIJ,qCACE,SAAA,QAGF,mCACE,QAAA,eACA,WAAA,KAGF,kCACE,QAAA,KAGF,oCACE,QAAA,KAGF,6BACE,SAAA,QACA,OAAA,EACA,QAAA,KACA,UAAA,EACA,WAAA,kBACA,iBAAA,YACA,aAAA,EACA,YAAA,EfhMJ,WAAA,KekMI,UAAA,KhCi5HV,oCgC/4HQ,iCAEE,OAAA,KACA,WAAA,EACA,cAAA,EAGF,kCACE,QAAA,KACA,UAAA,EACA,QAAA,EACA,WAAA,SvBhKN,yBuBsGA,kBAEI,UAAA,OACA,gBAAA,WAEA,8BACE,eAAA,IAEA,6CACE,SAAA,SAGF,wCACE,cAAA,MACA,aAAA,MAIJ,qCACE,SAAA,QAGF,mCACE,QAAA,eACA,WAAA,KAGF,kCACE,QAAA,KAGF,oCACE,QAAA,KAGF,6BACE,SAAA,QACA,OAAA,EACA,QAAA,KACA,UAAA,EACA,WAAA,kBACA,iBAAA,YACA,aAAA,EACA,YAAA,EfhMJ,WAAA,KekMI,UAAA,KhCs8HV,oCgCp8HQ,iCAEE,OAAA,KACA,WAAA,EACA,cAAA,EAGF,kCACE,QAAA,KACA,UAAA,EACA,QAAA,EACA,WAAA,SvBhKN,0BuBsGA,kBAEI,UAAA,OACA,gBAAA,WAEA,8BACE,eAAA,IAEA,6CACE,SAAA,SAGF,wCACE,cAAA,MACA,aAAA,MAIJ,qCACE,SAAA,QAGF,mCACE,QAAA,eACA,WAAA,KAGF,kCACE,QAAA,KAGF,oCACE,QAAA,KAGF,6BACE,SAAA,QACA,OAAA,EACA,QAAA,KACA,UAAA,EACA,WAAA,kBACA,iBAAA,YACA,aAAA,EACA,YAAA,EfhMJ,WAAA,KekMI,UAAA,KhC2/HV,oCgCz/HQ,iCAEE,OAAA,KACA,WAAA,EACA,cAAA,EAGF,kCACE,QAAA,KACA,UAAA,EACA,QAAA,EACA,WAAA,SvBhKN,0BuBsGA,mBAEI,UAAA,OACA,gBAAA,WAEA,+BACE,eAAA,IAEA,8CACE,SAAA,SAGF,yCACE,cAAA,MACA,aAAA,MAIJ,sCACE,SAAA,QAGF,oCACE,QAAA,eACA,WAAA,KAGF,mCACE,QAAA,KAGF,qCACE,QAAA,KAGF,8BACE,SAAA,QACA,OAAA,EACA,QAAA,KACA,UAAA,EACA,WAAA,kBACA,iBAAA,YACA,aAAA,EACA,YAAA,EfhMJ,WAAA,KekMI,UAAA,KhCgjIV,qCgC9iIQ,kCAEE,OAAA,KACA,WAAA,EACA,cAAA,EAGF,mCACE,QAAA,KACA,UAAA,EACA,QAAA,EACA,WAAA,SA1DN,eAEI,UAAA,OACA,gBAAA,WAEA,2BACE,eAAA,IAEA,0CACE,SAAA,SAGF,qCACE,cAAA,MACA,aAAA,MAIJ,kCACE,SAAA,QAGF,gCACE,QAAA,eACA,WAAA,KAGF,+BACE,QAAA,KAGF,iCACE,QAAA,KAGF,0BACE,SAAA,QACA,OAAA,EACA,QAAA,KACA,UAAA,EACA,WAAA,kBACA,iBAAA,YACA,aAAA,EACA,YAAA,EfhMJ,WAAA,KekMI,UAAA,KhComIV,iCgClmIQ,8BAEE,OAAA,KACA,WAAA,EACA,cAAA,EAGF,+BACE,QAAA,KACA,UAAA,EACA,QAAA,EACA,WAAA,QAcR,4BACE,MAAA,eAEA,kCAAA,kCAEE,MAAA,eAKF,oCACE,MAAA,gBAEA,0CAAA,0CAEE,MAAA,eAGF,6CACE,MAAA,ehCklIR,2CgC9kII,0CAEE,MAAA,eAIJ,8BACE,MAAA,gBACA,aAAA,eAGF,mCACE,iBAAA,4OAGF,2BACE,MAAA,gBAEA,6BhC2kIJ,mCADA,mCgCvkIM,MAAA,eAOJ,2BACE,MAAA,KAEA,iCAAA,iCAEE,MAAA,KAKF,mCACE,MAAA,sBAEA,yCAAA,yCAEE,MAAA,sBAGF,4CACE,MAAA,sBhCkkIR,0CgC9jII,yCAEE,MAAA,KAIJ,6BACE,MAAA,sBACA,aAAA,qBAGF,kCACE,iBAAA,kPAGF,0BACE,MAAA,sBACA,4BhC4jIJ,kCADA,kCgCxjIM,MAAA,KCvUN,MACE,SAAA,SACA,QAAA,KACA,eAAA,OACA,UAAA,EAEA,UAAA,WACA,iBAAA,KACA,gBAAA,WACA,OAAA,IAAA,MAAA,iB/BME,cAAA,O+BFF,SACE,aAAA,EACA,YAAA,EAGF,kBACE,WAAA,QACA,cAAA,QAEA,8BACE,iBAAA,E/BCF,uBAAA,mBACA,wBAAA,mB+BEA,6BACE,oBAAA,E/BUF,2BAAA,mBACA,0BAAA,mB+BJF,+BjC+3IF,+BiC73II,WAAA,EAIJ,WAGE,KAAA,EAAA,EAAA,KACA,QAAA,KAAA,KAIF,YACE,cAAA,MAGF,eACE,WAAA,QACA,cAAA,EAGF,sBACE,cAAA,EAQA,sBACE,YAAA,KAQJ,aACE,QAAA,MAAA,KACA,cAAA,EAEA,iBAAA,gBACA,cAAA,IAAA,MAAA,iBAEA,yB/BpEE,cAAA,mBAAA,mBAAA,EAAA,E+ByEJ,aACE,QAAA,MAAA,KAEA,iBAAA,gBACA,WAAA,IAAA,MAAA,iBAEA,wB/B/EE,cAAA,EAAA,EAAA,mBAAA,mB+ByFJ,kBACE,aAAA,OACA,cAAA,OACA,YAAA,OACA,cAAA,EAUF,mBACE,aAAA,OACA,YAAA,OAIF,kBACE,SAAA,SACA,IAAA,EACA,MAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,K/BnHE,cAAA,mB+BuHJ,UjCi2IA,iBADA,ciC71IE,MAAA,KAGF,UjCg2IA,cEp9II,uBAAA,mBACA,wBAAA,mB+BwHJ,UjCi2IA,iBE58II,2BAAA,mBACA,0BAAA,mB+BuHF,kBACE,cAAA,OxBpGA,yBwBgGJ,YAQI,QAAA,KACA,UAAA,IAAA,KAGA,kBAEE,KAAA,EAAA,EAAA,GACA,cAAA,EAEA,wBACE,YAAA,EACA,YAAA,EAKA,mC/BpJJ,wBAAA,EACA,2BAAA,EF4+IJ,gDiCt1IU,iDAGE,wBAAA,EjCu1IZ,gDiCr1IU,oDAGE,2BAAA,EAIJ,oC/BrJJ,uBAAA,EACA,0BAAA,EF0+IJ,iDiCn1IU,kDAGE,uBAAA,EjCo1IZ,iDiCl1IU,qDAGE,0BAAA,GC7MZ,kBACE,SAAA,SACA,QAAA,KACA,YAAA,OACA,MAAA,KACA,QAAA,KAAA,QjC4RI,UAAA,KiC1RJ,MAAA,QACA,WAAA,KACA,iBAAA,KACA,OAAA,EhCKE,cAAA,EgCHF,gBAAA,KjBAI,WAAA,MAAA,KAAA,WAAA,CAAA,iBAAA,KAAA,WAAA,CAAA,aAAA,KAAA,WAAA,CAAA,WAAA,KAAA,WAAA,CAAA,cAAA,KAAA,KAIA,uCiBhBN,kBjBiBQ,WAAA,MiBFN,kCACE,MAAA,QACA,iBAAA,QACA,WAAA,MAAA,EAAA,KAAA,EAAA,iBAEA,yCACE,iBAAA,gRACA,UAAA,gBAKJ,yBACE,YAAA,EACA,MAAA,QACA,OAAA,QACA,YAAA,KACA,QAAA,GACA,iBAAA,gRACA,kBAAA,UACA,gBAAA,QjBvBE,WAAA,UAAA,IAAA,YAIA,uCiBWJ,yBjBVM,WAAA,MiBsBN,wBACE,QAAA,EAGF,wBACE,QAAA,EACA,aAAA,QACA,QAAA,EACA,WAAA,EAAA,EAAA,EAAA,OAAA,qBAIJ,kBACE,cAAA,EAGF,gBACE,iBAAA,KACA,OAAA,IAAA,MAAA,iBAEA,8BhCnCE,uBAAA,OACA,wBAAA,OgCqCA,gDhCtCA,uBAAA,mBACA,wBAAA,mBgC0CF,oCACE,WAAA,EAIF,6BhClCE,2BAAA,OACA,0BAAA,OgCqCE,yDhCtCF,2BAAA,mBACA,0BAAA,mBgC0CA,iDhC3CA,2BAAA,OACA,0BAAA,OgCgDJ,gBACE,QAAA,KAAA,QASA,qCACE,aAAA,EAGF,iCACE,aAAA,EACA,YAAA,EhCxFA,cAAA,EgC2FA,6CAAgB,WAAA,EAChB,4CAAe,cAAA,EAEf,mDhC9FA,cAAA,EiCnBJ,YACE,QAAA,KACA,UAAA,KACA,QAAA,EAAA,EACA,cAAA,KAEA,WAAA,KAOA,kCACE,aAAA,MAEA,0CACE,MAAA,KACA,cAAA,MACA,MAAA,QACA,QAAA,kCAIJ,wBACE,MAAA,QCzBJ,YACE,QAAA,KhCGA,aAAA,EACA,WAAA,KgCAF,WACE,SAAA,SACA,QAAA,MACA,MAAA,QACA,gBAAA,KACA,iBAAA,KACA,OAAA,IAAA,MAAA,QnBKI,WAAA,MAAA,KAAA,WAAA,CAAA,iBAAA,KAAA,WAAA,CAAA,aAAA,KAAA,WAAA,CAAA,WAAA,KAAA,YAIA,uCmBfN,WnBgBQ,WAAA,MmBPN,iBACE,QAAA,EACA,MAAA,QAEA,iBAAA,QACA,aAAA,QAGF,iBACE,QAAA,EACA,MAAA,QACA,iBAAA,QACA,QAAA,EACA,WAAA,EAAA,EAAA,EAAA,OAAA,qBAKF,wCACE,YAAA,KAGF,6BACE,QAAA,EACA,MAAA,KlBlCF,iBAAA,QkBoCE,aAAA,QAGF,+BACE,MAAA,QACA,eAAA,KACA,iBAAA,KACA,aAAA,QC3CF,WACE,QAAA,QAAA,OAOI,kCnCqCJ,uBAAA,OACA,0BAAA,OmChCI,iCnCiBJ,wBAAA,OACA,2BAAA,OmChCF,0BACE,QAAA,OAAA,OpCgSE,UAAA,QoCzRE,iDnCqCJ,uBAAA,MACA,0BAAA,MmChCI,gDnCiBJ,wBAAA,MACA,2BAAA,MmChCF,0BACE,QAAA,OAAA,MpCgSE,UAAA,QoCzRE,iDnCqCJ,uBAAA,MACA,0BAAA,MmChCI,gDnCiBJ,wBAAA,MACA,2BAAA,MoC/BJ,OACE,QAAA,aACA,QAAA,MAAA,MrC8RI,UAAA,MqC5RJ,YAAA,IACA,YAAA,EACA,MAAA,KACA,WAAA,OACA,YAAA,OACA,eAAA,SpCKE,cAAA,OoCAF,aACE,QAAA,KAKJ,YACE,SAAA,SACA,IAAA,KCvBF,OACE,SAAA,SACA,QAAA,KAAA,KACA,cAAA,KACA,OAAA,IAAA,MAAA,YrCWE,cAAA,OqCNJ,eAEE,MAAA,QAIF,YACE,YAAA,IAQF,mBACE,cAAA,KAGA,8BACE,SAAA,SACA,IAAA,EACA,MAAA,EACA,QAAA,EACA,QAAA,QAAA,KAeF,eClDA,MAAA,QtBEA,iBAAA,QsBAA,aAAA,QAEA,2BACE,MAAA,QD6CF,iBClDA,MAAA,QtBEA,iBAAA,QsBAA,aAAA,QAEA,6BACE,MAAA,QD6CF,eClDA,MAAA,QtBEA,iBAAA,QsBAA,aAAA,QAEA,2BACE,MAAA,QD6CF,YClDA,MAAA,QtBEA,iBAAA,QsBAA,aAAA,QAEA,wBACE,MAAA,QD6CF,eClDA,MAAA,QtBEA,iBAAA,QsBAA,aAAA,QAEA,2BACE,MAAA,QD6CF,cClDA,MAAA,QtBEA,iBAAA,QsBAA,aAAA,QAEA,0BACE,MAAA,QD6CF,aClDA,MAAA,QtBEA,iBAAA,QsBAA,aAAA,QAEA,yBACE,MAAA,QD6CF,YClDA,MAAA,QtBEA,iBAAA,QsBAA,aAAA,QAEA,wBACE,MAAA,QCHF,wCACE,GAAK,sBAAA,MADP,gCACE,GAAK,sBAAA,MAKT,UACE,QAAA,KACA,OAAA,KACA,SAAA,OxCwRI,UAAA,OwCtRJ,iBAAA,QvCIE,cAAA,OuCCJ,cACE,QAAA,KACA,eAAA,OACA,gBAAA,OACA,SAAA,OACA,MAAA,KACA,WAAA,OACA,YAAA,OACA,iBAAA,QxBZI,WAAA,MAAA,IAAA,KAIA,uCwBAN,cxBCQ,WAAA,MwBWR,sBvBYE,iBAAA,iKuBVA,gBAAA,KAAA,KAIA,uBACE,kBAAA,GAAA,OAAA,SAAA,qBAAA,UAAA,GAAA,OAAA,SAAA,qBAGE,uCAJJ,uBAKM,kBAAA,KAAA,UAAA,MCvCR,YACE,QAAA,KACA,eAAA,OAGA,aAAA,EACA,cAAA,ExCSE,cAAA,OwCLJ,qBACE,gBAAA,KACA,cAAA,QAEA,gCAEE,QAAA,uBAAA,KACA,kBAAA,QAUJ,wBACE,MAAA,KACA,MAAA,QACA,WAAA,QAGA,8BAAA,8BAEE,QAAA,EACA,MAAA,QACA,gBAAA,KACA,iBAAA,QAGF,+BACE,MAAA,QACA,iBAAA,QASJ,iBACE,SAAA,SACA,QAAA,MACA,QAAA,MAAA,KACA,MAAA,QACA,gBAAA,KACA,iBAAA,KACA,OAAA,IAAA,MAAA,iBAEA,6BxCrCE,uBAAA,QACA,wBAAA,QwCwCF,4BxC3BE,2BAAA,QACA,0BAAA,QwC8BF,0BAAA,0BAEE,MAAA,QACA,eAAA,KACA,iBAAA,KAIF,wBACE,QAAA,EACA,MAAA,KACA,iBAAA,QACA,aAAA,QAGF,kCACE,iBAAA,EAEA,yCACE,WAAA,KACA,iBAAA,IAcF,uBACE,eAAA,IAGE,oDxCrCJ,0BAAA,OAZA,wBAAA,EwCsDI,mDxCtDJ,wBAAA,OAYA,0BAAA,EwC+CI,+CACE,WAAA,EAGF,yDACE,iBAAA,IACA,kBAAA,EAEA,gEACE,YAAA,KACA,kBAAA,IjCpER,yBiC4CA,0BACE,eAAA,IAGE,uDxCrCJ,0BAAA,OAZA,wBAAA,EwCsDI,sDxCtDJ,wBAAA,OAYA,0BAAA,EwC+CI,kDACE,WAAA,EAGF,4DACE,iBAAA,IACA,kBAAA,EAEA,mEACE,YAAA,KACA,kBAAA,KjCpER,yBiC4CA,0BACE,eAAA,IAGE,uDxCrCJ,0BAAA,OAZA,wBAAA,EwCsDI,sDxCtDJ,wBAAA,OAYA,0BAAA,EwC+CI,kDACE,WAAA,EAGF,4DACE,iBAAA,IACA,kBAAA,EAEA,mEACE,YAAA,KACA,kBAAA,KjCpER,yBiC4CA,0BACE,eAAA,IAGE,uDxCrCJ,0BAAA,OAZA,wBAAA,EwCsDI,sDxCtDJ,wBAAA,OAYA,0BAAA,EwC+CI,kDACE,WAAA,EAGF,4DACE,iBAAA,IACA,kBAAA,EAEA,mEACE,YAAA,KACA,kBAAA,KjCpER,0BiC4CA,0BACE,eAAA,IAGE,uDxCrCJ,0BAAA,OAZA,wBAAA,EwCsDI,sDxCtDJ,wBAAA,OAYA,0BAAA,EwC+CI,kDACE,WAAA,EAGF,4DACE,iBAAA,IACA,kBAAA,EAEA,mEACE,YAAA,KACA,kBAAA,KjCpER,0BiC4CA,2BACE,eAAA,IAGE,wDxCrCJ,0BAAA,OAZA,wBAAA,EwCsDI,uDxCtDJ,wBAAA,OAYA,0BAAA,EwC+CI,mDACE,WAAA,EAGF,6DACE,iBAAA,IACA,kBAAA,EAEA,oEACE,YAAA,KACA,kBAAA,KAcZ,kBxC9HI,cAAA,EwCiIF,mCACE,aAAA,EAAA,EAAA,IAEA,8CACE,oBAAA,ECpJJ,yBACE,MAAA,QACA,iBAAA,QAGE,sDAAA,sDAEE,MAAA,QACA,iBAAA,QAGF,uDACE,MAAA,KACA,iBAAA,QACA,aAAA,QAdN,2BACE,MAAA,QACA,iBAAA,QAGE,wDAAA,wDAEE,MAAA,QACA,iBAAA,QAGF,yDACE,MAAA,KACA,iBAAA,QACA,aAAA,QAdN,yBACE,MAAA,QACA,iBAAA,QAGE,sDAAA,sDAEE,MAAA,QACA,iBAAA,QAGF,uDACE,MAAA,KACA,iBAAA,QACA,aAAA,QAdN,sBACE,MAAA,QACA,iBAAA,QAGE,mDAAA,mDAEE,MAAA,QACA,iBAAA,QAGF,oDACE,MAAA,KACA,iBAAA,QACA,aAAA,QAdN,yBACE,MAAA,QACA,iBAAA,QAGE,sDAAA,sDAEE,MAAA,QACA,iBAAA,QAGF,uDACE,MAAA,KACA,iBAAA,QACA,aAAA,QAdN,wBACE,MAAA,QACA,iBAAA,QAGE,qDAAA,qDAEE,MAAA,QACA,iBAAA,QAGF,sDACE,MAAA,KACA,iBAAA,QACA,aAAA,QAdN,uBACE,MAAA,QACA,iBAAA,QAGE,oDAAA,oDAEE,MAAA,QACA,iBAAA,QAGF,qDACE,MAAA,KACA,iBAAA,QACA,aAAA,QAdN,sBACE,MAAA,QACA,iBAAA,QAGE,mDAAA,mDAEE,MAAA,QACA,iBAAA,QAGF,oDACE,MAAA,KACA,iBAAA,QACA,aAAA,QCbR,WACE,WAAA,YACA,MAAA,IACA,OAAA,IACA,QAAA,MAAA,MACA,MAAA,KACA,WAAA,YAAA,0TAAA,MAAA,CAAA,IAAA,KAAA,UACA,OAAA,E1COE,cAAA,O0CLF,QAAA,GAGA,iBACE,MAAA,KACA,gBAAA,KACA,QAAA,IAGF,iBACE,QAAA,EACA,WAAA,EAAA,EAAA,EAAA,OAAA,qBACA,QAAA,EAGF,oBAAA,oBAEE,eAAA,KACA,oBAAA,KAAA,iBAAA,KAAA,YAAA,KACA,QAAA,IAIJ,iBACE,OAAA,UAAA,gBAAA,iBCtCF,OACE,MAAA,MACA,UAAA,K5CmSI,UAAA,Q4ChSJ,eAAA,KACA,iBAAA,sBACA,gBAAA,YACA,OAAA,IAAA,MAAA,eACA,WAAA,EAAA,MAAA,KAAA,gB3CUE,cAAA,O2CPF,eACE,QAAA,EAGF,kBACE,QAAA,KAIJ,iBACE,MAAA,oBAAA,MAAA,iBAAA,MAAA,YACA,UAAA,KACA,eAAA,KAEA,mCACE,cAAA,OAIJ,cACE,QAAA,KACA,YAAA,OACA,QAAA,MAAA,OACA,MAAA,QACA,iBAAA,sBACA,gBAAA,YACA,cAAA,IAAA,MAAA,gB3CVE,uBAAA,mBACA,wBAAA,mB2CYF,yBACE,aAAA,SACA,YAAA,OAIJ,YACE,QAAA,OACA,UAAA,WC1CF,OACE,SAAA,MACA,IAAA,EACA,KAAA,EACA,QAAA,KACA,QAAA,KACA,MAAA,KACA,OAAA,KACA,WAAA,OACA,WAAA,KAGA,QAAA,EAOF,cACE,SAAA,SACA,MAAA,KACA,OAAA,MAEA,eAAA,KAGA,0B7BlBI,WAAA,UAAA,IAAA,S6BoBF,UAAA,mB7BhBE,uC6BcJ,0B7BbM,WAAA,M6BiBN,0BACE,UAAA,KAIF,kCACE,UAAA,YAIJ,yBACE,OAAA,kBAEA,wCACE,WAAA,KACA,SAAA,OAGF,qCACE,WAAA,KAIJ,uBACE,QAAA,KACA,YAAA,OACA,WAAA,kBAIF,eACE,SAAA,SACA,QAAA,KACA,eAAA,OACA,MAAA,KAGA,eAAA,KACA,iBAAA,KACA,gBAAA,YACA,OAAA,IAAA,MAAA,e5C3DE,cAAA,M4C+DF,QAAA,EAIF,gBCpFE,SAAA,MACA,IAAA,EACA,KAAA,EACA,QAAA,KACA,MAAA,MACA,OAAA,MACA,iBAAA,KAGA,qBAAS,QAAA,EACT,qBAAS,QAAA,GDgFX,cACE,QAAA,KACA,YAAA,EACA,YAAA,OACA,gBAAA,cACA,QAAA,KAAA,KACA,cAAA,IAAA,MAAA,Q5CtEE,uBAAA,kBACA,wBAAA,kB4CwEF,yBACE,QAAA,MAAA,MACA,OAAA,OAAA,OAAA,OAAA,KAKJ,aACE,cAAA,EACA,YAAA,IAKF,YACE,SAAA,SAGA,KAAA,EAAA,EAAA,KACA,QAAA,KAIF,cACE,QAAA,KACA,UAAA,KACA,YAAA,EACA,YAAA,OACA,gBAAA,SACA,QAAA,OACA,WAAA,IAAA,MAAA,Q5CzFE,2BAAA,kBACA,0BAAA,kB4C8FF,gBACE,OAAA,OrC3EA,yBqCkFF,cACE,UAAA,MACA,OAAA,QAAA,KAGF,yBACE,OAAA,oBAGF,uBACE,WAAA,oBAOF,UAAY,UAAA,OrCnGV,yBqCuGF,U9CszKF,U8CpzKI,UAAA,OrCzGA,0BqC8GF,UAAY,UAAA,QASV,kBACE,MAAA,MACA,UAAA,KACA,OAAA,KACA,OAAA,EAEA,iCACE,OAAA,KACA,OAAA,E5C3KJ,cAAA,E4C+KE,gC5C/KF,cAAA,E4CmLE,8BACE,WAAA,KAGF,gC5CvLF,cAAA,EOyDA,4BqC0GA,0BACE,MAAA,MACA,UAAA,KACA,OAAA,KACA,OAAA,EAEA,yCACE,OAAA,KACA,OAAA,E5C3KJ,cAAA,E4C+KE,wC5C/KF,cAAA,E4CmLE,sCACE,WAAA,KAGF,wC5CvLF,cAAA,GOyDA,4BqC0GA,0BACE,MAAA,MACA,UAAA,KACA,OAAA,KACA,OAAA,EAEA,yCACE,OAAA,KACA,OAAA,E5C3KJ,cAAA,E4C+KE,wC5C/KF,cAAA,E4CmLE,sCACE,WAAA,KAGF,wC5CvLF,cAAA,GOyDA,4BqC0GA,0BACE,MAAA,MACA,UAAA,KACA,OAAA,KACA,OAAA,EAEA,yCACE,OAAA,KACA,OAAA,E5C3KJ,cAAA,E4C+KE,wC5C/KF,cAAA,E4CmLE,sCACE,WAAA,KAGF,wC5CvLF,cAAA,GOyDA,6BqC0GA,0BACE,MAAA,MACA,UAAA,KACA,OAAA,KACA,OAAA,EAEA,yCACE,OAAA,KACA,OAAA,E5C3KJ,cAAA,E4C+KE,wC5C/KF,cAAA,E4CmLE,sCACE,WAAA,KAGF,wC5CvLF,cAAA,GOyDA,6BqC0GA,2BACE,MAAA,MACA,UAAA,KACA,OAAA,KACA,OAAA,EAEA,0CACE,OAAA,KACA,OAAA,E5C3KJ,cAAA,E4C+KE,yC5C/KF,cAAA,E4CmLE,uCACE,WAAA,KAGF,yC5CvLF,cAAA,G8ClBJ,SACE,SAAA,SACA,QAAA,KACA,QAAA,MACA,OAAA,ECJA,YAAA,0BAEA,WAAA,OACA,YAAA,IACA,YAAA,IACA,WAAA,KACA,WAAA,MACA,gBAAA,KACA,YAAA,KACA,eAAA,KACA,eAAA,OACA,WAAA,OACA,aAAA,OACA,YAAA,OACA,WAAA,KhDsRI,UAAA,Q+C1RJ,UAAA,WACA,QAAA,EAEA,cAAS,QAAA,GAET,wBACE,SAAA,SACA,QAAA,MACA,MAAA,MACA,OAAA,MAEA,gCACE,SAAA,SACA,QAAA,GACA,aAAA,YACA,aAAA,MAKN,6CAAA,gBACE,QAAA,MAAA,EAEA,4DAAA,+BACE,OAAA,EAEA,oEAAA,uCACE,IAAA,KACA,aAAA,MAAA,MAAA,EACA,iBAAA,KAKN,+CAAA,gBACE,QAAA,EAAA,MAEA,8DAAA,+BACE,KAAA,EACA,MAAA,MACA,OAAA,MAEA,sEAAA,uCACE,MAAA,KACA,aAAA,MAAA,MAAA,MAAA,EACA,mBAAA,KAKN,gDAAA,mBACE,QAAA,MAAA,EAEA,+DAAA,kCACE,IAAA,EAEA,uEAAA,0CACE,OAAA,KACA,aAAA,EAAA,MAAA,MACA,oBAAA,KAKN,8CAAA,kBACE,QAAA,EAAA,MAEA,6DAAA,iCACE,MAAA,EACA,MAAA,MACA,OAAA,MAEA,qEAAA,yCACE,KAAA,KACA,aAAA,MAAA,EAAA,MAAA,MACA,kBAAA,KAqBN,eACE,UAAA,MACA,QAAA,OAAA,MACA,MAAA,KACA,WAAA,OACA,iBAAA,K9C7FE,cAAA,OgDnBJ,SACE,SAAA,SACA,IAAA,EACA,KAAA,EACA,QAAA,KACA,QAAA,MACA,UAAA,MDLA,YAAA,0BAEA,WAAA,OACA,YAAA,IACA,YAAA,IACA,WAAA,KACA,WAAA,MACA,gBAAA,KACA,YAAA,KACA,eAAA,KACA,eAAA,OACA,WAAA,OACA,aAAA,OACA,YAAA,OACA,WAAA,KhDsRI,UAAA,QiDzRJ,UAAA,WACA,iBAAA,KACA,gBAAA,YACA,OAAA,IAAA,MAAA,ehDIE,cAAA,MgDAF,wBACE,SAAA,SACA,QAAA,MACA,MAAA,KACA,OAAA,MAEA,+BAAA,gCAEE,SAAA,SACA,QAAA,MACA,QAAA,GACA,aAAA,YACA,aAAA,MAMJ,4DAAA,+BACE,OAAA,mBAEA,oEAAA,uCACE,OAAA,EACA,aAAA,MAAA,MAAA,EACA,iBAAA,gBAGF,mEAAA,sCACE,OAAA,IACA,aAAA,MAAA,MAAA,EACA,iBAAA,KAMJ,8DAAA,+BACE,KAAA,mBACA,MAAA,MACA,OAAA,KAEA,sEAAA,uCACE,KAAA,EACA,aAAA,MAAA,MAAA,MAAA,EACA,mBAAA,gBAGF,qEAAA,sCACE,KAAA,IACA,aAAA,MAAA,MAAA,MAAA,EACA,mBAAA,KAMJ,+DAAA,kCACE,IAAA,mBAEA,uEAAA,0CACE,IAAA,EACA,aAAA,EAAA,MAAA,MAAA,MACA,oBAAA,gBAGF,sEAAA,yCACE,IAAA,IACA,aAAA,EAAA,MAAA,MAAA,MACA,oBAAA,KAKJ,wEAAA,2CACE,SAAA,SACA,IAAA,EACA,KAAA,IACA,QAAA,MACA,MAAA,KACA,YAAA,OACA,QAAA,GACA,cAAA,IAAA,MAAA,QAKF,6DAAA,iCACE,MAAA,mBACA,MAAA,MACA,OAAA,KAEA,qEAAA,yCACE,MAAA,EACA,aAAA,MAAA,EAAA,MAAA,MACA,kBAAA,gBAGF,oEAAA,wCACE,MAAA,IACA,aAAA,MAAA,EAAA,MAAA,MACA,kBAAA,KAqBN,gBACE,QAAA,MAAA,KACA,cAAA,EjDuJI,UAAA,KiDpJJ,iBAAA,QACA,cAAA,IAAA,MAAA,ehDtHE,uBAAA,kBACA,wBAAA,kBgDwHF,sBACE,QAAA,KAIJ,cACE,QAAA,KAAA,KACA,MAAA,QC/IF,UACE,SAAA,SAGF,wBACE,aAAA,MAGF,gBACE,SAAA,SACA,MAAA,KACA,SAAA,OCtBA,uBACE,QAAA,MACA,MAAA,KACA,QAAA,GDuBJ,eACE,SAAA,SACA,QAAA,KACA,MAAA,KACA,MAAA,KACA,aAAA,MACA,4BAAA,OAAA,oBAAA,OlClBI,WAAA,UAAA,IAAA,YAIA,uCkCQN,elCPQ,WAAA,MjB61LR,oBACA,oBmD70LA,sBAGE,QAAA,MnDg1LF,0BmD50LA,8CAEE,UAAA,iBnD+0LF,4BmD50LA,4CAEE,UAAA,kBAWA,8BACE,QAAA,EACA,oBAAA,QACA,UAAA,KnDu0LJ,uDACA,qDmDr0LE,qCAGE,QAAA,EACA,QAAA,EnDs0LJ,yCmDn0LE,2CAEE,QAAA,EACA,QAAA,ElC/DE,WAAA,QAAA,GAAA,IAIA,uCjBk4LN,yCmD10LE,2ClCvDM,WAAA,MjBu4LR,uBmDn0LA,uBAEE,SAAA,SACA,IAAA,EACA,OAAA,EACA,QAAA,EAEA,QAAA,KACA,YAAA,OACA,gBAAA,OACA,MAAA,IACA,QAAA,EACA,MAAA,KACA,WAAA,OACA,WAAA,IACA,OAAA,EACA,QAAA,GlCzFI,WAAA,QAAA,KAAA,KAIA,uCjB25LN,uBmDt1LA,uBlCpEQ,WAAA,MjBg6LR,6BADA,6BmDv0LE,6BAAA,6BAEE,MAAA,KACA,gBAAA,KACA,QAAA,EACA,QAAA,GAGJ,uBACE,KAAA,EAGF,uBACE,MAAA,EnD20LF,4BmDt0LA,4BAEE,QAAA,aACA,MAAA,KACA,OAAA,KACA,kBAAA,UACA,oBAAA,IACA,gBAAA,KAAA,KAWF,4BACE,iBAAA,wPAEF,4BACE,iBAAA,yPAQF,qBACE,SAAA,SACA,MAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,EACA,QAAA,KACA,gBAAA,OACA,QAAA,EAEA,aAAA,IACA,cAAA,KACA,YAAA,IACA,WAAA,KAEA,sCACE,WAAA,YACA,KAAA,EAAA,EAAA,KACA,MAAA,KACA,OAAA,IACA,QAAA,EACA,aAAA,IACA,YAAA,IACA,YAAA,OACA,OAAA,QACA,iBAAA,KACA,gBAAA,YACA,OAAA,EAEA,WAAA,KAAA,MAAA,YACA,cAAA,KAAA,MAAA,YACA,QAAA,GlC5KE,WAAA,QAAA,IAAA,KAIA,uCkCwJJ,sClCvJM,WAAA,MkC2KN,6BACE,QAAA,EASJ,kBACE,SAAA,SACA,MAAA,IACA,OAAA,QACA,KAAA,IACA,YAAA,QACA,eAAA,QACA,MAAA,KACA,WAAA,OnDi0LF,2CmD3zLE,2CAEE,OAAA,UAAA,eAGF,qDACE,iBAAA,KAGF,iCACE,MAAA,KE7NJ,kCACE,GAAK,UAAA,gBADP,0BACE,GAAK,UAAA,gBAIP,gBACE,QAAA,aACA,MAAA,KACA,OAAA,KACA,eAAA,QACA,OAAA,MAAA,MAAA,aACA,mBAAA,YAEA,cAAA,IACA,kBAAA,KAAA,OAAA,SAAA,eAAA,UAAA,KAAA,OAAA,SAAA,eAGF,mBACE,MAAA,KACA,OAAA,KACA,aAAA,KAQF,gCACE,GACE,UAAA,SAEF,IACE,QAAA,EACA,UAAA,MANJ,wBACE,GACE,UAAA,SAEF,IACE,QAAA,EACA,UAAA,MAKJ,cACE,QAAA,aACA,MAAA,KACA,OAAA,KACA,eAAA,QACA,iBAAA,aAEA,cAAA,IACA,QAAA,EACA,kBAAA,KAAA,OAAA,SAAA,aAAA,UAAA,KAAA,OAAA,SAAA,aAGF,iBACE,MAAA,KACA,OAAA,KAIA,uCACE,gBrDiiMJ,cqD/hMM,2BAAA,KAAA,mBAAA,MCjEN,WACE,SAAA,MACA,OAAA,EACA,QAAA,KACA,QAAA,KACA,eAAA,OACA,UAAA,KAEA,WAAA,OACA,iBAAA,KACA,gBAAA,YACA,QAAA,ErCKI,WAAA,UAAA,IAAA,YAIA,uCqCpBN,WrCqBQ,WAAA,MqCLR,oBPdE,SAAA,MACA,IAAA,EACA,KAAA,EACA,QAAA,KACA,MAAA,MACA,OAAA,MACA,iBAAA,KAGA,yBAAS,QAAA,EACT,yBAAS,QAAA,GOQX,kBACE,QAAA,KACA,YAAA,OACA,gBAAA,cACA,QAAA,KAAA,KAEA,6BACE,QAAA,MAAA,MACA,WAAA,OACA,aAAA,OACA,cAAA,OAIJ,iBACE,cAAA,EACA,YAAA,IAGF,gBACE,UAAA,EACA,QAAA,KAAA,KACA,WAAA,KAGF,iBACE,IAAA,EACA,KAAA,EACA,MAAA,MACA,aAAA,IAAA,MAAA,eACA,UAAA,kBAGF,eACE,IAAA,EACA,MAAA,EACA,MAAA,MACA,YAAA,IAAA,MAAA,eACA,UAAA,iBAGF,eACE,IAAA,EACA,MAAA,EACA,KAAA,EACA,OAAA,KACA,WAAA,KACA,cAAA,IAAA,MAAA,eACA,UAAA,kBAGF,kBACE,MAAA,EACA,KAAA,EACA,OAAA,KACA,WAAA,KACA,WAAA,IAAA,MAAA,eACA,UAAA,iBAGF,gBACE,UAAA,KCjFF,aACE,QAAA,aACA,WAAA,IACA,eAAA,OACA,OAAA,KACA,iBAAA,aACA,QAAA,GAEA,yBACE,QAAA,aACA,QAAA,GAKJ,gBACE,WAAA,KAGF,gBACE,WAAA,KAGF,gBACE,WAAA,MAKA,+BACE,kBAAA,iBAAA,GAAA,YAAA,SAAA,UAAA,iBAAA,GAAA,YAAA,SAIJ,oCACE,IACE,QAAA,IAFJ,4BACE,IACE,QAAA,IAIJ,kBACE,mBAAA,8DAAA,WAAA,8DACA,kBAAA,KAAA,KAAA,UAAA,KAAA,KACA,kBAAA,iBAAA,GAAA,OAAA,SAAA,UAAA,iBAAA,GAAA,OAAA,SAGF,oCACE,KACE,sBAAA,MAAA,GAAA,cAAA,MAAA,IAFJ,4BACE,KACE,sBAAA,MAAA,GAAA,cAAA,MAAA,IH9CF,iBACE,QAAA,MACA,MAAA,KACA,QAAA,GIJF,cACE,MAAA,QAGE,oBAAA,oBAEE,MAAA,QANN,gBACE,MAAA,QAGE,sBAAA,sBAEE,MAAA,QANN,cACE,MAAA,QAGE,oBAAA,oBAEE,MAAA,QANN,WACE,MAAA,QAGE,iBAAA,iBAEE,MAAA,QANN,cACE,MAAA,QAGE,oBAAA,oBAEE,MAAA,QANN,aACE,MAAA,QAGE,mBAAA,mBAEE,MAAA,QANN,YACE,MAAA,QAGE,kBAAA,kBAEE,MAAA,QANN,WACE,MAAA,QAGE,iBAAA,iBAEE,MAAA,QCLR,OACE,SAAA,SACA,MAAA,KAEA,eACE,QAAA,MACA,YAAA,uBACA,QAAA,GAGF,SACE,SAAA,SACA,IAAA,EACA,KAAA,EACA,MAAA,KACA,OAAA,KAKF,WACE,kBAAA,KADF,WACE,kBAAA,IADF,YACE,kBAAA,OADF,YACE,kBAAA,eCrBJ,WACE,SAAA,MACA,IAAA,EACA,MAAA,EACA,KAAA,EACA,QAAA,KAGF,cACE,SAAA,MACA,MAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,KAQE,YACE,SAAA,eAAA,SAAA,OACA,IAAA,EACA,QAAA,KjDqCF,yBiDxCA,eACE,SAAA,eAAA,SAAA,OACA,IAAA,EACA,QAAA,MjDqCF,yBiDxCA,eACE,SAAA,eAAA,SAAA,OACA,IAAA,EACA,QAAA,MjDqCF,yBiDxCA,eACE,SAAA,eAAA,SAAA,OACA,IAAA,EACA,QAAA,MjDqCF,0BiDxCA,eACE,SAAA,eAAA,SAAA,OACA,IAAA,EACA,QAAA,MjDqCF,0BiDxCA,gBACE,SAAA,eAAA,SAAA,OACA,IAAA,EACA,QAAA,MCzBN,QACE,QAAA,KACA,eAAA,IACA,YAAA,OACA,WAAA,QAGF,QACE,QAAA,KACA,KAAA,EAAA,EAAA,KACA,eAAA,OACA,WAAA,QCRF,iB5D+6MA,0D6D36ME,SAAA,mBACA,MAAA,cACA,OAAA,cACA,QAAA,YACA,OAAA,eACA,SAAA,iBACA,KAAA,wBACA,YAAA,iBACA,OAAA,YCXA,uBACE,SAAA,SACA,IAAA,EACA,MAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,EACA,QAAA,GCRJ,eCAE,SAAA,OACA,cAAA,SACA,YAAA,OCNF,IACE,QAAA,aACA,WAAA,QACA,MAAA,IACA,WAAA,IACA,iBAAA,aACA,QAAA,ICyDM,gBAOI,eAAA,mBAPJ,WAOI,eAAA,cAPJ,cAOI,eAAA,iBAPJ,cAOI,eAAA,iBAPJ,mBAOI,eAAA,sBAPJ,gBAOI,eAAA,mBAPJ,aAOI,MAAA,eAPJ,WAOI,MAAA,gBAPJ,YAOI,MAAA,eAPJ,WAOI,QAAA,YAPJ,YAOI,QAAA,cAPJ,YAOI,QAAA,aAPJ,YAOI,QAAA,cAPJ,aAOI,QAAA,YAPJ,eAOI,SAAA,eAPJ,iBAOI,SAAA,iBAPJ,kBAOI,SAAA,kBAPJ,iBAOI,SAAA,iBAPJ,UAOI,QAAA,iBAPJ,gBAOI,QAAA,uBAPJ,SAOI,QAAA,gBAPJ,QAOI,QAAA,eAPJ,SAOI,QAAA,gBAPJ,aAOI,QAAA,oBAPJ,cAOI,QAAA,qBAPJ,QAOI,QAAA,eAPJ,eAOI,QAAA,sBAPJ,QAOI,QAAA,eAPJ,QAOI,WAAA,EAAA,MAAA,KAAA,0BAPJ,WAOI,WAAA,EAAA,QAAA,OAAA,2BAPJ,WAOI,WAAA,EAAA,KAAA,KAAA,2BAPJ,aAOI,WAAA,eAPJ,iBAOI,SAAA,iBAPJ,mBAOI,SAAA,mBAPJ,mBAOI,SAAA,mBAPJ,gBAOI,SAAA,gBAPJ,iBAOI,SAAA,yBAAA,SAAA,iBAPJ,OAOI,IAAA,YAPJ,QAOI,IAAA,cAPJ,SAOI,IAAA,eAPJ,UAOI,OAAA,YAPJ,WAOI,OAAA,cAPJ,YAOI,OAAA,eAPJ,SAOI,KAAA,YAPJ,UAOI,KAAA,cAPJ,WAOI,KAAA,eAPJ,OAOI,MAAA,YAPJ,QAOI,MAAA,cAPJ,SAOI,MAAA,eAPJ,kBAOI,UAAA,+BAPJ,oBAOI,UAAA,2BAPJ,oBAOI,UAAA,2BAPJ,QAOI,OAAA,IAAA,MAAA,kBAPJ,UAOI,OAAA,YAPJ,YAOI,WAAA,IAAA,MAAA,kBAPJ,cAOI,WAAA,YAPJ,YAOI,aAAA,IAAA,MAAA,kBAPJ,cAOI,aAAA,YAPJ,eAOI,cAAA,IAAA,MAAA,kBAPJ,iBAOI,cAAA,YAPJ,cAOI,YAAA,IAAA,MAAA,kBAPJ,gBAOI,YAAA,YAPJ,gBAOI,aAAA,kBAPJ,kBAOI,aAAA,kBAPJ,gBAOI,aAAA,kBAPJ,aAOI,aAAA,kBAPJ,gBAOI,aAAA,kBAPJ,eAOI,aAAA,kBAPJ,cAOI,aAAA,kBAPJ,aAOI,aAAA,kBAPJ,cAOI,aAAA,eAPJ,UAOI,aAAA,cAPJ,UAOI,aAAA,cAPJ,UAOI,aAAA,cAPJ,UAOI,aAAA,cAPJ,UAOI,aAAA,cAPJ,MAOI,MAAA,cAPJ,MAOI,MAAA,cAPJ,MAOI,MAAA,cAPJ,OAOI,MAAA,eAPJ,QAOI,MAAA,eAPJ,QAOI,UAAA,eAPJ,QAOI,MAAA,gBAPJ,YAOI,UAAA,gBAPJ,MAOI,OAAA,cAPJ,MAOI,OAAA,cAPJ,MAOI,OAAA,cAPJ,OAOI,OAAA,eAPJ,QAOI,OAAA,eAPJ,QAOI,WAAA,eAPJ,QAOI,OAAA,gBAPJ,YAOI,WAAA,gBAPJ,WAOI,KAAA,EAAA,EAAA,eAPJ,UAOI,eAAA,cAPJ,aAOI,eAAA,iBAPJ,kBAOI,eAAA,sBAPJ,qBAOI,eAAA,yBAPJ,aAOI,UAAA,YAPJ,aAOI,UAAA,YAPJ,eAOI,YAAA,YAPJ,eAOI,YAAA,YAPJ,WAOI,UAAA,eAPJ,aAOI,UAAA,iBAPJ,mBAOI,UAAA,uBAPJ,OAOI,IAAA,YAPJ,OAOI,IAAA,iBAPJ,OAOI,IAAA,gBAPJ,OAOI,IAAA,eAPJ,OAOI,IAAA,iBAPJ,OAOI,IAAA,eAPJ,uBAOI,gBAAA,qBAPJ,qBAOI,gBAAA,mBAPJ,wBAOI,gBAAA,iBAPJ,yBAOI,gBAAA,wBAPJ,wBAOI,gBAAA,uBAPJ,wBAOI,gBAAA,uBAPJ,mBAOI,YAAA,qBAPJ,iBAOI,YAAA,mBAPJ,oBAOI,YAAA,iBAPJ,sBAOI,YAAA,mBAPJ,qBAOI,YAAA,kBAPJ,qBAOI,cAAA,qBAPJ,mBAOI,cAAA,mBAPJ,sBAOI,cAAA,iBAPJ,uBAOI,cAAA,wBAPJ,sBAOI,cAAA,uBAPJ,uBAOI,cAAA,kBAPJ,iBAOI,WAAA,eAPJ,kBAOI,WAAA,qBAPJ,gBAOI,WAAA,mBAPJ,mBAOI,WAAA,iBAPJ,qBAOI,WAAA,mBAPJ,oBAOI,WAAA,kBAPJ,aAOI,MAAA,aAPJ,SAOI,MAAA,YAPJ,SAOI,MAAA,YAPJ,SAOI,MAAA,YAPJ,SAOI,MAAA,YAPJ,SAOI,MAAA,YAPJ,SAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,KAOI,OAAA,YAPJ,KAOI,OAAA,iBAPJ,KAOI,OAAA,gBAPJ,KAOI,OAAA,eAPJ,KAOI,OAAA,iBAPJ,KAOI,OAAA,eAPJ,QAOI,OAAA,eAPJ,MAOI,aAAA,YAAA,YAAA,YAPJ,MAOI,aAAA,iBAAA,YAAA,iBAPJ,MAOI,aAAA,gBAAA,YAAA,gBAPJ,MAOI,aAAA,eAAA,YAAA,eAPJ,MAOI,aAAA,iBAAA,YAAA,iBAPJ,MAOI,aAAA,eAAA,YAAA,eAPJ,SAOI,aAAA,eAAA,YAAA,eAPJ,MAOI,WAAA,YAAA,cAAA,YAPJ,MAOI,WAAA,iBAAA,cAAA,iBAPJ,MAOI,WAAA,gBAAA,cAAA,gBAPJ,MAOI,WAAA,eAAA,cAAA,eAPJ,MAOI,WAAA,iBAAA,cAAA,iBAPJ,MAOI,WAAA,eAAA,cAAA,eAPJ,SAOI,WAAA,eAAA,cAAA,eAPJ,MAOI,WAAA,YAPJ,MAOI,WAAA,iBAPJ,MAOI,WAAA,gBAPJ,MAOI,WAAA,eAPJ,MAOI,WAAA,iBAPJ,MAOI,WAAA,eAPJ,SAOI,WAAA,eAPJ,MAOI,aAAA,YAPJ,MAOI,aAAA,iBAPJ,MAOI,aAAA,gBAPJ,MAOI,aAAA,eAPJ,MAOI,aAAA,iBAPJ,MAOI,aAAA,eAPJ,SAOI,aAAA,eAPJ,MAOI,cAAA,YAPJ,MAOI,cAAA,iBAPJ,MAOI,cAAA,gBAPJ,MAOI,cAAA,eAPJ,MAOI,cAAA,iBAPJ,MAOI,cAAA,eAPJ,SAOI,cAAA,eAPJ,MAOI,YAAA,YAPJ,MAOI,YAAA,iBAPJ,MAOI,YAAA,gBAPJ,MAOI,YAAA,eAPJ,MAOI,YAAA,iBAPJ,MAOI,YAAA,eAPJ,SAOI,YAAA,eAPJ,KAOI,QAAA,YAPJ,KAOI,QAAA,iBAPJ,KAOI,QAAA,gBAPJ,KAOI,QAAA,eAPJ,KAOI,QAAA,iBAPJ,KAOI,QAAA,eAPJ,MAOI,cAAA,YAAA,aAAA,YAPJ,MAOI,cAAA,iBAAA,aAAA,iBAPJ,MAOI,cAAA,gBAAA,aAAA,gBAPJ,MAOI,cAAA,eAAA,aAAA,eAPJ,MAOI,cAAA,iBAAA,aAAA,iBAPJ,MAOI,cAAA,eAAA,aAAA,eAPJ,MAOI,YAAA,YAAA,eAAA,YAPJ,MAOI,YAAA,iBAAA,eAAA,iBAPJ,MAOI,YAAA,gBAAA,eAAA,gBAPJ,MAOI,YAAA,eAAA,eAAA,eAPJ,MAOI,YAAA,iBAAA,eAAA,iBAPJ,MAOI,YAAA,eAAA,eAAA,eAPJ,MAOI,YAAA,YAPJ,MAOI,YAAA,iBAPJ,MAOI,YAAA,gBAPJ,MAOI,YAAA,eAPJ,MAOI,YAAA,iBAPJ,MAOI,YAAA,eAPJ,MAOI,cAAA,YAPJ,MAOI,cAAA,iBAPJ,MAOI,cAAA,gBAPJ,MAOI,cAAA,eAPJ,MAOI,cAAA,iBAPJ,MAOI,cAAA,eAPJ,MAOI,eAAA,YAPJ,MAOI,eAAA,iBAPJ,MAOI,eAAA,gBAPJ,MAOI,eAAA,eAPJ,MAOI,eAAA,iBAPJ,MAOI,eAAA,eAPJ,MAOI,aAAA,YAPJ,MAOI,aAAA,iBAPJ,MAOI,aAAA,gBAPJ,MAOI,aAAA,eAPJ,MAOI,aAAA,iBAPJ,MAOI,aAAA,eAPJ,gBAOI,YAAA,mCAPJ,MAOI,UAAA,iCAPJ,MAOI,UAAA,gCAPJ,MAOI,UAAA,8BAPJ,MAOI,UAAA,gCAPJ,MAOI,UAAA,kBAPJ,MAOI,UAAA,eAPJ,YAOI,WAAA,iBAPJ,YAOI,WAAA,iBAPJ,UAOI,YAAA,cAPJ,YAOI,YAAA,kBAPJ,WAOI,YAAA,cAPJ,SAOI,YAAA,cAPJ,WAOI,YAAA,iBAPJ,MAOI,YAAA,YAPJ,OAOI,YAAA,eAPJ,SAOI,YAAA,cAPJ,OAOI,YAAA,YAPJ,YAOI,WAAA,eAPJ,UAOI,WAAA,gBAPJ,aAOI,WAAA,iBAPJ,sBAOI,gBAAA,eAPJ,2BAOI,gBAAA,oBAPJ,8BAOI,gBAAA,uBAPJ,gBAOI,eAAA,oBAPJ,gBAOI,eAAA,oBAPJ,iBAOI,eAAA,qBAPJ,WAOI,YAAA,iBAPJ,aAOI,YAAA,iBAPJ,YAOI,UAAA,qBAAA,WAAA,qBAPJ,cAIQ,kBAAA,EAGJ,MAAA,6DAPJ,gBAIQ,kBAAA,EAGJ,MAAA,+DAPJ,cAIQ,kBAAA,EAGJ,MAAA,6DAPJ,WAIQ,kBAAA,EAGJ,MAAA,0DAPJ,cAIQ,kBAAA,EAGJ,MAAA,6DAPJ,aAIQ,kBAAA,EAGJ,MAAA,4DAPJ,YAIQ,kBAAA,EAGJ,MAAA,2DAPJ,WAIQ,kBAAA,EAGJ,MAAA,0DAPJ,YAIQ,kBAAA,EAGJ,MAAA,2DAPJ,YAIQ,kBAAA,EAGJ,MAAA,2DAPJ,WAIQ,kBAAA,EAGJ,MAAA,gEAPJ,YAIQ,kBAAA,EAGJ,MAAA,kBAPJ,eAIQ,kBAAA,EAGJ,MAAA,yBAPJ,eAIQ,kBAAA,EAGJ,MAAA,+BAPJ,YAIQ,kBAAA,EAGJ,MAAA,kBAjBJ,iBACE,kBAAA,KADF,iBACE,kBAAA,IADF,iBACE,kBAAA,KADF,kBACE,kBAAA,EASF,YAIQ,gBAAA,EAGJ,iBAAA,2DAPJ,cAIQ,gBAAA,EAGJ,iBAAA,6DAPJ,YAIQ,gBAAA,EAGJ,iBAAA,2DAPJ,SAIQ,gBAAA,EAGJ,iBAAA,wDAPJ,YAIQ,gBAAA,EAGJ,iBAAA,2DAPJ,WAIQ,gBAAA,EAGJ,iBAAA,0DAPJ,UAIQ,gBAAA,EAGJ,iBAAA,yDAPJ,SAIQ,gBAAA,EAGJ,iBAAA,wDAPJ,UAIQ,gBAAA,EAGJ,iBAAA,yDAPJ,UAIQ,gBAAA,EAGJ,iBAAA,yDAPJ,SAIQ,gBAAA,EAGJ,iBAAA,2DAPJ,gBAIQ,gBAAA,EAGJ,iBAAA,sBAjBJ,eACE,gBAAA,IADF,eACE,gBAAA,KADF,eACE,gBAAA,IADF,eACE,gBAAA,KADF,gBACE,gBAAA,EASF,aAOI,iBAAA,6BAPJ,iBAOI,oBAAA,cAAA,iBAAA,cAAA,YAAA,cAPJ,kBAOI,oBAAA,eAAA,iBAAA,eAAA,YAAA,eAPJ,kBAOI,oBAAA,eAAA,iBAAA,eAAA,YAAA,eAPJ,SAOI,eAAA,eAPJ,SAOI,eAAA,eAPJ,SAOI,cAAA,iBAPJ,WAOI,cAAA,YAPJ,WAOI,cAAA,gBAPJ,WAOI,cAAA,iBAPJ,WAOI,cAAA,gBAPJ,gBAOI,cAAA,cAPJ,cAOI,cAAA,gBAPJ,aAOI,uBAAA,iBAAA,wBAAA,iBAPJ,aAOI,wBAAA,iBAAA,2BAAA,iBAPJ,gBAOI,2BAAA,iBAAA,0BAAA,iBAPJ,eAOI,0BAAA,iBAAA,uBAAA,iBAPJ,SAOI,WAAA,kBAPJ,WAOI,WAAA,iBzDPR,yByDAI,gBAOI,MAAA,eAPJ,cAOI,MAAA,gBAPJ,eAOI,MAAA,eAPJ,aAOI,QAAA,iBAPJ,mBAOI,QAAA,uBAPJ,YAOI,QAAA,gBAPJ,WAOI,QAAA,eAPJ,YAOI,QAAA,gBAPJ,gBAOI,QAAA,oBAPJ,iBAOI,QAAA,qBAPJ,WAOI,QAAA,eAPJ,kBAOI,QAAA,sBAPJ,WAOI,QAAA,eAPJ,cAOI,KAAA,EAAA,EAAA,eAPJ,aAOI,eAAA,cAPJ,gBAOI,eAAA,iBAPJ,qBAOI,eAAA,sBAPJ,wBAOI,eAAA,yBAPJ,gBAOI,UAAA,YAPJ,gBAOI,UAAA,YAPJ,kBAOI,YAAA,YAPJ,kBAOI,YAAA,YAPJ,cAOI,UAAA,eAPJ,gBAOI,UAAA,iBAPJ,sBAOI,UAAA,uBAPJ,UAOI,IAAA,YAPJ,UAOI,IAAA,iBAPJ,UAOI,IAAA,gBAPJ,UAOI,IAAA,eAPJ,UAOI,IAAA,iBAPJ,UAOI,IAAA,eAPJ,0BAOI,gBAAA,qBAPJ,wBAOI,gBAAA,mBAPJ,2BAOI,gBAAA,iBAPJ,4BAOI,gBAAA,wBAPJ,2BAOI,gBAAA,uBAPJ,2BAOI,gBAAA,uBAPJ,sBAOI,YAAA,qBAPJ,oBAOI,YAAA,mBAPJ,uBAOI,YAAA,iBAPJ,yBAOI,YAAA,mBAPJ,wBAOI,YAAA,kBAPJ,wBAOI,cAAA,qBAPJ,sBAOI,cAAA,mBAPJ,yBAOI,cAAA,iBAPJ,0BAOI,cAAA,wBAPJ,yBAOI,cAAA,uBAPJ,0BAOI,cAAA,kBAPJ,oBAOI,WAAA,eAPJ,qBAOI,WAAA,qBAPJ,mBAOI,WAAA,mBAPJ,sBAOI,WAAA,iBAPJ,wBAOI,WAAA,mBAPJ,uBAOI,WAAA,kBAPJ,gBAOI,MAAA,aAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,eAOI,MAAA,YAPJ,QAOI,OAAA,YAPJ,QAOI,OAAA,iBAPJ,QAOI,OAAA,gBAPJ,QAOI,OAAA,eAPJ,QAOI,OAAA,iBAPJ,QAOI,OAAA,eAPJ,WAOI,OAAA,eAPJ,SAOI,aAAA,YAAA,YAAA,YAPJ,SAOI,aAAA,iBAAA,YAAA,iBAPJ,SAOI,aAAA,gBAAA,YAAA,gBAPJ,SAOI,aAAA,eAAA,YAAA,eAPJ,SAOI,aAAA,iBAAA,YAAA,iBAPJ,SAOI,aAAA,eAAA,YAAA,eAPJ,YAOI,aAAA,eAAA,YAAA,eAPJ,SAOI,WAAA,YAAA,cAAA,YAPJ,SAOI,WAAA,iBAAA,cAAA,iBAPJ,SAOI,WAAA,gBAAA,cAAA,gBAPJ,SAOI,WAAA,eAAA,cAAA,eAPJ,SAOI,WAAA,iBAAA,cAAA,iBAPJ,SAOI,WAAA,eAAA,cAAA,eAPJ,YAOI,WAAA,eAAA,cAAA,eAPJ,SAOI,WAAA,YAPJ,SAOI,WAAA,iBAPJ,SAOI,WAAA,gBAPJ,SAOI,WAAA,eAPJ,SAOI,WAAA,iBAPJ,SAOI,WAAA,eAPJ,YAOI,WAAA,eAPJ,SAOI,aAAA,YAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,gBAPJ,SAOI,aAAA,eAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,eAPJ,YAOI,aAAA,eAPJ,SAOI,cAAA,YAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,gBAPJ,SAOI,cAAA,eAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,eAPJ,YAOI,cAAA,eAPJ,SAOI,YAAA,YAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,gBAPJ,SAOI,YAAA,eAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,eAPJ,YAOI,YAAA,eAPJ,QAOI,QAAA,YAPJ,QAOI,QAAA,iBAPJ,QAOI,QAAA,gBAPJ,QAOI,QAAA,eAPJ,QAOI,QAAA,iBAPJ,QAOI,QAAA,eAPJ,SAOI,cAAA,YAAA,aAAA,YAPJ,SAOI,cAAA,iBAAA,aAAA,iBAPJ,SAOI,cAAA,gBAAA,aAAA,gBAPJ,SAOI,cAAA,eAAA,aAAA,eAPJ,SAOI,cAAA,iBAAA,aAAA,iBAPJ,SAOI,cAAA,eAAA,aAAA,eAPJ,SAOI,YAAA,YAAA,eAAA,YAPJ,SAOI,YAAA,iBAAA,eAAA,iBAPJ,SAOI,YAAA,gBAAA,eAAA,gBAPJ,SAOI,YAAA,eAAA,eAAA,eAPJ,SAOI,YAAA,iBAAA,eAAA,iBAPJ,SAOI,YAAA,eAAA,eAAA,eAPJ,SAOI,YAAA,YAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,gBAPJ,SAOI,YAAA,eAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,eAPJ,SAOI,cAAA,YAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,gBAPJ,SAOI,cAAA,eAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,eAPJ,SAOI,eAAA,YAPJ,SAOI,eAAA,iBAPJ,SAOI,eAAA,gBAPJ,SAOI,eAAA,eAPJ,SAOI,eAAA,iBAPJ,SAOI,eAAA,eAPJ,SAOI,aAAA,YAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,gBAPJ,SAOI,aAAA,eAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,eAPJ,eAOI,WAAA,eAPJ,aAOI,WAAA,gBAPJ,gBAOI,WAAA,kBzDPR,yByDAI,gBAOI,MAAA,eAPJ,cAOI,MAAA,gBAPJ,eAOI,MAAA,eAPJ,aAOI,QAAA,iBAPJ,mBAOI,QAAA,uBAPJ,YAOI,QAAA,gBAPJ,WAOI,QAAA,eAPJ,YAOI,QAAA,gBAPJ,gBAOI,QAAA,oBAPJ,iBAOI,QAAA,qBAPJ,WAOI,QAAA,eAPJ,kBAOI,QAAA,sBAPJ,WAOI,QAAA,eAPJ,cAOI,KAAA,EAAA,EAAA,eAPJ,aAOI,eAAA,cAPJ,gBAOI,eAAA,iBAPJ,qBAOI,eAAA,sBAPJ,wBAOI,eAAA,yBAPJ,gBAOI,UAAA,YAPJ,gBAOI,UAAA,YAPJ,kBAOI,YAAA,YAPJ,kBAOI,YAAA,YAPJ,cAOI,UAAA,eAPJ,gBAOI,UAAA,iBAPJ,sBAOI,UAAA,uBAPJ,UAOI,IAAA,YAPJ,UAOI,IAAA,iBAPJ,UAOI,IAAA,gBAPJ,UAOI,IAAA,eAPJ,UAOI,IAAA,iBAPJ,UAOI,IAAA,eAPJ,0BAOI,gBAAA,qBAPJ,wBAOI,gBAAA,mBAPJ,2BAOI,gBAAA,iBAPJ,4BAOI,gBAAA,wBAPJ,2BAOI,gBAAA,uBAPJ,2BAOI,gBAAA,uBAPJ,sBAOI,YAAA,qBAPJ,oBAOI,YAAA,mBAPJ,uBAOI,YAAA,iBAPJ,yBAOI,YAAA,mBAPJ,wBAOI,YAAA,kBAPJ,wBAOI,cAAA,qBAPJ,sBAOI,cAAA,mBAPJ,yBAOI,cAAA,iBAPJ,0BAOI,cAAA,wBAPJ,yBAOI,cAAA,uBAPJ,0BAOI,cAAA,kBAPJ,oBAOI,WAAA,eAPJ,qBAOI,WAAA,qBAPJ,mBAOI,WAAA,mBAPJ,sBAOI,WAAA,iBAPJ,wBAOI,WAAA,mBAPJ,uBAOI,WAAA,kBAPJ,gBAOI,MAAA,aAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,eAOI,MAAA,YAPJ,QAOI,OAAA,YAPJ,QAOI,OAAA,iBAPJ,QAOI,OAAA,gBAPJ,QAOI,OAAA,eAPJ,QAOI,OAAA,iBAPJ,QAOI,OAAA,eAPJ,WAOI,OAAA,eAPJ,SAOI,aAAA,YAAA,YAAA,YAPJ,SAOI,aAAA,iBAAA,YAAA,iBAPJ,SAOI,aAAA,gBAAA,YAAA,gBAPJ,SAOI,aAAA,eAAA,YAAA,eAPJ,SAOI,aAAA,iBAAA,YAAA,iBAPJ,SAOI,aAAA,eAAA,YAAA,eAPJ,YAOI,aAAA,eAAA,YAAA,eAPJ,SAOI,WAAA,YAAA,cAAA,YAPJ,SAOI,WAAA,iBAAA,cAAA,iBAPJ,SAOI,WAAA,gBAAA,cAAA,gBAPJ,SAOI,WAAA,eAAA,cAAA,eAPJ,SAOI,WAAA,iBAAA,cAAA,iBAPJ,SAOI,WAAA,eAAA,cAAA,eAPJ,YAOI,WAAA,eAAA,cAAA,eAPJ,SAOI,WAAA,YAPJ,SAOI,WAAA,iBAPJ,SAOI,WAAA,gBAPJ,SAOI,WAAA,eAPJ,SAOI,WAAA,iBAPJ,SAOI,WAAA,eAPJ,YAOI,WAAA,eAPJ,SAOI,aAAA,YAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,gBAPJ,SAOI,aAAA,eAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,eAPJ,YAOI,aAAA,eAPJ,SAOI,cAAA,YAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,gBAPJ,SAOI,cAAA,eAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,eAPJ,YAOI,cAAA,eAPJ,SAOI,YAAA,YAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,gBAPJ,SAOI,YAAA,eAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,eAPJ,YAOI,YAAA,eAPJ,QAOI,QAAA,YAPJ,QAOI,QAAA,iBAPJ,QAOI,QAAA,gBAPJ,QAOI,QAAA,eAPJ,QAOI,QAAA,iBAPJ,QAOI,QAAA,eAPJ,SAOI,cAAA,YAAA,aAAA,YAPJ,SAOI,cAAA,iBAAA,aAAA,iBAPJ,SAOI,cAAA,gBAAA,aAAA,gBAPJ,SAOI,cAAA,eAAA,aAAA,eAPJ,SAOI,cAAA,iBAAA,aAAA,iBAPJ,SAOI,cAAA,eAAA,aAAA,eAPJ,SAOI,YAAA,YAAA,eAAA,YAPJ,SAOI,YAAA,iBAAA,eAAA,iBAPJ,SAOI,YAAA,gBAAA,eAAA,gBAPJ,SAOI,YAAA,eAAA,eAAA,eAPJ,SAOI,YAAA,iBAAA,eAAA,iBAPJ,SAOI,YAAA,eAAA,eAAA,eAPJ,SAOI,YAAA,YAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,gBAPJ,SAOI,YAAA,eAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,eAPJ,SAOI,cAAA,YAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,gBAPJ,SAOI,cAAA,eAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,eAPJ,SAOI,eAAA,YAPJ,SAOI,eAAA,iBAPJ,SAOI,eAAA,gBAPJ,SAOI,eAAA,eAPJ,SAOI,eAAA,iBAPJ,SAOI,eAAA,eAPJ,SAOI,aAAA,YAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,gBAPJ,SAOI,aAAA,eAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,eAPJ,eAOI,WAAA,eAPJ,aAOI,WAAA,gBAPJ,gBAOI,WAAA,kBzDPR,yByDAI,gBAOI,MAAA,eAPJ,cAOI,MAAA,gBAPJ,eAOI,MAAA,eAPJ,aAOI,QAAA,iBAPJ,mBAOI,QAAA,uBAPJ,YAOI,QAAA,gBAPJ,WAOI,QAAA,eAPJ,YAOI,QAAA,gBAPJ,gBAOI,QAAA,oBAPJ,iBAOI,QAAA,qBAPJ,WAOI,QAAA,eAPJ,kBAOI,QAAA,sBAPJ,WAOI,QAAA,eAPJ,cAOI,KAAA,EAAA,EAAA,eAPJ,aAOI,eAAA,cAPJ,gBAOI,eAAA,iBAPJ,qBAOI,eAAA,sBAPJ,wBAOI,eAAA,yBAPJ,gBAOI,UAAA,YAPJ,gBAOI,UAAA,YAPJ,kBAOI,YAAA,YAPJ,kBAOI,YAAA,YAPJ,cAOI,UAAA,eAPJ,gBAOI,UAAA,iBAPJ,sBAOI,UAAA,uBAPJ,UAOI,IAAA,YAPJ,UAOI,IAAA,iBAPJ,UAOI,IAAA,gBAPJ,UAOI,IAAA,eAPJ,UAOI,IAAA,iBAPJ,UAOI,IAAA,eAPJ,0BAOI,gBAAA,qBAPJ,wBAOI,gBAAA,mBAPJ,2BAOI,gBAAA,iBAPJ,4BAOI,gBAAA,wBAPJ,2BAOI,gBAAA,uBAPJ,2BAOI,gBAAA,uBAPJ,sBAOI,YAAA,qBAPJ,oBAOI,YAAA,mBAPJ,uBAOI,YAAA,iBAPJ,yBAOI,YAAA,mBAPJ,wBAOI,YAAA,kBAPJ,wBAOI,cAAA,qBAPJ,sBAOI,cAAA,mBAPJ,yBAOI,cAAA,iBAPJ,0BAOI,cAAA,wBAPJ,yBAOI,cAAA,uBAPJ,0BAOI,cAAA,kBAPJ,oBAOI,WAAA,eAPJ,qBAOI,WAAA,qBAPJ,mBAOI,WAAA,mBAPJ,sBAOI,WAAA,iBAPJ,wBAOI,WAAA,mBAPJ,uBAOI,WAAA,kBAPJ,gBAOI,MAAA,aAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,eAOI,MAAA,YAPJ,QAOI,OAAA,YAPJ,QAOI,OAAA,iBAPJ,QAOI,OAAA,gBAPJ,QAOI,OAAA,eAPJ,QAOI,OAAA,iBAPJ,QAOI,OAAA,eAPJ,WAOI,OAAA,eAPJ,SAOI,aAAA,YAAA,YAAA,YAPJ,SAOI,aAAA,iBAAA,YAAA,iBAPJ,SAOI,aAAA,gBAAA,YAAA,gBAPJ,SAOI,aAAA,eAAA,YAAA,eAPJ,SAOI,aAAA,iBAAA,YAAA,iBAPJ,SAOI,aAAA,eAAA,YAAA,eAPJ,YAOI,aAAA,eAAA,YAAA,eAPJ,SAOI,WAAA,YAAA,cAAA,YAPJ,SAOI,WAAA,iBAAA,cAAA,iBAPJ,SAOI,WAAA,gBAAA,cAAA,gBAPJ,SAOI,WAAA,eAAA,cAAA,eAPJ,SAOI,WAAA,iBAAA,cAAA,iBAPJ,SAOI,WAAA,eAAA,cAAA,eAPJ,YAOI,WAAA,eAAA,cAAA,eAPJ,SAOI,WAAA,YAPJ,SAOI,WAAA,iBAPJ,SAOI,WAAA,gBAPJ,SAOI,WAAA,eAPJ,SAOI,WAAA,iBAPJ,SAOI,WAAA,eAPJ,YAOI,WAAA,eAPJ,SAOI,aAAA,YAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,gBAPJ,SAOI,aAAA,eAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,eAPJ,YAOI,aAAA,eAPJ,SAOI,cAAA,YAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,gBAPJ,SAOI,cAAA,eAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,eAPJ,YAOI,cAAA,eAPJ,SAOI,YAAA,YAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,gBAPJ,SAOI,YAAA,eAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,eAPJ,YAOI,YAAA,eAPJ,QAOI,QAAA,YAPJ,QAOI,QAAA,iBAPJ,QAOI,QAAA,gBAPJ,QAOI,QAAA,eAPJ,QAOI,QAAA,iBAPJ,QAOI,QAAA,eAPJ,SAOI,cAAA,YAAA,aAAA,YAPJ,SAOI,cAAA,iBAAA,aAAA,iBAPJ,SAOI,cAAA,gBAAA,aAAA,gBAPJ,SAOI,cAAA,eAAA,aAAA,eAPJ,SAOI,cAAA,iBAAA,aAAA,iBAPJ,SAOI,cAAA,eAAA,aAAA,eAPJ,SAOI,YAAA,YAAA,eAAA,YAPJ,SAOI,YAAA,iBAAA,eAAA,iBAPJ,SAOI,YAAA,gBAAA,eAAA,gBAPJ,SAOI,YAAA,eAAA,eAAA,eAPJ,SAOI,YAAA,iBAAA,eAAA,iBAPJ,SAOI,YAAA,eAAA,eAAA,eAPJ,SAOI,YAAA,YAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,gBAPJ,SAOI,YAAA,eAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,eAPJ,SAOI,cAAA,YAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,gBAPJ,SAOI,cAAA,eAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,eAPJ,SAOI,eAAA,YAPJ,SAOI,eAAA,iBAPJ,SAOI,eAAA,gBAPJ,SAOI,eAAA,eAPJ,SAOI,eAAA,iBAPJ,SAOI,eAAA,eAPJ,SAOI,aAAA,YAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,gBAPJ,SAOI,aAAA,eAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,eAPJ,eAOI,WAAA,eAPJ,aAOI,WAAA,gBAPJ,gBAOI,WAAA,kBzDPR,0ByDAI,gBAOI,MAAA,eAPJ,cAOI,MAAA,gBAPJ,eAOI,MAAA,eAPJ,aAOI,QAAA,iBAPJ,mBAOI,QAAA,uBAPJ,YAOI,QAAA,gBAPJ,WAOI,QAAA,eAPJ,YAOI,QAAA,gBAPJ,gBAOI,QAAA,oBAPJ,iBAOI,QAAA,qBAPJ,WAOI,QAAA,eAPJ,kBAOI,QAAA,sBAPJ,WAOI,QAAA,eAPJ,cAOI,KAAA,EAAA,EAAA,eAPJ,aAOI,eAAA,cAPJ,gBAOI,eAAA,iBAPJ,qBAOI,eAAA,sBAPJ,wBAOI,eAAA,yBAPJ,gBAOI,UAAA,YAPJ,gBAOI,UAAA,YAPJ,kBAOI,YAAA,YAPJ,kBAOI,YAAA,YAPJ,cAOI,UAAA,eAPJ,gBAOI,UAAA,iBAPJ,sBAOI,UAAA,uBAPJ,UAOI,IAAA,YAPJ,UAOI,IAAA,iBAPJ,UAOI,IAAA,gBAPJ,UAOI,IAAA,eAPJ,UAOI,IAAA,iBAPJ,UAOI,IAAA,eAPJ,0BAOI,gBAAA,qBAPJ,wBAOI,gBAAA,mBAPJ,2BAOI,gBAAA,iBAPJ,4BAOI,gBAAA,wBAPJ,2BAOI,gBAAA,uBAPJ,2BAOI,gBAAA,uBAPJ,sBAOI,YAAA,qBAPJ,oBAOI,YAAA,mBAPJ,uBAOI,YAAA,iBAPJ,yBAOI,YAAA,mBAPJ,wBAOI,YAAA,kBAPJ,wBAOI,cAAA,qBAPJ,sBAOI,cAAA,mBAPJ,yBAOI,cAAA,iBAPJ,0BAOI,cAAA,wBAPJ,yBAOI,cAAA,uBAPJ,0BAOI,cAAA,kBAPJ,oBAOI,WAAA,eAPJ,qBAOI,WAAA,qBAPJ,mBAOI,WAAA,mBAPJ,sBAOI,WAAA,iBAPJ,wBAOI,WAAA,mBAPJ,uBAOI,WAAA,kBAPJ,gBAOI,MAAA,aAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,eAOI,MAAA,YAPJ,QAOI,OAAA,YAPJ,QAOI,OAAA,iBAPJ,QAOI,OAAA,gBAPJ,QAOI,OAAA,eAPJ,QAOI,OAAA,iBAPJ,QAOI,OAAA,eAPJ,WAOI,OAAA,eAPJ,SAOI,aAAA,YAAA,YAAA,YAPJ,SAOI,aAAA,iBAAA,YAAA,iBAPJ,SAOI,aAAA,gBAAA,YAAA,gBAPJ,SAOI,aAAA,eAAA,YAAA,eAPJ,SAOI,aAAA,iBAAA,YAAA,iBAPJ,SAOI,aAAA,eAAA,YAAA,eAPJ,YAOI,aAAA,eAAA,YAAA,eAPJ,SAOI,WAAA,YAAA,cAAA,YAPJ,SAOI,WAAA,iBAAA,cAAA,iBAPJ,SAOI,WAAA,gBAAA,cAAA,gBAPJ,SAOI,WAAA,eAAA,cAAA,eAPJ,SAOI,WAAA,iBAAA,cAAA,iBAPJ,SAOI,WAAA,eAAA,cAAA,eAPJ,YAOI,WAAA,eAAA,cAAA,eAPJ,SAOI,WAAA,YAPJ,SAOI,WAAA,iBAPJ,SAOI,WAAA,gBAPJ,SAOI,WAAA,eAPJ,SAOI,WAAA,iBAPJ,SAOI,WAAA,eAPJ,YAOI,WAAA,eAPJ,SAOI,aAAA,YAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,gBAPJ,SAOI,aAAA,eAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,eAPJ,YAOI,aAAA,eAPJ,SAOI,cAAA,YAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,gBAPJ,SAOI,cAAA,eAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,eAPJ,YAOI,cAAA,eAPJ,SAOI,YAAA,YAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,gBAPJ,SAOI,YAAA,eAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,eAPJ,YAOI,YAAA,eAPJ,QAOI,QAAA,YAPJ,QAOI,QAAA,iBAPJ,QAOI,QAAA,gBAPJ,QAOI,QAAA,eAPJ,QAOI,QAAA,iBAPJ,QAOI,QAAA,eAPJ,SAOI,cAAA,YAAA,aAAA,YAPJ,SAOI,cAAA,iBAAA,aAAA,iBAPJ,SAOI,cAAA,gBAAA,aAAA,gBAPJ,SAOI,cAAA,eAAA,aAAA,eAPJ,SAOI,cAAA,iBAAA,aAAA,iBAPJ,SAOI,cAAA,eAAA,aAAA,eAPJ,SAOI,YAAA,YAAA,eAAA,YAPJ,SAOI,YAAA,iBAAA,eAAA,iBAPJ,SAOI,YAAA,gBAAA,eAAA,gBAPJ,SAOI,YAAA,eAAA,eAAA,eAPJ,SAOI,YAAA,iBAAA,eAAA,iBAPJ,SAOI,YAAA,eAAA,eAAA,eAPJ,SAOI,YAAA,YAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,gBAPJ,SAOI,YAAA,eAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,eAPJ,SAOI,cAAA,YAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,gBAPJ,SAOI,cAAA,eAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,eAPJ,SAOI,eAAA,YAPJ,SAOI,eAAA,iBAPJ,SAOI,eAAA,gBAPJ,SAOI,eAAA,eAPJ,SAOI,eAAA,iBAPJ,SAOI,eAAA,eAPJ,SAOI,aAAA,YAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,gBAPJ,SAOI,aAAA,eAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,eAPJ,eAOI,WAAA,eAPJ,aAOI,WAAA,gBAPJ,gBAOI,WAAA,kBzDPR,0ByDAI,iBAOI,MAAA,eAPJ,eAOI,MAAA,gBAPJ,gBAOI,MAAA,eAPJ,cAOI,QAAA,iBAPJ,oBAOI,QAAA,uBAPJ,aAOI,QAAA,gBAPJ,YAOI,QAAA,eAPJ,aAOI,QAAA,gBAPJ,iBAOI,QAAA,oBAPJ,kBAOI,QAAA,qBAPJ,YAOI,QAAA,eAPJ,mBAOI,QAAA,sBAPJ,YAOI,QAAA,eAPJ,eAOI,KAAA,EAAA,EAAA,eAPJ,cAOI,eAAA,cAPJ,iBAOI,eAAA,iBAPJ,sBAOI,eAAA,sBAPJ,yBAOI,eAAA,yBAPJ,iBAOI,UAAA,YAPJ,iBAOI,UAAA,YAPJ,mBAOI,YAAA,YAPJ,mBAOI,YAAA,YAPJ,eAOI,UAAA,eAPJ,iBAOI,UAAA,iBAPJ,uBAOI,UAAA,uBAPJ,WAOI,IAAA,YAPJ,WAOI,IAAA,iBAPJ,WAOI,IAAA,gBAPJ,WAOI,IAAA,eAPJ,WAOI,IAAA,iBAPJ,WAOI,IAAA,eAPJ,2BAOI,gBAAA,qBAPJ,yBAOI,gBAAA,mBAPJ,4BAOI,gBAAA,iBAPJ,6BAOI,gBAAA,wBAPJ,4BAOI,gBAAA,uBAPJ,4BAOI,gBAAA,uBAPJ,uBAOI,YAAA,qBAPJ,qBAOI,YAAA,mBAPJ,wBAOI,YAAA,iBAPJ,0BAOI,YAAA,mBAPJ,yBAOI,YAAA,kBAPJ,yBAOI,cAAA,qBAPJ,uBAOI,cAAA,mBAPJ,0BAOI,cAAA,iBAPJ,2BAOI,cAAA,wBAPJ,0BAOI,cAAA,uBAPJ,2BAOI,cAAA,kBAPJ,qBAOI,WAAA,eAPJ,sBAOI,WAAA,qBAPJ,oBAOI,WAAA,mBAPJ,uBAOI,WAAA,iBAPJ,yBAOI,WAAA,mBAPJ,wBAOI,WAAA,kBAPJ,iBAOI,MAAA,aAPJ,aAOI,MAAA,YAPJ,aAOI,MAAA,YAPJ,aAOI,MAAA,YAPJ,aAOI,MAAA,YAPJ,aAOI,MAAA,YAPJ,aAOI,MAAA,YAPJ,gBAOI,MAAA,YAPJ,SAOI,OAAA,YAPJ,SAOI,OAAA,iBAPJ,SAOI,OAAA,gBAPJ,SAOI,OAAA,eAPJ,SAOI,OAAA,iBAPJ,SAOI,OAAA,eAPJ,YAOI,OAAA,eAPJ,UAOI,aAAA,YAAA,YAAA,YAPJ,UAOI,aAAA,iBAAA,YAAA,iBAPJ,UAOI,aAAA,gBAAA,YAAA,gBAPJ,UAOI,aAAA,eAAA,YAAA,eAPJ,UAOI,aAAA,iBAAA,YAAA,iBAPJ,UAOI,aAAA,eAAA,YAAA,eAPJ,aAOI,aAAA,eAAA,YAAA,eAPJ,UAOI,WAAA,YAAA,cAAA,YAPJ,UAOI,WAAA,iBAAA,cAAA,iBAPJ,UAOI,WAAA,gBAAA,cAAA,gBAPJ,UAOI,WAAA,eAAA,cAAA,eAPJ,UAOI,WAAA,iBAAA,cAAA,iBAPJ,UAOI,WAAA,eAAA,cAAA,eAPJ,aAOI,WAAA,eAAA,cAAA,eAPJ,UAOI,WAAA,YAPJ,UAOI,WAAA,iBAPJ,UAOI,WAAA,gBAPJ,UAOI,WAAA,eAPJ,UAOI,WAAA,iBAPJ,UAOI,WAAA,eAPJ,aAOI,WAAA,eAPJ,UAOI,aAAA,YAPJ,UAOI,aAAA,iBAPJ,UAOI,aAAA,gBAPJ,UAOI,aAAA,eAPJ,UAOI,aAAA,iBAPJ,UAOI,aAAA,eAPJ,aAOI,aAAA,eAPJ,UAOI,cAAA,YAPJ,UAOI,cAAA,iBAPJ,UAOI,cAAA,gBAPJ,UAOI,cAAA,eAPJ,UAOI,cAAA,iBAPJ,UAOI,cAAA,eAPJ,aAOI,cAAA,eAPJ,UAOI,YAAA,YAPJ,UAOI,YAAA,iBAPJ,UAOI,YAAA,gBAPJ,UAOI,YAAA,eAPJ,UAOI,YAAA,iBAPJ,UAOI,YAAA,eAPJ,aAOI,YAAA,eAPJ,SAOI,QAAA,YAPJ,SAOI,QAAA,iBAPJ,SAOI,QAAA,gBAPJ,SAOI,QAAA,eAPJ,SAOI,QAAA,iBAPJ,SAOI,QAAA,eAPJ,UAOI,cAAA,YAAA,aAAA,YAPJ,UAOI,cAAA,iBAAA,aAAA,iBAPJ,UAOI,cAAA,gBAAA,aAAA,gBAPJ,UAOI,cAAA,eAAA,aAAA,eAPJ,UAOI,cAAA,iBAAA,aAAA,iBAPJ,UAOI,cAAA,eAAA,aAAA,eAPJ,UAOI,YAAA,YAAA,eAAA,YAPJ,UAOI,YAAA,iBAAA,eAAA,iBAPJ,UAOI,YAAA,gBAAA,eAAA,gBAPJ,UAOI,YAAA,eAAA,eAAA,eAPJ,UAOI,YAAA,iBAAA,eAAA,iBAPJ,UAOI,YAAA,eAAA,eAAA,eAPJ,UAOI,YAAA,YAPJ,UAOI,YAAA,iBAPJ,UAOI,YAAA,gBAPJ,UAOI,YAAA,eAPJ,UAOI,YAAA,iBAPJ,UAOI,YAAA,eAPJ,UAOI,cAAA,YAPJ,UAOI,cAAA,iBAPJ,UAOI,cAAA,gBAPJ,UAOI,cAAA,eAPJ,UAOI,cAAA,iBAPJ,UAOI,cAAA,eAPJ,UAOI,eAAA,YAPJ,UAOI,eAAA,iBAPJ,UAOI,eAAA,gBAPJ,UAOI,eAAA,eAPJ,UAOI,eAAA,iBAPJ,UAOI,eAAA,eAPJ,UAOI,aAAA,YAPJ,UAOI,aAAA,iBAPJ,UAOI,aAAA,gBAPJ,UAOI,aAAA,eAPJ,UAOI,aAAA,iBAPJ,UAOI,aAAA,eAPJ,gBAOI,WAAA,eAPJ,cAOI,WAAA,gBAPJ,iBAOI,WAAA,kBCnDZ,0BD4CQ,MAOI,UAAA,iBAPJ,MAOI,UAAA,eAPJ,MAOI,UAAA,kBAPJ,MAOI,UAAA,kBChCZ,aDyBQ,gBAOI,QAAA,iBAPJ,sBAOI,QAAA,uBAPJ,eAOI,QAAA,gBAPJ,cAOI,QAAA,eAPJ,eAOI,QAAA,gBAPJ,mBAOI,QAAA,oBAPJ,oBAOI,QAAA,qBAPJ,cAOI,QAAA,eAPJ,qBAOI,QAAA,sBAPJ,cAOI,QAAA","sourcesContent":["/*!\n * Bootstrap v5.1.3 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n\n// scss-docs-start import-stack\n// Configuration\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"utilities\";\n\n// Layout & components\n@import \"root\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"containers\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"accordion\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"alert\";\n@import \"progress\";\n@import \"list-group\";\n@import \"close\";\n@import \"toasts\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"spinners\";\n@import \"offcanvas\";\n@import \"placeholders\";\n\n// Helpers\n@import \"helpers\";\n\n// Utilities\n@import \"utilities/api\";\n// scss-docs-end import-stack\n",":root {\n // Note: Custom variable values only support SassScript inside `#{}`.\n\n // Colors\n //\n // Generate palettes for full colors, grays, and theme colors.\n\n @each $color, $value in $colors {\n --#{$variable-prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $grays {\n --#{$variable-prefix}gray-#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$variable-prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors-rgb {\n --#{$variable-prefix}#{$color}-rgb: #{$value};\n }\n\n --#{$variable-prefix}white-rgb: #{to-rgb($white)};\n --#{$variable-prefix}black-rgb: #{to-rgb($black)};\n --#{$variable-prefix}body-color-rgb: #{to-rgb($body-color)};\n --#{$variable-prefix}body-bg-rgb: #{to-rgb($body-bg)};\n\n // Fonts\n\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$variable-prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$variable-prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$variable-prefix}gradient: #{$gradient};\n\n // Root and body\n // stylelint-disable custom-property-empty-line-before\n // scss-docs-start root-body-variables\n @if $font-size-root != null {\n --#{$variable-prefix}root-font-size: #{$font-size-root};\n }\n --#{$variable-prefix}body-font-family: #{$font-family-base};\n --#{$variable-prefix}body-font-size: #{$font-size-base};\n --#{$variable-prefix}body-font-weight: #{$font-weight-base};\n --#{$variable-prefix}body-line-height: #{$line-height-base};\n --#{$variable-prefix}body-color: #{$body-color};\n @if $body-text-align != null {\n --#{$variable-prefix}body-text-align: #{$body-text-align};\n }\n --#{$variable-prefix}body-bg: #{$body-bg};\n // scss-docs-end root-body-variables\n // stylelint-enable custom-property-empty-line-before\n}\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n\n// Root\n//\n// Ability to the value of the root font sizes, affecting the value of `rem`.\n// null by default, thus nothing is generated.\n\n:root {\n @if $font-size-root != null {\n font-size: var(--#{$variable-prefix}root-font-size);\n }\n\n @if $enable-smooth-scroll {\n @media (prefers-reduced-motion: no-preference) {\n scroll-behavior: smooth;\n }\n }\n}\n\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Prevent adjustments of font size after orientation changes in iOS.\n// 4. Change the default tap highlight to be completely transparent in iOS.\n\n// scss-docs-start reboot-body-rules\nbody {\n margin: 0; // 1\n font-family: var(--#{$variable-prefix}body-font-family);\n @include font-size(var(--#{$variable-prefix}body-font-size));\n font-weight: var(--#{$variable-prefix}body-font-weight);\n line-height: var(--#{$variable-prefix}body-line-height);\n color: var(--#{$variable-prefix}body-color);\n text-align: var(--#{$variable-prefix}body-text-align);\n background-color: var(--#{$variable-prefix}body-bg); // 2\n -webkit-text-size-adjust: 100%; // 3\n -webkit-tap-highlight-color: rgba($black, 0); // 4\n}\n// scss-docs-end reboot-body-rules\n\n\n// Content grouping\n//\n// 1. Reset Firefox's gray color\n// 2. Set correct height and prevent the `size` attribute to make the `hr` look like an input field\n\nhr {\n margin: $hr-margin-y 0;\n color: $hr-color; // 1\n background-color: currentColor;\n border: 0;\n opacity: $hr-opacity;\n}\n\nhr:not([size]) {\n height: $hr-height; // 2\n}\n\n\n// Typography\n//\n// 1. Remove top margins from headings\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n\n%heading {\n margin-top: 0; // 1\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-style: $headings-font-style;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n}\n\nh1 {\n @extend %heading;\n @include font-size($h1-font-size);\n}\n\nh2 {\n @extend %heading;\n @include font-size($h2-font-size);\n}\n\nh3 {\n @extend %heading;\n @include font-size($h3-font-size);\n}\n\nh4 {\n @extend %heading;\n @include font-size($h4-font-size);\n}\n\nh5 {\n @extend %heading;\n @include font-size($h5-font-size);\n}\n\nh6 {\n @extend %heading;\n @include font-size($h6-font-size);\n}\n\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\n\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-bs-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-bs-original-title] { // 1\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n text-decoration-skip-ink: none; // 4\n}\n\n\n// Address\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\n\n// Lists\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\n// 1. Undo browser default\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // 1\n}\n\n\n// Blockquote\n\nblockquote {\n margin: 0 0 1rem;\n}\n\n\n// Strong\n//\n// Add the correct font weight in Chrome, Edge, and Safari\n\nb,\nstrong {\n font-weight: $font-weight-bolder;\n}\n\n\n// Small\n//\n// Add the correct font size in all browsers\n\nsmall {\n @include font-size($small-font-size);\n}\n\n\n// Mark\n\nmark {\n padding: $mark-padding;\n background-color: $mark-bg;\n}\n\n\n// Sub and Sup\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n\nsub,\nsup {\n position: relative;\n @include font-size($sub-sup-font-size);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n// Links\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n\n &:hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n &,\n &:hover {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n// Code\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-code;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n direction: ltr #{\"/* rtl:ignore */\"};\n unicode-bidi: bidi-override;\n}\n\n// 1. Remove browser default top margin\n// 2. Reset browser default of `1em` to use `rem`s\n// 3. Don't allow content to break outside\n\npre {\n display: block;\n margin-top: 0; // 1\n margin-bottom: 1rem; // 2\n overflow: auto; // 3\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\ncode {\n @include font-size($code-font-size);\n color: $code-color;\n word-wrap: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n\n kbd {\n padding: 0;\n @include font-size(1em);\n font-weight: $nested-kbd-font-weight;\n }\n}\n\n\n// Figures\n//\n// Apply a consistent margin strategy (matches our type styles).\n\nfigure {\n margin: 0 0 1rem;\n}\n\n\n// Images and content\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\n\n// Tables\n//\n// Prevent double borders\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: $table-cell-padding-y;\n padding-bottom: $table-cell-padding-y;\n color: $table-caption-color;\n text-align: left;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `

+ + + + + + + + + + + +
+ + + + = roles.support + ? "Example: 'projectId:a100cd', Types are: jobId | jobName | projectId | arrayJobId | username | name" + : "Example: 'jobName:myjob', Types are jobId | jobName | projectId | arrayJobId "} + > + + +
+{/if} From ce758610b6e9c94528c25047a03343a7a90fec63 Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Fri, 25 Aug 2023 17:38:25 +0200 Subject: [PATCH 76/95] change: implement topX query in jobsStatistics --- api/schema.graphqls | 5 +- internal/graph/generated/generated.go | 182 +++++++++++++++++++++++++- internal/graph/model/models_gen.go | 19 ++- internal/repository/stats.go | 38 ++++-- web/frontend/src/Analysis.root.svelte | 27 +++- web/frontend/src/Status.root.svelte | 63 ++++++--- 6 files changed, 293 insertions(+), 41 deletions(-) diff --git a/api/schema.graphqls b/api/schema.graphqls index eb3e270..303ede5 100644 --- a/api/schema.graphqls +++ b/api/schema.graphqls @@ -167,7 +167,7 @@ type TimeWeights { } enum Aggregate { USER, PROJECT, CLUSTER } -enum SortByAggregate { WALLTIME, NODEHOURS, COREHOURS, ACCHOURS } +enum SortByAggregate { WALLTIME, TOTALNODES, NODEHOURS, TOTALCORES, COREHOURS, TOTALACCS, ACCHOURS } type NodeMetrics { host: String! @@ -293,8 +293,11 @@ type JobsStatistics { runningJobs: Int! # Number of running jobs shortJobs: Int! # Number of jobs with a duration of less than duration totalWalltime: Int! # Sum of the duration of all matched jobs in hours + totalNodes: Int! # Sum of the nodes of all matched jobs totalNodeHours: Int! # Sum of the node hours of all matched jobs + totalCores: Int! # Sum of the cores of all matched jobs totalCoreHours: Int! # Sum of the core hours of all matched jobs + totalAccs: Int! # Sum of the accs of all matched jobs totalAccHours: Int! # Sum of the gpu hours of all matched jobs histDuration: [HistoPoint!]! # value: hour, count: number of jobs with a rounded duration of value histNumNodes: [HistoPoint!]! # value: number of nodes, count: number of jobs with that number of nodes diff --git a/internal/graph/generated/generated.go b/internal/graph/generated/generated.go index 355b25a..f06698c 100644 --- a/internal/graph/generated/generated.go +++ b/internal/graph/generated/generated.go @@ -147,9 +147,12 @@ type ComplexityRoot struct { RunningJobs func(childComplexity int) int ShortJobs func(childComplexity int) int TotalAccHours func(childComplexity int) int + TotalAccs func(childComplexity int) int TotalCoreHours func(childComplexity int) int + TotalCores func(childComplexity int) int TotalJobs func(childComplexity int) int TotalNodeHours func(childComplexity int) int + TotalNodes func(childComplexity int) int TotalWalltime func(childComplexity int) int } @@ -767,6 +770,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.JobsStatistics.TotalAccHours(childComplexity), true + case "JobsStatistics.totalAccs": + if e.complexity.JobsStatistics.TotalAccs == nil { + break + } + + return e.complexity.JobsStatistics.TotalAccs(childComplexity), true + case "JobsStatistics.totalCoreHours": if e.complexity.JobsStatistics.TotalCoreHours == nil { break @@ -774,6 +784,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.JobsStatistics.TotalCoreHours(childComplexity), true + case "JobsStatistics.totalCores": + if e.complexity.JobsStatistics.TotalCores == nil { + break + } + + return e.complexity.JobsStatistics.TotalCores(childComplexity), true + case "JobsStatistics.totalJobs": if e.complexity.JobsStatistics.TotalJobs == nil { break @@ -788,6 +805,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.JobsStatistics.TotalNodeHours(childComplexity), true + case "JobsStatistics.totalNodes": + if e.complexity.JobsStatistics.TotalNodes == nil { + break + } + + return e.complexity.JobsStatistics.TotalNodes(childComplexity), true + case "JobsStatistics.totalWalltime": if e.complexity.JobsStatistics.TotalWalltime == nil { break @@ -1727,7 +1751,7 @@ type TimeWeights { } enum Aggregate { USER, PROJECT, CLUSTER } -enum SortByAggregate { WALLTIME, NODEHOURS, COREHOURS, ACCHOURS } +enum SortByAggregate { WALLTIME, TOTALNODES, NODEHOURS, TOTALCORES, COREHOURS, TOTALACCS, ACCHOURS } type NodeMetrics { host: String! @@ -1853,8 +1877,11 @@ type JobsStatistics { runningJobs: Int! # Number of running jobs shortJobs: Int! # Number of jobs with a duration of less than duration totalWalltime: Int! # Sum of the duration of all matched jobs in hours + totalNodes: Int! # Sum of the nodes of all matched jobs totalNodeHours: Int! # Sum of the node hours of all matched jobs + totalCores: Int! # Sum of the cores of all matched jobs totalCoreHours: Int! # Sum of the core hours of all matched jobs + totalAccs: Int! # Sum of the accs of all matched jobs totalAccHours: Int! # Sum of the gpu hours of all matched jobs histDuration: [HistoPoint!]! # value: hour, count: number of jobs with a rounded duration of value histNumNodes: [HistoPoint!]! # value: number of nodes, count: number of jobs with that number of nodes @@ -5131,6 +5158,50 @@ func (ec *executionContext) fieldContext_JobsStatistics_totalWalltime(ctx contex return fc, nil } +func (ec *executionContext) _JobsStatistics_totalNodes(ctx context.Context, field graphql.CollectedField, obj *model.JobsStatistics) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_JobsStatistics_totalNodes(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.TotalNodes, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(int) + fc.Result = res + return ec.marshalNInt2int(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_JobsStatistics_totalNodes(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "JobsStatistics", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Int does not have child fields") + }, + } + return fc, nil +} + func (ec *executionContext) _JobsStatistics_totalNodeHours(ctx context.Context, field graphql.CollectedField, obj *model.JobsStatistics) (ret graphql.Marshaler) { fc, err := ec.fieldContext_JobsStatistics_totalNodeHours(ctx, field) if err != nil { @@ -5175,6 +5246,50 @@ func (ec *executionContext) fieldContext_JobsStatistics_totalNodeHours(ctx conte return fc, nil } +func (ec *executionContext) _JobsStatistics_totalCores(ctx context.Context, field graphql.CollectedField, obj *model.JobsStatistics) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_JobsStatistics_totalCores(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.TotalCores, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(int) + fc.Result = res + return ec.marshalNInt2int(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_JobsStatistics_totalCores(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "JobsStatistics", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Int does not have child fields") + }, + } + return fc, nil +} + func (ec *executionContext) _JobsStatistics_totalCoreHours(ctx context.Context, field graphql.CollectedField, obj *model.JobsStatistics) (ret graphql.Marshaler) { fc, err := ec.fieldContext_JobsStatistics_totalCoreHours(ctx, field) if err != nil { @@ -5219,6 +5334,50 @@ func (ec *executionContext) fieldContext_JobsStatistics_totalCoreHours(ctx conte return fc, nil } +func (ec *executionContext) _JobsStatistics_totalAccs(ctx context.Context, field graphql.CollectedField, obj *model.JobsStatistics) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_JobsStatistics_totalAccs(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.TotalAccs, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(int) + fc.Result = res + return ec.marshalNInt2int(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_JobsStatistics_totalAccs(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "JobsStatistics", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Int does not have child fields") + }, + } + return fc, nil +} + func (ec *executionContext) _JobsStatistics_totalAccHours(ctx context.Context, field graphql.CollectedField, obj *model.JobsStatistics) (ret graphql.Marshaler) { fc, err := ec.fieldContext_JobsStatistics_totalAccHours(ctx, field) if err != nil { @@ -7134,10 +7293,16 @@ func (ec *executionContext) fieldContext_Query_jobsStatistics(ctx context.Contex return ec.fieldContext_JobsStatistics_shortJobs(ctx, field) case "totalWalltime": return ec.fieldContext_JobsStatistics_totalWalltime(ctx, field) + case "totalNodes": + return ec.fieldContext_JobsStatistics_totalNodes(ctx, field) case "totalNodeHours": return ec.fieldContext_JobsStatistics_totalNodeHours(ctx, field) + case "totalCores": + return ec.fieldContext_JobsStatistics_totalCores(ctx, field) case "totalCoreHours": return ec.fieldContext_JobsStatistics_totalCoreHours(ctx, field) + case "totalAccs": + return ec.fieldContext_JobsStatistics_totalAccs(ctx, field) case "totalAccHours": return ec.fieldContext_JobsStatistics_totalAccHours(ctx, field) case "histDuration": @@ -12573,16 +12738,31 @@ func (ec *executionContext) _JobsStatistics(ctx context.Context, sel ast.Selecti if out.Values[i] == graphql.Null { out.Invalids++ } + case "totalNodes": + out.Values[i] = ec._JobsStatistics_totalNodes(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } case "totalNodeHours": out.Values[i] = ec._JobsStatistics_totalNodeHours(ctx, field, obj) if out.Values[i] == graphql.Null { out.Invalids++ } + case "totalCores": + out.Values[i] = ec._JobsStatistics_totalCores(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } case "totalCoreHours": out.Values[i] = ec._JobsStatistics_totalCoreHours(ctx, field, obj) if out.Values[i] == graphql.Null { out.Invalids++ } + case "totalAccs": + out.Values[i] = ec._JobsStatistics_totalAccs(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } case "totalAccHours": out.Values[i] = ec._JobsStatistics_totalAccHours(ctx, field, obj) if out.Values[i] == graphql.Null { diff --git a/internal/graph/model/models_gen.go b/internal/graph/model/models_gen.go index 609e6a4..3997b2d 100644 --- a/internal/graph/model/models_gen.go +++ b/internal/graph/model/models_gen.go @@ -91,8 +91,11 @@ type JobsStatistics struct { RunningJobs int `json:"runningJobs"` ShortJobs int `json:"shortJobs"` TotalWalltime int `json:"totalWalltime"` + TotalNodes int `json:"totalNodes"` TotalNodeHours int `json:"totalNodeHours"` + TotalCores int `json:"totalCores"` TotalCoreHours int `json:"totalCoreHours"` + TotalAccs int `json:"totalAccs"` TotalAccHours int `json:"totalAccHours"` HistDuration []*HistoPoint `json:"histDuration"` HistNumNodes []*HistoPoint `json:"histNumNodes"` @@ -191,22 +194,28 @@ func (e Aggregate) MarshalGQL(w io.Writer) { type SortByAggregate string const ( - SortByAggregateWalltime SortByAggregate = "WALLTIME" - SortByAggregateNodehours SortByAggregate = "NODEHOURS" - SortByAggregateCorehours SortByAggregate = "COREHOURS" - SortByAggregateAcchours SortByAggregate = "ACCHOURS" + SortByAggregateWalltime SortByAggregate = "WALLTIME" + SortByAggregateTotalnodes SortByAggregate = "TOTALNODES" + SortByAggregateNodehours SortByAggregate = "NODEHOURS" + SortByAggregateTotalcores SortByAggregate = "TOTALCORES" + SortByAggregateCorehours SortByAggregate = "COREHOURS" + SortByAggregateTotalaccs SortByAggregate = "TOTALACCS" + SortByAggregateAcchours SortByAggregate = "ACCHOURS" ) var AllSortByAggregate = []SortByAggregate{ SortByAggregateWalltime, + SortByAggregateTotalnodes, SortByAggregateNodehours, + SortByAggregateTotalcores, SortByAggregateCorehours, + SortByAggregateTotalaccs, SortByAggregateAcchours, } func (e SortByAggregate) IsValid() bool { switch e { - case SortByAggregateWalltime, SortByAggregateNodehours, SortByAggregateCorehours, SortByAggregateAcchours: + case SortByAggregateWalltime, SortByAggregateTotalnodes, SortByAggregateNodehours, SortByAggregateTotalcores, SortByAggregateCorehours, SortByAggregateTotalaccs, SortByAggregateAcchours: return true } return false diff --git a/internal/repository/stats.go b/internal/repository/stats.go index 18d495b..905d74b 100644 --- a/internal/repository/stats.go +++ b/internal/repository/stats.go @@ -24,10 +24,13 @@ var groupBy2column = map[model.Aggregate]string{ } var sortBy2column = map[model.SortByAggregate]string{ - model.SortByAggregateWalltime: "totalWalltime", - model.SortByAggregateNodehours: "totalNodeHours", - model.SortByAggregateCorehours: "totalCoreHours", - model.SortByAggregateAcchours: "totalAccHours", + model.SortByAggregateWalltime: "totalWalltime", + model.SortByAggregateTotalnodes: "totalNodes", + model.SortByAggregateNodehours: "totalNodeHours", + model.SortByAggregateTotalcores: "totalCores", + model.SortByAggregateCorehours: "totalCoreHours", + model.SortByAggregateTotalaccs: "totalAccs", + model.SortByAggregateAcchours: "totalAccHours", } func (r *JobRepository) buildCountQuery( @@ -67,20 +70,26 @@ func (r *JobRepository) buildStatsQuery( castType := r.getCastType() if col != "" { - // Scan columns: id, totalJobs, totalWalltime, totalNodeHours, totalCoreHours, totalAccHours + // Scan columns: id, totalJobs, totalWalltime, totalNodes, totalNodeHours, totalCores, totalCoreHours, totalAccs, totalAccHours query = sq.Select(col, "COUNT(job.id)", fmt.Sprintf("CAST(ROUND(SUM(job.duration) / 3600) as %s) as totalWalltime", castType), + fmt.Sprintf("CAST(SUM(job.num_nodes) as %s) as totalNodes", castType), fmt.Sprintf("CAST(ROUND(SUM(job.duration * job.num_nodes) / 3600) as %s) as totalNodeHours", castType), + fmt.Sprintf("CAST(SUM(job.num_hwthreads) as %s) as totalCores", castType), fmt.Sprintf("CAST(ROUND(SUM(job.duration * job.num_hwthreads) / 3600) as %s) as totalCoreHours", castType), + fmt.Sprintf("CAST(SUM(job.num_acc) as %s) as totalAccs", castType), fmt.Sprintf("CAST(ROUND(SUM(job.duration * job.num_acc) / 3600) as %s) as totalAccHours", castType), ).From("job").GroupBy(col) } else { - // Scan columns: totalJobs, totalWalltime, totalNodeHours, totalCoreHours, totalAccHours + // Scan columns: totalJobs, totalWalltime, totalNodes, totalNodeHours, totalCores, totalCoreHours, totalAccs, totalAccHours query = sq.Select("COUNT(job.id)", fmt.Sprintf("CAST(ROUND(SUM(job.duration) / 3600) as %s)", castType), + fmt.Sprintf("CAST(SUM(job.num_nodes) as %s)", castType), fmt.Sprintf("CAST(ROUND(SUM(job.duration * job.num_nodes) / 3600) as %s)", castType), + fmt.Sprintf("CAST(SUM(job.num_hwthreads) as %s)", castType), fmt.Sprintf("CAST(ROUND(SUM(job.duration * job.num_hwthreads) / 3600) as %s)", castType), + fmt.Sprintf("CAST(SUM(job.num_acc) as %s)", castType), fmt.Sprintf("CAST(ROUND(SUM(job.duration * job.num_acc) / 3600) as %s)", castType), ).From("job") } @@ -152,14 +161,21 @@ func (r *JobRepository) JobsStatsGrouped( for rows.Next() { var id sql.NullString - var jobs, walltime, nodeHours, coreHours, accHours sql.NullInt64 - if err := rows.Scan(&id, &jobs, &walltime, &nodeHours, &coreHours, &accHours); err != nil { + var jobs, walltime, nodes, nodeHours, cores, coreHours, accs, accHours sql.NullInt64 + if err := rows.Scan(&id, &jobs, &walltime, &nodes, &nodeHours, &cores, &coreHours, &accs, &accHours); err != nil { log.Warn("Error while scanning rows") return nil, err } if id.Valid { - var totalCoreHours, totalAccHours int + var totalCores, totalCoreHours, totalAccs, totalAccHours int + + if cores.Valid { + totalCores = int(cores.Int64) + } + if accs.Valid { + totalAccs = int(accs.Int64) + } if coreHours.Valid { totalCoreHours = int(coreHours.Int64) @@ -176,7 +192,9 @@ func (r *JobRepository) JobsStatsGrouped( Name: name, TotalJobs: int(jobs.Int64), TotalWalltime: int(walltime.Int64), + TotalCores: totalCores, TotalCoreHours: totalCoreHours, + TotalAccs: totalAccs, TotalAccHours: totalAccHours}) } else { stats = append(stats, @@ -184,7 +202,9 @@ func (r *JobRepository) JobsStatsGrouped( ID: id.String, TotalJobs: int(jobs.Int64), TotalWalltime: int(walltime.Int64), + TotalCores: totalCores, TotalCoreHours: totalCoreHours, + TotalAccs: totalAccs, TotalAccHours: totalAccHours}) } } diff --git a/web/frontend/src/Analysis.root.svelte b/web/frontend/src/Analysis.root.svelte index f60b2b9..4a87600 100644 --- a/web/frontend/src/Analysis.root.svelte +++ b/web/frontend/src/Analysis.root.svelte @@ -66,13 +66,26 @@ histDuration { count, value } histNumNodes { count, value } } - - topUsers: jobsCount(filter: $jobFilters, groupBy: USER, weight: CORE_HOURS, limit: 5) { name, count } } `, variables: { jobFilters } }) + const paging = { itemsPerPage: 5, page: 1 }; // Top 5 + // const sorting = { field: "totalCoreHours", order: "DESC" }; + $: topQuery = queryStore({ + client: client, + query: gql` + query($jobFilters: [JobFilter!]!, $paging: PageRequest!) { + jobsStatistics(filter: $jobFilters, page: $paging, sortBy: TOTALCOREHOURS, groupBy: USER) { + id + totalCoreHours + } + } + `, + variables: { jobFilters, paging } + }) + $: footprintsQuery = queryStore({ client: client, query: gql` @@ -164,8 +177,8 @@ b.count - a.count).map((tu) => tu.count)} - entities={$statsQuery.data.topUsers.sort((a, b) => b.count - a.count).map((tu) => tu.name)} + quantities={$topQuery.data.jobsStatistics.map((tu) => tu.totalCoreHours)} + entities={$topQuery.data.jobsStatistics.map((tu) => tu.id)} /> {/key} @@ -173,11 +186,11 @@
LegendUser NameNode Hours
LegendUser NameCore Hours
` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-`` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-` - = roles.support - ? "Example: 'projectId:a100cd', Types are: jobId | jobName | projectId | arrayJobId | username | name" - : "Example: 'jobName:myjob', Types are jobId | jobName | projectId | arrayJobId "} - > - - - - {#if username} - -
- -
-
- {/if} - - - - diff --git a/web/frontend/src/NavbarTools.svelte b/web/frontend/src/NavbarTools.svelte new file mode 100644 index 0000000..5655a7c --- /dev/null +++ b/web/frontend/src/NavbarTools.svelte @@ -0,0 +1,124 @@ + + +{#if screenSize >= 768} + +
+ + + + = roles.support + ? "Example: 'projectId:a100cd', Types are: jobId | jobName | projectId | arrayJobId | username | name" + : "Example: 'jobName:myjob', Types are jobId | jobName | projectId | arrayJobId "} + > + +
+
+ {#if username} + +
+ +
+
+ {/if} + + + +{:else} + + + +
- {#each $statsQuery.data.topUsers.sort((a, b) => b.count - a.count) as { name, count }, i} + {#each $topQuery.data.jobsStatistics as { id, totalCoreHours }, i} - - + + {/each}
LegendUser NameCore Hours
{name}{count}{id}{totalCoreHours}
diff --git a/web/frontend/src/Status.root.svelte b/web/frontend/src/Status.root.svelte index 244862c..06a1893 100644 --- a/web/frontend/src/Status.root.svelte +++ b/web/frontend/src/Status.root.svelte @@ -38,9 +38,7 @@ histNumNodes { count, value } } - allocatedNodes(cluster: $cluster) { name, count } - topUsers: jobsCount(filter: $filter, groupBy: USER, weight: NODE_COUNT, limit: 10) { name, count } - topProjects: jobsCount(filter: $filter, groupBy: PROJECT, weight: NODE_COUNT, limit: 10) { name, count } + allocatedNodes(cluster: $cluster) { name, count } }`, variables: { cluster: cluster, metrics: ['flops_any', 'mem_bw'], from: from.toISOString(), to: to.toISOString(), @@ -48,6 +46,36 @@ } }) + const paging = { itemsPerPage: 10, page: 1 }; // Top 10 + // const sorting = { field: "totalCores", order: "DESC" }; + $: topUserQuery = queryStore({ + client: client, + query: gql` + query($filter: [JobFilter!]!, $paging: PageRequest!) { + topUser: jobsStatistics(filter: $filter, page: $paging, sortBy: TOTALCORES, groupBy: USER) { + id + totalNodes + totalCores + } + } + `, + variables: { filter: [{ state: ['running'] }, { cluster: { eq: cluster } }], paging } + }) + + $: topProjectQuery = queryStore({ + client: client, + query: gql` + query($filter: [JobFilter!]!, $paging: PageRequest!) { + topProjects: jobsStatistics(filter: $filter, page: $paging, sortBy: TOTALCORES, groupBy: PROJECT) { + id + totalNodes + totalCores + } + } + `, + variables: { filter: [{ state: ['running'] }, { cluster: { eq: cluster } }], paging } + }) + const sumUp = (data, subcluster, metric) => data.reduce((sum, node) => node.subCluster == subcluster ? sum + (node.metrics.find(m => m.name == metric)?.metric.series.reduce((sum, series) => sum + series.data[series.data.length - 1], 0) || 0) : sum, 0) @@ -161,48 +189,47 @@

Top Users

- {#key $mainQuery.data} + {#key $topUserQuery.data} b.count - a.count).map((tu) => tu.count)} - entities={$mainQuery.data.topUsers.sort((a, b) => b.count - a.count).map((tu) => tu.name)} - + quantities={$topUserQuery.data.topUser.map((tu) => tu.totalCores)} + entities={$topUserQuery.data.topUser.map((tu) => tu.id)} /> {/key}
- - {#each $mainQuery.data.topUsers.sort((a, b) => b.count - a.count) as { name, count }, i} + + {#each $topUserQuery.data.topUser as { id, totalCores, totalNodes }, i} - - + + {/each}
LegendUser NameNumber of Nodes
LegendUser NameNumber of Cores
{name}{count}{id}{totalCores}

Top Projects

- {#key $mainQuery.data} + {#key $topProjectQuery.data} b.count - a.count).map((tp) => tp.count)} - entities={$mainQuery.data.topProjects.sort((a, b) => b.count - a.count).map((tp) => tp.name)} + quantities={$topProjectQuery.data.topProjects.map((tp) => tp.totalCores)} + entities={$topProjectQuery.data.topProjects.map((tp) => tp.id)} /> {/key} - - {#each $mainQuery.data.topProjects.sort((a, b) => b.count - a.count) as { name, count }, i} + + {#each $topProjectQuery.data.topProjects as { id, totalCores, totalNodes }, i} - - + + {/each}
LegendProject CodeNumber of Nodes
LegendProject CodeNumber of Cores
{name}{count}{id}{totalCores}
From c84b81921257da407c04492a65f60b1f9b1df7ea Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Mon, 28 Aug 2023 10:00:20 +0200 Subject: [PATCH 77/95] Fix frontend errors - todo: debug backend handling --- internal/repository/stats.go | 12 ++++++++++-- web/frontend/src/Analysis.root.svelte | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/internal/repository/stats.go b/internal/repository/stats.go index 905d74b..c766238 100644 --- a/internal/repository/stats.go +++ b/internal/repository/stats.go @@ -221,14 +221,22 @@ func (r *JobRepository) jobsStats( row := query.RunWith(r.DB).QueryRow() stats := make([]*model.JobsStatistics, 0, 1) - var jobs, walltime, nodeHours, coreHours, accHours sql.NullInt64 - if err := row.Scan(&jobs, &walltime, &nodeHours, &coreHours, &accHours); err != nil { + var jobs, walltime, nodes, nodeHours, cores, coreHours, accs, accHours sql.NullInt64 + if err := row.Scan(&jobs, &walltime, &nodes, &nodeHours, &cores, &coreHours, &accs, &accHours); err != nil { log.Warn("Error while scanning rows") return nil, err } if jobs.Valid { var totalCoreHours, totalAccHours int + // var totalCores, totalAccs int + + // if cores.Valid { + // totalCores = int(cores.Int64) + // } + // if accs.Valid { + // totalAccs = int(accs.Int64) + // } if coreHours.Valid { totalCoreHours = int(coreHours.Int64) diff --git a/web/frontend/src/Analysis.root.svelte b/web/frontend/src/Analysis.root.svelte index 4a87600..76e1813 100644 --- a/web/frontend/src/Analysis.root.svelte +++ b/web/frontend/src/Analysis.root.svelte @@ -77,7 +77,7 @@ client: client, query: gql` query($jobFilters: [JobFilter!]!, $paging: PageRequest!) { - jobsStatistics(filter: $jobFilters, page: $paging, sortBy: TOTALCOREHOURS, groupBy: USER) { + jobsStatistics(filter: $jobFilters, page: $paging, sortBy: COREHOURS, groupBy: USER) { id totalCoreHours } From 69519ec0401ce134a4b98e44ffeb6842683eba70 Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Mon, 28 Aug 2023 10:19:26 +0200 Subject: [PATCH 78/95] Add requireField cases to resolver --- internal/graph/schema.resolvers.go | 3 ++- web/frontend/src/Analysis.root.svelte | 8 ++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/internal/graph/schema.resolvers.go b/internal/graph/schema.resolvers.go index 83aec04..684783a 100644 --- a/internal/graph/schema.resolvers.go +++ b/internal/graph/schema.resolvers.go @@ -248,7 +248,8 @@ func (r *queryResolver) JobsStatistics(ctx context.Context, filter []*model.JobF var err error var stats []*model.JobsStatistics - if requireField(ctx, "totalJobs") { + if requireField(ctx, "totalJobs") || requireField(ctx, "totalNodes") || requireField(ctx, "totalCores") || requireField(ctx, "totalAccs") || + requireField(ctx, "totalNodeHours") || requireField(ctx, "totalCoreHours") || requireField(ctx, "totalAccHours") { if groupBy == nil { stats, err = r.Repo.JobsStats(ctx, filter) } else { diff --git a/web/frontend/src/Analysis.root.svelte b/web/frontend/src/Analysis.root.svelte index 76e1813..88c3a32 100644 --- a/web/frontend/src/Analysis.root.svelte +++ b/web/frontend/src/Analysis.root.svelte @@ -77,7 +77,7 @@ client: client, query: gql` query($jobFilters: [JobFilter!]!, $paging: PageRequest!) { - jobsStatistics(filter: $jobFilters, page: $paging, sortBy: COREHOURS, groupBy: USER) { + topUser: jobsStatistics(filter: $jobFilters, page: $paging, sortBy: COREHOURS, groupBy: USER) { id totalCoreHours } @@ -177,8 +177,8 @@ tu.totalCoreHours)} - entities={$topQuery.data.jobsStatistics.map((tu) => tu.id)} + quantities={$topQuery.data.topUser.map((tu) => tu.totalCoreHours)} + entities={$topQuery.data.topUser.map((tu) => tu.id)} /> {/key}
@@ -186,7 +186,7 @@ - {#each $topQuery.data.jobsStatistics as { id, totalCoreHours }, i} + {#each $topQuery.data.topUser as { id, totalCoreHours }, i} From 5772f38debf07228d47278c6a8eb0be19924fc99 Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Mon, 28 Aug 2023 12:53:09 +0200 Subject: [PATCH 79/95] fix plot timestamp format in systems/node view --- web/frontend/src/plots/MetricPlot.svelte | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/web/frontend/src/plots/MetricPlot.svelte b/web/frontend/src/plots/MetricPlot.svelte index 094122e..17eec5f 100644 --- a/web/frontend/src/plots/MetricPlot.svelte +++ b/web/frontend/src/plots/MetricPlot.svelte @@ -166,7 +166,7 @@ } } - const plotSeries = [{label: 'Runtime', value: (u, ts, sidx, didx) => didx == null ? null : formatTime(ts)}] + const plotSeries = [{label: 'Runtime', value: (u, ts, sidx, didx) => didx == null ? null : formatTime(ts, forNode)}] const plotData = [new Array(longestSeries)] if (forNode === true) { @@ -227,7 +227,7 @@ scale: 'x', space: 35, incrs: timeIncrs(timestep, maxX, forNode), - values: (_, vals) => vals.map(v => formatTime(v)) + values: (_, vals) => vals.map(v => formatTime(v, forNode)) }, { scale: 'y', @@ -349,19 +349,21 @@ } @@ -200,7 +248,7 @@ diff --git a/web/frontend/src/Status.root.svelte b/web/frontend/src/Status.root.svelte index 4e7269a..c0a67ad 100644 --- a/web/frontend/src/Status.root.svelte +++ b/web/frontend/src/Status.root.svelte @@ -1,4 +1,5 @@ From 1da0e3a7479ea96032a14e06bcbed80355c3baf3 Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Thu, 31 Aug 2023 13:10:01 +0200 Subject: [PATCH 88/95] Reformat --- web/frontend/src/Status.root.svelte | 340 ++++++++++++++++++++-------- 1 file changed, 248 insertions(+), 92 deletions(-) diff --git a/web/frontend/src/Status.root.svelte b/web/frontend/src/Status.root.svelte index 34a8fa0..f1d8e05 100644 --- a/web/frontend/src/Status.root.svelte +++ b/web/frontend/src/Status.root.svelte @@ -1,30 +1,67 @@ @@ -349,18 +451,27 @@
-

Top Users on {cluster.charAt(0).toUpperCase() + cluster.slice(1)}

+

+ Top Users on {cluster.charAt(0).toUpperCase() + + cluster.slice(1)} +

{#key $topUserQuery.data} {#if $topUserQuery.fetching} - + {:else if $topUserQuery.error} - {$topUserQuery.error.message} - {:else} + {$topUserQuery.error.message} + {:else} tu[topUserSelection.key])} - entities={$topUserQuery.data.topUser.map((tu) => tu.id)} + quantities={$topUserQuery.data.topUser.map( + (tu) => tu[topUserSelection.key] + )} + entities={$topUserQuery.data.topUser.map( + (tu) => tu.id + )} /> {/if} {/key} @@ -369,16 +480,22 @@
{#key $topUserQuery.data} {#if $topUserQuery.fetching} - + {:else if $topUserQuery.error} - {$topUserQuery.error.message} - {:else} + {$topUserQuery.error.message} + {:else}
LegendUser NameCore Hours
{id}
- {#each $topUserQuery.data.topUser as tu, i} - - + + {/each} @@ -399,18 +526,27 @@ {/key} -

Top Projects on {cluster.charAt(0).toUpperCase() + cluster.slice(1)}

+

+ Top Projects on {cluster.charAt(0).toUpperCase() + + cluster.slice(1)} +

{#key $topProjectQuery.data} {#if $topProjectQuery.fetching} - + {:else if $topProjectQuery.error} - {$topProjectQuery.error.message} + {$topProjectQuery.error.message} {:else} tp[topProjectSelection.key])} - entities={$topProjectQuery.data.topProjects.map((tp) => tp.id)} + quantities={$topProjectQuery.data.topProjects.map( + (tp) => tp[topProjectSelection.key] + )} + entities={$topProjectQuery.data.topProjects.map( + (tp) => tp.id + )} /> {/if} {/key} @@ -418,16 +554,22 @@ {#key $topProjectQuery.data} {#if $topProjectQuery.fetching} - + {:else if $topProjectQuery.error} - {$topProjectQuery.error.message} - {:else} + {$topProjectQuery.error.message} + {:else}
Legend User NameNumber of - Number of +
{tu.id}{tu.id} {tu[topUserSelection.key]}
- {#each $topProjectQuery.data.topProjects as tp, i} - - + + {/each} @@ -486,13 +638,16 @@
{#key $mainQuery.data.stats} + yunit="Jobs" + /> {/key}
@@ -503,9 +658,10 @@ width={colWidth2 - 25} title="Number of Accelerators Distribution" xlabel="Allocated Accs" - xunit="Accs" + xunit="Accs" ylabel="Number of Jobs" - yunit="Jobs"/> + yunit="Jobs" + /> {/key} From 369757b35b68123cde4c56454803975a58d434d4 Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Thu, 31 Aug 2023 14:18:33 +0200 Subject: [PATCH 89/95] Fix Navbar layout --- web/frontend/src/Header.svelte | 7 +- web/frontend/src/NavbarTools.svelte | 199 ++++++++++++++-------------- 2 files changed, 105 insertions(+), 101 deletions(-) diff --git a/web/frontend/src/Header.svelte b/web/frontend/src/Header.svelte index 038d1a3..03c8cd0 100644 --- a/web/frontend/src/Header.svelte +++ b/web/frontend/src/Header.svelte @@ -8,7 +8,7 @@ NavbarToggler, Dropdown, DropdownToggle, - DropdownMenu + DropdownMenu, } from "sveltestrap"; import NavbarLinks from "./NavbarLinks.svelte"; import NavbarTools from "./NavbarTools.svelte"; @@ -106,12 +106,13 @@ (isOpen = !isOpen)} /> (isOpen = detail.isOpen)} > - - + {#if username} + + + + + + {/if} + + + + {:else} + + + + + + + + + - - - - - - - - - -
- - - - = roles.support - ? "Example: 'projectId:a100cd', Types are: jobId | jobName | projectId | arrayJobId | username | name" - : "Example: 'jobName:myjob', Types are jobId | jobName | projectId | arrayJobId "} - > - - -
-{/if} + + + + + +
+ + + + = roles.support + ? "Example: 'projectId:a100cd', Types are: jobId | jobName | projectId | arrayJobId | username | name" + : "Example: 'jobName:myjob', Types are jobId | jobName | projectId | arrayJobId "} + > + + +
+ {/if} + From b52330ebf038ca7b1a910160b05b8d77e9c5af34 Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Thu, 31 Aug 2023 14:48:19 +0200 Subject: [PATCH 90/95] simplify bins return --- web/frontend/src/utils.js | 27 ++++++--------------------- 1 file changed, 6 insertions(+), 21 deletions(-) diff --git a/web/frontend/src/utils.js b/web/frontend/src/utils.js index 5e9cdae..42942fd 100644 --- a/web/frontend/src/utils.js +++ b/web/frontend/src/utils.js @@ -350,31 +350,16 @@ export function binsFromFootprint(weights, scope, values, numBins) { scopeWeights = weights.nodeHours } - const bins = new Array(numBins).fill(0) + const rawBins = new Array(numBins).fill(0) for (let i = 0; i < values.length; i++) bins[Math.floor(((values[i] - min) / (max - min)) * numBins)] += scopeWeights ? scopeWeights[i] : 1 - // Manual Canvas Original - // return { - // label: idx => { - // let start = min + (idx / numBins) * (max - min) - // let stop = min + ((idx + 1) / numBins) * (max - min) - // return `${formatNumber(start)} - ${formatNumber(stop)}` - // }, - // bins: bins.map((count, idx) => ({ value: idx, count: count })), - // min: min, - // max: max - // } + const bins = rawBins.map((count, idx) => ({ + value: Math.floor(min + ((idx + 1) / numBins) * (max - min)), + count: count + })) return { - bins: bins.map((count, idx) => ({ - value: idx => { // Use bins' max value instead of mean - // let start = min + (idx / numBins) * (max - min) - let stop = min + ((idx + 1) / numBins) * (max - min) - // return `${formatNumber(Math.floor((start+stop)/2))}` - return Math.floor(stop) - }, - count: count - })) + bins: bins } } From 64796519c6eeae8c5aa982857ad2b954ba3b2fa8 Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Thu, 31 Aug 2023 15:10:57 +0200 Subject: [PATCH 91/95] change: use continue for rooflineHeatmap errors - hard errors blocked rendering in frontend --- internal/graph/util.go | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/internal/graph/util.go b/internal/graph/util.go index b61bcc7..3a2c3b1 100644 --- a/internal/graph/util.go +++ b/internal/graph/util.go @@ -6,7 +6,6 @@ package graph import ( "context" - "errors" "fmt" "math" @@ -33,7 +32,7 @@ func (r *queryResolver) rooflineHeatmap( return nil, err } if len(jobs) > MAX_JOBS_FOR_ANALYSIS { - return nil, fmt.Errorf("GRAPH/STATS > too many jobs matched (max: %d)", MAX_JOBS_FOR_ANALYSIS) + return nil, fmt.Errorf("GRAPH/UTIL > too many jobs matched (max: %d)", MAX_JOBS_FOR_ANALYSIS) } fcols, frows := float64(cols), float64(rows) @@ -50,20 +49,24 @@ func (r *queryResolver) rooflineHeatmap( jobdata, err := metricdata.LoadData(job, []string{"flops_any", "mem_bw"}, []schema.MetricScope{schema.MetricScopeNode}, ctx) if err != nil { - log.Error("Error while loading metrics for roofline") + log.Errorf("Error while loading roofline metrics for job %d", job.ID) return nil, err } flops_, membw_ := jobdata["flops_any"], jobdata["mem_bw"] if flops_ == nil && membw_ == nil { - return nil, fmt.Errorf("GRAPH/STATS > 'flops_any' or 'mem_bw' missing for job %d", job.ID) + log.Infof("rooflineHeatmap(): 'flops_any' or 'mem_bw' missing for job %d", job.ID) + continue + // return nil, fmt.Errorf("GRAPH/UTIL > 'flops_any' or 'mem_bw' missing for job %d", job.ID) } flops, ok1 := flops_["node"] membw, ok2 := membw_["node"] if !ok1 || !ok2 { + log.Info("rooflineHeatmap() query not implemented for where flops_any or mem_bw not available at 'node' level") + continue // TODO/FIXME: - return nil, errors.New("GRAPH/STATS > todo: rooflineHeatmap() query not implemented for where flops_any or mem_bw not available at 'node' level") + // return nil, errors.New("GRAPH/UTIL > todo: rooflineHeatmap() query not implemented for where flops_any or mem_bw not available at 'node' level") } for n := 0; n < len(flops.Series); n++ { @@ -99,7 +102,7 @@ func (r *queryResolver) jobsFootprints(ctx context.Context, filter []*model.JobF return nil, err } if len(jobs) > MAX_JOBS_FOR_ANALYSIS { - return nil, fmt.Errorf("GRAPH/STATS > too many jobs matched (max: %d)", MAX_JOBS_FOR_ANALYSIS) + return nil, fmt.Errorf("GRAPH/UTIL > too many jobs matched (max: %d)", MAX_JOBS_FOR_ANALYSIS) } avgs := make([][]schema.Float, len(metrics)) From cffdd055c9c2b2c28871ccc6078c38c6af82d977 Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Thu, 31 Aug 2023 15:17:40 +0200 Subject: [PATCH 92/95] change: use continue for ccms.loadStats errors --- internal/metricdata/cc-metric-store.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/internal/metricdata/cc-metric-store.go b/internal/metricdata/cc-metric-store.go index cfaa6fd..4874975 100644 --- a/internal/metricdata/cc-metric-store.go +++ b/internal/metricdata/cc-metric-store.go @@ -533,7 +533,9 @@ func (ccms *CCMetricStore) LoadStats( metric := ccms.toLocalName(query.Metric) data := res[0] if data.Error != nil { - return nil, fmt.Errorf("METRICDATA/CCMS > fetching %s for node %s failed: %s", metric, query.Hostname, *data.Error) + log.Infof("fetching %s for node %s failed: %s", metric, query.Hostname, *data.Error) + continue + // return nil, fmt.Errorf("METRICDATA/CCMS > fetching %s for node %s failed: %s", metric, query.Hostname, *data.Error) } metricdata, ok := stats[metric] @@ -543,7 +545,9 @@ func (ccms *CCMetricStore) LoadStats( } if data.Avg.IsNaN() || data.Min.IsNaN() || data.Max.IsNaN() { - return nil, fmt.Errorf("METRICDATA/CCMS > fetching %s for node %s failed: %s", metric, query.Hostname, "avg/min/max is NaN") + log.Infof("fetching %s for node %s failed: one of avg/min/max is NaN", metric, query.Hostname) + continue + // return nil, fmt.Errorf("METRICDATA/CCMS > fetching %s for node %s failed: %s", metric, query.Hostname, "avg/min/max is NaN") } metricdata[query.Hostname] = schema.MetricStatistics{ From a2a4b2e6c2a0631d95adb0270e63dbde1a1002f7 Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Thu, 31 Aug 2023 15:19:54 +0200 Subject: [PATCH 93/95] fix variable --- web/frontend/src/utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/frontend/src/utils.js b/web/frontend/src/utils.js index 42942fd..0650916 100644 --- a/web/frontend/src/utils.js +++ b/web/frontend/src/utils.js @@ -352,7 +352,7 @@ export function binsFromFootprint(weights, scope, values, numBins) { const rawBins = new Array(numBins).fill(0) for (let i = 0; i < values.length; i++) - bins[Math.floor(((values[i] - min) / (max - min)) * numBins)] += scopeWeights ? scopeWeights[i] : 1 + rawBins[Math.floor(((values[i] - min) / (max - min)) * numBins)] += scopeWeights ? scopeWeights[i] : 1 const bins = rawBins.map((count, idx) => ({ value: Math.floor(min + ((idx + 1) / numBins) * (max - min)), From cdb66365bf93cf00c5dba87695104fdd09b195b4 Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Thu, 31 Aug 2023 16:17:15 +0200 Subject: [PATCH 94/95] Prepare release --- Makefile | 2 +- ReleaseNotes.md | 14 +++++++++----- configs/README.md | 33 ++++++++++++++++++++++++--------- configs/config.json | 2 +- 4 files changed, 35 insertions(+), 16 deletions(-) diff --git a/Makefile b/Makefile index 505281c..3d44172 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ TARGET = ./cc-backend VAR = ./var CFG = config.json .env FRONTEND = ./web/frontend -VERSION = 1.1.0 +VERSION = 1.2.0 GIT_HASH := $(shell git rev-parse --short HEAD || echo 'development') CURRENT_TIME = $(shell date +"%Y-%m-%d:T%H:%M:%S") LD_FLAGS = '-s -X main.date=${CURRENT_TIME} -X main.version=${VERSION} -X main.commit=${GIT_HASH}' diff --git a/ReleaseNotes.md b/ReleaseNotes.md index d66a27f..c10ecd5 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -7,12 +7,12 @@ implementation of ClusterCockpit. ** Breaking changes ** -The LDAP configuration option user_filter was changed and now should not include -the wildcard. Example: -* Old: `"user_filter": "(&(objectclass=posixAccount)(uid=*))"` -* New: `"user_filter": "&(objectclass=posixAccount)"` +* The LDAP configuration option user_filter was changed and now should not include +the uid wildcard. Example: + - Old: `"user_filter": "(&(objectclass=posixAccount)(uid=*))"` + - New: `"user_filter": "(&(objectclass=posixAccount))"` -The aggregate job statistic core hours is now computed using the job table +* The aggregate job statistic core hours is now computed using the job table column `num_hwthreads`. In a future release this column will be renamed to `num_cores`. For correct display of core hours `num_hwthreads` must be correctly filled on job start. If your existing jobs do not provide the correct value in @@ -21,6 +21,10 @@ if you have exclusive jobs, only. Please be aware that we treat this column as it is the number of cores. In case you have SMT enabled and `num_hwthreads` is not the number of cores the core hours will be too high by a factor! +* The jwts key is now mandatory in config.json. It has to set max-age for + validity. Some key names have changed, please refer to + [config documentation](./configs/README.md) for details. + ** NOTE ** If you are using the sqlite3 backend the `PRAGMA` option `foreign_keys` must be explicitly set to ON. If using the sqlite3 console it is per default set to diff --git a/configs/README.md b/configs/README.md index 944d0d3..76029d1 100644 --- a/configs/README.md +++ b/configs/README.md @@ -16,26 +16,41 @@ It is supported to set these by means of a `.env` file in the project root. * `static-files`: Type string. Folder where static assets can be found, if `embed-static-files` is `false`. No default. * `db-driver`: Type string. 'sqlite3' or 'mysql' (mysql will work for mariadb as well). Default `sqlite3`. * `db`: Type string. For sqlite3 a filename, for mysql a DSN in this format: https://github.com/go-sql-driver/mysql#dsn-data-source-name (Without query parameters!). Default: `./var/job.db`. -* `job-archive`: Type string. Path to the job-archive. Default: `./var/job-archive`. +* `job-archive`: Type object. + - `kind`: Type string. At them moment only file is supported as value. + - `path`: Type string. Path to the job-archive. Default: `./var/job-archive`. + - `compression`: Type integer. Setup automatic compression for jobs older than number of days. + - `retention`: Type object. + - `policy`: Type string (required). Retention policy. Possible values none, delete, + move. + - `includeDB`: Type boolean. Also remove jobs from database. + - `age`: Type integer. Act on jobs with startTime older than age (in days). + - `location`: Type string. The target directory for retention. Only applicable for retention policy move. * `disable-archive`: Type bool. Keep all metric data in the metric data repositories, do not write to the job-archive. Default `false`. * `validate`: Type bool. Validate all input json documents against json schema. * `session-max-age`: Type string. Specifies for how long a session shall be valid as a string parsable by time.ParseDuration(). If 0 or empty, the session/token does not expire! Default `168h`. -* `jwt-max-age`: Type string. Specifies for how long a JWT token shall be valid as a string parsable by time.ParseDuration(). If 0 or empty, the session/token does not expire! Default `0`. * `https-cert-file` and `https-key-file`: Type string. If both those options are not empty, use HTTPS using those certificates. * `redirect-http-to`: Type string. If not the empty string and `addr` does not end in ":80", redirect every request incoming at port 80 to that url. * `machine-state-dir`: Type string. Where to store MachineState files. TODO: Explain in more detail! * `stop-jobs-exceeding-walltime`: Type int. If not zero, automatically mark jobs as stopped running X seconds longer than their walltime. Only applies if walltime is set for job. Default `0`. * `short-running-jobs-duration`: Type int. Do not show running jobs shorter than X seconds. Default `300`. +* `jwts`: Type object (required). For JWT Authentication. + - `max-age`: Type string (required). Configure how long a token is valid. As string parsable by time.ParseDuration(). + - `cookieName`: Type string. Cookie that should be checked for a JWT token. + - `vaidateUser`: Type boolean. Deny login for users not in database (but defined in JWT). Overwrite roles in JWT with database roles. + - `trustedIssuer`: Type string. Issuer that should be accepted when validating external JWTs. + - `syncUserOnLogin`: Type boolean. Add non-existent user to DB at login attempt with values provided in JWT. * `ldap`: Type object. For LDAP Authentication and user synchronisation. Default `nil`. - - `url`: Type string. URL of LDAP directory server. - - `user_base`: Type string. Base DN of user tree root. - - `search_dn`: Type string. DN for authenticating LDAP admin account with general read rights. - - `user_bind`: Type string. Expression used to authenticate users via LDAP bind. Must contain `uid={username}`. - - `user_filter`: Type string. Filter to extract users for syncing. + - `url`: Type string (required). URL of LDAP directory server. + - `user_base`: Type string (required). Base DN of user tree root. + - `search_dn`: Type string (required). DN for authenticating LDAP admin account with general read rights. + - `user_bind`: Type string (required). Expression used to authenticate users via LDAP bind. Must contain `uid={username}`. + - `user_filter`: Type string (required). Filter to extract users for syncing. - `username_attr`: Type string. Attribute with full user name. Defaults to `gecos` if not provided. - `sync_interval`: Type string. Interval used for syncing local user table with LDAP directory. Parsed using time.ParseDuration. - - `sync_del_old_users`: Type bool. Delete obsolete users in database. -* `clusters`: Type array of objects + - `sync_del_old_users`: Type boolean. Delete obsolete users in database. + - `syncUserOnLogin`: Type boolean. Add non-existent user to DB at login attempt if user exists in Ldap directory. +* `clusters`: Type array of objects (required) - `name`: Type string. The name of the cluster. - `metricDataRepository`: Type object with properties: `kind` (Type string, can be one of `cc-metric-store`, `influxdb` ), `url` (Type string), `token` (Type string) - `filterRanges` Type object. This option controls the slider ranges for the UI controls of numNodes, duration, and startTime. Example: diff --git a/configs/config.json b/configs/config.json index 3a2c64b..fbc3343 100644 --- a/configs/config.json +++ b/configs/config.json @@ -5,7 +5,7 @@ "user_base": "ou=people,ou=hpc,dc=test,dc=de", "search_dn": "cn=hpcmonitoring,ou=roadm,ou=profile,ou=hpc,dc=test,dc=de", "user_bind": "uid={username},ou=people,ou=hpc,dc=test,dc=de", - "user_filter": "(&(objectclass=posixAccount)(uid=*))" + "user_filter": "(&(objectclass=posixAccount))" }, "https-cert-file": "/etc/letsencrypt/live/url/fullchain.pem", "https-key-file": "/etc/letsencrypt/live/url/privkey.pem", From d4f09b4679e30aefec028e22fe6c1904358d84d7 Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Fri, 1 Sep 2023 07:36:29 +0200 Subject: [PATCH 95/95] Remove generated REST client --- internal/api/0.0.37/.gitignore | 24 - internal/api/0.0.37/.openapi-generator-ignore | 23 - internal/api/0.0.37/.openapi-generator/FILES | 58 - .../api/0.0.37/.openapi-generator/VERSION | 1 - internal/api/0.0.37/.travis.yml | 8 - internal/api/0.0.37/README.md | 190 - internal/api/0.0.37/api/openapi.yaml | 2525 ---------- internal/api/0.0.37/api_openapi.go | 480 -- internal/api/0.0.37/api_slurm.go | 1746 ------- internal/api/0.0.37/client.go | 666 --- internal/api/0.0.37/configuration.go | 243 - internal/api/0.0.37/docs/OpenapiAPI.md | 240 - internal/api/0.0.37/docs/SlurmAPI.md | 871 ---- internal/api/0.0.37/docs/V0037Diag.md | 82 - .../api/0.0.37/docs/V0037DiagStatistics.md | 1044 ----- internal/api/0.0.37/docs/V0037Error.md | 82 - .../api/0.0.37/docs/V0037JobProperties.md | 1871 -------- internal/api/0.0.37/docs/V0037JobResources.md | 134 - .../0.0.37/docs/V0037JobResponseProperties.md | 2812 ------------ .../api/0.0.37/docs/V0037JobSubmission.md | 103 - .../0.0.37/docs/V0037JobSubmissionResponse.md | 134 - internal/api/0.0.37/docs/V0037JobsResponse.md | 82 - internal/api/0.0.37/docs/V0037Node.md | 1122 ----- .../api/0.0.37/docs/V0037NodeAllocation.md | 134 - .../api/0.0.37/docs/V0037NodesResponse.md | 82 - internal/api/0.0.37/docs/V0037Partition.md | 758 --- .../0.0.37/docs/V0037PartitionsResponse.md | 82 - internal/api/0.0.37/docs/V0037Ping.md | 134 - internal/api/0.0.37/docs/V0037Pings.md | 82 - internal/api/0.0.37/docs/V0037Reservation.md | 524 --- .../docs/V0037ReservationPurgeCompleted.md | 56 - .../0.0.37/docs/V0037ReservationsResponse.md | 82 - internal/api/0.0.37/docs/V0037Signal.md | 39 - internal/api/0.0.37/git_push.sh | 57 - internal/api/0.0.37/go.mod | 6 - internal/api/0.0.37/go.sum | 11 - internal/api/0.0.37/model_v0_0_37_diag.go | 164 - .../0.0.37/model_v0_0_37_diag_statistics.go | 1534 ------- internal/api/0.0.37/model_v0_0_37_error.go | 165 - .../0.0.37/model_v0_0_37_job_properties.go | 2713 ----------- .../api/0.0.37/model_v0_0_37_job_resources.go | 239 - .../model_v0_0_37_job_response_properties.go | 4049 ----------------- .../0.0.37/model_v0_0_37_job_submission.go | 192 - .../model_v0_0_37_job_submission_response.go | 239 - .../api/0.0.37/model_v0_0_37_jobs_response.go | 165 - internal/api/0.0.37/model_v0_0_37_node.go | 1645 ------- .../0.0.37/model_v0_0_37_node_allocation.go | 239 - .../0.0.37/model_v0_0_37_nodes_response.go | 165 - .../api/0.0.37/model_v0_0_37_partition.go | 1127 ----- .../model_v0_0_37_partitions_response.go | 165 - internal/api/0.0.37/model_v0_0_37_ping.go | 239 - internal/api/0.0.37/model_v0_0_37_pings.go | 165 - .../api/0.0.37/model_v0_0_37_reservation.go | 793 ---- ...del_v0_0_37_reservation_purge_completed.go | 128 - .../model_v0_0_37_reservations_response.go | 165 - internal/api/0.0.37/model_v0_0_37_signal.go | 138 - internal/api/0.0.37/response.go | 48 - internal/api/0.0.37/test/api_openapi_test.go | 69 - internal/api/0.0.37/test/api_slurm_test.go | 191 - internal/api/0.0.37/utils.go | 348 -- internal/scheduler/slurmRestClient.go | 0 61 files changed, 31673 deletions(-) delete mode 100644 internal/api/0.0.37/.gitignore delete mode 100644 internal/api/0.0.37/.openapi-generator-ignore delete mode 100644 internal/api/0.0.37/.openapi-generator/FILES delete mode 100644 internal/api/0.0.37/.openapi-generator/VERSION delete mode 100644 internal/api/0.0.37/.travis.yml delete mode 100644 internal/api/0.0.37/README.md delete mode 100644 internal/api/0.0.37/api/openapi.yaml delete mode 100644 internal/api/0.0.37/api_openapi.go delete mode 100644 internal/api/0.0.37/api_slurm.go delete mode 100644 internal/api/0.0.37/client.go delete mode 100644 internal/api/0.0.37/configuration.go delete mode 100644 internal/api/0.0.37/docs/OpenapiAPI.md delete mode 100644 internal/api/0.0.37/docs/SlurmAPI.md delete mode 100644 internal/api/0.0.37/docs/V0037Diag.md delete mode 100644 internal/api/0.0.37/docs/V0037DiagStatistics.md delete mode 100644 internal/api/0.0.37/docs/V0037Error.md delete mode 100644 internal/api/0.0.37/docs/V0037JobProperties.md delete mode 100644 internal/api/0.0.37/docs/V0037JobResources.md delete mode 100644 internal/api/0.0.37/docs/V0037JobResponseProperties.md delete mode 100644 internal/api/0.0.37/docs/V0037JobSubmission.md delete mode 100644 internal/api/0.0.37/docs/V0037JobSubmissionResponse.md delete mode 100644 internal/api/0.0.37/docs/V0037JobsResponse.md delete mode 100644 internal/api/0.0.37/docs/V0037Node.md delete mode 100644 internal/api/0.0.37/docs/V0037NodeAllocation.md delete mode 100644 internal/api/0.0.37/docs/V0037NodesResponse.md delete mode 100644 internal/api/0.0.37/docs/V0037Partition.md delete mode 100644 internal/api/0.0.37/docs/V0037PartitionsResponse.md delete mode 100644 internal/api/0.0.37/docs/V0037Ping.md delete mode 100644 internal/api/0.0.37/docs/V0037Pings.md delete mode 100644 internal/api/0.0.37/docs/V0037Reservation.md delete mode 100644 internal/api/0.0.37/docs/V0037ReservationPurgeCompleted.md delete mode 100644 internal/api/0.0.37/docs/V0037ReservationsResponse.md delete mode 100644 internal/api/0.0.37/docs/V0037Signal.md delete mode 100644 internal/api/0.0.37/git_push.sh delete mode 100644 internal/api/0.0.37/go.mod delete mode 100644 internal/api/0.0.37/go.sum delete mode 100644 internal/api/0.0.37/model_v0_0_37_diag.go delete mode 100644 internal/api/0.0.37/model_v0_0_37_diag_statistics.go delete mode 100644 internal/api/0.0.37/model_v0_0_37_error.go delete mode 100644 internal/api/0.0.37/model_v0_0_37_job_properties.go delete mode 100644 internal/api/0.0.37/model_v0_0_37_job_resources.go delete mode 100644 internal/api/0.0.37/model_v0_0_37_job_response_properties.go delete mode 100644 internal/api/0.0.37/model_v0_0_37_job_submission.go delete mode 100644 internal/api/0.0.37/model_v0_0_37_job_submission_response.go delete mode 100644 internal/api/0.0.37/model_v0_0_37_jobs_response.go delete mode 100644 internal/api/0.0.37/model_v0_0_37_node.go delete mode 100644 internal/api/0.0.37/model_v0_0_37_node_allocation.go delete mode 100644 internal/api/0.0.37/model_v0_0_37_nodes_response.go delete mode 100644 internal/api/0.0.37/model_v0_0_37_partition.go delete mode 100644 internal/api/0.0.37/model_v0_0_37_partitions_response.go delete mode 100644 internal/api/0.0.37/model_v0_0_37_ping.go delete mode 100644 internal/api/0.0.37/model_v0_0_37_pings.go delete mode 100644 internal/api/0.0.37/model_v0_0_37_reservation.go delete mode 100644 internal/api/0.0.37/model_v0_0_37_reservation_purge_completed.go delete mode 100644 internal/api/0.0.37/model_v0_0_37_reservations_response.go delete mode 100644 internal/api/0.0.37/model_v0_0_37_signal.go delete mode 100644 internal/api/0.0.37/response.go delete mode 100644 internal/api/0.0.37/test/api_openapi_test.go delete mode 100644 internal/api/0.0.37/test/api_slurm_test.go delete mode 100644 internal/api/0.0.37/utils.go create mode 100644 internal/scheduler/slurmRestClient.go diff --git a/internal/api/0.0.37/.gitignore b/internal/api/0.0.37/.gitignore deleted file mode 100644 index daf913b..0000000 --- a/internal/api/0.0.37/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe -*.test -*.prof diff --git a/internal/api/0.0.37/.openapi-generator-ignore b/internal/api/0.0.37/.openapi-generator-ignore deleted file mode 100644 index 7484ee5..0000000 --- a/internal/api/0.0.37/.openapi-generator-ignore +++ /dev/null @@ -1,23 +0,0 @@ -# OpenAPI Generator Ignore -# Generated by openapi-generator https://github.com/openapitools/openapi-generator - -# Use this file to prevent files from being overwritten by the generator. -# The patterns follow closely to .gitignore or .dockerignore. - -# As an example, the C# client generator defines ApiClient.cs. -# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: -#ApiClient.cs - -# You can match any string of characters against a directory, file or extension with a single asterisk (*): -#foo/*/qux -# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux - -# You can recursively match patterns against a directory, file or extension with a double asterisk (**): -#foo/**/qux -# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux - -# You can also negate patterns with an exclamation (!). -# For example, you can ignore all files in a docs folder with the file extension .md: -#docs/*.md -# Then explicitly reverse the ignore rule for a single file: -#!docs/README.md diff --git a/internal/api/0.0.37/.openapi-generator/FILES b/internal/api/0.0.37/.openapi-generator/FILES deleted file mode 100644 index 5483b82..0000000 --- a/internal/api/0.0.37/.openapi-generator/FILES +++ /dev/null @@ -1,58 +0,0 @@ -.gitignore -.openapi-generator-ignore -.travis.yml -README.md -api/openapi.yaml -api_openapi.go -api_slurm.go -client.go -configuration.go -docs/OpenapiAPI.md -docs/SlurmAPI.md -docs/V0037Diag.md -docs/V0037DiagStatistics.md -docs/V0037Error.md -docs/V0037JobProperties.md -docs/V0037JobResources.md -docs/V0037JobResponseProperties.md -docs/V0037JobSubmission.md -docs/V0037JobSubmissionResponse.md -docs/V0037JobsResponse.md -docs/V0037Node.md -docs/V0037NodeAllocation.md -docs/V0037NodesResponse.md -docs/V0037Partition.md -docs/V0037PartitionsResponse.md -docs/V0037Ping.md -docs/V0037Pings.md -docs/V0037Reservation.md -docs/V0037ReservationPurgeCompleted.md -docs/V0037ReservationsResponse.md -docs/V0037Signal.md -git_push.sh -go.mod -go.sum -model_v0_0_37_diag.go -model_v0_0_37_diag_statistics.go -model_v0_0_37_error.go -model_v0_0_37_job_properties.go -model_v0_0_37_job_resources.go -model_v0_0_37_job_response_properties.go -model_v0_0_37_job_submission.go -model_v0_0_37_job_submission_response.go -model_v0_0_37_jobs_response.go -model_v0_0_37_node.go -model_v0_0_37_node_allocation.go -model_v0_0_37_nodes_response.go -model_v0_0_37_partition.go -model_v0_0_37_partitions_response.go -model_v0_0_37_ping.go -model_v0_0_37_pings.go -model_v0_0_37_reservation.go -model_v0_0_37_reservation_purge_completed.go -model_v0_0_37_reservations_response.go -model_v0_0_37_signal.go -response.go -test/api_openapi_test.go -test/api_slurm_test.go -utils.go diff --git a/internal/api/0.0.37/.openapi-generator/VERSION b/internal/api/0.0.37/.openapi-generator/VERSION deleted file mode 100644 index 757e674..0000000 --- a/internal/api/0.0.37/.openapi-generator/VERSION +++ /dev/null @@ -1 +0,0 @@ -7.0.0-SNAPSHOT \ No newline at end of file diff --git a/internal/api/0.0.37/.travis.yml b/internal/api/0.0.37/.travis.yml deleted file mode 100644 index f5cb2ce..0000000 --- a/internal/api/0.0.37/.travis.yml +++ /dev/null @@ -1,8 +0,0 @@ -language: go - -install: - - go get -d -v . - -script: - - go build -v ./ - diff --git a/internal/api/0.0.37/README.md b/internal/api/0.0.37/README.md deleted file mode 100644 index ea920d4..0000000 --- a/internal/api/0.0.37/README.md +++ /dev/null @@ -1,190 +0,0 @@ -# Go API client for openapi - -API to access and control Slurm. - -## Overview -This API client was generated by the [OpenAPI Generator](https://openapi-generator.tech) project. By using the [OpenAPI-spec](https://www.openapis.org/) from a remote server, you can easily generate an API client. - -- API version: 0.0.37 -- Package version: 1.0.0 -- Build package: org.openapitools.codegen.languages.GoClientCodegen -For more information, please visit [https://www.schedmd.com/](https://www.schedmd.com/) - -## Installation - -Install the following dependencies: - -```shell -go get github.com/stretchr/testify/assert -go get golang.org/x/net/context -``` - -Put the package under your project folder and add the following in import: - -```golang -import openapi "github.com/GIT_USER_ID/GIT_REPO_ID" -``` - -To use a proxy, set the environment variable `HTTP_PROXY`: - -```golang -os.Setenv("HTTP_PROXY", "http://proxy_name:proxy_port") -``` - -## Configuration of Server URL - -Default configuration comes with `Servers` field that contains server objects as defined in the OpenAPI specification. - -### Select Server Configuration - -For using other server than the one defined on index 0 set context value `sw.ContextServerIndex` of type `int`. - -```golang -ctx := context.WithValue(context.Background(), openapi.ContextServerIndex, 1) -``` - -### Templated Server URL - -Templated server URL is formatted using default variables from configuration or from context value `sw.ContextServerVariables` of type `map[string]string`. - -```golang -ctx := context.WithValue(context.Background(), openapi.ContextServerVariables, map[string]string{ - "basePath": "v2", -}) -``` - -Note, enum values are always validated and all unused variables are silently ignored. - -### URLs Configuration per Operation - -Each operation can use different server URL defined using `OperationServers` map in the `Configuration`. -An operation is uniquely identified by `"{classname}Service.{nickname}"` string. -Similar rules for overriding default operation server index and variables applies by using `sw.ContextOperationServerIndices` and `sw.ContextOperationServerVariables` context maps. - -```golang -ctx := context.WithValue(context.Background(), openapi.ContextOperationServerIndices, map[string]int{ - "{classname}Service.{nickname}": 2, -}) -ctx = context.WithValue(context.Background(), openapi.ContextOperationServerVariables, map[string]map[string]string{ - "{classname}Service.{nickname}": { - "port": "8443", - }, -}) -``` - -## Documentation for API Endpoints - -All URIs are relative to *http://localhost/slurm/v0.0.37* - -Class | Method | HTTP request | Description ------------- | ------------- | ------------- | ------------- -*OpenapiAPI* | [**OpenapiGet**](docs/OpenapiAPI.md#openapiget) | **Get** /openapi | Retrieve OpenAPI Specification -*OpenapiAPI* | [**OpenapiJsonGet**](docs/OpenapiAPI.md#openapijsonget) | **Get** /openapi.json | Retrieve OpenAPI Specification -*OpenapiAPI* | [**OpenapiV3Get**](docs/OpenapiAPI.md#openapiv3get) | **Get** /openapi/v3 | Retrieve OpenAPI Specification -*OpenapiAPI* | [**OpenapiYamlGet**](docs/OpenapiAPI.md#openapiyamlget) | **Get** /openapi.yaml | Retrieve OpenAPI Specification -*SlurmAPI* | [**SlurmctldCancelJob**](docs/SlurmAPI.md#slurmctldcanceljob) | **Delete** /job/{job_id} | cancel or signal job -*SlurmAPI* | [**SlurmctldDiag**](docs/SlurmAPI.md#slurmctlddiag) | **Get** /diag/ | get diagnostics -*SlurmAPI* | [**SlurmctldGetJob**](docs/SlurmAPI.md#slurmctldgetjob) | **Get** /job/{job_id} | get job info -*SlurmAPI* | [**SlurmctldGetJobs**](docs/SlurmAPI.md#slurmctldgetjobs) | **Get** /jobs/ | get list of jobs -*SlurmAPI* | [**SlurmctldGetNode**](docs/SlurmAPI.md#slurmctldgetnode) | **Get** /node/{node_name} | get node info -*SlurmAPI* | [**SlurmctldGetNodes**](docs/SlurmAPI.md#slurmctldgetnodes) | **Get** /nodes/ | get all node info -*SlurmAPI* | [**SlurmctldGetPartition**](docs/SlurmAPI.md#slurmctldgetpartition) | **Get** /partition/{partition_name} | get partition info -*SlurmAPI* | [**SlurmctldGetPartitions**](docs/SlurmAPI.md#slurmctldgetpartitions) | **Get** /partitions/ | get all partition info -*SlurmAPI* | [**SlurmctldGetReservation**](docs/SlurmAPI.md#slurmctldgetreservation) | **Get** /reservation/{reservation_name} | get reservation info -*SlurmAPI* | [**SlurmctldGetReservations**](docs/SlurmAPI.md#slurmctldgetreservations) | **Get** /reservations/ | get all reservation info -*SlurmAPI* | [**SlurmctldPing**](docs/SlurmAPI.md#slurmctldping) | **Get** /ping/ | ping test -*SlurmAPI* | [**SlurmctldSubmitJob**](docs/SlurmAPI.md#slurmctldsubmitjob) | **Post** /job/submit | submit new job -*SlurmAPI* | [**SlurmctldUpdateJob**](docs/SlurmAPI.md#slurmctldupdatejob) | **Post** /job/{job_id} | update job - - -## Documentation For Models - - - [V0037Diag](docs/V0037Diag.md) - - [V0037DiagStatistics](docs/V0037DiagStatistics.md) - - [V0037Error](docs/V0037Error.md) - - [V0037JobProperties](docs/V0037JobProperties.md) - - [V0037JobResources](docs/V0037JobResources.md) - - [V0037JobResponseProperties](docs/V0037JobResponseProperties.md) - - [V0037JobSubmission](docs/V0037JobSubmission.md) - - [V0037JobSubmissionResponse](docs/V0037JobSubmissionResponse.md) - - [V0037JobsResponse](docs/V0037JobsResponse.md) - - [V0037Node](docs/V0037Node.md) - - [V0037NodeAllocation](docs/V0037NodeAllocation.md) - - [V0037NodesResponse](docs/V0037NodesResponse.md) - - [V0037Partition](docs/V0037Partition.md) - - [V0037PartitionsResponse](docs/V0037PartitionsResponse.md) - - [V0037Ping](docs/V0037Ping.md) - - [V0037Pings](docs/V0037Pings.md) - - [V0037Reservation](docs/V0037Reservation.md) - - [V0037ReservationPurgeCompleted](docs/V0037ReservationPurgeCompleted.md) - - [V0037ReservationsResponse](docs/V0037ReservationsResponse.md) - - [V0037Signal](docs/V0037Signal.md) - - -## Documentation For Authorization - - -Authentication schemes defined for the API: -### user - -- **Type**: API key -- **API key parameter name**: X-SLURM-USER-NAME -- **Location**: HTTP header - -Note, each API key must be added to a map of `map[string]APIKey` where the key is: X-SLURM-USER-NAME and passed in as the auth context for each request. - -Example - -```golang -auth := context.WithValue( - context.Background(), - sw.ContextAPIKeys, - map[string]sw.APIKey{ - "X-SLURM-USER-NAME": {Key: "API_KEY_STRING"}, - }, - ) -r, err := client.Service.Operation(auth, args) -``` - -### token - -- **Type**: API key -- **API key parameter name**: X-SLURM-USER-TOKEN -- **Location**: HTTP header - -Note, each API key must be added to a map of `map[string]APIKey` where the key is: X-SLURM-USER-TOKEN and passed in as the auth context for each request. - -Example - -```golang -auth := context.WithValue( - context.Background(), - sw.ContextAPIKeys, - map[string]sw.APIKey{ - "X-SLURM-USER-TOKEN": {Key: "API_KEY_STRING"}, - }, - ) -r, err := client.Service.Operation(auth, args) -``` - - -## Documentation for Utility Methods - -Due to the fact that model structure members are all pointers, this package contains -a number of utility functions to easily obtain pointers to values of basic types. -Each of these functions takes a value of the given basic type and returns a pointer to it: - -* `PtrBool` -* `PtrInt` -* `PtrInt32` -* `PtrInt64` -* `PtrFloat` -* `PtrFloat32` -* `PtrFloat64` -* `PtrString` -* `PtrTime` - -## Author - -sales@schedmd.com - diff --git a/internal/api/0.0.37/api/openapi.yaml b/internal/api/0.0.37/api/openapi.yaml deleted file mode 100644 index eed4438..0000000 --- a/internal/api/0.0.37/api/openapi.yaml +++ /dev/null @@ -1,2525 +0,0 @@ -openapi: 3.0.2 -info: - contact: - email: sales@schedmd.com - name: SchedMD LLC - url: https://www.schedmd.com/ - description: API to access and control Slurm. - license: - name: Apache 2.0 - url: https://www.apache.org/licenses/LICENSE-2.0.html - termsOfService: https://github.com/SchedMD/slurm/blob/master/DISCLAIMER - title: Slurm Rest API - version: 0.0.37 -servers: -- url: /slurm/v0.0.37/ -security: -- user: [] - token: [] -tags: -- description: methods that query slurmctld - name: slurm -- description: methods that query for OpenAPI specifications - name: openapi -paths: - /diag/: - get: - operationId: slurmctld_diag - responses: - "200": - content: - application/json: - schema: - $ref: '#/components/schemas/v0.0.37_diag' - application/x-yaml: - schema: - $ref: '#/components/schemas/v0.0.37_diag' - description: diagnostic results - default: - description: unable to request ping test - summary: get diagnostics - tags: - - slurm - /ping/: - get: - operationId: slurmctld_ping - responses: - "200": - content: - application/json: - schema: - $ref: '#/components/schemas/v0.0.37_pings' - application/x-yaml: - schema: - $ref: '#/components/schemas/v0.0.37_pings' - description: results of ping test - default: - description: unable to request ping test - summary: ping test - tags: - - slurm - /jobs/: - get: - operationId: slurmctld_get_jobs - parameters: - - description: Filter if changed since update_time. Use of this parameter can - result in faster replies. - explode: false - in: query - name: update_time - required: false - schema: - format: int64 - type: integer - style: simple - responses: - "200": - content: - application/json: - schema: - $ref: '#/components/schemas/v0.0.37_jobs_response' - application/x-yaml: - schema: - $ref: '#/components/schemas/v0.0.37_jobs_response' - description: job(s) information - default: - description: job not found - summary: get list of jobs - tags: - - slurm - /job/{job_id}: - delete: - operationId: slurmctld_cancel_job - parameters: - - description: Slurm Job ID - explode: false - in: path - name: job_id - required: true - schema: - type: string - style: simple - - description: signal to send to job - explode: true - in: query - name: signal - required: false - schema: - $ref: '#/components/schemas/v0.0.37_signal' - style: form - responses: - "200": - description: job cancelled or sent signal - "500": - description: job not found - summary: cancel or signal job - tags: - - slurm - get: - operationId: slurmctld_get_job - parameters: - - description: Slurm JobID - explode: false - in: path - name: job_id - required: true - schema: - type: string - style: simple - responses: - "200": - content: - application/json: - schema: - $ref: '#/components/schemas/v0.0.37_jobs_response' - application/x-yaml: - schema: - $ref: '#/components/schemas/v0.0.37_jobs_response' - description: job(s) information - default: - description: job matching JobId not found - summary: get job info - tags: - - slurm - post: - operationId: slurmctld_update_job - parameters: - - description: Slurm Job ID - explode: false - in: path - name: job_id - required: true - schema: - type: string - style: simple - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/v0.0.37_job_properties' - application/x-yaml: - schema: - $ref: '#/components/schemas/v0.0.37_job_properties' - description: update job - required: true - responses: - "200": - description: job information - "500": - description: job not found - summary: update job - tags: - - slurm - /job/submit: - post: - operationId: slurmctld_submit_job - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/v0.0.37_job_submission' - application/x-yaml: - schema: - $ref: '#/components/schemas/v0.0.37_job_submission' - description: submit new job - required: true - responses: - "200": - content: - application/json: - schema: - $ref: '#/components/schemas/v0.0.37_job_submission_response' - application/x-yaml: - schema: - $ref: '#/components/schemas/v0.0.37_job_submission_response' - description: job submitted - default: - description: job rejected - summary: submit new job - tags: - - slurm - /nodes/: - get: - operationId: slurmctld_get_nodes - parameters: - - description: Filter if changed since update_time. Use of this parameter can - result in faster replies. - explode: false - in: query - name: update_time - required: false - schema: - format: int64 - type: integer - style: simple - responses: - "200": - content: - application/json: - schema: - $ref: '#/components/schemas/v0.0.37_nodes_response' - application/x-yaml: - schema: - $ref: '#/components/schemas/v0.0.37_nodes_response' - description: node information - default: - description: no nodes in cluster - summary: get all node info - tags: - - slurm - /node/{node_name}: - get: - operationId: slurmctld_get_node - parameters: - - description: Slurm Node Name - explode: false - in: path - name: node_name - required: true - schema: - type: string - style: simple - responses: - "200": - content: - application/json: - schema: - $ref: '#/components/schemas/v0.0.37_nodes_response' - application/x-yaml: - schema: - $ref: '#/components/schemas/v0.0.37_nodes_response' - description: node information - default: - description: node not found - summary: get node info - tags: - - slurm - /partitions/: - get: - operationId: slurmctld_get_partitions - parameters: - - description: Filter if changed since update_time. Use of this parameter can - result in faster replies. - explode: false - in: query - name: update_time - required: false - schema: - format: int64 - type: integer - style: simple - responses: - "200": - content: - application/json: - schema: - $ref: '#/components/schemas/v0.0.37_partitions_response' - application/x-yaml: - schema: - $ref: '#/components/schemas/v0.0.37_partitions_response' - description: partition information - default: - description: no partitions found - summary: get all partition info - tags: - - slurm - /partition/{partition_name}: - get: - operationId: slurmctld_get_partition - parameters: - - description: Slurm Partition Name - explode: false - in: path - name: partition_name - required: true - schema: - type: string - style: simple - - description: Filter if there were no partition changes (not limited to partition - in URL endpoint) since update_time. - explode: false - in: query - name: update_time - required: false - schema: - format: int64 - type: integer - style: simple - responses: - "200": - content: - application/json: - schema: - $ref: '#/components/schemas/v0.0.37_partitions_response' - application/x-yaml: - schema: - $ref: '#/components/schemas/v0.0.37_partitions_response' - description: partition information - default: - description: no partitions found - summary: get partition info - tags: - - slurm - /reservations/: - get: - operationId: slurmctld_get_reservations - parameters: - - description: Filter if changed since update_time. Use of this parameter can - result in faster replies. - explode: false - in: query - name: update_time - required: false - schema: - format: int64 - type: integer - style: simple - responses: - "200": - content: - application/json: - schema: - $ref: '#/components/schemas/v0.0.37_reservations_response' - application/x-yaml: - schema: - $ref: '#/components/schemas/v0.0.37_reservations_response' - description: reservation information - default: - description: no reservations found - summary: get all reservation info - tags: - - slurm - /reservation/{reservation_name}: - get: - operationId: slurmctld_get_reservation - parameters: - - description: Slurm Reservation Name - explode: false - in: path - name: reservation_name - required: true - schema: - type: string - style: simple - - description: Filter if no reservation (not limited to reservation in URL) - changed since update_time. - explode: false - in: query - name: update_time - required: false - schema: - format: int64 - type: integer - style: simple - responses: - "200": - content: - application/json: - schema: - $ref: '#/components/schemas/v0.0.37_reservations_response' - application/x-yaml: - schema: - $ref: '#/components/schemas/v0.0.37_reservations_response' - description: reservation information - default: - description: no reservations found - summary: get reservation info - tags: - - slurm - /openapi.yaml: - get: - responses: - "200": - description: OpenAPI Specification - summary: Retrieve OpenAPI Specification - tags: - - openapi - servers: - - url: / - /openapi.json: - get: - responses: - "200": - description: OpenAPI Specification - summary: Retrieve OpenAPI Specification - tags: - - openapi - servers: - - url: / - /openapi: - get: - responses: - "200": - description: OpenAPI Specification - summary: Retrieve OpenAPI Specification - tags: - - openapi - servers: - - url: / - /openapi/v3: - get: - responses: - "200": - description: OpenAPI Specification - summary: Retrieve OpenAPI Specification - tags: - - openapi - servers: - - url: / -components: - schemas: - v0.0.37_diag: - example: - errors: - - errno: 0 - error: error - - errno: 0 - error: error - statistics: - schedule_cycle_per_minute: 6 - req_time_start: 5 - jobs_running: 8 - bf_cycle_max: 6 - bf_last_backfilled_jobs: 3 - bf_last_depth: 6 - bf_backfilled_het_jobs: 6 - bf_backfilled_jobs: 6 - bf_cycle_mean: 2 - job_states_ts: 9 - bf_queue_len: 7 - jobs_started: 4 - schedule_cycle_max: 4 - server_thread_count: 5 - dbd_agent_queue_size: 3 - jobs_pending: 6 - agent_count: 7 - bf_cycle_last: 3 - parts_packed: 6 - agent_thread_count: 9 - jobs_completed: 5 - bf_depth_mean: 6 - bf_active: true - bf_depth_mean_try: 3 - schedule_cycle_mean: 1 - agent_queue_size: 2 - jobs_failed: 9 - gettimeofday_latency: 2 - bf_last_depth_try: 5 - req_time: 1 - bf_cycle_counter: 1 - schedule_queue_length: 7 - bf_queue_len_mean: 0 - schedule_cycle_total: 1 - bf_when_last_cycle: 7 - schedule_cycle_last: 7 - jobs_canceled: 9 - jobs_submitted: 1 - schedule_cycle_mean_depth: 1 - properties: - errors: - description: slurm errors - items: - $ref: '#/components/schemas/v0.0.37_error' - type: array - statistics: - $ref: '#/components/schemas/v0_0_37_diag_statistics' - type: object - v0.0.37_pings: - example: - pings: - - mode: mode - hostname: hostname - ping: UP - status: 0 - - mode: mode - hostname: hostname - ping: UP - status: 0 - errors: - - errno: 0 - error: error - - errno: 0 - error: error - properties: - errors: - description: slurm errors - items: - $ref: '#/components/schemas/v0.0.37_error' - type: array - pings: - description: slurm controller pings - items: - $ref: '#/components/schemas/v0.0.37_ping' - type: array - type: object - v0.0.37_ping: - example: - mode: mode - hostname: hostname - ping: UP - status: 0 - properties: - hostname: - description: slurm controller hostname - type: string - ping: - description: slurm controller host up - enum: - - UP - - DOWN - type: string - mode: - description: slurm controller mode - type: string - status: - description: slurm controller status - type: integer - type: object - v0.0.37_partition: - example: - max_time_limit: 7 - maximum_cpus_per_node: 5 - over_time_limit: 3 - denied_accounts: denied_accounts - flags: - - flags - - flags - maximum_memory_per_node: 5 - total_cpus: 7 - billing_weights: billing_weights - default_memory_per_cpu: 0 - allowed_qos: allowed_qos - min_nodes_per_job: 9 - qos: qos - default_time_limit: 6 - denied_qos: denied_qos - priority_job_factor: 2 - tres: tres - allowed_allocation_nodes: allowed_allocation_nodes - state: state - preemption_grace_time: 1 - allowed_accounts: allowed_accounts - alternative: alternative - preemption_mode: - - preemption_mode - - preemption_mode - nodes: nodes - name: name - allowed_groups: allowed_groups - total_nodes: 1 - maximum_nodes_per_job: 2 - priority_tier: 4 - properties: - flags: - description: partition options - items: - type: string - type: array - preemption_mode: - description: preemption type - items: - type: string - type: array - allowed_allocation_nodes: - description: list names of allowed allocating nodes - type: string - allowed_accounts: - description: comma delimited list of accounts - type: string - allowed_groups: - description: comma delimited list of groups - type: string - allowed_qos: - description: comma delimited list of qos - type: string - alternative: - description: name of alternate partition - type: string - billing_weights: - description: TRES billing weights - type: string - default_memory_per_cpu: - description: default MB memory per allocated CPU - format: int64 - type: integer - default_time_limit: - description: default time limit (minutes) - format: int64 - type: integer - denied_accounts: - description: comma delimited list of denied accounts - type: string - denied_qos: - description: comma delimited list of denied qos - type: string - preemption_grace_time: - description: preemption grace time (seconds) - format: int64 - type: integer - maximum_cpus_per_node: - description: maximum allocated CPUs per node - type: integer - maximum_memory_per_node: - description: maximum memory per allocated CPU (MiB) - format: int64 - type: integer - maximum_nodes_per_job: - description: Max nodes per job - type: integer - max_time_limit: - description: Max time limit per job - format: int64 - type: integer - min_nodes_per_job: - description: Min number of nodes per job - type: integer - name: - description: Partition name - type: string - nodes: - description: list names of nodes in partition - type: string - over_time_limit: - description: job's time limit can be exceeded by this number of minutes - before cancellation - type: integer - priority_job_factor: - description: job priority weight factor - type: integer - priority_tier: - description: tier for scheduling and preemption - type: integer - qos: - description: partition QOS name - type: string - state: - description: Partition state - type: string - total_cpus: - description: Total cpus in partition - type: integer - total_nodes: - description: Total number of nodes in partition - type: integer - tres: - description: configured TRES in partition - type: string - type: object - v0.0.37_partitions_response: - example: - partitions: - - max_time_limit: 7 - maximum_cpus_per_node: 5 - over_time_limit: 3 - denied_accounts: denied_accounts - flags: - - flags - - flags - maximum_memory_per_node: 5 - total_cpus: 7 - billing_weights: billing_weights - default_memory_per_cpu: 0 - allowed_qos: allowed_qos - min_nodes_per_job: 9 - qos: qos - default_time_limit: 6 - denied_qos: denied_qos - priority_job_factor: 2 - tres: tres - allowed_allocation_nodes: allowed_allocation_nodes - state: state - preemption_grace_time: 1 - allowed_accounts: allowed_accounts - alternative: alternative - preemption_mode: - - preemption_mode - - preemption_mode - nodes: nodes - name: name - allowed_groups: allowed_groups - total_nodes: 1 - maximum_nodes_per_job: 2 - priority_tier: 4 - - max_time_limit: 7 - maximum_cpus_per_node: 5 - over_time_limit: 3 - denied_accounts: denied_accounts - flags: - - flags - - flags - maximum_memory_per_node: 5 - total_cpus: 7 - billing_weights: billing_weights - default_memory_per_cpu: 0 - allowed_qos: allowed_qos - min_nodes_per_job: 9 - qos: qos - default_time_limit: 6 - denied_qos: denied_qos - priority_job_factor: 2 - tres: tres - allowed_allocation_nodes: allowed_allocation_nodes - state: state - preemption_grace_time: 1 - allowed_accounts: allowed_accounts - alternative: alternative - preemption_mode: - - preemption_mode - - preemption_mode - nodes: nodes - name: name - allowed_groups: allowed_groups - total_nodes: 1 - maximum_nodes_per_job: 2 - priority_tier: 4 - errors: - - errno: 0 - error: error - - errno: 0 - error: error - properties: - errors: - description: slurm errors - items: - $ref: '#/components/schemas/v0.0.37_error' - type: array - partitions: - description: partition info - items: - $ref: '#/components/schemas/v0.0.37_partition' - type: array - type: object - v0.0.37_reservation: - example: - core_spec_cnt: 6 - end_time: 1 - flags: - - flags - - flags - groups: groups - users: users - max_start_delay: 5 - features: features - start_time: 7 - burst_buffer: burst_buffer - licenses: licenses - partition: partition - watts: 9 - name: name - tres: tres - accounts: accounts - node_count: 5 - node_list: node_list - purge_completed: - time: 2 - core_count: 0 - properties: - accounts: - description: Allowed accounts - type: string - burst_buffer: - description: Reserved burst buffer - type: string - core_count: - description: Number of reserved cores - type: integer - core_spec_cnt: - description: Number of reserved specialized cores - type: integer - end_time: - description: End time of the reservation - type: integer - features: - description: List of features - type: string - flags: - description: Reservation options - items: - type: string - type: array - groups: - description: List of groups permitted to use the reserved nodes - type: string - licenses: - description: List of licenses - type: string - max_start_delay: - description: Maximum delay in which jobs outside of the reservation will - be permitted to overlap once any jobs are queued for the reservation - type: integer - name: - description: Reservationn name - type: string - node_count: - description: Count of nodes reserved - type: integer - node_list: - description: List of reserved nodes - type: string - partition: - description: Partition - type: string - purge_completed: - $ref: '#/components/schemas/v0_0_37_reservation_purge_completed' - start_time: - description: Start time of reservation - type: integer - watts: - description: amount of power to reserve in watts - type: integer - tres: - description: List of TRES - type: string - users: - description: List of users - type: string - type: object - v0.0.37_reservations_response: - example: - reservations: - - core_spec_cnt: 6 - end_time: 1 - flags: - - flags - - flags - groups: groups - users: users - max_start_delay: 5 - features: features - start_time: 7 - burst_buffer: burst_buffer - licenses: licenses - partition: partition - watts: 9 - name: name - tres: tres - accounts: accounts - node_count: 5 - node_list: node_list - purge_completed: - time: 2 - core_count: 0 - - core_spec_cnt: 6 - end_time: 1 - flags: - - flags - - flags - groups: groups - users: users - max_start_delay: 5 - features: features - start_time: 7 - burst_buffer: burst_buffer - licenses: licenses - partition: partition - watts: 9 - name: name - tres: tres - accounts: accounts - node_count: 5 - node_list: node_list - purge_completed: - time: 2 - core_count: 0 - errors: - - errno: 0 - error: error - - errno: 0 - error: error - properties: - errors: - description: slurm errors - items: - $ref: '#/components/schemas/v0.0.37_error' - type: array - reservations: - description: reservation info - items: - $ref: '#/components/schemas/v0.0.37_reservation' - type: array - type: object - v0.0.37_error: - example: - errno: 0 - error: error - properties: - error: - description: error message - type: string - errno: - description: error number - type: integer - type: object - v0.0.37_signal: - description: POSIX signal name - enum: - - HUP - - INT - - QUIT - - ABRT - - KILL - - ALRM - - TERM - - USR1 - - USR2 - - URG - - CONT - - STOP - - TSTP - - TTIN - - TTOU - format: int32 - type: string - v0.0.37_job_submission_response: - example: - job_id: 0 - step_id: step_id - errors: - - errno: 0 - error: error - - errno: 0 - error: error - job_submit_user_msg: job_submit_user_msg - properties: - errors: - description: slurm errors - items: - $ref: '#/components/schemas/v0.0.37_error' - type: array - job_id: - description: new job ID - type: integer - step_id: - description: new job step ID - type: string - job_submit_user_msg: - description: Message to user from job_submit plugin - type: string - type: object - v0.0.37_job_submission: - properties: - script: - description: Executable script (full contents) to run in batch step - type: string - job: - $ref: '#/components/schemas/v0.0.37_job_properties' - jobs: - description: Properties of an HetJob - items: - $ref: '#/components/schemas/v0.0.37_job_properties' - type: array - required: - - script - v0.0.37_jobs_response: - example: - jobs: - - cluster: cluster - time_minimum: time_minimum - memory_per_tres: memory_per_tres - qos: qos - resize_time: 2 - eligible_time: 6 - cpus_per_tres: cpus_per_tres - tasks: tasks - system_comment: system_comment - federation_siblings_active: federation_siblings_active - tasks_per_core: tasks_per_core - accrue_time: 0 - dependency: dependency - profile: - - profile - - profile - priority: priority - tres_per_job: tres_per_job - derived_exit_code: derived_exit_code - core_spec: core_spec - mcs_label: mcs_label - required_nodes: required_nodes - tres_bind: tres_bind - user_id: user_id - exit_code: 5 - federation_origin: federation_origin - shared: shared - tasks_per_board: tasks_per_board - user_name: user_name - flags: - - flags - - flags - standard_input: standard_input - admin_comment: admin_comment - cores_per_socket: cores_per_socket - job_state: job_state - current_working_directory: current_working_directory - standard_error: standard_error - array_job_id: array_job_id - cluster_features: cluster_features - partition: partition - threads_per_core: threads_per_core - tres_alloc_str: tres_alloc_str - memory_per_cpu: memory_per_cpu - cpu_frequency_minimum: cpu_frequency_minimum - node_count: node_count - deadline: deadline - memory_per_node: memory_per_node - state_reason: state_reason - het_job_offset: het_job_offset - end_time: 1 - sockets_per_board: sockets_per_board - nice: nice - last_sched_evaluation: last_sched_evaluation - tres_per_node: tres_per_node - burst_buffer: burst_buffer - licenses: licenses - excluded_nodes: excluded_nodes - array_max_tasks: array_max_tasks - het_job_id: het_job_id - sockets_per_node: sockets_per_node - time_limit: time_limit - minimum_cpus_per_node: minimum_cpus_per_node - tasks_per_socket: tasks_per_socket - batch_host: batch_host - max_cpus: max_cpus - cpu_frequency_maximum: cpu_frequency_maximum - features: features - het_job_id_set: het_job_id_set - state_description: state_description - show_flags: - - show_flags - - show_flags - array_task_id: array_task_id - minimum_tmp_disk_per_node: minimum_tmp_disk_per_node - tres_req_str: tres_req_str - burst_buffer_state: burst_buffer_state - tres_per_socket: tres_per_socket - array_task_string: array_task_string - submit_time: 7 - wckey: wckey - max_nodes: max_nodes - batch_flag: true - start_time: 4 - name: name - preempt_time: 9 - contiguous: true - job_resources: - nodes: nodes - allocated_nodes: - - memory: 7 - cores: "{}" - cpus: "{}" - sockets: "{}" - - memory: 7 - cores: "{}" - cpus: "{}" - sockets: "{}" - allocated_cpus: 5 - allocated_hosts: 2 - billable_tres: billable_tres - federation_siblings_viable: federation_siblings_viable - cpus_per_task: cpus_per_task - batch_features: batch_features - thread_spec: thread_spec - cpu_frequency_governor: cpu_frequency_governor - gres_detail: - - gres_detail - - gres_detail - restart_cnt: restart_cnt - resv_name: resv_name - delay_boot: delay_boot - reboot: true - cpus: cpus - standard_output: standard_output - pre_sus_time: 3 - suspend_time: 1 - association_id: association_id - command: command - tres_freq: tres_freq - requeue: true - tres_per_task: tres_per_task - nodes: nodes - group_id: group_id - job_id: job_id - comment: comment - account: account - - cluster: cluster - time_minimum: time_minimum - memory_per_tres: memory_per_tres - qos: qos - resize_time: 2 - eligible_time: 6 - cpus_per_tres: cpus_per_tres - tasks: tasks - system_comment: system_comment - federation_siblings_active: federation_siblings_active - tasks_per_core: tasks_per_core - accrue_time: 0 - dependency: dependency - profile: - - profile - - profile - priority: priority - tres_per_job: tres_per_job - derived_exit_code: derived_exit_code - core_spec: core_spec - mcs_label: mcs_label - required_nodes: required_nodes - tres_bind: tres_bind - user_id: user_id - exit_code: 5 - federation_origin: federation_origin - shared: shared - tasks_per_board: tasks_per_board - user_name: user_name - flags: - - flags - - flags - standard_input: standard_input - admin_comment: admin_comment - cores_per_socket: cores_per_socket - job_state: job_state - current_working_directory: current_working_directory - standard_error: standard_error - array_job_id: array_job_id - cluster_features: cluster_features - partition: partition - threads_per_core: threads_per_core - tres_alloc_str: tres_alloc_str - memory_per_cpu: memory_per_cpu - cpu_frequency_minimum: cpu_frequency_minimum - node_count: node_count - deadline: deadline - memory_per_node: memory_per_node - state_reason: state_reason - het_job_offset: het_job_offset - end_time: 1 - sockets_per_board: sockets_per_board - nice: nice - last_sched_evaluation: last_sched_evaluation - tres_per_node: tres_per_node - burst_buffer: burst_buffer - licenses: licenses - excluded_nodes: excluded_nodes - array_max_tasks: array_max_tasks - het_job_id: het_job_id - sockets_per_node: sockets_per_node - time_limit: time_limit - minimum_cpus_per_node: minimum_cpus_per_node - tasks_per_socket: tasks_per_socket - batch_host: batch_host - max_cpus: max_cpus - cpu_frequency_maximum: cpu_frequency_maximum - features: features - het_job_id_set: het_job_id_set - state_description: state_description - show_flags: - - show_flags - - show_flags - array_task_id: array_task_id - minimum_tmp_disk_per_node: minimum_tmp_disk_per_node - tres_req_str: tres_req_str - burst_buffer_state: burst_buffer_state - tres_per_socket: tres_per_socket - array_task_string: array_task_string - submit_time: 7 - wckey: wckey - max_nodes: max_nodes - batch_flag: true - start_time: 4 - name: name - preempt_time: 9 - contiguous: true - job_resources: - nodes: nodes - allocated_nodes: - - memory: 7 - cores: "{}" - cpus: "{}" - sockets: "{}" - - memory: 7 - cores: "{}" - cpus: "{}" - sockets: "{}" - allocated_cpus: 5 - allocated_hosts: 2 - billable_tres: billable_tres - federation_siblings_viable: federation_siblings_viable - cpus_per_task: cpus_per_task - batch_features: batch_features - thread_spec: thread_spec - cpu_frequency_governor: cpu_frequency_governor - gres_detail: - - gres_detail - - gres_detail - restart_cnt: restart_cnt - resv_name: resv_name - delay_boot: delay_boot - reboot: true - cpus: cpus - standard_output: standard_output - pre_sus_time: 3 - suspend_time: 1 - association_id: association_id - command: command - tres_freq: tres_freq - requeue: true - tres_per_task: tres_per_task - nodes: nodes - group_id: group_id - job_id: job_id - comment: comment - account: account - errors: - - errno: 0 - error: error - - errno: 0 - error: error - properties: - errors: - description: slurm errors - items: - $ref: '#/components/schemas/v0.0.37_error' - type: array - jobs: - description: job descriptions - items: - $ref: '#/components/schemas/v0.0.37_job_response_properties' - type: array - type: object - v0.0.37_job_response_properties: - example: - cluster: cluster - time_minimum: time_minimum - memory_per_tres: memory_per_tres - qos: qos - resize_time: 2 - eligible_time: 6 - cpus_per_tres: cpus_per_tres - tasks: tasks - system_comment: system_comment - federation_siblings_active: federation_siblings_active - tasks_per_core: tasks_per_core - accrue_time: 0 - dependency: dependency - profile: - - profile - - profile - priority: priority - tres_per_job: tres_per_job - derived_exit_code: derived_exit_code - core_spec: core_spec - mcs_label: mcs_label - required_nodes: required_nodes - tres_bind: tres_bind - user_id: user_id - exit_code: 5 - federation_origin: federation_origin - shared: shared - tasks_per_board: tasks_per_board - user_name: user_name - flags: - - flags - - flags - standard_input: standard_input - admin_comment: admin_comment - cores_per_socket: cores_per_socket - job_state: job_state - current_working_directory: current_working_directory - standard_error: standard_error - array_job_id: array_job_id - cluster_features: cluster_features - partition: partition - threads_per_core: threads_per_core - tres_alloc_str: tres_alloc_str - memory_per_cpu: memory_per_cpu - cpu_frequency_minimum: cpu_frequency_minimum - node_count: node_count - deadline: deadline - memory_per_node: memory_per_node - state_reason: state_reason - het_job_offset: het_job_offset - end_time: 1 - sockets_per_board: sockets_per_board - nice: nice - last_sched_evaluation: last_sched_evaluation - tres_per_node: tres_per_node - burst_buffer: burst_buffer - licenses: licenses - excluded_nodes: excluded_nodes - array_max_tasks: array_max_tasks - het_job_id: het_job_id - sockets_per_node: sockets_per_node - time_limit: time_limit - minimum_cpus_per_node: minimum_cpus_per_node - tasks_per_socket: tasks_per_socket - batch_host: batch_host - max_cpus: max_cpus - cpu_frequency_maximum: cpu_frequency_maximum - features: features - het_job_id_set: het_job_id_set - state_description: state_description - show_flags: - - show_flags - - show_flags - array_task_id: array_task_id - minimum_tmp_disk_per_node: minimum_tmp_disk_per_node - tres_req_str: tres_req_str - burst_buffer_state: burst_buffer_state - tres_per_socket: tres_per_socket - array_task_string: array_task_string - submit_time: 7 - wckey: wckey - max_nodes: max_nodes - batch_flag: true - start_time: 4 - name: name - preempt_time: 9 - contiguous: true - job_resources: - nodes: nodes - allocated_nodes: - - memory: 7 - cores: "{}" - cpus: "{}" - sockets: "{}" - - memory: 7 - cores: "{}" - cpus: "{}" - sockets: "{}" - allocated_cpus: 5 - allocated_hosts: 2 - billable_tres: billable_tres - federation_siblings_viable: federation_siblings_viable - cpus_per_task: cpus_per_task - batch_features: batch_features - thread_spec: thread_spec - cpu_frequency_governor: cpu_frequency_governor - gres_detail: - - gres_detail - - gres_detail - restart_cnt: restart_cnt - resv_name: resv_name - delay_boot: delay_boot - reboot: true - cpus: cpus - standard_output: standard_output - pre_sus_time: 3 - suspend_time: 1 - association_id: association_id - command: command - tres_freq: tres_freq - requeue: true - tres_per_task: tres_per_task - nodes: nodes - group_id: group_id - job_id: job_id - comment: comment - account: account - properties: - account: - description: Charge resources used by this job to specified account - type: string - accrue_time: - description: time job is eligible for running - format: int64 - type: integer - admin_comment: - description: administrator's arbitrary comment - type: string - array_job_id: - description: job_id of a job array or 0 if N/A - type: string - array_task_id: - description: task_id of a job array - type: string - array_max_tasks: - description: Maximum number of running array tasks - type: string - array_task_string: - description: string expression of task IDs in this record - type: string - association_id: - description: association id for job - type: string - batch_features: - description: features required for batch script's node - type: string - batch_flag: - description: "if batch: queued job with script" - type: boolean - batch_host: - description: name of host running batch script - type: string - flags: - description: Job flags - items: - type: string - type: array - burst_buffer: - description: burst buffer specifications - type: string - burst_buffer_state: - description: burst buffer state info - type: string - cluster: - description: name of cluster that the job is on - type: string - cluster_features: - description: comma separated list of required cluster features - type: string - command: - description: command to be executed - type: string - comment: - description: arbitrary comment - type: string - contiguous: - description: job requires contiguous nodes - type: boolean - core_spec: - description: specialized core count - type: string - thread_spec: - description: specialized thread count - type: string - cores_per_socket: - description: cores per socket required by job - type: string - billable_tres: - description: billable TRES - type: string - cpus_per_task: - description: number of processors required for each task - type: string - cpu_frequency_minimum: - description: Minimum cpu frequency - type: string - cpu_frequency_maximum: - description: Maximum cpu frequency - type: string - cpu_frequency_governor: - description: cpu frequency governor - type: string - cpus_per_tres: - description: semicolon delimited list of TRES=# values - type: string - deadline: - description: 'job start deadline ' - type: string - delay_boot: - description: command to be executed - type: string - dependency: - description: synchronize job execution with other jobs - type: string - derived_exit_code: - description: highest exit code of all job steps - type: string - eligible_time: - description: time job is eligible for running - format: int64 - type: integer - end_time: - description: "time of termination, actual or expected" - format: int64 - type: integer - excluded_nodes: - description: comma separated list of excluded nodes - type: string - exit_code: - description: exit code for job - type: integer - features: - description: comma separated list of required features - type: string - federation_origin: - description: Origin cluster's name - type: string - federation_siblings_active: - description: string of active sibling names - type: string - federation_siblings_viable: - description: string of viable sibling names - type: string - gres_detail: - description: Job flags - items: - type: string - type: array - group_id: - description: group job submitted as - type: string - job_id: - description: job ID - type: string - job_resources: - $ref: '#/components/schemas/v0.0.37_job_resources' - job_state: - description: state of the job - type: string - last_sched_evaluation: - description: last time job was evaluated for scheduling - type: string - licenses: - description: licenses required by the job - type: string - max_cpus: - description: maximum number of cpus usable by job - type: string - max_nodes: - description: maximum number of nodes usable by job - type: string - mcs_label: - description: mcs_label if mcs plugin in use - type: string - memory_per_tres: - description: semicolon delimited list of TRES=# values - type: string - name: - description: name of the job - type: string - nodes: - description: list of nodes allocated to job - type: string - nice: - description: requested priority change - type: string - tasks_per_core: - description: number of tasks to invoke on each core - type: string - tasks_per_socket: - description: number of tasks to invoke on each socket - type: string - tasks_per_board: - description: number of tasks to invoke on each board - type: string - cpus: - description: minimum number of cpus required by job - type: string - node_count: - description: minimum number of nodes required by job - type: string - tasks: - description: requested task count - type: string - het_job_id: - description: job ID of hetjob leader - type: string - het_job_id_set: - description: job IDs for all components - type: string - het_job_offset: - description: HetJob component offset from leader - type: string - partition: - description: name of assigned partition - type: string - memory_per_node: - description: minimum real memory per node - type: string - memory_per_cpu: - description: minimum real memory per cpu - type: string - minimum_cpus_per_node: - description: "minimum # CPUs per node" - type: string - minimum_tmp_disk_per_node: - description: minimum tmp disk per node - type: string - preempt_time: - description: preemption signal time - format: int64 - type: integer - pre_sus_time: - description: time job ran prior to last suspend - format: int64 - type: integer - priority: - description: relative priority of the job - type: string - profile: - description: Job profiling requested - items: - type: string - type: array - qos: - description: Quality of Service - type: string - reboot: - description: node reboot requested before start - type: boolean - required_nodes: - description: comma separated list of required nodes - type: string - requeue: - description: enable or disable job requeue option - type: boolean - resize_time: - description: time of latest size change - format: int64 - type: integer - restart_cnt: - description: count of job restarts - type: string - resv_name: - description: reservation name - type: string - shared: - description: type and if job can share nodes with other jobs - type: string - show_flags: - description: details requested - items: - type: string - type: array - sockets_per_board: - description: sockets per board required by job - type: string - sockets_per_node: - description: sockets per node required by job - type: string - start_time: - description: "time execution begins, actual or expected" - format: int64 - type: integer - state_description: - description: optional details for state_reason - type: string - state_reason: - description: reason job still pending or failed - type: string - standard_error: - description: pathname of job's stderr file - type: string - standard_input: - description: pathname of job's stdin file - type: string - standard_output: - description: pathname of job's stdout file - type: string - submit_time: - description: time of job submission - format: int64 - type: integer - suspend_time: - description: time job last suspended or resumed - format: int64 - type: integer - system_comment: - description: slurmctld's arbitrary comment - type: string - time_limit: - description: maximum run time in minutes - type: string - time_minimum: - description: minimum run time in minutes - type: string - threads_per_core: - description: threads per core required by job - type: string - tres_bind: - description: Task to TRES binding directives - type: string - tres_freq: - description: TRES frequency directives - type: string - tres_per_job: - description: semicolon delimited list of TRES=# values - type: string - tres_per_node: - description: semicolon delimited list of TRES=# values - type: string - tres_per_socket: - description: semicolon delimited list of TRES=# values - type: string - tres_per_task: - description: semicolon delimited list of TRES=# values - type: string - tres_req_str: - description: tres reqeusted in the job - type: string - tres_alloc_str: - description: tres used in the job - type: string - user_id: - description: user id the job runs as - type: string - user_name: - description: user the job runs as - type: string - wckey: - description: wckey for job - type: string - current_working_directory: - description: pathname of working directory - type: string - type: object - v0.0.37_job_resources: - example: - nodes: nodes - allocated_nodes: - - memory: 7 - cores: "{}" - cpus: "{}" - sockets: "{}" - - memory: 7 - cores: "{}" - cpus: "{}" - sockets: "{}" - allocated_cpus: 5 - allocated_hosts: 2 - properties: - nodes: - description: list of assigned job nodes - type: string - allocated_cpus: - description: number of assigned job cpus - type: integer - allocated_hosts: - description: number of assigned job hosts - type: integer - allocated_nodes: - description: node allocations - items: - $ref: '#/components/schemas/v0.0.37_node_allocation' - type: array - type: object - v0.0.37_node_allocation: - example: - memory: 7 - cores: "{}" - cpus: "{}" - sockets: "{}" - properties: - memory: - description: amount of assigned job memory - type: integer - cpus: - description: amount of assigned job CPUs - type: object - sockets: - description: assignment status of each socket by socket id - type: object - cores: - description: assignment status of each core by core id - type: object - type: object - v0.0.37_job_properties: - properties: - account: - description: Charge resources used by this job to specified account. - type: string - account_gather_frequency: - description: Define the job accounting and profiling sampling intervals. - type: string - argv: - description: Arguments to the script. - items: - type: string - type: array - array: - description: "Submit a job array, multiple jobs to be executed with identical\ - \ parameters. The indexes specification identifies what array index values\ - \ should be used." - type: string - batch_features: - description: features required for batch script's node - type: string - begin_time: - description: "Submit the batch script to the Slurm controller immediately,\ - \ like normal, but tell the controller to defer the allocation of the\ - \ job until the specified time." - format: int64 - type: integer - burst_buffer: - description: Burst buffer specification. - type: string - cluster_constraint: - description: Specifies features that a federated cluster must have to have - a sibling job submitted to it. - type: string - comment: - description: An arbitrary comment. - type: string - constraints: - description: node features required by job. - type: string - core_specification: - description: Count of specialized threads per node reserved by the job for - system operations and not used by the application. - type: integer - cores_per_socket: - description: Restrict node selection to nodes with at least the specified - number of cores per socket. - type: integer - cpu_binding: - description: Cpu binding - type: string - cpu_binding_hint: - description: Cpu binding hint - type: string - cpu_frequency: - description: "Request that job steps initiated by srun commands inside this\ - \ sbatch script be run at some requested frequency if possible, on the\ - \ CPUs selected for the step on the compute node(s)." - type: string - cpus_per_gpu: - description: Number of CPUs requested per allocated GPU. - type: string - cpus_per_task: - description: Advise the Slurm controller that ensuing job steps will require - ncpus number of processors per task. - type: integer - current_working_directory: - description: Instruct Slurm to connect the batch script's standard output - directly to the file name. - type: string - deadline: - description: "Remove the job if no ending is possible before this deadline\ - \ (start > (deadline - time[-min]))." - type: string - delay_boot: - description: Do not reboot nodes in order to satisfied this job's feature - specification if the job has been eligible to run for less than this time - period. - type: integer - dependency: - description: Defer the start of this job until the specified dependencies - have been satisfied completed. - type: string - distribution: - description: Specify alternate distribution methods for remote processes. - type: string - environment: - description: Dictionary of environment entries. - type: object - exclusive: - description: The job allocation can share nodes just other users with the - "user" option or with the "mcs" option). - enum: - - user - - mcs - - "true" - - "false" - type: string - get_user_environment: - description: Load new login environment for user on job node. - type: boolean - gres: - description: Specifies a comma delimited list of generic consumable resources. - type: string - gres_flags: - description: Specify generic resource task binding options. - enum: - - disable-binding - - enforce-binding - type: string - gpu_binding: - description: Requested binding of tasks to GPU. - type: string - gpu_frequency: - description: Requested GPU frequency. - type: string - gpus: - description: GPUs per job. - type: string - gpus_per_node: - description: GPUs per node. - type: string - gpus_per_socket: - description: GPUs per socket. - type: string - gpus_per_task: - description: GPUs per task. - type: string - hold: - description: Specify the job is to be submitted in a held state (priority - of zero). - type: boolean - kill_on_invalid_dependency: - description: "If a job has an invalid dependency, then Slurm is to terminate\ - \ it." - type: boolean - licenses: - description: Specification of licenses (or other resources available on - all nodes of the cluster) which must be allocated to this job. - type: string - mail_type: - description: Notify user by email when certain event types occur. - type: string - mail_user: - description: User to receive email notification of state changes as defined - by mail_type. - type: string - mcs_label: - description: This parameter is a group among the groups of the user. - type: string - memory_binding: - description: Bind tasks to memory. - type: string - memory_per_cpu: - description: Minimum real memory per cpu (MB). - type: integer - memory_per_gpu: - description: Minimum memory required per allocated GPU. - type: integer - memory_per_node: - description: Minimum real memory per node (MB). - type: integer - minimum_cpus_per_node: - description: Minimum number of CPUs per node. - type: integer - minimum_nodes: - description: "If a range of node counts is given, prefer the smaller count." - type: boolean - name: - description: Specify a name for the job allocation. - type: string - nice: - description: Run the job with an adjusted scheduling priority within Slurm. - type: string - no_kill: - description: Do not automatically terminate a job if one of the nodes it - has been allocated fails. - type: boolean - nodes: - description: Request that a minimum of minnodes nodes and a maximum node - count. - items: - type: integer - maxItems: 2 - minItems: 1 - type: array - open_mode: - default: append - description: Open the output and error files using append or truncate mode - as specified. - enum: - - append - - truncate - type: string - partition: - description: Request a specific partition for the resource allocation. - type: string - priority: - description: Request a specific job priority. - type: string - qos: - description: Request a quality of service for the job. - type: string - requeue: - description: Specifies that the batch job should eligible to being requeue. - type: boolean - reservation: - description: Allocate resources for the job from the named reservation. - type: string - signal: - description: "When a job is within sig_time seconds of its end time, send\ - \ it the signal sig_num." - pattern: (B:|)sig_num(@sig_time|) - type: string - sockets_per_node: - description: Restrict node selection to nodes with at least the specified - number of sockets. - type: integer - spread_job: - description: Spread the job allocation over as many nodes as possible and - attempt to evenly distribute tasks across the allocated nodes. - type: boolean - standard_error: - description: Instruct Slurm to connect the batch script's standard error - directly to the file name. - type: string - standard_input: - description: Instruct Slurm to connect the batch script's standard input - directly to the file name specified. - type: string - standard_output: - description: Instruct Slurm to connect the batch script's standard output - directly to the file name. - type: string - tasks: - description: Advises the Slurm controller that job steps run within the - allocation will launch a maximum of number tasks and to provide for sufficient - resources. - type: integer - tasks_per_core: - description: Request the maximum ntasks be invoked on each core. - type: integer - tasks_per_node: - description: Request the maximum ntasks be invoked on each node. - type: integer - tasks_per_socket: - description: Request the maximum ntasks be invoked on each socket. - type: integer - thread_specification: - description: Count of specialized threads per node reserved by the job for - system operations and not used by the application. - type: integer - threads_per_core: - description: Restrict node selection to nodes with at least the specified - number of threads per core. - type: integer - time_limit: - description: Step time limit. - type: integer - time_minimum: - description: Minimum run time in minutes. - type: integer - wait_all_nodes: - description: Do not begin execution until all nodes are ready for use. - type: boolean - wckey: - description: Specify wckey to be used with job. - type: string - required: - - environment - type: object - v0.0.37_node: - example: - reason: reason - boards: 0 - alloc_cpus: 7 - active_features: active_features - reason_set_by_user: reason_set_by_user - slurmd_start_time: 4 - features: features - hostname: hostname - cores: 1 - slurmd_version: slurmd_version - reason_changed_at: 2 - operating_system: operating_system - next_state_after_reboot_flags: - - next_state_after_reboot_flags - - next_state_after_reboot_flags - tres: tres - cpu_binding: 5 - state: state - sockets: 7 - architecture: architecture - owner: owner - partitions: - - partitions - - partitions - state_flags: - - state_flags - - state_flags - address: address - cpus: 7 - free_memory: 2 - tres_weighted: 6.84685269835264 - gres: gres - gres_drained: gres_drained - threads: 1 - weight: 1 - boot_time: 6 - gres_used: gres_used - alloc_memory: 4 - mcs_label: mcs_label - real_memory: 3 - burstbuffer_network_address: burstbuffer_network_address - port: 9 - name: name - next_state_after_reboot: next_state_after_reboot - temporary_disk: 1 - tres_used: tres_used - idle_cpus: 1 - cpu_load: 5 - properties: - architecture: - description: computer architecture - type: string - burstbuffer_network_address: - description: BcastAddr - type: string - boards: - description: total number of boards per node - type: integer - boot_time: - description: timestamp of node boot - format: int64 - type: integer - cores: - description: number of cores per socket - type: integer - cpu_binding: - description: Default task binding - type: integer - cpu_load: - description: CPU load * 100 - format: int64 - type: integer - free_memory: - description: free memory in MiB - type: integer - cpus: - description: configured count of cpus running on the node - type: integer - features: - description: "" - type: string - active_features: - description: list of a node's available features - type: string - gres: - description: list of a node's generic resources - type: string - gres_drained: - description: list of drained GRES - type: string - gres_used: - description: list of GRES in current use - type: string - mcs_label: - description: mcs label if mcs plugin in use - type: string - name: - description: node name to slurm - type: string - next_state_after_reboot: - description: state after reboot - type: string - next_state_after_reboot_flags: - description: node state flags - items: - type: string - type: array - address: - description: state after reboot - type: string - hostname: - description: node's hostname - type: string - state: - description: current node state - type: string - state_flags: - description: node state flags - items: - type: string - type: array - operating_system: - description: operating system - type: string - owner: - description: User allowed to use this node - type: string - partitions: - description: assigned partitions - items: - type: string - type: array - port: - description: TCP port number of the slurmd - type: integer - real_memory: - description: configured MB of real memory on the node - type: integer - reason: - description: reason for node being DOWN or DRAINING - type: string - reason_changed_at: - description: Time stamp when reason was set - type: integer - reason_set_by_user: - description: User that set the reason - type: string - slurmd_start_time: - description: timestamp of slurmd startup - format: int64 - type: integer - sockets: - description: total number of sockets per node - type: integer - threads: - description: number of threads per core - type: integer - temporary_disk: - description: configured MB of total disk in TMP_FS - type: integer - weight: - description: arbitrary priority of node for scheduling - type: integer - tres: - description: TRES on node - type: string - tres_used: - description: TRES used on node - type: string - tres_weighted: - description: TRES weight used on node - format: double - type: number - slurmd_version: - description: Slurmd version - type: string - alloc_cpus: - description: Allocated CPUs - format: int64 - type: integer - idle_cpus: - description: Idle CPUs - format: int64 - type: integer - alloc_memory: - description: Allocated memory (MB) - format: int64 - type: integer - type: object - v0.0.37_nodes_response: - example: - nodes: - - reason: reason - boards: 0 - alloc_cpus: 7 - active_features: active_features - reason_set_by_user: reason_set_by_user - slurmd_start_time: 4 - features: features - hostname: hostname - cores: 1 - slurmd_version: slurmd_version - reason_changed_at: 2 - operating_system: operating_system - next_state_after_reboot_flags: - - next_state_after_reboot_flags - - next_state_after_reboot_flags - tres: tres - cpu_binding: 5 - state: state - sockets: 7 - architecture: architecture - owner: owner - partitions: - - partitions - - partitions - state_flags: - - state_flags - - state_flags - address: address - cpus: 7 - free_memory: 2 - tres_weighted: 6.84685269835264 - gres: gres - gres_drained: gres_drained - threads: 1 - weight: 1 - boot_time: 6 - gres_used: gres_used - alloc_memory: 4 - mcs_label: mcs_label - real_memory: 3 - burstbuffer_network_address: burstbuffer_network_address - port: 9 - name: name - next_state_after_reboot: next_state_after_reboot - temporary_disk: 1 - tres_used: tres_used - idle_cpus: 1 - cpu_load: 5 - - reason: reason - boards: 0 - alloc_cpus: 7 - active_features: active_features - reason_set_by_user: reason_set_by_user - slurmd_start_time: 4 - features: features - hostname: hostname - cores: 1 - slurmd_version: slurmd_version - reason_changed_at: 2 - operating_system: operating_system - next_state_after_reboot_flags: - - next_state_after_reboot_flags - - next_state_after_reboot_flags - tres: tres - cpu_binding: 5 - state: state - sockets: 7 - architecture: architecture - owner: owner - partitions: - - partitions - - partitions - state_flags: - - state_flags - - state_flags - address: address - cpus: 7 - free_memory: 2 - tres_weighted: 6.84685269835264 - gres: gres - gres_drained: gres_drained - threads: 1 - weight: 1 - boot_time: 6 - gres_used: gres_used - alloc_memory: 4 - mcs_label: mcs_label - real_memory: 3 - burstbuffer_network_address: burstbuffer_network_address - port: 9 - name: name - next_state_after_reboot: next_state_after_reboot - temporary_disk: 1 - tres_used: tres_used - idle_cpus: 1 - cpu_load: 5 - errors: - - errno: 0 - error: error - - errno: 0 - error: error - properties: - errors: - description: slurm errors - items: - $ref: '#/components/schemas/v0.0.37_error' - type: array - nodes: - description: nodes info - items: - $ref: '#/components/schemas/v0.0.37_node' - type: array - type: object - v0_0_37_diag_statistics: - description: Slurm statistics - example: - schedule_cycle_per_minute: 6 - req_time_start: 5 - jobs_running: 8 - bf_cycle_max: 6 - bf_last_backfilled_jobs: 3 - bf_last_depth: 6 - bf_backfilled_het_jobs: 6 - bf_backfilled_jobs: 6 - bf_cycle_mean: 2 - job_states_ts: 9 - bf_queue_len: 7 - jobs_started: 4 - schedule_cycle_max: 4 - server_thread_count: 5 - dbd_agent_queue_size: 3 - jobs_pending: 6 - agent_count: 7 - bf_cycle_last: 3 - parts_packed: 6 - agent_thread_count: 9 - jobs_completed: 5 - bf_depth_mean: 6 - bf_active: true - bf_depth_mean_try: 3 - schedule_cycle_mean: 1 - agent_queue_size: 2 - jobs_failed: 9 - gettimeofday_latency: 2 - bf_last_depth_try: 5 - req_time: 1 - bf_cycle_counter: 1 - schedule_queue_length: 7 - bf_queue_len_mean: 0 - schedule_cycle_total: 1 - bf_when_last_cycle: 7 - schedule_cycle_last: 7 - jobs_canceled: 9 - jobs_submitted: 1 - schedule_cycle_mean_depth: 1 - properties: - parts_packed: - description: partition records packed - type: integer - req_time: - description: generation time - type: integer - req_time_start: - description: data since - type: integer - server_thread_count: - description: Server thread count - type: integer - agent_queue_size: - description: Agent queue size - type: integer - agent_count: - description: Agent count - type: integer - agent_thread_count: - description: Agent thread count - type: integer - dbd_agent_queue_size: - description: DBD Agent queue size - type: integer - gettimeofday_latency: - description: Latency for 1000 calls to gettimeofday() - type: integer - schedule_cycle_max: - description: Main Schedule max cycle - type: integer - schedule_cycle_last: - description: Main Schedule last cycle - type: integer - schedule_cycle_total: - description: Main Schedule cycle iterations - type: integer - schedule_cycle_mean: - description: Average time for Schedule Max cycle - type: integer - schedule_cycle_mean_depth: - description: Average depth for Schedule Max cycle - type: integer - schedule_cycle_per_minute: - description: Main Schedule Cycles per minute - type: integer - schedule_queue_length: - description: Main Schedule Last queue length - type: integer - jobs_submitted: - description: Job submitted - type: integer - jobs_started: - description: Job started - type: integer - jobs_completed: - description: Job completed - type: integer - jobs_canceled: - description: Job cancelled - type: integer - jobs_failed: - description: Job failed - type: integer - jobs_pending: - description: Job pending - type: integer - jobs_running: - description: Job running - type: integer - job_states_ts: - description: Job states timestamp - type: integer - bf_backfilled_jobs: - description: Total backfilled jobs (since last slurm start) - type: integer - bf_last_backfilled_jobs: - description: Total backfilled jobs (since last stats cycle start) - type: integer - bf_backfilled_het_jobs: - description: Total backfilled heterogeneous job components - type: integer - bf_cycle_counter: - description: Backfill Schedule Total cycles - type: integer - bf_cycle_mean: - description: Backfill Schedule Mean cycle - type: integer - bf_cycle_max: - description: Backfill Schedule Max cycle time - type: integer - bf_last_depth: - description: Backfill Schedule Last depth cycle - type: integer - bf_last_depth_try: - description: Backfill Schedule Mean cycle (try sched) - type: integer - bf_depth_mean: - description: Backfill Schedule Depth Mean - type: integer - bf_depth_mean_try: - description: Backfill Schedule Depth Mean (try sched) - type: integer - bf_cycle_last: - description: Backfill Schedule Last cycle time - type: integer - bf_queue_len: - description: Backfill Schedule Last queue length - type: integer - bf_queue_len_mean: - description: Backfill Schedule Mean queue length - type: integer - bf_when_last_cycle: - description: Last cycle timestamp - type: integer - bf_active: - description: Backfill Schedule currently active - type: boolean - type: object - v0_0_37_reservation_purge_completed: - description: If PURGE_COMP flag is set the amount of seconds this reservation - will sit idle until it is revoked - example: - time: 2 - properties: - time: - description: amount of seconds this reservation will sit idle until it is - revoked - type: integer - type: object - securitySchemes: - user: - description: User name - in: header - name: X-SLURM-USER-NAME - type: apiKey - token: - description: User access token - in: header - name: X-SLURM-USER-TOKEN - type: apiKey diff --git a/internal/api/0.0.37/api_openapi.go b/internal/api/0.0.37/api_openapi.go deleted file mode 100644 index a89ecbc..0000000 --- a/internal/api/0.0.37/api_openapi.go +++ /dev/null @@ -1,480 +0,0 @@ -/* -Slurm Rest API - -API to access and control Slurm. - -API version: 0.0.37 -Contact: sales@schedmd.com -*/ - -// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. - -package openapi - -import ( - "bytes" - "context" - "io" - "net/http" - "net/url" -) - - -// OpenapiAPIService OpenapiAPI service -type OpenapiAPIService service - -type ApiOpenapiGetRequest struct { - ctx context.Context - ApiService *OpenapiAPIService -} - -func (r ApiOpenapiGetRequest) Execute() (*http.Response, error) { - return r.ApiService.OpenapiGetExecute(r) -} - -/* -OpenapiGet Retrieve OpenAPI Specification - - @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). - @return ApiOpenapiGetRequest -*/ -func (a *OpenapiAPIService) OpenapiGet(ctx context.Context) ApiOpenapiGetRequest { - return ApiOpenapiGetRequest{ - ApiService: a, - ctx: ctx, - } -} - -// Execute executes the request -func (a *OpenapiAPIService) OpenapiGetExecute(r ApiOpenapiGetRequest) (*http.Response, error) { - var ( - localVarHTTPMethod = http.MethodGet - localVarPostBody interface{} - formFiles []formFile - ) - - localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "OpenapiAPIService.OpenapiGet") - if err != nil { - return nil, &GenericOpenAPIError{error: err.Error()} - } - - localVarPath := localBasePath + "/openapi" - - localVarHeaderParams := make(map[string]string) - localVarQueryParams := url.Values{} - localVarFormParams := url.Values{} - - // to determine the Content-Type header - localVarHTTPContentTypes := []string{} - - // set Content-Type header - localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes) - if localVarHTTPContentType != "" { - localVarHeaderParams["Content-Type"] = localVarHTTPContentType - } - - // to determine the Accept header - localVarHTTPHeaderAccepts := []string{} - - // set Accept header - localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts) - if localVarHTTPHeaderAccept != "" { - localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept - } - if r.ctx != nil { - // API Key Authentication - if auth, ok := r.ctx.Value(ContextAPIKeys).(map[string]APIKey); ok { - if apiKey, ok := auth["user"]; ok { - var key string - if apiKey.Prefix != "" { - key = apiKey.Prefix + " " + apiKey.Key - } else { - key = apiKey.Key - } - localVarHeaderParams["X-SLURM-USER-NAME"] = key - } - } - } - if r.ctx != nil { - // API Key Authentication - if auth, ok := r.ctx.Value(ContextAPIKeys).(map[string]APIKey); ok { - if apiKey, ok := auth["token"]; ok { - var key string - if apiKey.Prefix != "" { - key = apiKey.Prefix + " " + apiKey.Key - } else { - key = apiKey.Key - } - localVarHeaderParams["X-SLURM-USER-TOKEN"] = key - } - } - } - req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, formFiles) - if err != nil { - return nil, err - } - - localVarHTTPResponse, err := a.client.callAPI(req) - if err != nil || localVarHTTPResponse == nil { - return localVarHTTPResponse, err - } - - localVarBody, err := io.ReadAll(localVarHTTPResponse.Body) - localVarHTTPResponse.Body.Close() - localVarHTTPResponse.Body = io.NopCloser(bytes.NewBuffer(localVarBody)) - if err != nil { - return localVarHTTPResponse, err - } - - if localVarHTTPResponse.StatusCode >= 300 { - newErr := &GenericOpenAPIError{ - body: localVarBody, - error: localVarHTTPResponse.Status, - } - return localVarHTTPResponse, newErr - } - - return localVarHTTPResponse, nil -} - -type ApiOpenapiJsonGetRequest struct { - ctx context.Context - ApiService *OpenapiAPIService -} - -func (r ApiOpenapiJsonGetRequest) Execute() (*http.Response, error) { - return r.ApiService.OpenapiJsonGetExecute(r) -} - -/* -OpenapiJsonGet Retrieve OpenAPI Specification - - @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). - @return ApiOpenapiJsonGetRequest -*/ -func (a *OpenapiAPIService) OpenapiJsonGet(ctx context.Context) ApiOpenapiJsonGetRequest { - return ApiOpenapiJsonGetRequest{ - ApiService: a, - ctx: ctx, - } -} - -// Execute executes the request -func (a *OpenapiAPIService) OpenapiJsonGetExecute(r ApiOpenapiJsonGetRequest) (*http.Response, error) { - var ( - localVarHTTPMethod = http.MethodGet - localVarPostBody interface{} - formFiles []formFile - ) - - localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "OpenapiAPIService.OpenapiJsonGet") - if err != nil { - return nil, &GenericOpenAPIError{error: err.Error()} - } - - localVarPath := localBasePath + "/openapi.json" - - localVarHeaderParams := make(map[string]string) - localVarQueryParams := url.Values{} - localVarFormParams := url.Values{} - - // to determine the Content-Type header - localVarHTTPContentTypes := []string{} - - // set Content-Type header - localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes) - if localVarHTTPContentType != "" { - localVarHeaderParams["Content-Type"] = localVarHTTPContentType - } - - // to determine the Accept header - localVarHTTPHeaderAccepts := []string{} - - // set Accept header - localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts) - if localVarHTTPHeaderAccept != "" { - localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept - } - if r.ctx != nil { - // API Key Authentication - if auth, ok := r.ctx.Value(ContextAPIKeys).(map[string]APIKey); ok { - if apiKey, ok := auth["user"]; ok { - var key string - if apiKey.Prefix != "" { - key = apiKey.Prefix + " " + apiKey.Key - } else { - key = apiKey.Key - } - localVarHeaderParams["X-SLURM-USER-NAME"] = key - } - } - } - if r.ctx != nil { - // API Key Authentication - if auth, ok := r.ctx.Value(ContextAPIKeys).(map[string]APIKey); ok { - if apiKey, ok := auth["token"]; ok { - var key string - if apiKey.Prefix != "" { - key = apiKey.Prefix + " " + apiKey.Key - } else { - key = apiKey.Key - } - localVarHeaderParams["X-SLURM-USER-TOKEN"] = key - } - } - } - req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, formFiles) - if err != nil { - return nil, err - } - - localVarHTTPResponse, err := a.client.callAPI(req) - if err != nil || localVarHTTPResponse == nil { - return localVarHTTPResponse, err - } - - localVarBody, err := io.ReadAll(localVarHTTPResponse.Body) - localVarHTTPResponse.Body.Close() - localVarHTTPResponse.Body = io.NopCloser(bytes.NewBuffer(localVarBody)) - if err != nil { - return localVarHTTPResponse, err - } - - if localVarHTTPResponse.StatusCode >= 300 { - newErr := &GenericOpenAPIError{ - body: localVarBody, - error: localVarHTTPResponse.Status, - } - return localVarHTTPResponse, newErr - } - - return localVarHTTPResponse, nil -} - -type ApiOpenapiV3GetRequest struct { - ctx context.Context - ApiService *OpenapiAPIService -} - -func (r ApiOpenapiV3GetRequest) Execute() (*http.Response, error) { - return r.ApiService.OpenapiV3GetExecute(r) -} - -/* -OpenapiV3Get Retrieve OpenAPI Specification - - @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). - @return ApiOpenapiV3GetRequest -*/ -func (a *OpenapiAPIService) OpenapiV3Get(ctx context.Context) ApiOpenapiV3GetRequest { - return ApiOpenapiV3GetRequest{ - ApiService: a, - ctx: ctx, - } -} - -// Execute executes the request -func (a *OpenapiAPIService) OpenapiV3GetExecute(r ApiOpenapiV3GetRequest) (*http.Response, error) { - var ( - localVarHTTPMethod = http.MethodGet - localVarPostBody interface{} - formFiles []formFile - ) - - localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "OpenapiAPIService.OpenapiV3Get") - if err != nil { - return nil, &GenericOpenAPIError{error: err.Error()} - } - - localVarPath := localBasePath + "/openapi/v3" - - localVarHeaderParams := make(map[string]string) - localVarQueryParams := url.Values{} - localVarFormParams := url.Values{} - - // to determine the Content-Type header - localVarHTTPContentTypes := []string{} - - // set Content-Type header - localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes) - if localVarHTTPContentType != "" { - localVarHeaderParams["Content-Type"] = localVarHTTPContentType - } - - // to determine the Accept header - localVarHTTPHeaderAccepts := []string{} - - // set Accept header - localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts) - if localVarHTTPHeaderAccept != "" { - localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept - } - if r.ctx != nil { - // API Key Authentication - if auth, ok := r.ctx.Value(ContextAPIKeys).(map[string]APIKey); ok { - if apiKey, ok := auth["user"]; ok { - var key string - if apiKey.Prefix != "" { - key = apiKey.Prefix + " " + apiKey.Key - } else { - key = apiKey.Key - } - localVarHeaderParams["X-SLURM-USER-NAME"] = key - } - } - } - if r.ctx != nil { - // API Key Authentication - if auth, ok := r.ctx.Value(ContextAPIKeys).(map[string]APIKey); ok { - if apiKey, ok := auth["token"]; ok { - var key string - if apiKey.Prefix != "" { - key = apiKey.Prefix + " " + apiKey.Key - } else { - key = apiKey.Key - } - localVarHeaderParams["X-SLURM-USER-TOKEN"] = key - } - } - } - req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, formFiles) - if err != nil { - return nil, err - } - - localVarHTTPResponse, err := a.client.callAPI(req) - if err != nil || localVarHTTPResponse == nil { - return localVarHTTPResponse, err - } - - localVarBody, err := io.ReadAll(localVarHTTPResponse.Body) - localVarHTTPResponse.Body.Close() - localVarHTTPResponse.Body = io.NopCloser(bytes.NewBuffer(localVarBody)) - if err != nil { - return localVarHTTPResponse, err - } - - if localVarHTTPResponse.StatusCode >= 300 { - newErr := &GenericOpenAPIError{ - body: localVarBody, - error: localVarHTTPResponse.Status, - } - return localVarHTTPResponse, newErr - } - - return localVarHTTPResponse, nil -} - -type ApiOpenapiYamlGetRequest struct { - ctx context.Context - ApiService *OpenapiAPIService -} - -func (r ApiOpenapiYamlGetRequest) Execute() (*http.Response, error) { - return r.ApiService.OpenapiYamlGetExecute(r) -} - -/* -OpenapiYamlGet Retrieve OpenAPI Specification - - @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). - @return ApiOpenapiYamlGetRequest -*/ -func (a *OpenapiAPIService) OpenapiYamlGet(ctx context.Context) ApiOpenapiYamlGetRequest { - return ApiOpenapiYamlGetRequest{ - ApiService: a, - ctx: ctx, - } -} - -// Execute executes the request -func (a *OpenapiAPIService) OpenapiYamlGetExecute(r ApiOpenapiYamlGetRequest) (*http.Response, error) { - var ( - localVarHTTPMethod = http.MethodGet - localVarPostBody interface{} - formFiles []formFile - ) - - localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "OpenapiAPIService.OpenapiYamlGet") - if err != nil { - return nil, &GenericOpenAPIError{error: err.Error()} - } - - localVarPath := localBasePath + "/openapi.yaml" - - localVarHeaderParams := make(map[string]string) - localVarQueryParams := url.Values{} - localVarFormParams := url.Values{} - - // to determine the Content-Type header - localVarHTTPContentTypes := []string{} - - // set Content-Type header - localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes) - if localVarHTTPContentType != "" { - localVarHeaderParams["Content-Type"] = localVarHTTPContentType - } - - // to determine the Accept header - localVarHTTPHeaderAccepts := []string{} - - // set Accept header - localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts) - if localVarHTTPHeaderAccept != "" { - localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept - } - if r.ctx != nil { - // API Key Authentication - if auth, ok := r.ctx.Value(ContextAPIKeys).(map[string]APIKey); ok { - if apiKey, ok := auth["user"]; ok { - var key string - if apiKey.Prefix != "" { - key = apiKey.Prefix + " " + apiKey.Key - } else { - key = apiKey.Key - } - localVarHeaderParams["X-SLURM-USER-NAME"] = key - } - } - } - if r.ctx != nil { - // API Key Authentication - if auth, ok := r.ctx.Value(ContextAPIKeys).(map[string]APIKey); ok { - if apiKey, ok := auth["token"]; ok { - var key string - if apiKey.Prefix != "" { - key = apiKey.Prefix + " " + apiKey.Key - } else { - key = apiKey.Key - } - localVarHeaderParams["X-SLURM-USER-TOKEN"] = key - } - } - } - req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, formFiles) - if err != nil { - return nil, err - } - - localVarHTTPResponse, err := a.client.callAPI(req) - if err != nil || localVarHTTPResponse == nil { - return localVarHTTPResponse, err - } - - localVarBody, err := io.ReadAll(localVarHTTPResponse.Body) - localVarHTTPResponse.Body.Close() - localVarHTTPResponse.Body = io.NopCloser(bytes.NewBuffer(localVarBody)) - if err != nil { - return localVarHTTPResponse, err - } - - if localVarHTTPResponse.StatusCode >= 300 { - newErr := &GenericOpenAPIError{ - body: localVarBody, - error: localVarHTTPResponse.Status, - } - return localVarHTTPResponse, newErr - } - - return localVarHTTPResponse, nil -} diff --git a/internal/api/0.0.37/api_slurm.go b/internal/api/0.0.37/api_slurm.go deleted file mode 100644 index 8bb24db..0000000 --- a/internal/api/0.0.37/api_slurm.go +++ /dev/null @@ -1,1746 +0,0 @@ -/* -Slurm Rest API - -API to access and control Slurm. - -API version: 0.0.37 -Contact: sales@schedmd.com -*/ - -// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. - -package openapi - -import ( - "bytes" - "context" - "io" - "net/http" - "net/url" - "strings" -) - - -// SlurmAPIService SlurmAPI service -type SlurmAPIService service - -type ApiSlurmctldCancelJobRequest struct { - ctx context.Context - ApiService *SlurmAPIService - jobId string - signal *V0037Signal -} - -// signal to send to job -func (r ApiSlurmctldCancelJobRequest) Signal(signal V0037Signal) ApiSlurmctldCancelJobRequest { - r.signal = &signal - return r -} - -func (r ApiSlurmctldCancelJobRequest) Execute() (*http.Response, error) { - return r.ApiService.SlurmctldCancelJobExecute(r) -} - -/* -SlurmctldCancelJob cancel or signal job - - @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). - @param jobId Slurm Job ID - @return ApiSlurmctldCancelJobRequest -*/ -func (a *SlurmAPIService) SlurmctldCancelJob(ctx context.Context, jobId string) ApiSlurmctldCancelJobRequest { - return ApiSlurmctldCancelJobRequest{ - ApiService: a, - ctx: ctx, - jobId: jobId, - } -} - -// Execute executes the request -func (a *SlurmAPIService) SlurmctldCancelJobExecute(r ApiSlurmctldCancelJobRequest) (*http.Response, error) { - var ( - localVarHTTPMethod = http.MethodDelete - localVarPostBody interface{} - formFiles []formFile - ) - - localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "SlurmAPIService.SlurmctldCancelJob") - if err != nil { - return nil, &GenericOpenAPIError{error: err.Error()} - } - - localVarPath := localBasePath + "/job/{job_id}" - localVarPath = strings.Replace(localVarPath, "{"+"job_id"+"}", url.PathEscape(parameterValueToString(r.jobId, "jobId")), -1) - - localVarHeaderParams := make(map[string]string) - localVarQueryParams := url.Values{} - localVarFormParams := url.Values{} - - if r.signal != nil { - parameterAddToHeaderOrQuery(localVarQueryParams, "signal", r.signal, "") - } - // to determine the Content-Type header - localVarHTTPContentTypes := []string{} - - // set Content-Type header - localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes) - if localVarHTTPContentType != "" { - localVarHeaderParams["Content-Type"] = localVarHTTPContentType - } - - // to determine the Accept header - localVarHTTPHeaderAccepts := []string{} - - // set Accept header - localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts) - if localVarHTTPHeaderAccept != "" { - localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept - } - if r.ctx != nil { - // API Key Authentication - if auth, ok := r.ctx.Value(ContextAPIKeys).(map[string]APIKey); ok { - if apiKey, ok := auth["user"]; ok { - var key string - if apiKey.Prefix != "" { - key = apiKey.Prefix + " " + apiKey.Key - } else { - key = apiKey.Key - } - localVarHeaderParams["X-SLURM-USER-NAME"] = key - } - } - } - if r.ctx != nil { - // API Key Authentication - if auth, ok := r.ctx.Value(ContextAPIKeys).(map[string]APIKey); ok { - if apiKey, ok := auth["token"]; ok { - var key string - if apiKey.Prefix != "" { - key = apiKey.Prefix + " " + apiKey.Key - } else { - key = apiKey.Key - } - localVarHeaderParams["X-SLURM-USER-TOKEN"] = key - } - } - } - req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, formFiles) - if err != nil { - return nil, err - } - - localVarHTTPResponse, err := a.client.callAPI(req) - if err != nil || localVarHTTPResponse == nil { - return localVarHTTPResponse, err - } - - localVarBody, err := io.ReadAll(localVarHTTPResponse.Body) - localVarHTTPResponse.Body.Close() - localVarHTTPResponse.Body = io.NopCloser(bytes.NewBuffer(localVarBody)) - if err != nil { - return localVarHTTPResponse, err - } - - if localVarHTTPResponse.StatusCode >= 300 { - newErr := &GenericOpenAPIError{ - body: localVarBody, - error: localVarHTTPResponse.Status, - } - return localVarHTTPResponse, newErr - } - - return localVarHTTPResponse, nil -} - -type ApiSlurmctldDiagRequest struct { - ctx context.Context - ApiService *SlurmAPIService -} - -func (r ApiSlurmctldDiagRequest) Execute() (*V0037Diag, *http.Response, error) { - return r.ApiService.SlurmctldDiagExecute(r) -} - -/* -SlurmctldDiag get diagnostics - - @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). - @return ApiSlurmctldDiagRequest -*/ -func (a *SlurmAPIService) SlurmctldDiag(ctx context.Context) ApiSlurmctldDiagRequest { - return ApiSlurmctldDiagRequest{ - ApiService: a, - ctx: ctx, - } -} - -// Execute executes the request -// @return V0037Diag -func (a *SlurmAPIService) SlurmctldDiagExecute(r ApiSlurmctldDiagRequest) (*V0037Diag, *http.Response, error) { - var ( - localVarHTTPMethod = http.MethodGet - localVarPostBody interface{} - formFiles []formFile - localVarReturnValue *V0037Diag - ) - - localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "SlurmAPIService.SlurmctldDiag") - if err != nil { - return localVarReturnValue, nil, &GenericOpenAPIError{error: err.Error()} - } - - localVarPath := localBasePath + "/diag/" - - localVarHeaderParams := make(map[string]string) - localVarQueryParams := url.Values{} - localVarFormParams := url.Values{} - - // to determine the Content-Type header - localVarHTTPContentTypes := []string{} - - // set Content-Type header - localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes) - if localVarHTTPContentType != "" { - localVarHeaderParams["Content-Type"] = localVarHTTPContentType - } - - // to determine the Accept header - localVarHTTPHeaderAccepts := []string{"application/json", "application/x-yaml"} - - // set Accept header - localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts) - if localVarHTTPHeaderAccept != "" { - localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept - } - if r.ctx != nil { - // API Key Authentication - if auth, ok := r.ctx.Value(ContextAPIKeys).(map[string]APIKey); ok { - if apiKey, ok := auth["user"]; ok { - var key string - if apiKey.Prefix != "" { - key = apiKey.Prefix + " " + apiKey.Key - } else { - key = apiKey.Key - } - localVarHeaderParams["X-SLURM-USER-NAME"] = key - } - } - } - if r.ctx != nil { - // API Key Authentication - if auth, ok := r.ctx.Value(ContextAPIKeys).(map[string]APIKey); ok { - if apiKey, ok := auth["token"]; ok { - var key string - if apiKey.Prefix != "" { - key = apiKey.Prefix + " " + apiKey.Key - } else { - key = apiKey.Key - } - localVarHeaderParams["X-SLURM-USER-TOKEN"] = key - } - } - } - req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, formFiles) - if err != nil { - return localVarReturnValue, nil, err - } - - localVarHTTPResponse, err := a.client.callAPI(req) - if err != nil || localVarHTTPResponse == nil { - return localVarReturnValue, localVarHTTPResponse, err - } - - localVarBody, err := io.ReadAll(localVarHTTPResponse.Body) - localVarHTTPResponse.Body.Close() - localVarHTTPResponse.Body = io.NopCloser(bytes.NewBuffer(localVarBody)) - if err != nil { - return localVarReturnValue, localVarHTTPResponse, err - } - - if localVarHTTPResponse.StatusCode >= 300 { - newErr := &GenericOpenAPIError{ - body: localVarBody, - error: localVarHTTPResponse.Status, - } - return localVarReturnValue, localVarHTTPResponse, newErr - } - - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr := &GenericOpenAPIError{ - body: localVarBody, - error: err.Error(), - } - return localVarReturnValue, localVarHTTPResponse, newErr - } - - return localVarReturnValue, localVarHTTPResponse, nil -} - -type ApiSlurmctldGetJobRequest struct { - ctx context.Context - ApiService *SlurmAPIService - jobId string -} - -func (r ApiSlurmctldGetJobRequest) Execute() (*V0037JobsResponse, *http.Response, error) { - return r.ApiService.SlurmctldGetJobExecute(r) -} - -/* -SlurmctldGetJob get job info - - @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). - @param jobId Slurm JobID - @return ApiSlurmctldGetJobRequest -*/ -func (a *SlurmAPIService) SlurmctldGetJob(ctx context.Context, jobId string) ApiSlurmctldGetJobRequest { - return ApiSlurmctldGetJobRequest{ - ApiService: a, - ctx: ctx, - jobId: jobId, - } -} - -// Execute executes the request -// @return V0037JobsResponse -func (a *SlurmAPIService) SlurmctldGetJobExecute(r ApiSlurmctldGetJobRequest) (*V0037JobsResponse, *http.Response, error) { - var ( - localVarHTTPMethod = http.MethodGet - localVarPostBody interface{} - formFiles []formFile - localVarReturnValue *V0037JobsResponse - ) - - localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "SlurmAPIService.SlurmctldGetJob") - if err != nil { - return localVarReturnValue, nil, &GenericOpenAPIError{error: err.Error()} - } - - localVarPath := localBasePath + "/job/{job_id}" - localVarPath = strings.Replace(localVarPath, "{"+"job_id"+"}", url.PathEscape(parameterValueToString(r.jobId, "jobId")), -1) - - localVarHeaderParams := make(map[string]string) - localVarQueryParams := url.Values{} - localVarFormParams := url.Values{} - - // to determine the Content-Type header - localVarHTTPContentTypes := []string{} - - // set Content-Type header - localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes) - if localVarHTTPContentType != "" { - localVarHeaderParams["Content-Type"] = localVarHTTPContentType - } - - // to determine the Accept header - localVarHTTPHeaderAccepts := []string{"application/json", "application/x-yaml"} - - // set Accept header - localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts) - if localVarHTTPHeaderAccept != "" { - localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept - } - if r.ctx != nil { - // API Key Authentication - if auth, ok := r.ctx.Value(ContextAPIKeys).(map[string]APIKey); ok { - if apiKey, ok := auth["user"]; ok { - var key string - if apiKey.Prefix != "" { - key = apiKey.Prefix + " " + apiKey.Key - } else { - key = apiKey.Key - } - localVarHeaderParams["X-SLURM-USER-NAME"] = key - } - } - } - if r.ctx != nil { - // API Key Authentication - if auth, ok := r.ctx.Value(ContextAPIKeys).(map[string]APIKey); ok { - if apiKey, ok := auth["token"]; ok { - var key string - if apiKey.Prefix != "" { - key = apiKey.Prefix + " " + apiKey.Key - } else { - key = apiKey.Key - } - localVarHeaderParams["X-SLURM-USER-TOKEN"] = key - } - } - } - req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, formFiles) - if err != nil { - return localVarReturnValue, nil, err - } - - localVarHTTPResponse, err := a.client.callAPI(req) - if err != nil || localVarHTTPResponse == nil { - return localVarReturnValue, localVarHTTPResponse, err - } - - localVarBody, err := io.ReadAll(localVarHTTPResponse.Body) - localVarHTTPResponse.Body.Close() - localVarHTTPResponse.Body = io.NopCloser(bytes.NewBuffer(localVarBody)) - if err != nil { - return localVarReturnValue, localVarHTTPResponse, err - } - - if localVarHTTPResponse.StatusCode >= 300 { - newErr := &GenericOpenAPIError{ - body: localVarBody, - error: localVarHTTPResponse.Status, - } - return localVarReturnValue, localVarHTTPResponse, newErr - } - - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr := &GenericOpenAPIError{ - body: localVarBody, - error: err.Error(), - } - return localVarReturnValue, localVarHTTPResponse, newErr - } - - return localVarReturnValue, localVarHTTPResponse, nil -} - -type ApiSlurmctldGetJobsRequest struct { - ctx context.Context - ApiService *SlurmAPIService - updateTime *int64 -} - -// Filter if changed since update_time. Use of this parameter can result in faster replies. -func (r ApiSlurmctldGetJobsRequest) UpdateTime(updateTime int64) ApiSlurmctldGetJobsRequest { - r.updateTime = &updateTime - return r -} - -func (r ApiSlurmctldGetJobsRequest) Execute() (*V0037JobsResponse, *http.Response, error) { - return r.ApiService.SlurmctldGetJobsExecute(r) -} - -/* -SlurmctldGetJobs get list of jobs - - @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). - @return ApiSlurmctldGetJobsRequest -*/ -func (a *SlurmAPIService) SlurmctldGetJobs(ctx context.Context) ApiSlurmctldGetJobsRequest { - return ApiSlurmctldGetJobsRequest{ - ApiService: a, - ctx: ctx, - } -} - -// Execute executes the request -// @return V0037JobsResponse -func (a *SlurmAPIService) SlurmctldGetJobsExecute(r ApiSlurmctldGetJobsRequest) (*V0037JobsResponse, *http.Response, error) { - var ( - localVarHTTPMethod = http.MethodGet - localVarPostBody interface{} - formFiles []formFile - localVarReturnValue *V0037JobsResponse - ) - - localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "SlurmAPIService.SlurmctldGetJobs") - if err != nil { - return localVarReturnValue, nil, &GenericOpenAPIError{error: err.Error()} - } - - localVarPath := localBasePath + "/jobs/" - - localVarHeaderParams := make(map[string]string) - localVarQueryParams := url.Values{} - localVarFormParams := url.Values{} - - if r.updateTime != nil { - parameterAddToHeaderOrQuery(localVarQueryParams, "update_time", r.updateTime, "") - } - // to determine the Content-Type header - localVarHTTPContentTypes := []string{} - - // set Content-Type header - localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes) - if localVarHTTPContentType != "" { - localVarHeaderParams["Content-Type"] = localVarHTTPContentType - } - - // to determine the Accept header - localVarHTTPHeaderAccepts := []string{"application/json", "application/x-yaml"} - - // set Accept header - localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts) - if localVarHTTPHeaderAccept != "" { - localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept - } - if r.ctx != nil { - // API Key Authentication - if auth, ok := r.ctx.Value(ContextAPIKeys).(map[string]APIKey); ok { - if apiKey, ok := auth["user"]; ok { - var key string - if apiKey.Prefix != "" { - key = apiKey.Prefix + " " + apiKey.Key - } else { - key = apiKey.Key - } - localVarHeaderParams["X-SLURM-USER-NAME"] = key - } - } - } - if r.ctx != nil { - // API Key Authentication - if auth, ok := r.ctx.Value(ContextAPIKeys).(map[string]APIKey); ok { - if apiKey, ok := auth["token"]; ok { - var key string - if apiKey.Prefix != "" { - key = apiKey.Prefix + " " + apiKey.Key - } else { - key = apiKey.Key - } - localVarHeaderParams["X-SLURM-USER-TOKEN"] = key - } - } - } - req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, formFiles) - if err != nil { - return localVarReturnValue, nil, err - } - - localVarHTTPResponse, err := a.client.callAPI(req) - if err != nil || localVarHTTPResponse == nil { - return localVarReturnValue, localVarHTTPResponse, err - } - - localVarBody, err := io.ReadAll(localVarHTTPResponse.Body) - localVarHTTPResponse.Body.Close() - localVarHTTPResponse.Body = io.NopCloser(bytes.NewBuffer(localVarBody)) - if err != nil { - return localVarReturnValue, localVarHTTPResponse, err - } - - if localVarHTTPResponse.StatusCode >= 300 { - newErr := &GenericOpenAPIError{ - body: localVarBody, - error: localVarHTTPResponse.Status, - } - return localVarReturnValue, localVarHTTPResponse, newErr - } - - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr := &GenericOpenAPIError{ - body: localVarBody, - error: err.Error(), - } - return localVarReturnValue, localVarHTTPResponse, newErr - } - - return localVarReturnValue, localVarHTTPResponse, nil -} - -type ApiSlurmctldGetNodeRequest struct { - ctx context.Context - ApiService *SlurmAPIService - nodeName string -} - -func (r ApiSlurmctldGetNodeRequest) Execute() (*V0037NodesResponse, *http.Response, error) { - return r.ApiService.SlurmctldGetNodeExecute(r) -} - -/* -SlurmctldGetNode get node info - - @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). - @param nodeName Slurm Node Name - @return ApiSlurmctldGetNodeRequest -*/ -func (a *SlurmAPIService) SlurmctldGetNode(ctx context.Context, nodeName string) ApiSlurmctldGetNodeRequest { - return ApiSlurmctldGetNodeRequest{ - ApiService: a, - ctx: ctx, - nodeName: nodeName, - } -} - -// Execute executes the request -// @return V0037NodesResponse -func (a *SlurmAPIService) SlurmctldGetNodeExecute(r ApiSlurmctldGetNodeRequest) (*V0037NodesResponse, *http.Response, error) { - var ( - localVarHTTPMethod = http.MethodGet - localVarPostBody interface{} - formFiles []formFile - localVarReturnValue *V0037NodesResponse - ) - - localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "SlurmAPIService.SlurmctldGetNode") - if err != nil { - return localVarReturnValue, nil, &GenericOpenAPIError{error: err.Error()} - } - - localVarPath := localBasePath + "/node/{node_name}" - localVarPath = strings.Replace(localVarPath, "{"+"node_name"+"}", url.PathEscape(parameterValueToString(r.nodeName, "nodeName")), -1) - - localVarHeaderParams := make(map[string]string) - localVarQueryParams := url.Values{} - localVarFormParams := url.Values{} - - // to determine the Content-Type header - localVarHTTPContentTypes := []string{} - - // set Content-Type header - localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes) - if localVarHTTPContentType != "" { - localVarHeaderParams["Content-Type"] = localVarHTTPContentType - } - - // to determine the Accept header - localVarHTTPHeaderAccepts := []string{"application/json", "application/x-yaml"} - - // set Accept header - localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts) - if localVarHTTPHeaderAccept != "" { - localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept - } - if r.ctx != nil { - // API Key Authentication - if auth, ok := r.ctx.Value(ContextAPIKeys).(map[string]APIKey); ok { - if apiKey, ok := auth["user"]; ok { - var key string - if apiKey.Prefix != "" { - key = apiKey.Prefix + " " + apiKey.Key - } else { - key = apiKey.Key - } - localVarHeaderParams["X-SLURM-USER-NAME"] = key - } - } - } - if r.ctx != nil { - // API Key Authentication - if auth, ok := r.ctx.Value(ContextAPIKeys).(map[string]APIKey); ok { - if apiKey, ok := auth["token"]; ok { - var key string - if apiKey.Prefix != "" { - key = apiKey.Prefix + " " + apiKey.Key - } else { - key = apiKey.Key - } - localVarHeaderParams["X-SLURM-USER-TOKEN"] = key - } - } - } - req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, formFiles) - if err != nil { - return localVarReturnValue, nil, err - } - - localVarHTTPResponse, err := a.client.callAPI(req) - if err != nil || localVarHTTPResponse == nil { - return localVarReturnValue, localVarHTTPResponse, err - } - - localVarBody, err := io.ReadAll(localVarHTTPResponse.Body) - localVarHTTPResponse.Body.Close() - localVarHTTPResponse.Body = io.NopCloser(bytes.NewBuffer(localVarBody)) - if err != nil { - return localVarReturnValue, localVarHTTPResponse, err - } - - if localVarHTTPResponse.StatusCode >= 300 { - newErr := &GenericOpenAPIError{ - body: localVarBody, - error: localVarHTTPResponse.Status, - } - return localVarReturnValue, localVarHTTPResponse, newErr - } - - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr := &GenericOpenAPIError{ - body: localVarBody, - error: err.Error(), - } - return localVarReturnValue, localVarHTTPResponse, newErr - } - - return localVarReturnValue, localVarHTTPResponse, nil -} - -type ApiSlurmctldGetNodesRequest struct { - ctx context.Context - ApiService *SlurmAPIService - updateTime *int64 -} - -// Filter if changed since update_time. Use of this parameter can result in faster replies. -func (r ApiSlurmctldGetNodesRequest) UpdateTime(updateTime int64) ApiSlurmctldGetNodesRequest { - r.updateTime = &updateTime - return r -} - -func (r ApiSlurmctldGetNodesRequest) Execute() (*V0037NodesResponse, *http.Response, error) { - return r.ApiService.SlurmctldGetNodesExecute(r) -} - -/* -SlurmctldGetNodes get all node info - - @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). - @return ApiSlurmctldGetNodesRequest -*/ -func (a *SlurmAPIService) SlurmctldGetNodes(ctx context.Context) ApiSlurmctldGetNodesRequest { - return ApiSlurmctldGetNodesRequest{ - ApiService: a, - ctx: ctx, - } -} - -// Execute executes the request -// @return V0037NodesResponse -func (a *SlurmAPIService) SlurmctldGetNodesExecute(r ApiSlurmctldGetNodesRequest) (*V0037NodesResponse, *http.Response, error) { - var ( - localVarHTTPMethod = http.MethodGet - localVarPostBody interface{} - formFiles []formFile - localVarReturnValue *V0037NodesResponse - ) - - localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "SlurmAPIService.SlurmctldGetNodes") - if err != nil { - return localVarReturnValue, nil, &GenericOpenAPIError{error: err.Error()} - } - - localVarPath := localBasePath + "/nodes/" - - localVarHeaderParams := make(map[string]string) - localVarQueryParams := url.Values{} - localVarFormParams := url.Values{} - - if r.updateTime != nil { - parameterAddToHeaderOrQuery(localVarQueryParams, "update_time", r.updateTime, "") - } - // to determine the Content-Type header - localVarHTTPContentTypes := []string{} - - // set Content-Type header - localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes) - if localVarHTTPContentType != "" { - localVarHeaderParams["Content-Type"] = localVarHTTPContentType - } - - // to determine the Accept header - localVarHTTPHeaderAccepts := []string{"application/json", "application/x-yaml"} - - // set Accept header - localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts) - if localVarHTTPHeaderAccept != "" { - localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept - } - if r.ctx != nil { - // API Key Authentication - if auth, ok := r.ctx.Value(ContextAPIKeys).(map[string]APIKey); ok { - if apiKey, ok := auth["user"]; ok { - var key string - if apiKey.Prefix != "" { - key = apiKey.Prefix + " " + apiKey.Key - } else { - key = apiKey.Key - } - localVarHeaderParams["X-SLURM-USER-NAME"] = key - } - } - } - if r.ctx != nil { - // API Key Authentication - if auth, ok := r.ctx.Value(ContextAPIKeys).(map[string]APIKey); ok { - if apiKey, ok := auth["token"]; ok { - var key string - if apiKey.Prefix != "" { - key = apiKey.Prefix + " " + apiKey.Key - } else { - key = apiKey.Key - } - localVarHeaderParams["X-SLURM-USER-TOKEN"] = key - } - } - } - req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, formFiles) - if err != nil { - return localVarReturnValue, nil, err - } - - localVarHTTPResponse, err := a.client.callAPI(req) - if err != nil || localVarHTTPResponse == nil { - return localVarReturnValue, localVarHTTPResponse, err - } - - localVarBody, err := io.ReadAll(localVarHTTPResponse.Body) - localVarHTTPResponse.Body.Close() - localVarHTTPResponse.Body = io.NopCloser(bytes.NewBuffer(localVarBody)) - if err != nil { - return localVarReturnValue, localVarHTTPResponse, err - } - - if localVarHTTPResponse.StatusCode >= 300 { - newErr := &GenericOpenAPIError{ - body: localVarBody, - error: localVarHTTPResponse.Status, - } - return localVarReturnValue, localVarHTTPResponse, newErr - } - - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr := &GenericOpenAPIError{ - body: localVarBody, - error: err.Error(), - } - return localVarReturnValue, localVarHTTPResponse, newErr - } - - return localVarReturnValue, localVarHTTPResponse, nil -} - -type ApiSlurmctldGetPartitionRequest struct { - ctx context.Context - ApiService *SlurmAPIService - partitionName string - updateTime *int64 -} - -// Filter if there were no partition changes (not limited to partition in URL endpoint) since update_time. -func (r ApiSlurmctldGetPartitionRequest) UpdateTime(updateTime int64) ApiSlurmctldGetPartitionRequest { - r.updateTime = &updateTime - return r -} - -func (r ApiSlurmctldGetPartitionRequest) Execute() (*V0037PartitionsResponse, *http.Response, error) { - return r.ApiService.SlurmctldGetPartitionExecute(r) -} - -/* -SlurmctldGetPartition get partition info - - @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). - @param partitionName Slurm Partition Name - @return ApiSlurmctldGetPartitionRequest -*/ -func (a *SlurmAPIService) SlurmctldGetPartition(ctx context.Context, partitionName string) ApiSlurmctldGetPartitionRequest { - return ApiSlurmctldGetPartitionRequest{ - ApiService: a, - ctx: ctx, - partitionName: partitionName, - } -} - -// Execute executes the request -// @return V0037PartitionsResponse -func (a *SlurmAPIService) SlurmctldGetPartitionExecute(r ApiSlurmctldGetPartitionRequest) (*V0037PartitionsResponse, *http.Response, error) { - var ( - localVarHTTPMethod = http.MethodGet - localVarPostBody interface{} - formFiles []formFile - localVarReturnValue *V0037PartitionsResponse - ) - - localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "SlurmAPIService.SlurmctldGetPartition") - if err != nil { - return localVarReturnValue, nil, &GenericOpenAPIError{error: err.Error()} - } - - localVarPath := localBasePath + "/partition/{partition_name}" - localVarPath = strings.Replace(localVarPath, "{"+"partition_name"+"}", url.PathEscape(parameterValueToString(r.partitionName, "partitionName")), -1) - - localVarHeaderParams := make(map[string]string) - localVarQueryParams := url.Values{} - localVarFormParams := url.Values{} - - if r.updateTime != nil { - parameterAddToHeaderOrQuery(localVarQueryParams, "update_time", r.updateTime, "") - } - // to determine the Content-Type header - localVarHTTPContentTypes := []string{} - - // set Content-Type header - localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes) - if localVarHTTPContentType != "" { - localVarHeaderParams["Content-Type"] = localVarHTTPContentType - } - - // to determine the Accept header - localVarHTTPHeaderAccepts := []string{"application/json", "application/x-yaml"} - - // set Accept header - localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts) - if localVarHTTPHeaderAccept != "" { - localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept - } - if r.ctx != nil { - // API Key Authentication - if auth, ok := r.ctx.Value(ContextAPIKeys).(map[string]APIKey); ok { - if apiKey, ok := auth["user"]; ok { - var key string - if apiKey.Prefix != "" { - key = apiKey.Prefix + " " + apiKey.Key - } else { - key = apiKey.Key - } - localVarHeaderParams["X-SLURM-USER-NAME"] = key - } - } - } - if r.ctx != nil { - // API Key Authentication - if auth, ok := r.ctx.Value(ContextAPIKeys).(map[string]APIKey); ok { - if apiKey, ok := auth["token"]; ok { - var key string - if apiKey.Prefix != "" { - key = apiKey.Prefix + " " + apiKey.Key - } else { - key = apiKey.Key - } - localVarHeaderParams["X-SLURM-USER-TOKEN"] = key - } - } - } - req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, formFiles) - if err != nil { - return localVarReturnValue, nil, err - } - - localVarHTTPResponse, err := a.client.callAPI(req) - if err != nil || localVarHTTPResponse == nil { - return localVarReturnValue, localVarHTTPResponse, err - } - - localVarBody, err := io.ReadAll(localVarHTTPResponse.Body) - localVarHTTPResponse.Body.Close() - localVarHTTPResponse.Body = io.NopCloser(bytes.NewBuffer(localVarBody)) - if err != nil { - return localVarReturnValue, localVarHTTPResponse, err - } - - if localVarHTTPResponse.StatusCode >= 300 { - newErr := &GenericOpenAPIError{ - body: localVarBody, - error: localVarHTTPResponse.Status, - } - return localVarReturnValue, localVarHTTPResponse, newErr - } - - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr := &GenericOpenAPIError{ - body: localVarBody, - error: err.Error(), - } - return localVarReturnValue, localVarHTTPResponse, newErr - } - - return localVarReturnValue, localVarHTTPResponse, nil -} - -type ApiSlurmctldGetPartitionsRequest struct { - ctx context.Context - ApiService *SlurmAPIService - updateTime *int64 -} - -// Filter if changed since update_time. Use of this parameter can result in faster replies. -func (r ApiSlurmctldGetPartitionsRequest) UpdateTime(updateTime int64) ApiSlurmctldGetPartitionsRequest { - r.updateTime = &updateTime - return r -} - -func (r ApiSlurmctldGetPartitionsRequest) Execute() (*V0037PartitionsResponse, *http.Response, error) { - return r.ApiService.SlurmctldGetPartitionsExecute(r) -} - -/* -SlurmctldGetPartitions get all partition info - - @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). - @return ApiSlurmctldGetPartitionsRequest -*/ -func (a *SlurmAPIService) SlurmctldGetPartitions(ctx context.Context) ApiSlurmctldGetPartitionsRequest { - return ApiSlurmctldGetPartitionsRequest{ - ApiService: a, - ctx: ctx, - } -} - -// Execute executes the request -// @return V0037PartitionsResponse -func (a *SlurmAPIService) SlurmctldGetPartitionsExecute(r ApiSlurmctldGetPartitionsRequest) (*V0037PartitionsResponse, *http.Response, error) { - var ( - localVarHTTPMethod = http.MethodGet - localVarPostBody interface{} - formFiles []formFile - localVarReturnValue *V0037PartitionsResponse - ) - - localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "SlurmAPIService.SlurmctldGetPartitions") - if err != nil { - return localVarReturnValue, nil, &GenericOpenAPIError{error: err.Error()} - } - - localVarPath := localBasePath + "/partitions/" - - localVarHeaderParams := make(map[string]string) - localVarQueryParams := url.Values{} - localVarFormParams := url.Values{} - - if r.updateTime != nil { - parameterAddToHeaderOrQuery(localVarQueryParams, "update_time", r.updateTime, "") - } - // to determine the Content-Type header - localVarHTTPContentTypes := []string{} - - // set Content-Type header - localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes) - if localVarHTTPContentType != "" { - localVarHeaderParams["Content-Type"] = localVarHTTPContentType - } - - // to determine the Accept header - localVarHTTPHeaderAccepts := []string{"application/json", "application/x-yaml"} - - // set Accept header - localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts) - if localVarHTTPHeaderAccept != "" { - localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept - } - if r.ctx != nil { - // API Key Authentication - if auth, ok := r.ctx.Value(ContextAPIKeys).(map[string]APIKey); ok { - if apiKey, ok := auth["user"]; ok { - var key string - if apiKey.Prefix != "" { - key = apiKey.Prefix + " " + apiKey.Key - } else { - key = apiKey.Key - } - localVarHeaderParams["X-SLURM-USER-NAME"] = key - } - } - } - if r.ctx != nil { - // API Key Authentication - if auth, ok := r.ctx.Value(ContextAPIKeys).(map[string]APIKey); ok { - if apiKey, ok := auth["token"]; ok { - var key string - if apiKey.Prefix != "" { - key = apiKey.Prefix + " " + apiKey.Key - } else { - key = apiKey.Key - } - localVarHeaderParams["X-SLURM-USER-TOKEN"] = key - } - } - } - req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, formFiles) - if err != nil { - return localVarReturnValue, nil, err - } - - localVarHTTPResponse, err := a.client.callAPI(req) - if err != nil || localVarHTTPResponse == nil { - return localVarReturnValue, localVarHTTPResponse, err - } - - localVarBody, err := io.ReadAll(localVarHTTPResponse.Body) - localVarHTTPResponse.Body.Close() - localVarHTTPResponse.Body = io.NopCloser(bytes.NewBuffer(localVarBody)) - if err != nil { - return localVarReturnValue, localVarHTTPResponse, err - } - - if localVarHTTPResponse.StatusCode >= 300 { - newErr := &GenericOpenAPIError{ - body: localVarBody, - error: localVarHTTPResponse.Status, - } - return localVarReturnValue, localVarHTTPResponse, newErr - } - - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr := &GenericOpenAPIError{ - body: localVarBody, - error: err.Error(), - } - return localVarReturnValue, localVarHTTPResponse, newErr - } - - return localVarReturnValue, localVarHTTPResponse, nil -} - -type ApiSlurmctldGetReservationRequest struct { - ctx context.Context - ApiService *SlurmAPIService - reservationName string - updateTime *int64 -} - -// Filter if no reservation (not limited to reservation in URL) changed since update_time. -func (r ApiSlurmctldGetReservationRequest) UpdateTime(updateTime int64) ApiSlurmctldGetReservationRequest { - r.updateTime = &updateTime - return r -} - -func (r ApiSlurmctldGetReservationRequest) Execute() (*V0037ReservationsResponse, *http.Response, error) { - return r.ApiService.SlurmctldGetReservationExecute(r) -} - -/* -SlurmctldGetReservation get reservation info - - @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). - @param reservationName Slurm Reservation Name - @return ApiSlurmctldGetReservationRequest -*/ -func (a *SlurmAPIService) SlurmctldGetReservation(ctx context.Context, reservationName string) ApiSlurmctldGetReservationRequest { - return ApiSlurmctldGetReservationRequest{ - ApiService: a, - ctx: ctx, - reservationName: reservationName, - } -} - -// Execute executes the request -// @return V0037ReservationsResponse -func (a *SlurmAPIService) SlurmctldGetReservationExecute(r ApiSlurmctldGetReservationRequest) (*V0037ReservationsResponse, *http.Response, error) { - var ( - localVarHTTPMethod = http.MethodGet - localVarPostBody interface{} - formFiles []formFile - localVarReturnValue *V0037ReservationsResponse - ) - - localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "SlurmAPIService.SlurmctldGetReservation") - if err != nil { - return localVarReturnValue, nil, &GenericOpenAPIError{error: err.Error()} - } - - localVarPath := localBasePath + "/reservation/{reservation_name}" - localVarPath = strings.Replace(localVarPath, "{"+"reservation_name"+"}", url.PathEscape(parameterValueToString(r.reservationName, "reservationName")), -1) - - localVarHeaderParams := make(map[string]string) - localVarQueryParams := url.Values{} - localVarFormParams := url.Values{} - - if r.updateTime != nil { - parameterAddToHeaderOrQuery(localVarQueryParams, "update_time", r.updateTime, "") - } - // to determine the Content-Type header - localVarHTTPContentTypes := []string{} - - // set Content-Type header - localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes) - if localVarHTTPContentType != "" { - localVarHeaderParams["Content-Type"] = localVarHTTPContentType - } - - // to determine the Accept header - localVarHTTPHeaderAccepts := []string{"application/json", "application/x-yaml"} - - // set Accept header - localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts) - if localVarHTTPHeaderAccept != "" { - localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept - } - if r.ctx != nil { - // API Key Authentication - if auth, ok := r.ctx.Value(ContextAPIKeys).(map[string]APIKey); ok { - if apiKey, ok := auth["user"]; ok { - var key string - if apiKey.Prefix != "" { - key = apiKey.Prefix + " " + apiKey.Key - } else { - key = apiKey.Key - } - localVarHeaderParams["X-SLURM-USER-NAME"] = key - } - } - } - if r.ctx != nil { - // API Key Authentication - if auth, ok := r.ctx.Value(ContextAPIKeys).(map[string]APIKey); ok { - if apiKey, ok := auth["token"]; ok { - var key string - if apiKey.Prefix != "" { - key = apiKey.Prefix + " " + apiKey.Key - } else { - key = apiKey.Key - } - localVarHeaderParams["X-SLURM-USER-TOKEN"] = key - } - } - } - req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, formFiles) - if err != nil { - return localVarReturnValue, nil, err - } - - localVarHTTPResponse, err := a.client.callAPI(req) - if err != nil || localVarHTTPResponse == nil { - return localVarReturnValue, localVarHTTPResponse, err - } - - localVarBody, err := io.ReadAll(localVarHTTPResponse.Body) - localVarHTTPResponse.Body.Close() - localVarHTTPResponse.Body = io.NopCloser(bytes.NewBuffer(localVarBody)) - if err != nil { - return localVarReturnValue, localVarHTTPResponse, err - } - - if localVarHTTPResponse.StatusCode >= 300 { - newErr := &GenericOpenAPIError{ - body: localVarBody, - error: localVarHTTPResponse.Status, - } - return localVarReturnValue, localVarHTTPResponse, newErr - } - - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr := &GenericOpenAPIError{ - body: localVarBody, - error: err.Error(), - } - return localVarReturnValue, localVarHTTPResponse, newErr - } - - return localVarReturnValue, localVarHTTPResponse, nil -} - -type ApiSlurmctldGetReservationsRequest struct { - ctx context.Context - ApiService *SlurmAPIService - updateTime *int64 -} - -// Filter if changed since update_time. Use of this parameter can result in faster replies. -func (r ApiSlurmctldGetReservationsRequest) UpdateTime(updateTime int64) ApiSlurmctldGetReservationsRequest { - r.updateTime = &updateTime - return r -} - -func (r ApiSlurmctldGetReservationsRequest) Execute() (*V0037ReservationsResponse, *http.Response, error) { - return r.ApiService.SlurmctldGetReservationsExecute(r) -} - -/* -SlurmctldGetReservations get all reservation info - - @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). - @return ApiSlurmctldGetReservationsRequest -*/ -func (a *SlurmAPIService) SlurmctldGetReservations(ctx context.Context) ApiSlurmctldGetReservationsRequest { - return ApiSlurmctldGetReservationsRequest{ - ApiService: a, - ctx: ctx, - } -} - -// Execute executes the request -// @return V0037ReservationsResponse -func (a *SlurmAPIService) SlurmctldGetReservationsExecute(r ApiSlurmctldGetReservationsRequest) (*V0037ReservationsResponse, *http.Response, error) { - var ( - localVarHTTPMethod = http.MethodGet - localVarPostBody interface{} - formFiles []formFile - localVarReturnValue *V0037ReservationsResponse - ) - - localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "SlurmAPIService.SlurmctldGetReservations") - if err != nil { - return localVarReturnValue, nil, &GenericOpenAPIError{error: err.Error()} - } - - localVarPath := localBasePath + "/reservations/" - - localVarHeaderParams := make(map[string]string) - localVarQueryParams := url.Values{} - localVarFormParams := url.Values{} - - if r.updateTime != nil { - parameterAddToHeaderOrQuery(localVarQueryParams, "update_time", r.updateTime, "") - } - // to determine the Content-Type header - localVarHTTPContentTypes := []string{} - - // set Content-Type header - localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes) - if localVarHTTPContentType != "" { - localVarHeaderParams["Content-Type"] = localVarHTTPContentType - } - - // to determine the Accept header - localVarHTTPHeaderAccepts := []string{"application/json", "application/x-yaml"} - - // set Accept header - localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts) - if localVarHTTPHeaderAccept != "" { - localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept - } - if r.ctx != nil { - // API Key Authentication - if auth, ok := r.ctx.Value(ContextAPIKeys).(map[string]APIKey); ok { - if apiKey, ok := auth["user"]; ok { - var key string - if apiKey.Prefix != "" { - key = apiKey.Prefix + " " + apiKey.Key - } else { - key = apiKey.Key - } - localVarHeaderParams["X-SLURM-USER-NAME"] = key - } - } - } - if r.ctx != nil { - // API Key Authentication - if auth, ok := r.ctx.Value(ContextAPIKeys).(map[string]APIKey); ok { - if apiKey, ok := auth["token"]; ok { - var key string - if apiKey.Prefix != "" { - key = apiKey.Prefix + " " + apiKey.Key - } else { - key = apiKey.Key - } - localVarHeaderParams["X-SLURM-USER-TOKEN"] = key - } - } - } - req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, formFiles) - if err != nil { - return localVarReturnValue, nil, err - } - - localVarHTTPResponse, err := a.client.callAPI(req) - if err != nil || localVarHTTPResponse == nil { - return localVarReturnValue, localVarHTTPResponse, err - } - - localVarBody, err := io.ReadAll(localVarHTTPResponse.Body) - localVarHTTPResponse.Body.Close() - localVarHTTPResponse.Body = io.NopCloser(bytes.NewBuffer(localVarBody)) - if err != nil { - return localVarReturnValue, localVarHTTPResponse, err - } - - if localVarHTTPResponse.StatusCode >= 300 { - newErr := &GenericOpenAPIError{ - body: localVarBody, - error: localVarHTTPResponse.Status, - } - return localVarReturnValue, localVarHTTPResponse, newErr - } - - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr := &GenericOpenAPIError{ - body: localVarBody, - error: err.Error(), - } - return localVarReturnValue, localVarHTTPResponse, newErr - } - - return localVarReturnValue, localVarHTTPResponse, nil -} - -type ApiSlurmctldPingRequest struct { - ctx context.Context - ApiService *SlurmAPIService -} - -func (r ApiSlurmctldPingRequest) Execute() (*V0037Pings, *http.Response, error) { - return r.ApiService.SlurmctldPingExecute(r) -} - -/* -SlurmctldPing ping test - - @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). - @return ApiSlurmctldPingRequest -*/ -func (a *SlurmAPIService) SlurmctldPing(ctx context.Context) ApiSlurmctldPingRequest { - return ApiSlurmctldPingRequest{ - ApiService: a, - ctx: ctx, - } -} - -// Execute executes the request -// @return V0037Pings -func (a *SlurmAPIService) SlurmctldPingExecute(r ApiSlurmctldPingRequest) (*V0037Pings, *http.Response, error) { - var ( - localVarHTTPMethod = http.MethodGet - localVarPostBody interface{} - formFiles []formFile - localVarReturnValue *V0037Pings - ) - - localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "SlurmAPIService.SlurmctldPing") - if err != nil { - return localVarReturnValue, nil, &GenericOpenAPIError{error: err.Error()} - } - - localVarPath := localBasePath + "/ping/" - - localVarHeaderParams := make(map[string]string) - localVarQueryParams := url.Values{} - localVarFormParams := url.Values{} - - // to determine the Content-Type header - localVarHTTPContentTypes := []string{} - - // set Content-Type header - localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes) - if localVarHTTPContentType != "" { - localVarHeaderParams["Content-Type"] = localVarHTTPContentType - } - - // to determine the Accept header - localVarHTTPHeaderAccepts := []string{"application/json", "application/x-yaml"} - - // set Accept header - localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts) - if localVarHTTPHeaderAccept != "" { - localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept - } - if r.ctx != nil { - // API Key Authentication - if auth, ok := r.ctx.Value(ContextAPIKeys).(map[string]APIKey); ok { - if apiKey, ok := auth["user"]; ok { - var key string - if apiKey.Prefix != "" { - key = apiKey.Prefix + " " + apiKey.Key - } else { - key = apiKey.Key - } - localVarHeaderParams["X-SLURM-USER-NAME"] = key - } - } - } - if r.ctx != nil { - // API Key Authentication - if auth, ok := r.ctx.Value(ContextAPIKeys).(map[string]APIKey); ok { - if apiKey, ok := auth["token"]; ok { - var key string - if apiKey.Prefix != "" { - key = apiKey.Prefix + " " + apiKey.Key - } else { - key = apiKey.Key - } - localVarHeaderParams["X-SLURM-USER-TOKEN"] = key - } - } - } - req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, formFiles) - if err != nil { - return localVarReturnValue, nil, err - } - - localVarHTTPResponse, err := a.client.callAPI(req) - if err != nil || localVarHTTPResponse == nil { - return localVarReturnValue, localVarHTTPResponse, err - } - - localVarBody, err := io.ReadAll(localVarHTTPResponse.Body) - localVarHTTPResponse.Body.Close() - localVarHTTPResponse.Body = io.NopCloser(bytes.NewBuffer(localVarBody)) - if err != nil { - return localVarReturnValue, localVarHTTPResponse, err - } - - if localVarHTTPResponse.StatusCode >= 300 { - newErr := &GenericOpenAPIError{ - body: localVarBody, - error: localVarHTTPResponse.Status, - } - return localVarReturnValue, localVarHTTPResponse, newErr - } - - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr := &GenericOpenAPIError{ - body: localVarBody, - error: err.Error(), - } - return localVarReturnValue, localVarHTTPResponse, newErr - } - - return localVarReturnValue, localVarHTTPResponse, nil -} - -type ApiSlurmctldSubmitJobRequest struct { - ctx context.Context - ApiService *SlurmAPIService - v0037JobSubmission *V0037JobSubmission -} - -// submit new job -func (r ApiSlurmctldSubmitJobRequest) V0037JobSubmission(v0037JobSubmission V0037JobSubmission) ApiSlurmctldSubmitJobRequest { - r.v0037JobSubmission = &v0037JobSubmission - return r -} - -func (r ApiSlurmctldSubmitJobRequest) Execute() (*V0037JobSubmissionResponse, *http.Response, error) { - return r.ApiService.SlurmctldSubmitJobExecute(r) -} - -/* -SlurmctldSubmitJob submit new job - - @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). - @return ApiSlurmctldSubmitJobRequest -*/ -func (a *SlurmAPIService) SlurmctldSubmitJob(ctx context.Context) ApiSlurmctldSubmitJobRequest { - return ApiSlurmctldSubmitJobRequest{ - ApiService: a, - ctx: ctx, - } -} - -// Execute executes the request -// @return V0037JobSubmissionResponse -func (a *SlurmAPIService) SlurmctldSubmitJobExecute(r ApiSlurmctldSubmitJobRequest) (*V0037JobSubmissionResponse, *http.Response, error) { - var ( - localVarHTTPMethod = http.MethodPost - localVarPostBody interface{} - formFiles []formFile - localVarReturnValue *V0037JobSubmissionResponse - ) - - localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "SlurmAPIService.SlurmctldSubmitJob") - if err != nil { - return localVarReturnValue, nil, &GenericOpenAPIError{error: err.Error()} - } - - localVarPath := localBasePath + "/job/submit" - - localVarHeaderParams := make(map[string]string) - localVarQueryParams := url.Values{} - localVarFormParams := url.Values{} - if r.v0037JobSubmission == nil { - return localVarReturnValue, nil, reportError("v0037JobSubmission is required and must be specified") - } - - // to determine the Content-Type header - localVarHTTPContentTypes := []string{"application/json", "application/x-yaml"} - - // set Content-Type header - localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes) - if localVarHTTPContentType != "" { - localVarHeaderParams["Content-Type"] = localVarHTTPContentType - } - - // to determine the Accept header - localVarHTTPHeaderAccepts := []string{"application/json", "application/x-yaml"} - - // set Accept header - localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts) - if localVarHTTPHeaderAccept != "" { - localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept - } - // body params - localVarPostBody = r.v0037JobSubmission - if r.ctx != nil { - // API Key Authentication - if auth, ok := r.ctx.Value(ContextAPIKeys).(map[string]APIKey); ok { - if apiKey, ok := auth["user"]; ok { - var key string - if apiKey.Prefix != "" { - key = apiKey.Prefix + " " + apiKey.Key - } else { - key = apiKey.Key - } - localVarHeaderParams["X-SLURM-USER-NAME"] = key - } - } - } - if r.ctx != nil { - // API Key Authentication - if auth, ok := r.ctx.Value(ContextAPIKeys).(map[string]APIKey); ok { - if apiKey, ok := auth["token"]; ok { - var key string - if apiKey.Prefix != "" { - key = apiKey.Prefix + " " + apiKey.Key - } else { - key = apiKey.Key - } - localVarHeaderParams["X-SLURM-USER-TOKEN"] = key - } - } - } - req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, formFiles) - if err != nil { - return localVarReturnValue, nil, err - } - - localVarHTTPResponse, err := a.client.callAPI(req) - if err != nil || localVarHTTPResponse == nil { - return localVarReturnValue, localVarHTTPResponse, err - } - - localVarBody, err := io.ReadAll(localVarHTTPResponse.Body) - localVarHTTPResponse.Body.Close() - localVarHTTPResponse.Body = io.NopCloser(bytes.NewBuffer(localVarBody)) - if err != nil { - return localVarReturnValue, localVarHTTPResponse, err - } - - if localVarHTTPResponse.StatusCode >= 300 { - newErr := &GenericOpenAPIError{ - body: localVarBody, - error: localVarHTTPResponse.Status, - } - return localVarReturnValue, localVarHTTPResponse, newErr - } - - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr := &GenericOpenAPIError{ - body: localVarBody, - error: err.Error(), - } - return localVarReturnValue, localVarHTTPResponse, newErr - } - - return localVarReturnValue, localVarHTTPResponse, nil -} - -type ApiSlurmctldUpdateJobRequest struct { - ctx context.Context - ApiService *SlurmAPIService - jobId string - v0037JobProperties *V0037JobProperties -} - -// update job -func (r ApiSlurmctldUpdateJobRequest) V0037JobProperties(v0037JobProperties V0037JobProperties) ApiSlurmctldUpdateJobRequest { - r.v0037JobProperties = &v0037JobProperties - return r -} - -func (r ApiSlurmctldUpdateJobRequest) Execute() (*http.Response, error) { - return r.ApiService.SlurmctldUpdateJobExecute(r) -} - -/* -SlurmctldUpdateJob update job - - @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). - @param jobId Slurm Job ID - @return ApiSlurmctldUpdateJobRequest -*/ -func (a *SlurmAPIService) SlurmctldUpdateJob(ctx context.Context, jobId string) ApiSlurmctldUpdateJobRequest { - return ApiSlurmctldUpdateJobRequest{ - ApiService: a, - ctx: ctx, - jobId: jobId, - } -} - -// Execute executes the request -func (a *SlurmAPIService) SlurmctldUpdateJobExecute(r ApiSlurmctldUpdateJobRequest) (*http.Response, error) { - var ( - localVarHTTPMethod = http.MethodPost - localVarPostBody interface{} - formFiles []formFile - ) - - localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "SlurmAPIService.SlurmctldUpdateJob") - if err != nil { - return nil, &GenericOpenAPIError{error: err.Error()} - } - - localVarPath := localBasePath + "/job/{job_id}" - localVarPath = strings.Replace(localVarPath, "{"+"job_id"+"}", url.PathEscape(parameterValueToString(r.jobId, "jobId")), -1) - - localVarHeaderParams := make(map[string]string) - localVarQueryParams := url.Values{} - localVarFormParams := url.Values{} - if r.v0037JobProperties == nil { - return nil, reportError("v0037JobProperties is required and must be specified") - } - - // to determine the Content-Type header - localVarHTTPContentTypes := []string{"application/json", "application/x-yaml"} - - // set Content-Type header - localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes) - if localVarHTTPContentType != "" { - localVarHeaderParams["Content-Type"] = localVarHTTPContentType - } - - // to determine the Accept header - localVarHTTPHeaderAccepts := []string{} - - // set Accept header - localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts) - if localVarHTTPHeaderAccept != "" { - localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept - } - // body params - localVarPostBody = r.v0037JobProperties - if r.ctx != nil { - // API Key Authentication - if auth, ok := r.ctx.Value(ContextAPIKeys).(map[string]APIKey); ok { - if apiKey, ok := auth["user"]; ok { - var key string - if apiKey.Prefix != "" { - key = apiKey.Prefix + " " + apiKey.Key - } else { - key = apiKey.Key - } - localVarHeaderParams["X-SLURM-USER-NAME"] = key - } - } - } - if r.ctx != nil { - // API Key Authentication - if auth, ok := r.ctx.Value(ContextAPIKeys).(map[string]APIKey); ok { - if apiKey, ok := auth["token"]; ok { - var key string - if apiKey.Prefix != "" { - key = apiKey.Prefix + " " + apiKey.Key - } else { - key = apiKey.Key - } - localVarHeaderParams["X-SLURM-USER-TOKEN"] = key - } - } - } - req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, formFiles) - if err != nil { - return nil, err - } - - localVarHTTPResponse, err := a.client.callAPI(req) - if err != nil || localVarHTTPResponse == nil { - return localVarHTTPResponse, err - } - - localVarBody, err := io.ReadAll(localVarHTTPResponse.Body) - localVarHTTPResponse.Body.Close() - localVarHTTPResponse.Body = io.NopCloser(bytes.NewBuffer(localVarBody)) - if err != nil { - return localVarHTTPResponse, err - } - - if localVarHTTPResponse.StatusCode >= 300 { - newErr := &GenericOpenAPIError{ - body: localVarBody, - error: localVarHTTPResponse.Status, - } - return localVarHTTPResponse, newErr - } - - return localVarHTTPResponse, nil -} diff --git a/internal/api/0.0.37/client.go b/internal/api/0.0.37/client.go deleted file mode 100644 index 2a0de87..0000000 --- a/internal/api/0.0.37/client.go +++ /dev/null @@ -1,666 +0,0 @@ -/* -Slurm Rest API - -API to access and control Slurm. - -API version: 0.0.37 -Contact: sales@schedmd.com -*/ - -// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. - -package openapi - -import ( - "bytes" - "context" - "encoding/json" - "encoding/xml" - "errors" - "fmt" - "io" - "log" - "mime/multipart" - "net/http" - "net/http/httputil" - "net/url" - "os" - "path/filepath" - "reflect" - "regexp" - "strconv" - "strings" - "time" - "unicode/utf8" - -) - -var ( - jsonCheck = regexp.MustCompile(`(?i:(?:application|text)/(?:vnd\.[^;]+\+)?json)`) - xmlCheck = regexp.MustCompile(`(?i:(?:application|text)/xml)`) - queryParamSplit = regexp.MustCompile(`(^|&)([^&]+)`) - queryDescape = strings.NewReplacer( "%5B", "[", "%5D", "]" ) -) - -// APIClient manages communication with the Slurm Rest API API v0.0.37 -// In most cases there should be only one, shared, APIClient. -type APIClient struct { - cfg *Configuration - common service // Reuse a single struct instead of allocating one for each service on the heap. - - // API Services - - OpenapiAPI *OpenapiAPIService - - SlurmAPI *SlurmAPIService -} - -type service struct { - client *APIClient -} - -// NewAPIClient creates a new API client. Requires a userAgent string describing your application. -// optionally a custom http.Client to allow for advanced features such as caching. -func NewAPIClient(cfg *Configuration) *APIClient { - if cfg.HTTPClient == nil { - cfg.HTTPClient = http.DefaultClient - } - - c := &APIClient{} - c.cfg = cfg - c.common.client = c - - // API Services - c.OpenapiAPI = (*OpenapiAPIService)(&c.common) - c.SlurmAPI = (*SlurmAPIService)(&c.common) - - return c -} - -func atoi(in string) (int, error) { - return strconv.Atoi(in) -} - -// selectHeaderContentType select a content type from the available list. -func selectHeaderContentType(contentTypes []string) string { - if len(contentTypes) == 0 { - return "" - } - if contains(contentTypes, "application/json") { - return "application/json" - } - return contentTypes[0] // use the first content type specified in 'consumes' -} - -// selectHeaderAccept join all accept types and return -func selectHeaderAccept(accepts []string) string { - if len(accepts) == 0 { - return "" - } - - if contains(accepts, "application/json") { - return "application/json" - } - - return strings.Join(accepts, ",") -} - -// contains is a case insensitive match, finding needle in a haystack -func contains(haystack []string, needle string) bool { - for _, a := range haystack { - if strings.EqualFold(a, needle) { - return true - } - } - return false -} - -// Verify optional parameters are of the correct type. -func typeCheckParameter(obj interface{}, expected string, name string) error { - // Make sure there is an object. - if obj == nil { - return nil - } - - // Check the type is as expected. - if reflect.TypeOf(obj).String() != expected { - return fmt.Errorf("expected %s to be of type %s but received %s", name, expected, reflect.TypeOf(obj).String()) - } - return nil -} - -func parameterValueToString( obj interface{}, key string ) string { - if reflect.TypeOf(obj).Kind() != reflect.Ptr { - return fmt.Sprintf("%v", obj) - } - var param,ok = obj.(MappedNullable) - if !ok { - return "" - } - dataMap,err := param.ToMap() - if err != nil { - return "" - } - return fmt.Sprintf("%v", dataMap[key]) -} - -// parameterAddToHeaderOrQuery adds the provided object to the request header or url query -// supporting deep object syntax -func parameterAddToHeaderOrQuery(headerOrQueryParams interface{}, keyPrefix string, obj interface{}, collectionType string) { - var v = reflect.ValueOf(obj) - var value = "" - if v == reflect.ValueOf(nil) { - value = "null" - } else { - switch v.Kind() { - case reflect.Invalid: - value = "invalid" - - case reflect.Struct: - if t,ok := obj.(MappedNullable); ok { - dataMap,err := t.ToMap() - if err != nil { - return - } - parameterAddToHeaderOrQuery(headerOrQueryParams, keyPrefix, dataMap, collectionType) - return - } - if t, ok := obj.(time.Time); ok { - parameterAddToHeaderOrQuery(headerOrQueryParams, keyPrefix, t.Format(time.RFC3339), collectionType) - return - } - value = v.Type().String() + " value" - case reflect.Slice: - var indValue = reflect.ValueOf(obj) - if indValue == reflect.ValueOf(nil) { - return - } - var lenIndValue = indValue.Len() - for i:=0;i 0 || (len(formFiles) > 0) { - if body != nil { - return nil, errors.New("Cannot specify postBody and multipart form at the same time.") - } - body = &bytes.Buffer{} - w := multipart.NewWriter(body) - - for k, v := range formParams { - for _, iv := range v { - if strings.HasPrefix(k, "@") { // file - err = addFile(w, k[1:], iv) - if err != nil { - return nil, err - } - } else { // form value - w.WriteField(k, iv) - } - } - } - for _, formFile := range formFiles { - if len(formFile.fileBytes) > 0 && formFile.fileName != "" { - w.Boundary() - part, err := w.CreateFormFile(formFile.formFileName, filepath.Base(formFile.fileName)) - if err != nil { - return nil, err - } - _, err = part.Write(formFile.fileBytes) - if err != nil { - return nil, err - } - } - } - - // Set the Boundary in the Content-Type - headerParams["Content-Type"] = w.FormDataContentType() - - // Set Content-Length - headerParams["Content-Length"] = fmt.Sprintf("%d", body.Len()) - w.Close() - } - - if strings.HasPrefix(headerParams["Content-Type"], "application/x-www-form-urlencoded") && len(formParams) > 0 { - if body != nil { - return nil, errors.New("Cannot specify postBody and x-www-form-urlencoded form at the same time.") - } - body = &bytes.Buffer{} - body.WriteString(formParams.Encode()) - // Set Content-Length - headerParams["Content-Length"] = fmt.Sprintf("%d", body.Len()) - } - - // Setup path and query parameters - url, err := url.Parse(path) - if err != nil { - return nil, err - } - - // Override request host, if applicable - if c.cfg.Host != "" { - url.Host = c.cfg.Host - } - - // Override request scheme, if applicable - if c.cfg.Scheme != "" { - url.Scheme = c.cfg.Scheme - } - - // Adding Query Param - query := url.Query() - for k, v := range queryParams { - for _, iv := range v { - query.Add(k, iv) - } - } - - // Encode the parameters. - url.RawQuery = queryParamSplit.ReplaceAllStringFunc(query.Encode(), func(s string) string { - pieces := strings.Split(s, "=") - pieces[0] = queryDescape.Replace(pieces[0]) - return strings.Join(pieces, "=") - }) - - // Generate a new request - if body != nil { - localVarRequest, err = http.NewRequest(method, url.String(), body) - } else { - localVarRequest, err = http.NewRequest(method, url.String(), nil) - } - if err != nil { - return nil, err - } - - // add header parameters, if any - if len(headerParams) > 0 { - headers := http.Header{} - for h, v := range headerParams { - headers[h] = []string{v} - } - localVarRequest.Header = headers - } - - // Add the user agent to the request. - localVarRequest.Header.Add("User-Agent", c.cfg.UserAgent) - - if ctx != nil { - // add context to the request - localVarRequest = localVarRequest.WithContext(ctx) - - // Walk through any authentication. - - } - - for header, value := range c.cfg.DefaultHeader { - localVarRequest.Header.Add(header, value) - } - return localVarRequest, nil -} - -func (c *APIClient) decode(v interface{}, b []byte, contentType string) (err error) { - if len(b) == 0 { - return nil - } - if s, ok := v.(*string); ok { - *s = string(b) - return nil - } - if f, ok := v.(*os.File); ok { - f, err = os.CreateTemp("", "HttpClientFile") - if err != nil { - return - } - _, err = f.Write(b) - if err != nil { - return - } - _, err = f.Seek(0, io.SeekStart) - err = os.Remove(f.Name()) - return - } - if f, ok := v.(**os.File); ok { - *f, err = os.CreateTemp("", "HttpClientFile") - if err != nil { - return - } - _, err = (*f).Write(b) - if err != nil { - return - } - _, err = (*f).Seek(0, io.SeekStart) - err = os.Remove((*f).Name()) - return - } - if xmlCheck.MatchString(contentType) { - if err = xml.Unmarshal(b, v); err != nil { - return err - } - return nil - } - if jsonCheck.MatchString(contentType) { - if actualObj, ok := v.(interface{ GetActualInstance() interface{} }); ok { // oneOf, anyOf schemas - if unmarshalObj, ok := actualObj.(interface{ UnmarshalJSON([]byte) error }); ok { // make sure it has UnmarshalJSON defined - if err = unmarshalObj.UnmarshalJSON(b); err != nil { - return err - } - } else { - return errors.New("Unknown type with GetActualInstance but no unmarshalObj.UnmarshalJSON defined") - } - } else if err = json.Unmarshal(b, v); err != nil { // simple model - return err - } - return nil - } - return errors.New("undefined response type") -} - -// Add a file to the multipart request -func addFile(w *multipart.Writer, fieldName, path string) error { - file, err := os.Open(filepath.Clean(path)) - if err != nil { - return err - } - err = file.Close() - if err != nil { - return err - } - - part, err := w.CreateFormFile(fieldName, filepath.Base(path)) - if err != nil { - return err - } - _, err = io.Copy(part, file) - - return err -} - -// Prevent trying to import "fmt" -func reportError(format string, a ...interface{}) error { - return fmt.Errorf(format, a...) -} - -// A wrapper for strict JSON decoding -func newStrictDecoder(data []byte) *json.Decoder { - dec := json.NewDecoder(bytes.NewBuffer(data)) - dec.DisallowUnknownFields() - return dec -} - -// Set request body from an interface{} -func setBody(body interface{}, contentType string) (bodyBuf *bytes.Buffer, err error) { - if bodyBuf == nil { - bodyBuf = &bytes.Buffer{} - } - - if reader, ok := body.(io.Reader); ok { - _, err = bodyBuf.ReadFrom(reader) - } else if fp, ok := body.(*os.File); ok { - _, err = bodyBuf.ReadFrom(fp) - } else if b, ok := body.([]byte); ok { - _, err = bodyBuf.Write(b) - } else if s, ok := body.(string); ok { - _, err = bodyBuf.WriteString(s) - } else if s, ok := body.(*string); ok { - _, err = bodyBuf.WriteString(*s) - } else if jsonCheck.MatchString(contentType) { - err = json.NewEncoder(bodyBuf).Encode(body) - } else if xmlCheck.MatchString(contentType) { - var bs []byte - bs, err = xml.Marshal(body) - if err == nil { - bodyBuf.Write(bs) - } - } - - if err != nil { - return nil, err - } - - if bodyBuf.Len() == 0 { - err = fmt.Errorf("invalid body type %s\n", contentType) - return nil, err - } - return bodyBuf, nil -} - -// detectContentType method is used to figure out `Request.Body` content type for request header -func detectContentType(body interface{}) string { - contentType := "text/plain; charset=utf-8" - kind := reflect.TypeOf(body).Kind() - - switch kind { - case reflect.Struct, reflect.Map, reflect.Ptr: - contentType = "application/json; charset=utf-8" - case reflect.String: - contentType = "text/plain; charset=utf-8" - default: - if b, ok := body.([]byte); ok { - contentType = http.DetectContentType(b) - } else if kind == reflect.Slice { - contentType = "application/json; charset=utf-8" - } - } - - return contentType -} - -// Ripped from https://github.com/gregjones/httpcache/blob/master/httpcache.go -type cacheControl map[string]string - -func parseCacheControl(headers http.Header) cacheControl { - cc := cacheControl{} - ccHeader := headers.Get("Cache-Control") - for _, part := range strings.Split(ccHeader, ",") { - part = strings.Trim(part, " ") - if part == "" { - continue - } - if strings.ContainsRune(part, '=') { - keyval := strings.Split(part, "=") - cc[strings.Trim(keyval[0], " ")] = strings.Trim(keyval[1], ",") - } else { - cc[part] = "" - } - } - return cc -} - -// CacheExpires helper function to determine remaining time before repeating a request. -func CacheExpires(r *http.Response) time.Time { - // Figure out when the cache expires. - var expires time.Time - now, err := time.Parse(time.RFC1123, r.Header.Get("date")) - if err != nil { - return time.Now() - } - respCacheControl := parseCacheControl(r.Header) - - if maxAge, ok := respCacheControl["max-age"]; ok { - lifetime, err := time.ParseDuration(maxAge + "s") - if err != nil { - expires = now - } else { - expires = now.Add(lifetime) - } - } else { - expiresHeader := r.Header.Get("Expires") - if expiresHeader != "" { - expires, err = time.Parse(time.RFC1123, expiresHeader) - if err != nil { - expires = now - } - } - } - return expires -} - -func strlen(s string) int { - return utf8.RuneCountInString(s) -} - -// GenericOpenAPIError Provides access to the body, error and model on returned errors. -type GenericOpenAPIError struct { - body []byte - error string - model interface{} -} - -// Error returns non-empty string if there was an error. -func (e GenericOpenAPIError) Error() string { - return e.error -} - -// Body returns the raw bytes of the response -func (e GenericOpenAPIError) Body() []byte { - return e.body -} - -// Model returns the unpacked model of the error -func (e GenericOpenAPIError) Model() interface{} { - return e.model -} - -// format error message using title and detail when model implements rfc7807 -func formatErrorMessage(status string, v interface{}) string { - str := "" - metaValue := reflect.ValueOf(v).Elem() - - if metaValue.Kind() == reflect.Struct { - field := metaValue.FieldByName("Title") - if field != (reflect.Value{}) { - str = fmt.Sprintf("%s", field.Interface()) - } - - field = metaValue.FieldByName("Detail") - if field != (reflect.Value{}) { - str = fmt.Sprintf("%s (%s)", str, field.Interface()) - } - } - - return strings.TrimSpace(fmt.Sprintf("%s %s", status, str)) -} diff --git a/internal/api/0.0.37/configuration.go b/internal/api/0.0.37/configuration.go deleted file mode 100644 index 44db2ba..0000000 --- a/internal/api/0.0.37/configuration.go +++ /dev/null @@ -1,243 +0,0 @@ -/* -Slurm Rest API - -API to access and control Slurm. - -API version: 0.0.37 -Contact: sales@schedmd.com -*/ - -// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. - -package openapi - -import ( - "context" - "fmt" - "net/http" - "strings" -) - -// contextKeys are used to identify the type of value in the context. -// Since these are string, it is possible to get a short description of the -// context key for logging and debugging using key.String(). - -type contextKey string - -func (c contextKey) String() string { - return "auth " + string(c) -} - -var ( - // ContextAPIKeys takes a string apikey as authentication for the request - ContextAPIKeys = contextKey("apiKeys") - - // ContextServerIndex uses a server configuration from the index. - ContextServerIndex = contextKey("serverIndex") - - // ContextOperationServerIndices uses a server configuration from the index mapping. - ContextOperationServerIndices = contextKey("serverOperationIndices") - - // ContextServerVariables overrides a server configuration variables. - ContextServerVariables = contextKey("serverVariables") - - // ContextOperationServerVariables overrides a server configuration variables using operation specific values. - ContextOperationServerVariables = contextKey("serverOperationVariables") -) - -// BasicAuth provides basic http authentication to a request passed via context using ContextBasicAuth -type BasicAuth struct { - UserName string `json:"userName,omitempty"` - Password string `json:"password,omitempty"` -} - -// APIKey provides API key based authentication to a request passed via context using ContextAPIKey -type APIKey struct { - Key string - Prefix string -} - -// ServerVariable stores the information about a server variable -type ServerVariable struct { - Description string - DefaultValue string - EnumValues []string -} - -// ServerConfiguration stores the information about a server -type ServerConfiguration struct { - URL string - Description string - Variables map[string]ServerVariable -} - -// ServerConfigurations stores multiple ServerConfiguration items -type ServerConfigurations []ServerConfiguration - -// Configuration stores the configuration of the API client -type Configuration struct { - Host string `json:"host,omitempty"` - Scheme string `json:"scheme,omitempty"` - DefaultHeader map[string]string `json:"defaultHeader,omitempty"` - UserAgent string `json:"userAgent,omitempty"` - Debug bool `json:"debug,omitempty"` - Servers ServerConfigurations - OperationServers map[string]ServerConfigurations - HTTPClient *http.Client -} - -// NewConfiguration returns a new Configuration object -func NewConfiguration() *Configuration { - cfg := &Configuration{ - DefaultHeader: make(map[string]string), - UserAgent: "OpenAPI-Generator/1.0.0/go", - Debug: false, - Servers: ServerConfigurations{ - { - URL: "/slurm/v0.0.37", - Description: "No description provided", - }, - }, - OperationServers: map[string]ServerConfigurations{ - "OpenapiAPIService.OpenapiGet": { - { - URL: "/", - Description: "No description provided", - }, - }, - "OpenapiAPIService.OpenapiJsonGet": { - { - URL: "/", - Description: "No description provided", - }, - }, - "OpenapiAPIService.OpenapiV3Get": { - { - URL: "/", - Description: "No description provided", - }, - }, - "OpenapiAPIService.OpenapiYamlGet": { - { - URL: "/", - Description: "No description provided", - }, - }, - }, - } - return cfg -} - -// AddDefaultHeader adds a new HTTP header to the default header in the request -func (c *Configuration) AddDefaultHeader(key string, value string) { - c.DefaultHeader[key] = value -} - -// URL formats template on a index using given variables -func (sc ServerConfigurations) URL(index int, variables map[string]string) (string, error) { - if index < 0 || len(sc) <= index { - return "", fmt.Errorf("index %v out of range %v", index, len(sc)-1) - } - server := sc[index] - url := server.URL - - // go through variables and replace placeholders - for name, variable := range server.Variables { - if value, ok := variables[name]; ok { - found := bool(len(variable.EnumValues) == 0) - for _, enumValue := range variable.EnumValues { - if value == enumValue { - found = true - } - } - if !found { - return "", fmt.Errorf("the variable %s in the server URL has invalid value %v. Must be %v", name, value, variable.EnumValues) - } - url = strings.Replace(url, "{"+name+"}", value, -1) - } else { - url = strings.Replace(url, "{"+name+"}", variable.DefaultValue, -1) - } - } - return url, nil -} - -// ServerURL returns URL based on server settings -func (c *Configuration) ServerURL(index int, variables map[string]string) (string, error) { - return c.Servers.URL(index, variables) -} - -func getServerIndex(ctx context.Context) (int, error) { - si := ctx.Value(ContextServerIndex) - if si != nil { - if index, ok := si.(int); ok { - return index, nil - } - return 0, reportError("Invalid type %T should be int", si) - } - return 0, nil -} - -func getServerOperationIndex(ctx context.Context, endpoint string) (int, error) { - osi := ctx.Value(ContextOperationServerIndices) - if osi != nil { - if operationIndices, ok := osi.(map[string]int); !ok { - return 0, reportError("Invalid type %T should be map[string]int", osi) - } else { - index, ok := operationIndices[endpoint] - if ok { - return index, nil - } - } - } - return getServerIndex(ctx) -} - -func getServerVariables(ctx context.Context) (map[string]string, error) { - sv := ctx.Value(ContextServerVariables) - if sv != nil { - if variables, ok := sv.(map[string]string); ok { - return variables, nil - } - return nil, reportError("ctx value of ContextServerVariables has invalid type %T should be map[string]string", sv) - } - return nil, nil -} - -func getServerOperationVariables(ctx context.Context, endpoint string) (map[string]string, error) { - osv := ctx.Value(ContextOperationServerVariables) - if osv != nil { - if operationVariables, ok := osv.(map[string]map[string]string); !ok { - return nil, reportError("ctx value of ContextOperationServerVariables has invalid type %T should be map[string]map[string]string", osv) - } else { - variables, ok := operationVariables[endpoint] - if ok { - return variables, nil - } - } - } - return getServerVariables(ctx) -} - -// ServerURLWithContext returns a new server URL given an endpoint -func (c *Configuration) ServerURLWithContext(ctx context.Context, endpoint string) (string, error) { - sc, ok := c.OperationServers[endpoint] - if !ok { - sc = c.Servers - } - - if ctx == nil { - return sc.URL(0, nil) - } - - index, err := getServerOperationIndex(ctx, endpoint) - if err != nil { - return "", err - } - - variables, err := getServerOperationVariables(ctx, endpoint) - if err != nil { - return "", err - } - - return sc.URL(index, variables) -} diff --git a/internal/api/0.0.37/docs/OpenapiAPI.md b/internal/api/0.0.37/docs/OpenapiAPI.md deleted file mode 100644 index 6b1e331..0000000 --- a/internal/api/0.0.37/docs/OpenapiAPI.md +++ /dev/null @@ -1,240 +0,0 @@ -# \OpenapiAPI - -All URIs are relative to *http://localhost/slurm/v0.0.37* - -Method | HTTP request | Description -------------- | ------------- | ------------- -[**OpenapiGet**](OpenapiAPI.md#OpenapiGet) | **Get** /openapi | Retrieve OpenAPI Specification -[**OpenapiJsonGet**](OpenapiAPI.md#OpenapiJsonGet) | **Get** /openapi.json | Retrieve OpenAPI Specification -[**OpenapiV3Get**](OpenapiAPI.md#OpenapiV3Get) | **Get** /openapi/v3 | Retrieve OpenAPI Specification -[**OpenapiYamlGet**](OpenapiAPI.md#OpenapiYamlGet) | **Get** /openapi.yaml | Retrieve OpenAPI Specification - - - -## OpenapiGet - -> OpenapiGet(ctx).Execute() - -Retrieve OpenAPI Specification - -### Example - -```go -package main - -import ( - "context" - "fmt" - "os" - openapiclient "github.com/GIT_USER_ID/GIT_REPO_ID" -) - -func main() { - - configuration := openapiclient.NewConfiguration() - apiClient := openapiclient.NewAPIClient(configuration) - r, err := apiClient.OpenapiAPI.OpenapiGet(context.Background()).Execute() - if err != nil { - fmt.Fprintf(os.Stderr, "Error when calling `OpenapiAPI.OpenapiGet``: %v\n", err) - fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r) - } -} -``` - -### Path Parameters - -This endpoint does not need any parameter. - -### Other Parameters - -Other parameters are passed through a pointer to a apiOpenapiGetRequest struct via the builder pattern - - -### Return type - - (empty response body) - -### Authorization - -[user](../README.md#user), [token](../README.md#token) - -### HTTP request headers - -- **Content-Type**: Not defined -- **Accept**: Not defined - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) -[[Back to Model list]](../README.md#documentation-for-models) -[[Back to README]](../README.md) - - -## OpenapiJsonGet - -> OpenapiJsonGet(ctx).Execute() - -Retrieve OpenAPI Specification - -### Example - -```go -package main - -import ( - "context" - "fmt" - "os" - openapiclient "github.com/GIT_USER_ID/GIT_REPO_ID" -) - -func main() { - - configuration := openapiclient.NewConfiguration() - apiClient := openapiclient.NewAPIClient(configuration) - r, err := apiClient.OpenapiAPI.OpenapiJsonGet(context.Background()).Execute() - if err != nil { - fmt.Fprintf(os.Stderr, "Error when calling `OpenapiAPI.OpenapiJsonGet``: %v\n", err) - fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r) - } -} -``` - -### Path Parameters - -This endpoint does not need any parameter. - -### Other Parameters - -Other parameters are passed through a pointer to a apiOpenapiJsonGetRequest struct via the builder pattern - - -### Return type - - (empty response body) - -### Authorization - -[user](../README.md#user), [token](../README.md#token) - -### HTTP request headers - -- **Content-Type**: Not defined -- **Accept**: Not defined - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) -[[Back to Model list]](../README.md#documentation-for-models) -[[Back to README]](../README.md) - - -## OpenapiV3Get - -> OpenapiV3Get(ctx).Execute() - -Retrieve OpenAPI Specification - -### Example - -```go -package main - -import ( - "context" - "fmt" - "os" - openapiclient "github.com/GIT_USER_ID/GIT_REPO_ID" -) - -func main() { - - configuration := openapiclient.NewConfiguration() - apiClient := openapiclient.NewAPIClient(configuration) - r, err := apiClient.OpenapiAPI.OpenapiV3Get(context.Background()).Execute() - if err != nil { - fmt.Fprintf(os.Stderr, "Error when calling `OpenapiAPI.OpenapiV3Get``: %v\n", err) - fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r) - } -} -``` - -### Path Parameters - -This endpoint does not need any parameter. - -### Other Parameters - -Other parameters are passed through a pointer to a apiOpenapiV3GetRequest struct via the builder pattern - - -### Return type - - (empty response body) - -### Authorization - -[user](../README.md#user), [token](../README.md#token) - -### HTTP request headers - -- **Content-Type**: Not defined -- **Accept**: Not defined - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) -[[Back to Model list]](../README.md#documentation-for-models) -[[Back to README]](../README.md) - - -## OpenapiYamlGet - -> OpenapiYamlGet(ctx).Execute() - -Retrieve OpenAPI Specification - -### Example - -```go -package main - -import ( - "context" - "fmt" - "os" - openapiclient "github.com/GIT_USER_ID/GIT_REPO_ID" -) - -func main() { - - configuration := openapiclient.NewConfiguration() - apiClient := openapiclient.NewAPIClient(configuration) - r, err := apiClient.OpenapiAPI.OpenapiYamlGet(context.Background()).Execute() - if err != nil { - fmt.Fprintf(os.Stderr, "Error when calling `OpenapiAPI.OpenapiYamlGet``: %v\n", err) - fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r) - } -} -``` - -### Path Parameters - -This endpoint does not need any parameter. - -### Other Parameters - -Other parameters are passed through a pointer to a apiOpenapiYamlGetRequest struct via the builder pattern - - -### Return type - - (empty response body) - -### Authorization - -[user](../README.md#user), [token](../README.md#token) - -### HTTP request headers - -- **Content-Type**: Not defined -- **Accept**: Not defined - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) -[[Back to Model list]](../README.md#documentation-for-models) -[[Back to README]](../README.md) - diff --git a/internal/api/0.0.37/docs/SlurmAPI.md b/internal/api/0.0.37/docs/SlurmAPI.md deleted file mode 100644 index 7543f5f..0000000 --- a/internal/api/0.0.37/docs/SlurmAPI.md +++ /dev/null @@ -1,871 +0,0 @@ -# \SlurmAPI - -All URIs are relative to *http://localhost/slurm/v0.0.37* - -Method | HTTP request | Description -------------- | ------------- | ------------- -[**SlurmctldCancelJob**](SlurmAPI.md#SlurmctldCancelJob) | **Delete** /job/{job_id} | cancel or signal job -[**SlurmctldDiag**](SlurmAPI.md#SlurmctldDiag) | **Get** /diag/ | get diagnostics -[**SlurmctldGetJob**](SlurmAPI.md#SlurmctldGetJob) | **Get** /job/{job_id} | get job info -[**SlurmctldGetJobs**](SlurmAPI.md#SlurmctldGetJobs) | **Get** /jobs/ | get list of jobs -[**SlurmctldGetNode**](SlurmAPI.md#SlurmctldGetNode) | **Get** /node/{node_name} | get node info -[**SlurmctldGetNodes**](SlurmAPI.md#SlurmctldGetNodes) | **Get** /nodes/ | get all node info -[**SlurmctldGetPartition**](SlurmAPI.md#SlurmctldGetPartition) | **Get** /partition/{partition_name} | get partition info -[**SlurmctldGetPartitions**](SlurmAPI.md#SlurmctldGetPartitions) | **Get** /partitions/ | get all partition info -[**SlurmctldGetReservation**](SlurmAPI.md#SlurmctldGetReservation) | **Get** /reservation/{reservation_name} | get reservation info -[**SlurmctldGetReservations**](SlurmAPI.md#SlurmctldGetReservations) | **Get** /reservations/ | get all reservation info -[**SlurmctldPing**](SlurmAPI.md#SlurmctldPing) | **Get** /ping/ | ping test -[**SlurmctldSubmitJob**](SlurmAPI.md#SlurmctldSubmitJob) | **Post** /job/submit | submit new job -[**SlurmctldUpdateJob**](SlurmAPI.md#SlurmctldUpdateJob) | **Post** /job/{job_id} | update job - - - -## SlurmctldCancelJob - -> SlurmctldCancelJob(ctx, jobId).Signal(signal).Execute() - -cancel or signal job - -### Example - -```go -package main - -import ( - "context" - "fmt" - "os" - openapiclient "github.com/GIT_USER_ID/GIT_REPO_ID" -) - -func main() { - jobId := "jobId_example" // string | Slurm Job ID - signal := openapiclient.v0.0.37_signal("HUP") // V0037Signal | signal to send to job (optional) - - configuration := openapiclient.NewConfiguration() - apiClient := openapiclient.NewAPIClient(configuration) - r, err := apiClient.SlurmAPI.SlurmctldCancelJob(context.Background(), jobId).Signal(signal).Execute() - if err != nil { - fmt.Fprintf(os.Stderr, "Error when calling `SlurmAPI.SlurmctldCancelJob``: %v\n", err) - fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r) - } -} -``` - -### Path Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- -**ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc. -**jobId** | **string** | Slurm Job ID | - -### Other Parameters - -Other parameters are passed through a pointer to a apiSlurmctldCancelJobRequest struct via the builder pattern - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - - **signal** | [**V0037Signal**](V0037Signal.md) | signal to send to job | - -### Return type - - (empty response body) - -### Authorization - -[user](../README.md#user), [token](../README.md#token) - -### HTTP request headers - -- **Content-Type**: Not defined -- **Accept**: Not defined - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) -[[Back to Model list]](../README.md#documentation-for-models) -[[Back to README]](../README.md) - - -## SlurmctldDiag - -> V0037Diag SlurmctldDiag(ctx).Execute() - -get diagnostics - -### Example - -```go -package main - -import ( - "context" - "fmt" - "os" - openapiclient "github.com/GIT_USER_ID/GIT_REPO_ID" -) - -func main() { - - configuration := openapiclient.NewConfiguration() - apiClient := openapiclient.NewAPIClient(configuration) - resp, r, err := apiClient.SlurmAPI.SlurmctldDiag(context.Background()).Execute() - if err != nil { - fmt.Fprintf(os.Stderr, "Error when calling `SlurmAPI.SlurmctldDiag``: %v\n", err) - fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r) - } - // response from `SlurmctldDiag`: V0037Diag - fmt.Fprintf(os.Stdout, "Response from `SlurmAPI.SlurmctldDiag`: %v\n", resp) -} -``` - -### Path Parameters - -This endpoint does not need any parameter. - -### Other Parameters - -Other parameters are passed through a pointer to a apiSlurmctldDiagRequest struct via the builder pattern - - -### Return type - -[**V0037Diag**](V0037Diag.md) - -### Authorization - -[user](../README.md#user), [token](../README.md#token) - -### HTTP request headers - -- **Content-Type**: Not defined -- **Accept**: application/json, application/x-yaml - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) -[[Back to Model list]](../README.md#documentation-for-models) -[[Back to README]](../README.md) - - -## SlurmctldGetJob - -> V0037JobsResponse SlurmctldGetJob(ctx, jobId).Execute() - -get job info - -### Example - -```go -package main - -import ( - "context" - "fmt" - "os" - openapiclient "github.com/GIT_USER_ID/GIT_REPO_ID" -) - -func main() { - jobId := "jobId_example" // string | Slurm JobID - - configuration := openapiclient.NewConfiguration() - apiClient := openapiclient.NewAPIClient(configuration) - resp, r, err := apiClient.SlurmAPI.SlurmctldGetJob(context.Background(), jobId).Execute() - if err != nil { - fmt.Fprintf(os.Stderr, "Error when calling `SlurmAPI.SlurmctldGetJob``: %v\n", err) - fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r) - } - // response from `SlurmctldGetJob`: V0037JobsResponse - fmt.Fprintf(os.Stdout, "Response from `SlurmAPI.SlurmctldGetJob`: %v\n", resp) -} -``` - -### Path Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- -**ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc. -**jobId** | **string** | Slurm JobID | - -### Other Parameters - -Other parameters are passed through a pointer to a apiSlurmctldGetJobRequest struct via the builder pattern - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - - -### Return type - -[**V0037JobsResponse**](V0037JobsResponse.md) - -### Authorization - -[user](../README.md#user), [token](../README.md#token) - -### HTTP request headers - -- **Content-Type**: Not defined -- **Accept**: application/json, application/x-yaml - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) -[[Back to Model list]](../README.md#documentation-for-models) -[[Back to README]](../README.md) - - -## SlurmctldGetJobs - -> V0037JobsResponse SlurmctldGetJobs(ctx).UpdateTime(updateTime).Execute() - -get list of jobs - -### Example - -```go -package main - -import ( - "context" - "fmt" - "os" - openapiclient "github.com/GIT_USER_ID/GIT_REPO_ID" -) - -func main() { - updateTime := int64(789) // int64 | Filter if changed since update_time. Use of this parameter can result in faster replies. (optional) - - configuration := openapiclient.NewConfiguration() - apiClient := openapiclient.NewAPIClient(configuration) - resp, r, err := apiClient.SlurmAPI.SlurmctldGetJobs(context.Background()).UpdateTime(updateTime).Execute() - if err != nil { - fmt.Fprintf(os.Stderr, "Error when calling `SlurmAPI.SlurmctldGetJobs``: %v\n", err) - fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r) - } - // response from `SlurmctldGetJobs`: V0037JobsResponse - fmt.Fprintf(os.Stdout, "Response from `SlurmAPI.SlurmctldGetJobs`: %v\n", resp) -} -``` - -### Path Parameters - - - -### Other Parameters - -Other parameters are passed through a pointer to a apiSlurmctldGetJobsRequest struct via the builder pattern - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **updateTime** | **int64** | Filter if changed since update_time. Use of this parameter can result in faster replies. | - -### Return type - -[**V0037JobsResponse**](V0037JobsResponse.md) - -### Authorization - -[user](../README.md#user), [token](../README.md#token) - -### HTTP request headers - -- **Content-Type**: Not defined -- **Accept**: application/json, application/x-yaml - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) -[[Back to Model list]](../README.md#documentation-for-models) -[[Back to README]](../README.md) - - -## SlurmctldGetNode - -> V0037NodesResponse SlurmctldGetNode(ctx, nodeName).Execute() - -get node info - -### Example - -```go -package main - -import ( - "context" - "fmt" - "os" - openapiclient "github.com/GIT_USER_ID/GIT_REPO_ID" -) - -func main() { - nodeName := "nodeName_example" // string | Slurm Node Name - - configuration := openapiclient.NewConfiguration() - apiClient := openapiclient.NewAPIClient(configuration) - resp, r, err := apiClient.SlurmAPI.SlurmctldGetNode(context.Background(), nodeName).Execute() - if err != nil { - fmt.Fprintf(os.Stderr, "Error when calling `SlurmAPI.SlurmctldGetNode``: %v\n", err) - fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r) - } - // response from `SlurmctldGetNode`: V0037NodesResponse - fmt.Fprintf(os.Stdout, "Response from `SlurmAPI.SlurmctldGetNode`: %v\n", resp) -} -``` - -### Path Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- -**ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc. -**nodeName** | **string** | Slurm Node Name | - -### Other Parameters - -Other parameters are passed through a pointer to a apiSlurmctldGetNodeRequest struct via the builder pattern - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - - -### Return type - -[**V0037NodesResponse**](V0037NodesResponse.md) - -### Authorization - -[user](../README.md#user), [token](../README.md#token) - -### HTTP request headers - -- **Content-Type**: Not defined -- **Accept**: application/json, application/x-yaml - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) -[[Back to Model list]](../README.md#documentation-for-models) -[[Back to README]](../README.md) - - -## SlurmctldGetNodes - -> V0037NodesResponse SlurmctldGetNodes(ctx).UpdateTime(updateTime).Execute() - -get all node info - -### Example - -```go -package main - -import ( - "context" - "fmt" - "os" - openapiclient "github.com/GIT_USER_ID/GIT_REPO_ID" -) - -func main() { - updateTime := int64(789) // int64 | Filter if changed since update_time. Use of this parameter can result in faster replies. (optional) - - configuration := openapiclient.NewConfiguration() - apiClient := openapiclient.NewAPIClient(configuration) - resp, r, err := apiClient.SlurmAPI.SlurmctldGetNodes(context.Background()).UpdateTime(updateTime).Execute() - if err != nil { - fmt.Fprintf(os.Stderr, "Error when calling `SlurmAPI.SlurmctldGetNodes``: %v\n", err) - fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r) - } - // response from `SlurmctldGetNodes`: V0037NodesResponse - fmt.Fprintf(os.Stdout, "Response from `SlurmAPI.SlurmctldGetNodes`: %v\n", resp) -} -``` - -### Path Parameters - - - -### Other Parameters - -Other parameters are passed through a pointer to a apiSlurmctldGetNodesRequest struct via the builder pattern - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **updateTime** | **int64** | Filter if changed since update_time. Use of this parameter can result in faster replies. | - -### Return type - -[**V0037NodesResponse**](V0037NodesResponse.md) - -### Authorization - -[user](../README.md#user), [token](../README.md#token) - -### HTTP request headers - -- **Content-Type**: Not defined -- **Accept**: application/json, application/x-yaml - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) -[[Back to Model list]](../README.md#documentation-for-models) -[[Back to README]](../README.md) - - -## SlurmctldGetPartition - -> V0037PartitionsResponse SlurmctldGetPartition(ctx, partitionName).UpdateTime(updateTime).Execute() - -get partition info - -### Example - -```go -package main - -import ( - "context" - "fmt" - "os" - openapiclient "github.com/GIT_USER_ID/GIT_REPO_ID" -) - -func main() { - partitionName := "partitionName_example" // string | Slurm Partition Name - updateTime := int64(789) // int64 | Filter if there were no partition changes (not limited to partition in URL endpoint) since update_time. (optional) - - configuration := openapiclient.NewConfiguration() - apiClient := openapiclient.NewAPIClient(configuration) - resp, r, err := apiClient.SlurmAPI.SlurmctldGetPartition(context.Background(), partitionName).UpdateTime(updateTime).Execute() - if err != nil { - fmt.Fprintf(os.Stderr, "Error when calling `SlurmAPI.SlurmctldGetPartition``: %v\n", err) - fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r) - } - // response from `SlurmctldGetPartition`: V0037PartitionsResponse - fmt.Fprintf(os.Stdout, "Response from `SlurmAPI.SlurmctldGetPartition`: %v\n", resp) -} -``` - -### Path Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- -**ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc. -**partitionName** | **string** | Slurm Partition Name | - -### Other Parameters - -Other parameters are passed through a pointer to a apiSlurmctldGetPartitionRequest struct via the builder pattern - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - - **updateTime** | **int64** | Filter if there were no partition changes (not limited to partition in URL endpoint) since update_time. | - -### Return type - -[**V0037PartitionsResponse**](V0037PartitionsResponse.md) - -### Authorization - -[user](../README.md#user), [token](../README.md#token) - -### HTTP request headers - -- **Content-Type**: Not defined -- **Accept**: application/json, application/x-yaml - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) -[[Back to Model list]](../README.md#documentation-for-models) -[[Back to README]](../README.md) - - -## SlurmctldGetPartitions - -> V0037PartitionsResponse SlurmctldGetPartitions(ctx).UpdateTime(updateTime).Execute() - -get all partition info - -### Example - -```go -package main - -import ( - "context" - "fmt" - "os" - openapiclient "github.com/GIT_USER_ID/GIT_REPO_ID" -) - -func main() { - updateTime := int64(789) // int64 | Filter if changed since update_time. Use of this parameter can result in faster replies. (optional) - - configuration := openapiclient.NewConfiguration() - apiClient := openapiclient.NewAPIClient(configuration) - resp, r, err := apiClient.SlurmAPI.SlurmctldGetPartitions(context.Background()).UpdateTime(updateTime).Execute() - if err != nil { - fmt.Fprintf(os.Stderr, "Error when calling `SlurmAPI.SlurmctldGetPartitions``: %v\n", err) - fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r) - } - // response from `SlurmctldGetPartitions`: V0037PartitionsResponse - fmt.Fprintf(os.Stdout, "Response from `SlurmAPI.SlurmctldGetPartitions`: %v\n", resp) -} -``` - -### Path Parameters - - - -### Other Parameters - -Other parameters are passed through a pointer to a apiSlurmctldGetPartitionsRequest struct via the builder pattern - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **updateTime** | **int64** | Filter if changed since update_time. Use of this parameter can result in faster replies. | - -### Return type - -[**V0037PartitionsResponse**](V0037PartitionsResponse.md) - -### Authorization - -[user](../README.md#user), [token](../README.md#token) - -### HTTP request headers - -- **Content-Type**: Not defined -- **Accept**: application/json, application/x-yaml - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) -[[Back to Model list]](../README.md#documentation-for-models) -[[Back to README]](../README.md) - - -## SlurmctldGetReservation - -> V0037ReservationsResponse SlurmctldGetReservation(ctx, reservationName).UpdateTime(updateTime).Execute() - -get reservation info - -### Example - -```go -package main - -import ( - "context" - "fmt" - "os" - openapiclient "github.com/GIT_USER_ID/GIT_REPO_ID" -) - -func main() { - reservationName := "reservationName_example" // string | Slurm Reservation Name - updateTime := int64(789) // int64 | Filter if no reservation (not limited to reservation in URL) changed since update_time. (optional) - - configuration := openapiclient.NewConfiguration() - apiClient := openapiclient.NewAPIClient(configuration) - resp, r, err := apiClient.SlurmAPI.SlurmctldGetReservation(context.Background(), reservationName).UpdateTime(updateTime).Execute() - if err != nil { - fmt.Fprintf(os.Stderr, "Error when calling `SlurmAPI.SlurmctldGetReservation``: %v\n", err) - fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r) - } - // response from `SlurmctldGetReservation`: V0037ReservationsResponse - fmt.Fprintf(os.Stdout, "Response from `SlurmAPI.SlurmctldGetReservation`: %v\n", resp) -} -``` - -### Path Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- -**ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc. -**reservationName** | **string** | Slurm Reservation Name | - -### Other Parameters - -Other parameters are passed through a pointer to a apiSlurmctldGetReservationRequest struct via the builder pattern - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - - **updateTime** | **int64** | Filter if no reservation (not limited to reservation in URL) changed since update_time. | - -### Return type - -[**V0037ReservationsResponse**](V0037ReservationsResponse.md) - -### Authorization - -[user](../README.md#user), [token](../README.md#token) - -### HTTP request headers - -- **Content-Type**: Not defined -- **Accept**: application/json, application/x-yaml - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) -[[Back to Model list]](../README.md#documentation-for-models) -[[Back to README]](../README.md) - - -## SlurmctldGetReservations - -> V0037ReservationsResponse SlurmctldGetReservations(ctx).UpdateTime(updateTime).Execute() - -get all reservation info - -### Example - -```go -package main - -import ( - "context" - "fmt" - "os" - openapiclient "github.com/GIT_USER_ID/GIT_REPO_ID" -) - -func main() { - updateTime := int64(789) // int64 | Filter if changed since update_time. Use of this parameter can result in faster replies. (optional) - - configuration := openapiclient.NewConfiguration() - apiClient := openapiclient.NewAPIClient(configuration) - resp, r, err := apiClient.SlurmAPI.SlurmctldGetReservations(context.Background()).UpdateTime(updateTime).Execute() - if err != nil { - fmt.Fprintf(os.Stderr, "Error when calling `SlurmAPI.SlurmctldGetReservations``: %v\n", err) - fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r) - } - // response from `SlurmctldGetReservations`: V0037ReservationsResponse - fmt.Fprintf(os.Stdout, "Response from `SlurmAPI.SlurmctldGetReservations`: %v\n", resp) -} -``` - -### Path Parameters - - - -### Other Parameters - -Other parameters are passed through a pointer to a apiSlurmctldGetReservationsRequest struct via the builder pattern - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **updateTime** | **int64** | Filter if changed since update_time. Use of this parameter can result in faster replies. | - -### Return type - -[**V0037ReservationsResponse**](V0037ReservationsResponse.md) - -### Authorization - -[user](../README.md#user), [token](../README.md#token) - -### HTTP request headers - -- **Content-Type**: Not defined -- **Accept**: application/json, application/x-yaml - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) -[[Back to Model list]](../README.md#documentation-for-models) -[[Back to README]](../README.md) - - -## SlurmctldPing - -> V0037Pings SlurmctldPing(ctx).Execute() - -ping test - -### Example - -```go -package main - -import ( - "context" - "fmt" - "os" - openapiclient "github.com/GIT_USER_ID/GIT_REPO_ID" -) - -func main() { - - configuration := openapiclient.NewConfiguration() - apiClient := openapiclient.NewAPIClient(configuration) - resp, r, err := apiClient.SlurmAPI.SlurmctldPing(context.Background()).Execute() - if err != nil { - fmt.Fprintf(os.Stderr, "Error when calling `SlurmAPI.SlurmctldPing``: %v\n", err) - fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r) - } - // response from `SlurmctldPing`: V0037Pings - fmt.Fprintf(os.Stdout, "Response from `SlurmAPI.SlurmctldPing`: %v\n", resp) -} -``` - -### Path Parameters - -This endpoint does not need any parameter. - -### Other Parameters - -Other parameters are passed through a pointer to a apiSlurmctldPingRequest struct via the builder pattern - - -### Return type - -[**V0037Pings**](V0037Pings.md) - -### Authorization - -[user](../README.md#user), [token](../README.md#token) - -### HTTP request headers - -- **Content-Type**: Not defined -- **Accept**: application/json, application/x-yaml - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) -[[Back to Model list]](../README.md#documentation-for-models) -[[Back to README]](../README.md) - - -## SlurmctldSubmitJob - -> V0037JobSubmissionResponse SlurmctldSubmitJob(ctx).V0037JobSubmission(v0037JobSubmission).Execute() - -submit new job - -### Example - -```go -package main - -import ( - "context" - "fmt" - "os" - openapiclient "github.com/GIT_USER_ID/GIT_REPO_ID" -) - -func main() { - v0037JobSubmission := *openapiclient.NewV0037JobSubmission("Script_example") // V0037JobSubmission | submit new job - - configuration := openapiclient.NewConfiguration() - apiClient := openapiclient.NewAPIClient(configuration) - resp, r, err := apiClient.SlurmAPI.SlurmctldSubmitJob(context.Background()).V0037JobSubmission(v0037JobSubmission).Execute() - if err != nil { - fmt.Fprintf(os.Stderr, "Error when calling `SlurmAPI.SlurmctldSubmitJob``: %v\n", err) - fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r) - } - // response from `SlurmctldSubmitJob`: V0037JobSubmissionResponse - fmt.Fprintf(os.Stdout, "Response from `SlurmAPI.SlurmctldSubmitJob`: %v\n", resp) -} -``` - -### Path Parameters - - - -### Other Parameters - -Other parameters are passed through a pointer to a apiSlurmctldSubmitJobRequest struct via the builder pattern - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **v0037JobSubmission** | [**V0037JobSubmission**](V0037JobSubmission.md) | submit new job | - -### Return type - -[**V0037JobSubmissionResponse**](V0037JobSubmissionResponse.md) - -### Authorization - -[user](../README.md#user), [token](../README.md#token) - -### HTTP request headers - -- **Content-Type**: application/json, application/x-yaml -- **Accept**: application/json, application/x-yaml - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) -[[Back to Model list]](../README.md#documentation-for-models) -[[Back to README]](../README.md) - - -## SlurmctldUpdateJob - -> SlurmctldUpdateJob(ctx, jobId).V0037JobProperties(v0037JobProperties).Execute() - -update job - -### Example - -```go -package main - -import ( - "context" - "fmt" - "os" - openapiclient "github.com/GIT_USER_ID/GIT_REPO_ID" -) - -func main() { - jobId := "jobId_example" // string | Slurm Job ID - v0037JobProperties := *openapiclient.NewV0037JobProperties(map[string]interface{}(123)) // V0037JobProperties | update job - - configuration := openapiclient.NewConfiguration() - apiClient := openapiclient.NewAPIClient(configuration) - r, err := apiClient.SlurmAPI.SlurmctldUpdateJob(context.Background(), jobId).V0037JobProperties(v0037JobProperties).Execute() - if err != nil { - fmt.Fprintf(os.Stderr, "Error when calling `SlurmAPI.SlurmctldUpdateJob``: %v\n", err) - fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r) - } -} -``` - -### Path Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- -**ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc. -**jobId** | **string** | Slurm Job ID | - -### Other Parameters - -Other parameters are passed through a pointer to a apiSlurmctldUpdateJobRequest struct via the builder pattern - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - - **v0037JobProperties** | [**V0037JobProperties**](V0037JobProperties.md) | update job | - -### Return type - - (empty response body) - -### Authorization - -[user](../README.md#user), [token](../README.md#token) - -### HTTP request headers - -- **Content-Type**: application/json, application/x-yaml -- **Accept**: Not defined - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) -[[Back to Model list]](../README.md#documentation-for-models) -[[Back to README]](../README.md) - diff --git a/internal/api/0.0.37/docs/V0037Diag.md b/internal/api/0.0.37/docs/V0037Diag.md deleted file mode 100644 index 632450e..0000000 --- a/internal/api/0.0.37/docs/V0037Diag.md +++ /dev/null @@ -1,82 +0,0 @@ -# V0037Diag - -## Properties - -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**Errors** | Pointer to [**[]V0037Error**](V0037Error.md) | slurm errors | [optional] -**Statistics** | Pointer to [**V0037DiagStatistics**](V0037DiagStatistics.md) | | [optional] - -## Methods - -### NewV0037Diag - -`func NewV0037Diag() *V0037Diag` - -NewV0037Diag instantiates a new V0037Diag object -This constructor will assign default values to properties that have it defined, -and makes sure properties required by API are set, but the set of arguments -will change when the set of required properties is changed - -### NewV0037DiagWithDefaults - -`func NewV0037DiagWithDefaults() *V0037Diag` - -NewV0037DiagWithDefaults instantiates a new V0037Diag object -This constructor will only assign default values to properties that have it defined, -but it doesn't guarantee that properties required by API are set - -### GetErrors - -`func (o *V0037Diag) GetErrors() []V0037Error` - -GetErrors returns the Errors field if non-nil, zero value otherwise. - -### GetErrorsOk - -`func (o *V0037Diag) GetErrorsOk() (*[]V0037Error, bool)` - -GetErrorsOk returns a tuple with the Errors field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetErrors - -`func (o *V0037Diag) SetErrors(v []V0037Error)` - -SetErrors sets Errors field to given value. - -### HasErrors - -`func (o *V0037Diag) HasErrors() bool` - -HasErrors returns a boolean if a field has been set. - -### GetStatistics - -`func (o *V0037Diag) GetStatistics() V0037DiagStatistics` - -GetStatistics returns the Statistics field if non-nil, zero value otherwise. - -### GetStatisticsOk - -`func (o *V0037Diag) GetStatisticsOk() (*V0037DiagStatistics, bool)` - -GetStatisticsOk returns a tuple with the Statistics field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetStatistics - -`func (o *V0037Diag) SetStatistics(v V0037DiagStatistics)` - -SetStatistics sets Statistics field to given value. - -### HasStatistics - -`func (o *V0037Diag) HasStatistics() bool` - -HasStatistics returns a boolean if a field has been set. - - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/internal/api/0.0.37/docs/V0037DiagStatistics.md b/internal/api/0.0.37/docs/V0037DiagStatistics.md deleted file mode 100644 index a6c0c2b..0000000 --- a/internal/api/0.0.37/docs/V0037DiagStatistics.md +++ /dev/null @@ -1,1044 +0,0 @@ -# V0037DiagStatistics - -## Properties - -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**PartsPacked** | Pointer to **int32** | partition records packed | [optional] -**ReqTime** | Pointer to **int32** | generation time | [optional] -**ReqTimeStart** | Pointer to **int32** | data since | [optional] -**ServerThreadCount** | Pointer to **int32** | Server thread count | [optional] -**AgentQueueSize** | Pointer to **int32** | Agent queue size | [optional] -**AgentCount** | Pointer to **int32** | Agent count | [optional] -**AgentThreadCount** | Pointer to **int32** | Agent thread count | [optional] -**DbdAgentQueueSize** | Pointer to **int32** | DBD Agent queue size | [optional] -**GettimeofdayLatency** | Pointer to **int32** | Latency for 1000 calls to gettimeofday() | [optional] -**ScheduleCycleMax** | Pointer to **int32** | Main Schedule max cycle | [optional] -**ScheduleCycleLast** | Pointer to **int32** | Main Schedule last cycle | [optional] -**ScheduleCycleTotal** | Pointer to **int32** | Main Schedule cycle iterations | [optional] -**ScheduleCycleMean** | Pointer to **int32** | Average time for Schedule Max cycle | [optional] -**ScheduleCycleMeanDepth** | Pointer to **int32** | Average depth for Schedule Max cycle | [optional] -**ScheduleCyclePerMinute** | Pointer to **int32** | Main Schedule Cycles per minute | [optional] -**ScheduleQueueLength** | Pointer to **int32** | Main Schedule Last queue length | [optional] -**JobsSubmitted** | Pointer to **int32** | Job submitted | [optional] -**JobsStarted** | Pointer to **int32** | Job started | [optional] -**JobsCompleted** | Pointer to **int32** | Job completed | [optional] -**JobsCanceled** | Pointer to **int32** | Job cancelled | [optional] -**JobsFailed** | Pointer to **int32** | Job failed | [optional] -**JobsPending** | Pointer to **int32** | Job pending | [optional] -**JobsRunning** | Pointer to **int32** | Job running | [optional] -**JobStatesTs** | Pointer to **int32** | Job states timestamp | [optional] -**BfBackfilledJobs** | Pointer to **int32** | Total backfilled jobs (since last slurm start) | [optional] -**BfLastBackfilledJobs** | Pointer to **int32** | Total backfilled jobs (since last stats cycle start) | [optional] -**BfBackfilledHetJobs** | Pointer to **int32** | Total backfilled heterogeneous job components | [optional] -**BfCycleCounter** | Pointer to **int32** | Backfill Schedule Total cycles | [optional] -**BfCycleMean** | Pointer to **int32** | Backfill Schedule Mean cycle | [optional] -**BfCycleMax** | Pointer to **int32** | Backfill Schedule Max cycle time | [optional] -**BfLastDepth** | Pointer to **int32** | Backfill Schedule Last depth cycle | [optional] -**BfLastDepthTry** | Pointer to **int32** | Backfill Schedule Mean cycle (try sched) | [optional] -**BfDepthMean** | Pointer to **int32** | Backfill Schedule Depth Mean | [optional] -**BfDepthMeanTry** | Pointer to **int32** | Backfill Schedule Depth Mean (try sched) | [optional] -**BfCycleLast** | Pointer to **int32** | Backfill Schedule Last cycle time | [optional] -**BfQueueLen** | Pointer to **int32** | Backfill Schedule Last queue length | [optional] -**BfQueueLenMean** | Pointer to **int32** | Backfill Schedule Mean queue length | [optional] -**BfWhenLastCycle** | Pointer to **int32** | Last cycle timestamp | [optional] -**BfActive** | Pointer to **bool** | Backfill Schedule currently active | [optional] - -## Methods - -### NewV0037DiagStatistics - -`func NewV0037DiagStatistics() *V0037DiagStatistics` - -NewV0037DiagStatistics instantiates a new V0037DiagStatistics object -This constructor will assign default values to properties that have it defined, -and makes sure properties required by API are set, but the set of arguments -will change when the set of required properties is changed - -### NewV0037DiagStatisticsWithDefaults - -`func NewV0037DiagStatisticsWithDefaults() *V0037DiagStatistics` - -NewV0037DiagStatisticsWithDefaults instantiates a new V0037DiagStatistics object -This constructor will only assign default values to properties that have it defined, -but it doesn't guarantee that properties required by API are set - -### GetPartsPacked - -`func (o *V0037DiagStatistics) GetPartsPacked() int32` - -GetPartsPacked returns the PartsPacked field if non-nil, zero value otherwise. - -### GetPartsPackedOk - -`func (o *V0037DiagStatistics) GetPartsPackedOk() (*int32, bool)` - -GetPartsPackedOk returns a tuple with the PartsPacked field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetPartsPacked - -`func (o *V0037DiagStatistics) SetPartsPacked(v int32)` - -SetPartsPacked sets PartsPacked field to given value. - -### HasPartsPacked - -`func (o *V0037DiagStatistics) HasPartsPacked() bool` - -HasPartsPacked returns a boolean if a field has been set. - -### GetReqTime - -`func (o *V0037DiagStatistics) GetReqTime() int32` - -GetReqTime returns the ReqTime field if non-nil, zero value otherwise. - -### GetReqTimeOk - -`func (o *V0037DiagStatistics) GetReqTimeOk() (*int32, bool)` - -GetReqTimeOk returns a tuple with the ReqTime field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetReqTime - -`func (o *V0037DiagStatistics) SetReqTime(v int32)` - -SetReqTime sets ReqTime field to given value. - -### HasReqTime - -`func (o *V0037DiagStatistics) HasReqTime() bool` - -HasReqTime returns a boolean if a field has been set. - -### GetReqTimeStart - -`func (o *V0037DiagStatistics) GetReqTimeStart() int32` - -GetReqTimeStart returns the ReqTimeStart field if non-nil, zero value otherwise. - -### GetReqTimeStartOk - -`func (o *V0037DiagStatistics) GetReqTimeStartOk() (*int32, bool)` - -GetReqTimeStartOk returns a tuple with the ReqTimeStart field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetReqTimeStart - -`func (o *V0037DiagStatistics) SetReqTimeStart(v int32)` - -SetReqTimeStart sets ReqTimeStart field to given value. - -### HasReqTimeStart - -`func (o *V0037DiagStatistics) HasReqTimeStart() bool` - -HasReqTimeStart returns a boolean if a field has been set. - -### GetServerThreadCount - -`func (o *V0037DiagStatistics) GetServerThreadCount() int32` - -GetServerThreadCount returns the ServerThreadCount field if non-nil, zero value otherwise. - -### GetServerThreadCountOk - -`func (o *V0037DiagStatistics) GetServerThreadCountOk() (*int32, bool)` - -GetServerThreadCountOk returns a tuple with the ServerThreadCount field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetServerThreadCount - -`func (o *V0037DiagStatistics) SetServerThreadCount(v int32)` - -SetServerThreadCount sets ServerThreadCount field to given value. - -### HasServerThreadCount - -`func (o *V0037DiagStatistics) HasServerThreadCount() bool` - -HasServerThreadCount returns a boolean if a field has been set. - -### GetAgentQueueSize - -`func (o *V0037DiagStatistics) GetAgentQueueSize() int32` - -GetAgentQueueSize returns the AgentQueueSize field if non-nil, zero value otherwise. - -### GetAgentQueueSizeOk - -`func (o *V0037DiagStatistics) GetAgentQueueSizeOk() (*int32, bool)` - -GetAgentQueueSizeOk returns a tuple with the AgentQueueSize field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetAgentQueueSize - -`func (o *V0037DiagStatistics) SetAgentQueueSize(v int32)` - -SetAgentQueueSize sets AgentQueueSize field to given value. - -### HasAgentQueueSize - -`func (o *V0037DiagStatistics) HasAgentQueueSize() bool` - -HasAgentQueueSize returns a boolean if a field has been set. - -### GetAgentCount - -`func (o *V0037DiagStatistics) GetAgentCount() int32` - -GetAgentCount returns the AgentCount field if non-nil, zero value otherwise. - -### GetAgentCountOk - -`func (o *V0037DiagStatistics) GetAgentCountOk() (*int32, bool)` - -GetAgentCountOk returns a tuple with the AgentCount field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetAgentCount - -`func (o *V0037DiagStatistics) SetAgentCount(v int32)` - -SetAgentCount sets AgentCount field to given value. - -### HasAgentCount - -`func (o *V0037DiagStatistics) HasAgentCount() bool` - -HasAgentCount returns a boolean if a field has been set. - -### GetAgentThreadCount - -`func (o *V0037DiagStatistics) GetAgentThreadCount() int32` - -GetAgentThreadCount returns the AgentThreadCount field if non-nil, zero value otherwise. - -### GetAgentThreadCountOk - -`func (o *V0037DiagStatistics) GetAgentThreadCountOk() (*int32, bool)` - -GetAgentThreadCountOk returns a tuple with the AgentThreadCount field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetAgentThreadCount - -`func (o *V0037DiagStatistics) SetAgentThreadCount(v int32)` - -SetAgentThreadCount sets AgentThreadCount field to given value. - -### HasAgentThreadCount - -`func (o *V0037DiagStatistics) HasAgentThreadCount() bool` - -HasAgentThreadCount returns a boolean if a field has been set. - -### GetDbdAgentQueueSize - -`func (o *V0037DiagStatistics) GetDbdAgentQueueSize() int32` - -GetDbdAgentQueueSize returns the DbdAgentQueueSize field if non-nil, zero value otherwise. - -### GetDbdAgentQueueSizeOk - -`func (o *V0037DiagStatistics) GetDbdAgentQueueSizeOk() (*int32, bool)` - -GetDbdAgentQueueSizeOk returns a tuple with the DbdAgentQueueSize field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetDbdAgentQueueSize - -`func (o *V0037DiagStatistics) SetDbdAgentQueueSize(v int32)` - -SetDbdAgentQueueSize sets DbdAgentQueueSize field to given value. - -### HasDbdAgentQueueSize - -`func (o *V0037DiagStatistics) HasDbdAgentQueueSize() bool` - -HasDbdAgentQueueSize returns a boolean if a field has been set. - -### GetGettimeofdayLatency - -`func (o *V0037DiagStatistics) GetGettimeofdayLatency() int32` - -GetGettimeofdayLatency returns the GettimeofdayLatency field if non-nil, zero value otherwise. - -### GetGettimeofdayLatencyOk - -`func (o *V0037DiagStatistics) GetGettimeofdayLatencyOk() (*int32, bool)` - -GetGettimeofdayLatencyOk returns a tuple with the GettimeofdayLatency field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetGettimeofdayLatency - -`func (o *V0037DiagStatistics) SetGettimeofdayLatency(v int32)` - -SetGettimeofdayLatency sets GettimeofdayLatency field to given value. - -### HasGettimeofdayLatency - -`func (o *V0037DiagStatistics) HasGettimeofdayLatency() bool` - -HasGettimeofdayLatency returns a boolean if a field has been set. - -### GetScheduleCycleMax - -`func (o *V0037DiagStatistics) GetScheduleCycleMax() int32` - -GetScheduleCycleMax returns the ScheduleCycleMax field if non-nil, zero value otherwise. - -### GetScheduleCycleMaxOk - -`func (o *V0037DiagStatistics) GetScheduleCycleMaxOk() (*int32, bool)` - -GetScheduleCycleMaxOk returns a tuple with the ScheduleCycleMax field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetScheduleCycleMax - -`func (o *V0037DiagStatistics) SetScheduleCycleMax(v int32)` - -SetScheduleCycleMax sets ScheduleCycleMax field to given value. - -### HasScheduleCycleMax - -`func (o *V0037DiagStatistics) HasScheduleCycleMax() bool` - -HasScheduleCycleMax returns a boolean if a field has been set. - -### GetScheduleCycleLast - -`func (o *V0037DiagStatistics) GetScheduleCycleLast() int32` - -GetScheduleCycleLast returns the ScheduleCycleLast field if non-nil, zero value otherwise. - -### GetScheduleCycleLastOk - -`func (o *V0037DiagStatistics) GetScheduleCycleLastOk() (*int32, bool)` - -GetScheduleCycleLastOk returns a tuple with the ScheduleCycleLast field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetScheduleCycleLast - -`func (o *V0037DiagStatistics) SetScheduleCycleLast(v int32)` - -SetScheduleCycleLast sets ScheduleCycleLast field to given value. - -### HasScheduleCycleLast - -`func (o *V0037DiagStatistics) HasScheduleCycleLast() bool` - -HasScheduleCycleLast returns a boolean if a field has been set. - -### GetScheduleCycleTotal - -`func (o *V0037DiagStatistics) GetScheduleCycleTotal() int32` - -GetScheduleCycleTotal returns the ScheduleCycleTotal field if non-nil, zero value otherwise. - -### GetScheduleCycleTotalOk - -`func (o *V0037DiagStatistics) GetScheduleCycleTotalOk() (*int32, bool)` - -GetScheduleCycleTotalOk returns a tuple with the ScheduleCycleTotal field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetScheduleCycleTotal - -`func (o *V0037DiagStatistics) SetScheduleCycleTotal(v int32)` - -SetScheduleCycleTotal sets ScheduleCycleTotal field to given value. - -### HasScheduleCycleTotal - -`func (o *V0037DiagStatistics) HasScheduleCycleTotal() bool` - -HasScheduleCycleTotal returns a boolean if a field has been set. - -### GetScheduleCycleMean - -`func (o *V0037DiagStatistics) GetScheduleCycleMean() int32` - -GetScheduleCycleMean returns the ScheduleCycleMean field if non-nil, zero value otherwise. - -### GetScheduleCycleMeanOk - -`func (o *V0037DiagStatistics) GetScheduleCycleMeanOk() (*int32, bool)` - -GetScheduleCycleMeanOk returns a tuple with the ScheduleCycleMean field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetScheduleCycleMean - -`func (o *V0037DiagStatistics) SetScheduleCycleMean(v int32)` - -SetScheduleCycleMean sets ScheduleCycleMean field to given value. - -### HasScheduleCycleMean - -`func (o *V0037DiagStatistics) HasScheduleCycleMean() bool` - -HasScheduleCycleMean returns a boolean if a field has been set. - -### GetScheduleCycleMeanDepth - -`func (o *V0037DiagStatistics) GetScheduleCycleMeanDepth() int32` - -GetScheduleCycleMeanDepth returns the ScheduleCycleMeanDepth field if non-nil, zero value otherwise. - -### GetScheduleCycleMeanDepthOk - -`func (o *V0037DiagStatistics) GetScheduleCycleMeanDepthOk() (*int32, bool)` - -GetScheduleCycleMeanDepthOk returns a tuple with the ScheduleCycleMeanDepth field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetScheduleCycleMeanDepth - -`func (o *V0037DiagStatistics) SetScheduleCycleMeanDepth(v int32)` - -SetScheduleCycleMeanDepth sets ScheduleCycleMeanDepth field to given value. - -### HasScheduleCycleMeanDepth - -`func (o *V0037DiagStatistics) HasScheduleCycleMeanDepth() bool` - -HasScheduleCycleMeanDepth returns a boolean if a field has been set. - -### GetScheduleCyclePerMinute - -`func (o *V0037DiagStatistics) GetScheduleCyclePerMinute() int32` - -GetScheduleCyclePerMinute returns the ScheduleCyclePerMinute field if non-nil, zero value otherwise. - -### GetScheduleCyclePerMinuteOk - -`func (o *V0037DiagStatistics) GetScheduleCyclePerMinuteOk() (*int32, bool)` - -GetScheduleCyclePerMinuteOk returns a tuple with the ScheduleCyclePerMinute field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetScheduleCyclePerMinute - -`func (o *V0037DiagStatistics) SetScheduleCyclePerMinute(v int32)` - -SetScheduleCyclePerMinute sets ScheduleCyclePerMinute field to given value. - -### HasScheduleCyclePerMinute - -`func (o *V0037DiagStatistics) HasScheduleCyclePerMinute() bool` - -HasScheduleCyclePerMinute returns a boolean if a field has been set. - -### GetScheduleQueueLength - -`func (o *V0037DiagStatistics) GetScheduleQueueLength() int32` - -GetScheduleQueueLength returns the ScheduleQueueLength field if non-nil, zero value otherwise. - -### GetScheduleQueueLengthOk - -`func (o *V0037DiagStatistics) GetScheduleQueueLengthOk() (*int32, bool)` - -GetScheduleQueueLengthOk returns a tuple with the ScheduleQueueLength field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetScheduleQueueLength - -`func (o *V0037DiagStatistics) SetScheduleQueueLength(v int32)` - -SetScheduleQueueLength sets ScheduleQueueLength field to given value. - -### HasScheduleQueueLength - -`func (o *V0037DiagStatistics) HasScheduleQueueLength() bool` - -HasScheduleQueueLength returns a boolean if a field has been set. - -### GetJobsSubmitted - -`func (o *V0037DiagStatistics) GetJobsSubmitted() int32` - -GetJobsSubmitted returns the JobsSubmitted field if non-nil, zero value otherwise. - -### GetJobsSubmittedOk - -`func (o *V0037DiagStatistics) GetJobsSubmittedOk() (*int32, bool)` - -GetJobsSubmittedOk returns a tuple with the JobsSubmitted field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetJobsSubmitted - -`func (o *V0037DiagStatistics) SetJobsSubmitted(v int32)` - -SetJobsSubmitted sets JobsSubmitted field to given value. - -### HasJobsSubmitted - -`func (o *V0037DiagStatistics) HasJobsSubmitted() bool` - -HasJobsSubmitted returns a boolean if a field has been set. - -### GetJobsStarted - -`func (o *V0037DiagStatistics) GetJobsStarted() int32` - -GetJobsStarted returns the JobsStarted field if non-nil, zero value otherwise. - -### GetJobsStartedOk - -`func (o *V0037DiagStatistics) GetJobsStartedOk() (*int32, bool)` - -GetJobsStartedOk returns a tuple with the JobsStarted field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetJobsStarted - -`func (o *V0037DiagStatistics) SetJobsStarted(v int32)` - -SetJobsStarted sets JobsStarted field to given value. - -### HasJobsStarted - -`func (o *V0037DiagStatistics) HasJobsStarted() bool` - -HasJobsStarted returns a boolean if a field has been set. - -### GetJobsCompleted - -`func (o *V0037DiagStatistics) GetJobsCompleted() int32` - -GetJobsCompleted returns the JobsCompleted field if non-nil, zero value otherwise. - -### GetJobsCompletedOk - -`func (o *V0037DiagStatistics) GetJobsCompletedOk() (*int32, bool)` - -GetJobsCompletedOk returns a tuple with the JobsCompleted field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetJobsCompleted - -`func (o *V0037DiagStatistics) SetJobsCompleted(v int32)` - -SetJobsCompleted sets JobsCompleted field to given value. - -### HasJobsCompleted - -`func (o *V0037DiagStatistics) HasJobsCompleted() bool` - -HasJobsCompleted returns a boolean if a field has been set. - -### GetJobsCanceled - -`func (o *V0037DiagStatistics) GetJobsCanceled() int32` - -GetJobsCanceled returns the JobsCanceled field if non-nil, zero value otherwise. - -### GetJobsCanceledOk - -`func (o *V0037DiagStatistics) GetJobsCanceledOk() (*int32, bool)` - -GetJobsCanceledOk returns a tuple with the JobsCanceled field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetJobsCanceled - -`func (o *V0037DiagStatistics) SetJobsCanceled(v int32)` - -SetJobsCanceled sets JobsCanceled field to given value. - -### HasJobsCanceled - -`func (o *V0037DiagStatistics) HasJobsCanceled() bool` - -HasJobsCanceled returns a boolean if a field has been set. - -### GetJobsFailed - -`func (o *V0037DiagStatistics) GetJobsFailed() int32` - -GetJobsFailed returns the JobsFailed field if non-nil, zero value otherwise. - -### GetJobsFailedOk - -`func (o *V0037DiagStatistics) GetJobsFailedOk() (*int32, bool)` - -GetJobsFailedOk returns a tuple with the JobsFailed field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetJobsFailed - -`func (o *V0037DiagStatistics) SetJobsFailed(v int32)` - -SetJobsFailed sets JobsFailed field to given value. - -### HasJobsFailed - -`func (o *V0037DiagStatistics) HasJobsFailed() bool` - -HasJobsFailed returns a boolean if a field has been set. - -### GetJobsPending - -`func (o *V0037DiagStatistics) GetJobsPending() int32` - -GetJobsPending returns the JobsPending field if non-nil, zero value otherwise. - -### GetJobsPendingOk - -`func (o *V0037DiagStatistics) GetJobsPendingOk() (*int32, bool)` - -GetJobsPendingOk returns a tuple with the JobsPending field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetJobsPending - -`func (o *V0037DiagStatistics) SetJobsPending(v int32)` - -SetJobsPending sets JobsPending field to given value. - -### HasJobsPending - -`func (o *V0037DiagStatistics) HasJobsPending() bool` - -HasJobsPending returns a boolean if a field has been set. - -### GetJobsRunning - -`func (o *V0037DiagStatistics) GetJobsRunning() int32` - -GetJobsRunning returns the JobsRunning field if non-nil, zero value otherwise. - -### GetJobsRunningOk - -`func (o *V0037DiagStatistics) GetJobsRunningOk() (*int32, bool)` - -GetJobsRunningOk returns a tuple with the JobsRunning field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetJobsRunning - -`func (o *V0037DiagStatistics) SetJobsRunning(v int32)` - -SetJobsRunning sets JobsRunning field to given value. - -### HasJobsRunning - -`func (o *V0037DiagStatistics) HasJobsRunning() bool` - -HasJobsRunning returns a boolean if a field has been set. - -### GetJobStatesTs - -`func (o *V0037DiagStatistics) GetJobStatesTs() int32` - -GetJobStatesTs returns the JobStatesTs field if non-nil, zero value otherwise. - -### GetJobStatesTsOk - -`func (o *V0037DiagStatistics) GetJobStatesTsOk() (*int32, bool)` - -GetJobStatesTsOk returns a tuple with the JobStatesTs field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetJobStatesTs - -`func (o *V0037DiagStatistics) SetJobStatesTs(v int32)` - -SetJobStatesTs sets JobStatesTs field to given value. - -### HasJobStatesTs - -`func (o *V0037DiagStatistics) HasJobStatesTs() bool` - -HasJobStatesTs returns a boolean if a field has been set. - -### GetBfBackfilledJobs - -`func (o *V0037DiagStatistics) GetBfBackfilledJobs() int32` - -GetBfBackfilledJobs returns the BfBackfilledJobs field if non-nil, zero value otherwise. - -### GetBfBackfilledJobsOk - -`func (o *V0037DiagStatistics) GetBfBackfilledJobsOk() (*int32, bool)` - -GetBfBackfilledJobsOk returns a tuple with the BfBackfilledJobs field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetBfBackfilledJobs - -`func (o *V0037DiagStatistics) SetBfBackfilledJobs(v int32)` - -SetBfBackfilledJobs sets BfBackfilledJobs field to given value. - -### HasBfBackfilledJobs - -`func (o *V0037DiagStatistics) HasBfBackfilledJobs() bool` - -HasBfBackfilledJobs returns a boolean if a field has been set. - -### GetBfLastBackfilledJobs - -`func (o *V0037DiagStatistics) GetBfLastBackfilledJobs() int32` - -GetBfLastBackfilledJobs returns the BfLastBackfilledJobs field if non-nil, zero value otherwise. - -### GetBfLastBackfilledJobsOk - -`func (o *V0037DiagStatistics) GetBfLastBackfilledJobsOk() (*int32, bool)` - -GetBfLastBackfilledJobsOk returns a tuple with the BfLastBackfilledJobs field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetBfLastBackfilledJobs - -`func (o *V0037DiagStatistics) SetBfLastBackfilledJobs(v int32)` - -SetBfLastBackfilledJobs sets BfLastBackfilledJobs field to given value. - -### HasBfLastBackfilledJobs - -`func (o *V0037DiagStatistics) HasBfLastBackfilledJobs() bool` - -HasBfLastBackfilledJobs returns a boolean if a field has been set. - -### GetBfBackfilledHetJobs - -`func (o *V0037DiagStatistics) GetBfBackfilledHetJobs() int32` - -GetBfBackfilledHetJobs returns the BfBackfilledHetJobs field if non-nil, zero value otherwise. - -### GetBfBackfilledHetJobsOk - -`func (o *V0037DiagStatistics) GetBfBackfilledHetJobsOk() (*int32, bool)` - -GetBfBackfilledHetJobsOk returns a tuple with the BfBackfilledHetJobs field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetBfBackfilledHetJobs - -`func (o *V0037DiagStatistics) SetBfBackfilledHetJobs(v int32)` - -SetBfBackfilledHetJobs sets BfBackfilledHetJobs field to given value. - -### HasBfBackfilledHetJobs - -`func (o *V0037DiagStatistics) HasBfBackfilledHetJobs() bool` - -HasBfBackfilledHetJobs returns a boolean if a field has been set. - -### GetBfCycleCounter - -`func (o *V0037DiagStatistics) GetBfCycleCounter() int32` - -GetBfCycleCounter returns the BfCycleCounter field if non-nil, zero value otherwise. - -### GetBfCycleCounterOk - -`func (o *V0037DiagStatistics) GetBfCycleCounterOk() (*int32, bool)` - -GetBfCycleCounterOk returns a tuple with the BfCycleCounter field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetBfCycleCounter - -`func (o *V0037DiagStatistics) SetBfCycleCounter(v int32)` - -SetBfCycleCounter sets BfCycleCounter field to given value. - -### HasBfCycleCounter - -`func (o *V0037DiagStatistics) HasBfCycleCounter() bool` - -HasBfCycleCounter returns a boolean if a field has been set. - -### GetBfCycleMean - -`func (o *V0037DiagStatistics) GetBfCycleMean() int32` - -GetBfCycleMean returns the BfCycleMean field if non-nil, zero value otherwise. - -### GetBfCycleMeanOk - -`func (o *V0037DiagStatistics) GetBfCycleMeanOk() (*int32, bool)` - -GetBfCycleMeanOk returns a tuple with the BfCycleMean field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetBfCycleMean - -`func (o *V0037DiagStatistics) SetBfCycleMean(v int32)` - -SetBfCycleMean sets BfCycleMean field to given value. - -### HasBfCycleMean - -`func (o *V0037DiagStatistics) HasBfCycleMean() bool` - -HasBfCycleMean returns a boolean if a field has been set. - -### GetBfCycleMax - -`func (o *V0037DiagStatistics) GetBfCycleMax() int32` - -GetBfCycleMax returns the BfCycleMax field if non-nil, zero value otherwise. - -### GetBfCycleMaxOk - -`func (o *V0037DiagStatistics) GetBfCycleMaxOk() (*int32, bool)` - -GetBfCycleMaxOk returns a tuple with the BfCycleMax field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetBfCycleMax - -`func (o *V0037DiagStatistics) SetBfCycleMax(v int32)` - -SetBfCycleMax sets BfCycleMax field to given value. - -### HasBfCycleMax - -`func (o *V0037DiagStatistics) HasBfCycleMax() bool` - -HasBfCycleMax returns a boolean if a field has been set. - -### GetBfLastDepth - -`func (o *V0037DiagStatistics) GetBfLastDepth() int32` - -GetBfLastDepth returns the BfLastDepth field if non-nil, zero value otherwise. - -### GetBfLastDepthOk - -`func (o *V0037DiagStatistics) GetBfLastDepthOk() (*int32, bool)` - -GetBfLastDepthOk returns a tuple with the BfLastDepth field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetBfLastDepth - -`func (o *V0037DiagStatistics) SetBfLastDepth(v int32)` - -SetBfLastDepth sets BfLastDepth field to given value. - -### HasBfLastDepth - -`func (o *V0037DiagStatistics) HasBfLastDepth() bool` - -HasBfLastDepth returns a boolean if a field has been set. - -### GetBfLastDepthTry - -`func (o *V0037DiagStatistics) GetBfLastDepthTry() int32` - -GetBfLastDepthTry returns the BfLastDepthTry field if non-nil, zero value otherwise. - -### GetBfLastDepthTryOk - -`func (o *V0037DiagStatistics) GetBfLastDepthTryOk() (*int32, bool)` - -GetBfLastDepthTryOk returns a tuple with the BfLastDepthTry field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetBfLastDepthTry - -`func (o *V0037DiagStatistics) SetBfLastDepthTry(v int32)` - -SetBfLastDepthTry sets BfLastDepthTry field to given value. - -### HasBfLastDepthTry - -`func (o *V0037DiagStatistics) HasBfLastDepthTry() bool` - -HasBfLastDepthTry returns a boolean if a field has been set. - -### GetBfDepthMean - -`func (o *V0037DiagStatistics) GetBfDepthMean() int32` - -GetBfDepthMean returns the BfDepthMean field if non-nil, zero value otherwise. - -### GetBfDepthMeanOk - -`func (o *V0037DiagStatistics) GetBfDepthMeanOk() (*int32, bool)` - -GetBfDepthMeanOk returns a tuple with the BfDepthMean field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetBfDepthMean - -`func (o *V0037DiagStatistics) SetBfDepthMean(v int32)` - -SetBfDepthMean sets BfDepthMean field to given value. - -### HasBfDepthMean - -`func (o *V0037DiagStatistics) HasBfDepthMean() bool` - -HasBfDepthMean returns a boolean if a field has been set. - -### GetBfDepthMeanTry - -`func (o *V0037DiagStatistics) GetBfDepthMeanTry() int32` - -GetBfDepthMeanTry returns the BfDepthMeanTry field if non-nil, zero value otherwise. - -### GetBfDepthMeanTryOk - -`func (o *V0037DiagStatistics) GetBfDepthMeanTryOk() (*int32, bool)` - -GetBfDepthMeanTryOk returns a tuple with the BfDepthMeanTry field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetBfDepthMeanTry - -`func (o *V0037DiagStatistics) SetBfDepthMeanTry(v int32)` - -SetBfDepthMeanTry sets BfDepthMeanTry field to given value. - -### HasBfDepthMeanTry - -`func (o *V0037DiagStatistics) HasBfDepthMeanTry() bool` - -HasBfDepthMeanTry returns a boolean if a field has been set. - -### GetBfCycleLast - -`func (o *V0037DiagStatistics) GetBfCycleLast() int32` - -GetBfCycleLast returns the BfCycleLast field if non-nil, zero value otherwise. - -### GetBfCycleLastOk - -`func (o *V0037DiagStatistics) GetBfCycleLastOk() (*int32, bool)` - -GetBfCycleLastOk returns a tuple with the BfCycleLast field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetBfCycleLast - -`func (o *V0037DiagStatistics) SetBfCycleLast(v int32)` - -SetBfCycleLast sets BfCycleLast field to given value. - -### HasBfCycleLast - -`func (o *V0037DiagStatistics) HasBfCycleLast() bool` - -HasBfCycleLast returns a boolean if a field has been set. - -### GetBfQueueLen - -`func (o *V0037DiagStatistics) GetBfQueueLen() int32` - -GetBfQueueLen returns the BfQueueLen field if non-nil, zero value otherwise. - -### GetBfQueueLenOk - -`func (o *V0037DiagStatistics) GetBfQueueLenOk() (*int32, bool)` - -GetBfQueueLenOk returns a tuple with the BfQueueLen field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetBfQueueLen - -`func (o *V0037DiagStatistics) SetBfQueueLen(v int32)` - -SetBfQueueLen sets BfQueueLen field to given value. - -### HasBfQueueLen - -`func (o *V0037DiagStatistics) HasBfQueueLen() bool` - -HasBfQueueLen returns a boolean if a field has been set. - -### GetBfQueueLenMean - -`func (o *V0037DiagStatistics) GetBfQueueLenMean() int32` - -GetBfQueueLenMean returns the BfQueueLenMean field if non-nil, zero value otherwise. - -### GetBfQueueLenMeanOk - -`func (o *V0037DiagStatistics) GetBfQueueLenMeanOk() (*int32, bool)` - -GetBfQueueLenMeanOk returns a tuple with the BfQueueLenMean field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetBfQueueLenMean - -`func (o *V0037DiagStatistics) SetBfQueueLenMean(v int32)` - -SetBfQueueLenMean sets BfQueueLenMean field to given value. - -### HasBfQueueLenMean - -`func (o *V0037DiagStatistics) HasBfQueueLenMean() bool` - -HasBfQueueLenMean returns a boolean if a field has been set. - -### GetBfWhenLastCycle - -`func (o *V0037DiagStatistics) GetBfWhenLastCycle() int32` - -GetBfWhenLastCycle returns the BfWhenLastCycle field if non-nil, zero value otherwise. - -### GetBfWhenLastCycleOk - -`func (o *V0037DiagStatistics) GetBfWhenLastCycleOk() (*int32, bool)` - -GetBfWhenLastCycleOk returns a tuple with the BfWhenLastCycle field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetBfWhenLastCycle - -`func (o *V0037DiagStatistics) SetBfWhenLastCycle(v int32)` - -SetBfWhenLastCycle sets BfWhenLastCycle field to given value. - -### HasBfWhenLastCycle - -`func (o *V0037DiagStatistics) HasBfWhenLastCycle() bool` - -HasBfWhenLastCycle returns a boolean if a field has been set. - -### GetBfActive - -`func (o *V0037DiagStatistics) GetBfActive() bool` - -GetBfActive returns the BfActive field if non-nil, zero value otherwise. - -### GetBfActiveOk - -`func (o *V0037DiagStatistics) GetBfActiveOk() (*bool, bool)` - -GetBfActiveOk returns a tuple with the BfActive field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetBfActive - -`func (o *V0037DiagStatistics) SetBfActive(v bool)` - -SetBfActive sets BfActive field to given value. - -### HasBfActive - -`func (o *V0037DiagStatistics) HasBfActive() bool` - -HasBfActive returns a boolean if a field has been set. - - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/internal/api/0.0.37/docs/V0037Error.md b/internal/api/0.0.37/docs/V0037Error.md deleted file mode 100644 index c5bc66f..0000000 --- a/internal/api/0.0.37/docs/V0037Error.md +++ /dev/null @@ -1,82 +0,0 @@ -# V0037Error - -## Properties - -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**Error** | Pointer to **string** | error message | [optional] -**Errno** | Pointer to **int32** | error number | [optional] - -## Methods - -### NewV0037Error - -`func NewV0037Error() *V0037Error` - -NewV0037Error instantiates a new V0037Error object -This constructor will assign default values to properties that have it defined, -and makes sure properties required by API are set, but the set of arguments -will change when the set of required properties is changed - -### NewV0037ErrorWithDefaults - -`func NewV0037ErrorWithDefaults() *V0037Error` - -NewV0037ErrorWithDefaults instantiates a new V0037Error object -This constructor will only assign default values to properties that have it defined, -but it doesn't guarantee that properties required by API are set - -### GetError - -`func (o *V0037Error) GetError() string` - -GetError returns the Error field if non-nil, zero value otherwise. - -### GetErrorOk - -`func (o *V0037Error) GetErrorOk() (*string, bool)` - -GetErrorOk returns a tuple with the Error field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetError - -`func (o *V0037Error) SetError(v string)` - -SetError sets Error field to given value. - -### HasError - -`func (o *V0037Error) HasError() bool` - -HasError returns a boolean if a field has been set. - -### GetErrno - -`func (o *V0037Error) GetErrno() int32` - -GetErrno returns the Errno field if non-nil, zero value otherwise. - -### GetErrnoOk - -`func (o *V0037Error) GetErrnoOk() (*int32, bool)` - -GetErrnoOk returns a tuple with the Errno field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetErrno - -`func (o *V0037Error) SetErrno(v int32)` - -SetErrno sets Errno field to given value. - -### HasErrno - -`func (o *V0037Error) HasErrno() bool` - -HasErrno returns a boolean if a field has been set. - - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/internal/api/0.0.37/docs/V0037JobProperties.md b/internal/api/0.0.37/docs/V0037JobProperties.md deleted file mode 100644 index f8dc44c..0000000 --- a/internal/api/0.0.37/docs/V0037JobProperties.md +++ /dev/null @@ -1,1871 +0,0 @@ -# V0037JobProperties - -## Properties - -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**Account** | Pointer to **string** | Charge resources used by this job to specified account. | [optional] -**AccountGatherFrequency** | Pointer to **string** | Define the job accounting and profiling sampling intervals. | [optional] -**Argv** | Pointer to **[]string** | Arguments to the script. | [optional] -**Array** | Pointer to **string** | Submit a job array, multiple jobs to be executed with identical parameters. The indexes specification identifies what array index values should be used. | [optional] -**BatchFeatures** | Pointer to **string** | features required for batch script's node | [optional] -**BeginTime** | Pointer to **int64** | Submit the batch script to the Slurm controller immediately, like normal, but tell the controller to defer the allocation of the job until the specified time. | [optional] -**BurstBuffer** | Pointer to **string** | Burst buffer specification. | [optional] -**ClusterConstraint** | Pointer to **string** | Specifies features that a federated cluster must have to have a sibling job submitted to it. | [optional] -**Comment** | Pointer to **string** | An arbitrary comment. | [optional] -**Constraints** | Pointer to **string** | node features required by job. | [optional] -**CoreSpecification** | Pointer to **int32** | Count of specialized threads per node reserved by the job for system operations and not used by the application. | [optional] -**CoresPerSocket** | Pointer to **int32** | Restrict node selection to nodes with at least the specified number of cores per socket. | [optional] -**CpuBinding** | Pointer to **string** | Cpu binding | [optional] -**CpuBindingHint** | Pointer to **string** | Cpu binding hint | [optional] -**CpuFrequency** | Pointer to **string** | Request that job steps initiated by srun commands inside this sbatch script be run at some requested frequency if possible, on the CPUs selected for the step on the compute node(s). | [optional] -**CpusPerGpu** | Pointer to **string** | Number of CPUs requested per allocated GPU. | [optional] -**CpusPerTask** | Pointer to **int32** | Advise the Slurm controller that ensuing job steps will require ncpus number of processors per task. | [optional] -**CurrentWorkingDirectory** | Pointer to **string** | Instruct Slurm to connect the batch script's standard output directly to the file name. | [optional] -**Deadline** | Pointer to **string** | Remove the job if no ending is possible before this deadline (start > (deadline - time[-min])). | [optional] -**DelayBoot** | Pointer to **int32** | Do not reboot nodes in order to satisfied this job's feature specification if the job has been eligible to run for less than this time period. | [optional] -**Dependency** | Pointer to **string** | Defer the start of this job until the specified dependencies have been satisfied completed. | [optional] -**Distribution** | Pointer to **string** | Specify alternate distribution methods for remote processes. | [optional] -**Environment** | **map[string]interface{}** | Dictionary of environment entries. | -**Exclusive** | Pointer to **string** | The job allocation can share nodes just other users with the \"user\" option or with the \"mcs\" option). | [optional] -**GetUserEnvironment** | Pointer to **bool** | Load new login environment for user on job node. | [optional] -**Gres** | Pointer to **string** | Specifies a comma delimited list of generic consumable resources. | [optional] -**GresFlags** | Pointer to **string** | Specify generic resource task binding options. | [optional] -**GpuBinding** | Pointer to **string** | Requested binding of tasks to GPU. | [optional] -**GpuFrequency** | Pointer to **string** | Requested GPU frequency. | [optional] -**Gpus** | Pointer to **string** | GPUs per job. | [optional] -**GpusPerNode** | Pointer to **string** | GPUs per node. | [optional] -**GpusPerSocket** | Pointer to **string** | GPUs per socket. | [optional] -**GpusPerTask** | Pointer to **string** | GPUs per task. | [optional] -**Hold** | Pointer to **bool** | Specify the job is to be submitted in a held state (priority of zero). | [optional] -**KillOnInvalidDependency** | Pointer to **bool** | If a job has an invalid dependency, then Slurm is to terminate it. | [optional] -**Licenses** | Pointer to **string** | Specification of licenses (or other resources available on all nodes of the cluster) which must be allocated to this job. | [optional] -**MailType** | Pointer to **string** | Notify user by email when certain event types occur. | [optional] -**MailUser** | Pointer to **string** | User to receive email notification of state changes as defined by mail_type. | [optional] -**McsLabel** | Pointer to **string** | This parameter is a group among the groups of the user. | [optional] -**MemoryBinding** | Pointer to **string** | Bind tasks to memory. | [optional] -**MemoryPerCpu** | Pointer to **int32** | Minimum real memory per cpu (MB). | [optional] -**MemoryPerGpu** | Pointer to **int32** | Minimum memory required per allocated GPU. | [optional] -**MemoryPerNode** | Pointer to **int32** | Minimum real memory per node (MB). | [optional] -**MinimumCpusPerNode** | Pointer to **int32** | Minimum number of CPUs per node. | [optional] -**MinimumNodes** | Pointer to **bool** | If a range of node counts is given, prefer the smaller count. | [optional] -**Name** | Pointer to **string** | Specify a name for the job allocation. | [optional] -**Nice** | Pointer to **string** | Run the job with an adjusted scheduling priority within Slurm. | [optional] -**NoKill** | Pointer to **bool** | Do not automatically terminate a job if one of the nodes it has been allocated fails. | [optional] -**Nodes** | Pointer to **[]int32** | Request that a minimum of minnodes nodes and a maximum node count. | [optional] -**OpenMode** | Pointer to **string** | Open the output and error files using append or truncate mode as specified. | [optional] [default to "append"] -**Partition** | Pointer to **string** | Request a specific partition for the resource allocation. | [optional] -**Priority** | Pointer to **string** | Request a specific job priority. | [optional] -**Qos** | Pointer to **string** | Request a quality of service for the job. | [optional] -**Requeue** | Pointer to **bool** | Specifies that the batch job should eligible to being requeue. | [optional] -**Reservation** | Pointer to **string** | Allocate resources for the job from the named reservation. | [optional] -**Signal** | Pointer to **string** | When a job is within sig_time seconds of its end time, send it the signal sig_num. | [optional] -**SocketsPerNode** | Pointer to **int32** | Restrict node selection to nodes with at least the specified number of sockets. | [optional] -**SpreadJob** | Pointer to **bool** | Spread the job allocation over as many nodes as possible and attempt to evenly distribute tasks across the allocated nodes. | [optional] -**StandardError** | Pointer to **string** | Instruct Slurm to connect the batch script's standard error directly to the file name. | [optional] -**StandardInput** | Pointer to **string** | Instruct Slurm to connect the batch script's standard input directly to the file name specified. | [optional] -**StandardOutput** | Pointer to **string** | Instruct Slurm to connect the batch script's standard output directly to the file name. | [optional] -**Tasks** | Pointer to **int32** | Advises the Slurm controller that job steps run within the allocation will launch a maximum of number tasks and to provide for sufficient resources. | [optional] -**TasksPerCore** | Pointer to **int32** | Request the maximum ntasks be invoked on each core. | [optional] -**TasksPerNode** | Pointer to **int32** | Request the maximum ntasks be invoked on each node. | [optional] -**TasksPerSocket** | Pointer to **int32** | Request the maximum ntasks be invoked on each socket. | [optional] -**ThreadSpecification** | Pointer to **int32** | Count of specialized threads per node reserved by the job for system operations and not used by the application. | [optional] -**ThreadsPerCore** | Pointer to **int32** | Restrict node selection to nodes with at least the specified number of threads per core. | [optional] -**TimeLimit** | Pointer to **int32** | Step time limit. | [optional] -**TimeMinimum** | Pointer to **int32** | Minimum run time in minutes. | [optional] -**WaitAllNodes** | Pointer to **bool** | Do not begin execution until all nodes are ready for use. | [optional] -**Wckey** | Pointer to **string** | Specify wckey to be used with job. | [optional] - -## Methods - -### NewV0037JobProperties - -`func NewV0037JobProperties(environment map[string]interface{}, ) *V0037JobProperties` - -NewV0037JobProperties instantiates a new V0037JobProperties object -This constructor will assign default values to properties that have it defined, -and makes sure properties required by API are set, but the set of arguments -will change when the set of required properties is changed - -### NewV0037JobPropertiesWithDefaults - -`func NewV0037JobPropertiesWithDefaults() *V0037JobProperties` - -NewV0037JobPropertiesWithDefaults instantiates a new V0037JobProperties object -This constructor will only assign default values to properties that have it defined, -but it doesn't guarantee that properties required by API are set - -### GetAccount - -`func (o *V0037JobProperties) GetAccount() string` - -GetAccount returns the Account field if non-nil, zero value otherwise. - -### GetAccountOk - -`func (o *V0037JobProperties) GetAccountOk() (*string, bool)` - -GetAccountOk returns a tuple with the Account field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetAccount - -`func (o *V0037JobProperties) SetAccount(v string)` - -SetAccount sets Account field to given value. - -### HasAccount - -`func (o *V0037JobProperties) HasAccount() bool` - -HasAccount returns a boolean if a field has been set. - -### GetAccountGatherFrequency - -`func (o *V0037JobProperties) GetAccountGatherFrequency() string` - -GetAccountGatherFrequency returns the AccountGatherFrequency field if non-nil, zero value otherwise. - -### GetAccountGatherFrequencyOk - -`func (o *V0037JobProperties) GetAccountGatherFrequencyOk() (*string, bool)` - -GetAccountGatherFrequencyOk returns a tuple with the AccountGatherFrequency field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetAccountGatherFrequency - -`func (o *V0037JobProperties) SetAccountGatherFrequency(v string)` - -SetAccountGatherFrequency sets AccountGatherFrequency field to given value. - -### HasAccountGatherFrequency - -`func (o *V0037JobProperties) HasAccountGatherFrequency() bool` - -HasAccountGatherFrequency returns a boolean if a field has been set. - -### GetArgv - -`func (o *V0037JobProperties) GetArgv() []string` - -GetArgv returns the Argv field if non-nil, zero value otherwise. - -### GetArgvOk - -`func (o *V0037JobProperties) GetArgvOk() (*[]string, bool)` - -GetArgvOk returns a tuple with the Argv field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetArgv - -`func (o *V0037JobProperties) SetArgv(v []string)` - -SetArgv sets Argv field to given value. - -### HasArgv - -`func (o *V0037JobProperties) HasArgv() bool` - -HasArgv returns a boolean if a field has been set. - -### GetArray - -`func (o *V0037JobProperties) GetArray() string` - -GetArray returns the Array field if non-nil, zero value otherwise. - -### GetArrayOk - -`func (o *V0037JobProperties) GetArrayOk() (*string, bool)` - -GetArrayOk returns a tuple with the Array field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetArray - -`func (o *V0037JobProperties) SetArray(v string)` - -SetArray sets Array field to given value. - -### HasArray - -`func (o *V0037JobProperties) HasArray() bool` - -HasArray returns a boolean if a field has been set. - -### GetBatchFeatures - -`func (o *V0037JobProperties) GetBatchFeatures() string` - -GetBatchFeatures returns the BatchFeatures field if non-nil, zero value otherwise. - -### GetBatchFeaturesOk - -`func (o *V0037JobProperties) GetBatchFeaturesOk() (*string, bool)` - -GetBatchFeaturesOk returns a tuple with the BatchFeatures field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetBatchFeatures - -`func (o *V0037JobProperties) SetBatchFeatures(v string)` - -SetBatchFeatures sets BatchFeatures field to given value. - -### HasBatchFeatures - -`func (o *V0037JobProperties) HasBatchFeatures() bool` - -HasBatchFeatures returns a boolean if a field has been set. - -### GetBeginTime - -`func (o *V0037JobProperties) GetBeginTime() int64` - -GetBeginTime returns the BeginTime field if non-nil, zero value otherwise. - -### GetBeginTimeOk - -`func (o *V0037JobProperties) GetBeginTimeOk() (*int64, bool)` - -GetBeginTimeOk returns a tuple with the BeginTime field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetBeginTime - -`func (o *V0037JobProperties) SetBeginTime(v int64)` - -SetBeginTime sets BeginTime field to given value. - -### HasBeginTime - -`func (o *V0037JobProperties) HasBeginTime() bool` - -HasBeginTime returns a boolean if a field has been set. - -### GetBurstBuffer - -`func (o *V0037JobProperties) GetBurstBuffer() string` - -GetBurstBuffer returns the BurstBuffer field if non-nil, zero value otherwise. - -### GetBurstBufferOk - -`func (o *V0037JobProperties) GetBurstBufferOk() (*string, bool)` - -GetBurstBufferOk returns a tuple with the BurstBuffer field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetBurstBuffer - -`func (o *V0037JobProperties) SetBurstBuffer(v string)` - -SetBurstBuffer sets BurstBuffer field to given value. - -### HasBurstBuffer - -`func (o *V0037JobProperties) HasBurstBuffer() bool` - -HasBurstBuffer returns a boolean if a field has been set. - -### GetClusterConstraint - -`func (o *V0037JobProperties) GetClusterConstraint() string` - -GetClusterConstraint returns the ClusterConstraint field if non-nil, zero value otherwise. - -### GetClusterConstraintOk - -`func (o *V0037JobProperties) GetClusterConstraintOk() (*string, bool)` - -GetClusterConstraintOk returns a tuple with the ClusterConstraint field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetClusterConstraint - -`func (o *V0037JobProperties) SetClusterConstraint(v string)` - -SetClusterConstraint sets ClusterConstraint field to given value. - -### HasClusterConstraint - -`func (o *V0037JobProperties) HasClusterConstraint() bool` - -HasClusterConstraint returns a boolean if a field has been set. - -### GetComment - -`func (o *V0037JobProperties) GetComment() string` - -GetComment returns the Comment field if non-nil, zero value otherwise. - -### GetCommentOk - -`func (o *V0037JobProperties) GetCommentOk() (*string, bool)` - -GetCommentOk returns a tuple with the Comment field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetComment - -`func (o *V0037JobProperties) SetComment(v string)` - -SetComment sets Comment field to given value. - -### HasComment - -`func (o *V0037JobProperties) HasComment() bool` - -HasComment returns a boolean if a field has been set. - -### GetConstraints - -`func (o *V0037JobProperties) GetConstraints() string` - -GetConstraints returns the Constraints field if non-nil, zero value otherwise. - -### GetConstraintsOk - -`func (o *V0037JobProperties) GetConstraintsOk() (*string, bool)` - -GetConstraintsOk returns a tuple with the Constraints field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetConstraints - -`func (o *V0037JobProperties) SetConstraints(v string)` - -SetConstraints sets Constraints field to given value. - -### HasConstraints - -`func (o *V0037JobProperties) HasConstraints() bool` - -HasConstraints returns a boolean if a field has been set. - -### GetCoreSpecification - -`func (o *V0037JobProperties) GetCoreSpecification() int32` - -GetCoreSpecification returns the CoreSpecification field if non-nil, zero value otherwise. - -### GetCoreSpecificationOk - -`func (o *V0037JobProperties) GetCoreSpecificationOk() (*int32, bool)` - -GetCoreSpecificationOk returns a tuple with the CoreSpecification field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetCoreSpecification - -`func (o *V0037JobProperties) SetCoreSpecification(v int32)` - -SetCoreSpecification sets CoreSpecification field to given value. - -### HasCoreSpecification - -`func (o *V0037JobProperties) HasCoreSpecification() bool` - -HasCoreSpecification returns a boolean if a field has been set. - -### GetCoresPerSocket - -`func (o *V0037JobProperties) GetCoresPerSocket() int32` - -GetCoresPerSocket returns the CoresPerSocket field if non-nil, zero value otherwise. - -### GetCoresPerSocketOk - -`func (o *V0037JobProperties) GetCoresPerSocketOk() (*int32, bool)` - -GetCoresPerSocketOk returns a tuple with the CoresPerSocket field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetCoresPerSocket - -`func (o *V0037JobProperties) SetCoresPerSocket(v int32)` - -SetCoresPerSocket sets CoresPerSocket field to given value. - -### HasCoresPerSocket - -`func (o *V0037JobProperties) HasCoresPerSocket() bool` - -HasCoresPerSocket returns a boolean if a field has been set. - -### GetCpuBinding - -`func (o *V0037JobProperties) GetCpuBinding() string` - -GetCpuBinding returns the CpuBinding field if non-nil, zero value otherwise. - -### GetCpuBindingOk - -`func (o *V0037JobProperties) GetCpuBindingOk() (*string, bool)` - -GetCpuBindingOk returns a tuple with the CpuBinding field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetCpuBinding - -`func (o *V0037JobProperties) SetCpuBinding(v string)` - -SetCpuBinding sets CpuBinding field to given value. - -### HasCpuBinding - -`func (o *V0037JobProperties) HasCpuBinding() bool` - -HasCpuBinding returns a boolean if a field has been set. - -### GetCpuBindingHint - -`func (o *V0037JobProperties) GetCpuBindingHint() string` - -GetCpuBindingHint returns the CpuBindingHint field if non-nil, zero value otherwise. - -### GetCpuBindingHintOk - -`func (o *V0037JobProperties) GetCpuBindingHintOk() (*string, bool)` - -GetCpuBindingHintOk returns a tuple with the CpuBindingHint field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetCpuBindingHint - -`func (o *V0037JobProperties) SetCpuBindingHint(v string)` - -SetCpuBindingHint sets CpuBindingHint field to given value. - -### HasCpuBindingHint - -`func (o *V0037JobProperties) HasCpuBindingHint() bool` - -HasCpuBindingHint returns a boolean if a field has been set. - -### GetCpuFrequency - -`func (o *V0037JobProperties) GetCpuFrequency() string` - -GetCpuFrequency returns the CpuFrequency field if non-nil, zero value otherwise. - -### GetCpuFrequencyOk - -`func (o *V0037JobProperties) GetCpuFrequencyOk() (*string, bool)` - -GetCpuFrequencyOk returns a tuple with the CpuFrequency field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetCpuFrequency - -`func (o *V0037JobProperties) SetCpuFrequency(v string)` - -SetCpuFrequency sets CpuFrequency field to given value. - -### HasCpuFrequency - -`func (o *V0037JobProperties) HasCpuFrequency() bool` - -HasCpuFrequency returns a boolean if a field has been set. - -### GetCpusPerGpu - -`func (o *V0037JobProperties) GetCpusPerGpu() string` - -GetCpusPerGpu returns the CpusPerGpu field if non-nil, zero value otherwise. - -### GetCpusPerGpuOk - -`func (o *V0037JobProperties) GetCpusPerGpuOk() (*string, bool)` - -GetCpusPerGpuOk returns a tuple with the CpusPerGpu field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetCpusPerGpu - -`func (o *V0037JobProperties) SetCpusPerGpu(v string)` - -SetCpusPerGpu sets CpusPerGpu field to given value. - -### HasCpusPerGpu - -`func (o *V0037JobProperties) HasCpusPerGpu() bool` - -HasCpusPerGpu returns a boolean if a field has been set. - -### GetCpusPerTask - -`func (o *V0037JobProperties) GetCpusPerTask() int32` - -GetCpusPerTask returns the CpusPerTask field if non-nil, zero value otherwise. - -### GetCpusPerTaskOk - -`func (o *V0037JobProperties) GetCpusPerTaskOk() (*int32, bool)` - -GetCpusPerTaskOk returns a tuple with the CpusPerTask field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetCpusPerTask - -`func (o *V0037JobProperties) SetCpusPerTask(v int32)` - -SetCpusPerTask sets CpusPerTask field to given value. - -### HasCpusPerTask - -`func (o *V0037JobProperties) HasCpusPerTask() bool` - -HasCpusPerTask returns a boolean if a field has been set. - -### GetCurrentWorkingDirectory - -`func (o *V0037JobProperties) GetCurrentWorkingDirectory() string` - -GetCurrentWorkingDirectory returns the CurrentWorkingDirectory field if non-nil, zero value otherwise. - -### GetCurrentWorkingDirectoryOk - -`func (o *V0037JobProperties) GetCurrentWorkingDirectoryOk() (*string, bool)` - -GetCurrentWorkingDirectoryOk returns a tuple with the CurrentWorkingDirectory field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetCurrentWorkingDirectory - -`func (o *V0037JobProperties) SetCurrentWorkingDirectory(v string)` - -SetCurrentWorkingDirectory sets CurrentWorkingDirectory field to given value. - -### HasCurrentWorkingDirectory - -`func (o *V0037JobProperties) HasCurrentWorkingDirectory() bool` - -HasCurrentWorkingDirectory returns a boolean if a field has been set. - -### GetDeadline - -`func (o *V0037JobProperties) GetDeadline() string` - -GetDeadline returns the Deadline field if non-nil, zero value otherwise. - -### GetDeadlineOk - -`func (o *V0037JobProperties) GetDeadlineOk() (*string, bool)` - -GetDeadlineOk returns a tuple with the Deadline field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetDeadline - -`func (o *V0037JobProperties) SetDeadline(v string)` - -SetDeadline sets Deadline field to given value. - -### HasDeadline - -`func (o *V0037JobProperties) HasDeadline() bool` - -HasDeadline returns a boolean if a field has been set. - -### GetDelayBoot - -`func (o *V0037JobProperties) GetDelayBoot() int32` - -GetDelayBoot returns the DelayBoot field if non-nil, zero value otherwise. - -### GetDelayBootOk - -`func (o *V0037JobProperties) GetDelayBootOk() (*int32, bool)` - -GetDelayBootOk returns a tuple with the DelayBoot field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetDelayBoot - -`func (o *V0037JobProperties) SetDelayBoot(v int32)` - -SetDelayBoot sets DelayBoot field to given value. - -### HasDelayBoot - -`func (o *V0037JobProperties) HasDelayBoot() bool` - -HasDelayBoot returns a boolean if a field has been set. - -### GetDependency - -`func (o *V0037JobProperties) GetDependency() string` - -GetDependency returns the Dependency field if non-nil, zero value otherwise. - -### GetDependencyOk - -`func (o *V0037JobProperties) GetDependencyOk() (*string, bool)` - -GetDependencyOk returns a tuple with the Dependency field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetDependency - -`func (o *V0037JobProperties) SetDependency(v string)` - -SetDependency sets Dependency field to given value. - -### HasDependency - -`func (o *V0037JobProperties) HasDependency() bool` - -HasDependency returns a boolean if a field has been set. - -### GetDistribution - -`func (o *V0037JobProperties) GetDistribution() string` - -GetDistribution returns the Distribution field if non-nil, zero value otherwise. - -### GetDistributionOk - -`func (o *V0037JobProperties) GetDistributionOk() (*string, bool)` - -GetDistributionOk returns a tuple with the Distribution field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetDistribution - -`func (o *V0037JobProperties) SetDistribution(v string)` - -SetDistribution sets Distribution field to given value. - -### HasDistribution - -`func (o *V0037JobProperties) HasDistribution() bool` - -HasDistribution returns a boolean if a field has been set. - -### GetEnvironment - -`func (o *V0037JobProperties) GetEnvironment() map[string]interface{}` - -GetEnvironment returns the Environment field if non-nil, zero value otherwise. - -### GetEnvironmentOk - -`func (o *V0037JobProperties) GetEnvironmentOk() (*map[string]interface{}, bool)` - -GetEnvironmentOk returns a tuple with the Environment field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetEnvironment - -`func (o *V0037JobProperties) SetEnvironment(v map[string]interface{})` - -SetEnvironment sets Environment field to given value. - - -### GetExclusive - -`func (o *V0037JobProperties) GetExclusive() string` - -GetExclusive returns the Exclusive field if non-nil, zero value otherwise. - -### GetExclusiveOk - -`func (o *V0037JobProperties) GetExclusiveOk() (*string, bool)` - -GetExclusiveOk returns a tuple with the Exclusive field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetExclusive - -`func (o *V0037JobProperties) SetExclusive(v string)` - -SetExclusive sets Exclusive field to given value. - -### HasExclusive - -`func (o *V0037JobProperties) HasExclusive() bool` - -HasExclusive returns a boolean if a field has been set. - -### GetGetUserEnvironment - -`func (o *V0037JobProperties) GetGetUserEnvironment() bool` - -GetGetUserEnvironment returns the GetUserEnvironment field if non-nil, zero value otherwise. - -### GetGetUserEnvironmentOk - -`func (o *V0037JobProperties) GetGetUserEnvironmentOk() (*bool, bool)` - -GetGetUserEnvironmentOk returns a tuple with the GetUserEnvironment field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetGetUserEnvironment - -`func (o *V0037JobProperties) SetGetUserEnvironment(v bool)` - -SetGetUserEnvironment sets GetUserEnvironment field to given value. - -### HasGetUserEnvironment - -`func (o *V0037JobProperties) HasGetUserEnvironment() bool` - -HasGetUserEnvironment returns a boolean if a field has been set. - -### GetGres - -`func (o *V0037JobProperties) GetGres() string` - -GetGres returns the Gres field if non-nil, zero value otherwise. - -### GetGresOk - -`func (o *V0037JobProperties) GetGresOk() (*string, bool)` - -GetGresOk returns a tuple with the Gres field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetGres - -`func (o *V0037JobProperties) SetGres(v string)` - -SetGres sets Gres field to given value. - -### HasGres - -`func (o *V0037JobProperties) HasGres() bool` - -HasGres returns a boolean if a field has been set. - -### GetGresFlags - -`func (o *V0037JobProperties) GetGresFlags() string` - -GetGresFlags returns the GresFlags field if non-nil, zero value otherwise. - -### GetGresFlagsOk - -`func (o *V0037JobProperties) GetGresFlagsOk() (*string, bool)` - -GetGresFlagsOk returns a tuple with the GresFlags field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetGresFlags - -`func (o *V0037JobProperties) SetGresFlags(v string)` - -SetGresFlags sets GresFlags field to given value. - -### HasGresFlags - -`func (o *V0037JobProperties) HasGresFlags() bool` - -HasGresFlags returns a boolean if a field has been set. - -### GetGpuBinding - -`func (o *V0037JobProperties) GetGpuBinding() string` - -GetGpuBinding returns the GpuBinding field if non-nil, zero value otherwise. - -### GetGpuBindingOk - -`func (o *V0037JobProperties) GetGpuBindingOk() (*string, bool)` - -GetGpuBindingOk returns a tuple with the GpuBinding field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetGpuBinding - -`func (o *V0037JobProperties) SetGpuBinding(v string)` - -SetGpuBinding sets GpuBinding field to given value. - -### HasGpuBinding - -`func (o *V0037JobProperties) HasGpuBinding() bool` - -HasGpuBinding returns a boolean if a field has been set. - -### GetGpuFrequency - -`func (o *V0037JobProperties) GetGpuFrequency() string` - -GetGpuFrequency returns the GpuFrequency field if non-nil, zero value otherwise. - -### GetGpuFrequencyOk - -`func (o *V0037JobProperties) GetGpuFrequencyOk() (*string, bool)` - -GetGpuFrequencyOk returns a tuple with the GpuFrequency field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetGpuFrequency - -`func (o *V0037JobProperties) SetGpuFrequency(v string)` - -SetGpuFrequency sets GpuFrequency field to given value. - -### HasGpuFrequency - -`func (o *V0037JobProperties) HasGpuFrequency() bool` - -HasGpuFrequency returns a boolean if a field has been set. - -### GetGpus - -`func (o *V0037JobProperties) GetGpus() string` - -GetGpus returns the Gpus field if non-nil, zero value otherwise. - -### GetGpusOk - -`func (o *V0037JobProperties) GetGpusOk() (*string, bool)` - -GetGpusOk returns a tuple with the Gpus field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetGpus - -`func (o *V0037JobProperties) SetGpus(v string)` - -SetGpus sets Gpus field to given value. - -### HasGpus - -`func (o *V0037JobProperties) HasGpus() bool` - -HasGpus returns a boolean if a field has been set. - -### GetGpusPerNode - -`func (o *V0037JobProperties) GetGpusPerNode() string` - -GetGpusPerNode returns the GpusPerNode field if non-nil, zero value otherwise. - -### GetGpusPerNodeOk - -`func (o *V0037JobProperties) GetGpusPerNodeOk() (*string, bool)` - -GetGpusPerNodeOk returns a tuple with the GpusPerNode field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetGpusPerNode - -`func (o *V0037JobProperties) SetGpusPerNode(v string)` - -SetGpusPerNode sets GpusPerNode field to given value. - -### HasGpusPerNode - -`func (o *V0037JobProperties) HasGpusPerNode() bool` - -HasGpusPerNode returns a boolean if a field has been set. - -### GetGpusPerSocket - -`func (o *V0037JobProperties) GetGpusPerSocket() string` - -GetGpusPerSocket returns the GpusPerSocket field if non-nil, zero value otherwise. - -### GetGpusPerSocketOk - -`func (o *V0037JobProperties) GetGpusPerSocketOk() (*string, bool)` - -GetGpusPerSocketOk returns a tuple with the GpusPerSocket field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetGpusPerSocket - -`func (o *V0037JobProperties) SetGpusPerSocket(v string)` - -SetGpusPerSocket sets GpusPerSocket field to given value. - -### HasGpusPerSocket - -`func (o *V0037JobProperties) HasGpusPerSocket() bool` - -HasGpusPerSocket returns a boolean if a field has been set. - -### GetGpusPerTask - -`func (o *V0037JobProperties) GetGpusPerTask() string` - -GetGpusPerTask returns the GpusPerTask field if non-nil, zero value otherwise. - -### GetGpusPerTaskOk - -`func (o *V0037JobProperties) GetGpusPerTaskOk() (*string, bool)` - -GetGpusPerTaskOk returns a tuple with the GpusPerTask field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetGpusPerTask - -`func (o *V0037JobProperties) SetGpusPerTask(v string)` - -SetGpusPerTask sets GpusPerTask field to given value. - -### HasGpusPerTask - -`func (o *V0037JobProperties) HasGpusPerTask() bool` - -HasGpusPerTask returns a boolean if a field has been set. - -### GetHold - -`func (o *V0037JobProperties) GetHold() bool` - -GetHold returns the Hold field if non-nil, zero value otherwise. - -### GetHoldOk - -`func (o *V0037JobProperties) GetHoldOk() (*bool, bool)` - -GetHoldOk returns a tuple with the Hold field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetHold - -`func (o *V0037JobProperties) SetHold(v bool)` - -SetHold sets Hold field to given value. - -### HasHold - -`func (o *V0037JobProperties) HasHold() bool` - -HasHold returns a boolean if a field has been set. - -### GetKillOnInvalidDependency - -`func (o *V0037JobProperties) GetKillOnInvalidDependency() bool` - -GetKillOnInvalidDependency returns the KillOnInvalidDependency field if non-nil, zero value otherwise. - -### GetKillOnInvalidDependencyOk - -`func (o *V0037JobProperties) GetKillOnInvalidDependencyOk() (*bool, bool)` - -GetKillOnInvalidDependencyOk returns a tuple with the KillOnInvalidDependency field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetKillOnInvalidDependency - -`func (o *V0037JobProperties) SetKillOnInvalidDependency(v bool)` - -SetKillOnInvalidDependency sets KillOnInvalidDependency field to given value. - -### HasKillOnInvalidDependency - -`func (o *V0037JobProperties) HasKillOnInvalidDependency() bool` - -HasKillOnInvalidDependency returns a boolean if a field has been set. - -### GetLicenses - -`func (o *V0037JobProperties) GetLicenses() string` - -GetLicenses returns the Licenses field if non-nil, zero value otherwise. - -### GetLicensesOk - -`func (o *V0037JobProperties) GetLicensesOk() (*string, bool)` - -GetLicensesOk returns a tuple with the Licenses field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetLicenses - -`func (o *V0037JobProperties) SetLicenses(v string)` - -SetLicenses sets Licenses field to given value. - -### HasLicenses - -`func (o *V0037JobProperties) HasLicenses() bool` - -HasLicenses returns a boolean if a field has been set. - -### GetMailType - -`func (o *V0037JobProperties) GetMailType() string` - -GetMailType returns the MailType field if non-nil, zero value otherwise. - -### GetMailTypeOk - -`func (o *V0037JobProperties) GetMailTypeOk() (*string, bool)` - -GetMailTypeOk returns a tuple with the MailType field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetMailType - -`func (o *V0037JobProperties) SetMailType(v string)` - -SetMailType sets MailType field to given value. - -### HasMailType - -`func (o *V0037JobProperties) HasMailType() bool` - -HasMailType returns a boolean if a field has been set. - -### GetMailUser - -`func (o *V0037JobProperties) GetMailUser() string` - -GetMailUser returns the MailUser field if non-nil, zero value otherwise. - -### GetMailUserOk - -`func (o *V0037JobProperties) GetMailUserOk() (*string, bool)` - -GetMailUserOk returns a tuple with the MailUser field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetMailUser - -`func (o *V0037JobProperties) SetMailUser(v string)` - -SetMailUser sets MailUser field to given value. - -### HasMailUser - -`func (o *V0037JobProperties) HasMailUser() bool` - -HasMailUser returns a boolean if a field has been set. - -### GetMcsLabel - -`func (o *V0037JobProperties) GetMcsLabel() string` - -GetMcsLabel returns the McsLabel field if non-nil, zero value otherwise. - -### GetMcsLabelOk - -`func (o *V0037JobProperties) GetMcsLabelOk() (*string, bool)` - -GetMcsLabelOk returns a tuple with the McsLabel field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetMcsLabel - -`func (o *V0037JobProperties) SetMcsLabel(v string)` - -SetMcsLabel sets McsLabel field to given value. - -### HasMcsLabel - -`func (o *V0037JobProperties) HasMcsLabel() bool` - -HasMcsLabel returns a boolean if a field has been set. - -### GetMemoryBinding - -`func (o *V0037JobProperties) GetMemoryBinding() string` - -GetMemoryBinding returns the MemoryBinding field if non-nil, zero value otherwise. - -### GetMemoryBindingOk - -`func (o *V0037JobProperties) GetMemoryBindingOk() (*string, bool)` - -GetMemoryBindingOk returns a tuple with the MemoryBinding field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetMemoryBinding - -`func (o *V0037JobProperties) SetMemoryBinding(v string)` - -SetMemoryBinding sets MemoryBinding field to given value. - -### HasMemoryBinding - -`func (o *V0037JobProperties) HasMemoryBinding() bool` - -HasMemoryBinding returns a boolean if a field has been set. - -### GetMemoryPerCpu - -`func (o *V0037JobProperties) GetMemoryPerCpu() int32` - -GetMemoryPerCpu returns the MemoryPerCpu field if non-nil, zero value otherwise. - -### GetMemoryPerCpuOk - -`func (o *V0037JobProperties) GetMemoryPerCpuOk() (*int32, bool)` - -GetMemoryPerCpuOk returns a tuple with the MemoryPerCpu field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetMemoryPerCpu - -`func (o *V0037JobProperties) SetMemoryPerCpu(v int32)` - -SetMemoryPerCpu sets MemoryPerCpu field to given value. - -### HasMemoryPerCpu - -`func (o *V0037JobProperties) HasMemoryPerCpu() bool` - -HasMemoryPerCpu returns a boolean if a field has been set. - -### GetMemoryPerGpu - -`func (o *V0037JobProperties) GetMemoryPerGpu() int32` - -GetMemoryPerGpu returns the MemoryPerGpu field if non-nil, zero value otherwise. - -### GetMemoryPerGpuOk - -`func (o *V0037JobProperties) GetMemoryPerGpuOk() (*int32, bool)` - -GetMemoryPerGpuOk returns a tuple with the MemoryPerGpu field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetMemoryPerGpu - -`func (o *V0037JobProperties) SetMemoryPerGpu(v int32)` - -SetMemoryPerGpu sets MemoryPerGpu field to given value. - -### HasMemoryPerGpu - -`func (o *V0037JobProperties) HasMemoryPerGpu() bool` - -HasMemoryPerGpu returns a boolean if a field has been set. - -### GetMemoryPerNode - -`func (o *V0037JobProperties) GetMemoryPerNode() int32` - -GetMemoryPerNode returns the MemoryPerNode field if non-nil, zero value otherwise. - -### GetMemoryPerNodeOk - -`func (o *V0037JobProperties) GetMemoryPerNodeOk() (*int32, bool)` - -GetMemoryPerNodeOk returns a tuple with the MemoryPerNode field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetMemoryPerNode - -`func (o *V0037JobProperties) SetMemoryPerNode(v int32)` - -SetMemoryPerNode sets MemoryPerNode field to given value. - -### HasMemoryPerNode - -`func (o *V0037JobProperties) HasMemoryPerNode() bool` - -HasMemoryPerNode returns a boolean if a field has been set. - -### GetMinimumCpusPerNode - -`func (o *V0037JobProperties) GetMinimumCpusPerNode() int32` - -GetMinimumCpusPerNode returns the MinimumCpusPerNode field if non-nil, zero value otherwise. - -### GetMinimumCpusPerNodeOk - -`func (o *V0037JobProperties) GetMinimumCpusPerNodeOk() (*int32, bool)` - -GetMinimumCpusPerNodeOk returns a tuple with the MinimumCpusPerNode field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetMinimumCpusPerNode - -`func (o *V0037JobProperties) SetMinimumCpusPerNode(v int32)` - -SetMinimumCpusPerNode sets MinimumCpusPerNode field to given value. - -### HasMinimumCpusPerNode - -`func (o *V0037JobProperties) HasMinimumCpusPerNode() bool` - -HasMinimumCpusPerNode returns a boolean if a field has been set. - -### GetMinimumNodes - -`func (o *V0037JobProperties) GetMinimumNodes() bool` - -GetMinimumNodes returns the MinimumNodes field if non-nil, zero value otherwise. - -### GetMinimumNodesOk - -`func (o *V0037JobProperties) GetMinimumNodesOk() (*bool, bool)` - -GetMinimumNodesOk returns a tuple with the MinimumNodes field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetMinimumNodes - -`func (o *V0037JobProperties) SetMinimumNodes(v bool)` - -SetMinimumNodes sets MinimumNodes field to given value. - -### HasMinimumNodes - -`func (o *V0037JobProperties) HasMinimumNodes() bool` - -HasMinimumNodes returns a boolean if a field has been set. - -### GetName - -`func (o *V0037JobProperties) GetName() string` - -GetName returns the Name field if non-nil, zero value otherwise. - -### GetNameOk - -`func (o *V0037JobProperties) GetNameOk() (*string, bool)` - -GetNameOk returns a tuple with the Name field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetName - -`func (o *V0037JobProperties) SetName(v string)` - -SetName sets Name field to given value. - -### HasName - -`func (o *V0037JobProperties) HasName() bool` - -HasName returns a boolean if a field has been set. - -### GetNice - -`func (o *V0037JobProperties) GetNice() string` - -GetNice returns the Nice field if non-nil, zero value otherwise. - -### GetNiceOk - -`func (o *V0037JobProperties) GetNiceOk() (*string, bool)` - -GetNiceOk returns a tuple with the Nice field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetNice - -`func (o *V0037JobProperties) SetNice(v string)` - -SetNice sets Nice field to given value. - -### HasNice - -`func (o *V0037JobProperties) HasNice() bool` - -HasNice returns a boolean if a field has been set. - -### GetNoKill - -`func (o *V0037JobProperties) GetNoKill() bool` - -GetNoKill returns the NoKill field if non-nil, zero value otherwise. - -### GetNoKillOk - -`func (o *V0037JobProperties) GetNoKillOk() (*bool, bool)` - -GetNoKillOk returns a tuple with the NoKill field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetNoKill - -`func (o *V0037JobProperties) SetNoKill(v bool)` - -SetNoKill sets NoKill field to given value. - -### HasNoKill - -`func (o *V0037JobProperties) HasNoKill() bool` - -HasNoKill returns a boolean if a field has been set. - -### GetNodes - -`func (o *V0037JobProperties) GetNodes() []int32` - -GetNodes returns the Nodes field if non-nil, zero value otherwise. - -### GetNodesOk - -`func (o *V0037JobProperties) GetNodesOk() (*[]int32, bool)` - -GetNodesOk returns a tuple with the Nodes field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetNodes - -`func (o *V0037JobProperties) SetNodes(v []int32)` - -SetNodes sets Nodes field to given value. - -### HasNodes - -`func (o *V0037JobProperties) HasNodes() bool` - -HasNodes returns a boolean if a field has been set. - -### GetOpenMode - -`func (o *V0037JobProperties) GetOpenMode() string` - -GetOpenMode returns the OpenMode field if non-nil, zero value otherwise. - -### GetOpenModeOk - -`func (o *V0037JobProperties) GetOpenModeOk() (*string, bool)` - -GetOpenModeOk returns a tuple with the OpenMode field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetOpenMode - -`func (o *V0037JobProperties) SetOpenMode(v string)` - -SetOpenMode sets OpenMode field to given value. - -### HasOpenMode - -`func (o *V0037JobProperties) HasOpenMode() bool` - -HasOpenMode returns a boolean if a field has been set. - -### GetPartition - -`func (o *V0037JobProperties) GetPartition() string` - -GetPartition returns the Partition field if non-nil, zero value otherwise. - -### GetPartitionOk - -`func (o *V0037JobProperties) GetPartitionOk() (*string, bool)` - -GetPartitionOk returns a tuple with the Partition field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetPartition - -`func (o *V0037JobProperties) SetPartition(v string)` - -SetPartition sets Partition field to given value. - -### HasPartition - -`func (o *V0037JobProperties) HasPartition() bool` - -HasPartition returns a boolean if a field has been set. - -### GetPriority - -`func (o *V0037JobProperties) GetPriority() string` - -GetPriority returns the Priority field if non-nil, zero value otherwise. - -### GetPriorityOk - -`func (o *V0037JobProperties) GetPriorityOk() (*string, bool)` - -GetPriorityOk returns a tuple with the Priority field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetPriority - -`func (o *V0037JobProperties) SetPriority(v string)` - -SetPriority sets Priority field to given value. - -### HasPriority - -`func (o *V0037JobProperties) HasPriority() bool` - -HasPriority returns a boolean if a field has been set. - -### GetQos - -`func (o *V0037JobProperties) GetQos() string` - -GetQos returns the Qos field if non-nil, zero value otherwise. - -### GetQosOk - -`func (o *V0037JobProperties) GetQosOk() (*string, bool)` - -GetQosOk returns a tuple with the Qos field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetQos - -`func (o *V0037JobProperties) SetQos(v string)` - -SetQos sets Qos field to given value. - -### HasQos - -`func (o *V0037JobProperties) HasQos() bool` - -HasQos returns a boolean if a field has been set. - -### GetRequeue - -`func (o *V0037JobProperties) GetRequeue() bool` - -GetRequeue returns the Requeue field if non-nil, zero value otherwise. - -### GetRequeueOk - -`func (o *V0037JobProperties) GetRequeueOk() (*bool, bool)` - -GetRequeueOk returns a tuple with the Requeue field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetRequeue - -`func (o *V0037JobProperties) SetRequeue(v bool)` - -SetRequeue sets Requeue field to given value. - -### HasRequeue - -`func (o *V0037JobProperties) HasRequeue() bool` - -HasRequeue returns a boolean if a field has been set. - -### GetReservation - -`func (o *V0037JobProperties) GetReservation() string` - -GetReservation returns the Reservation field if non-nil, zero value otherwise. - -### GetReservationOk - -`func (o *V0037JobProperties) GetReservationOk() (*string, bool)` - -GetReservationOk returns a tuple with the Reservation field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetReservation - -`func (o *V0037JobProperties) SetReservation(v string)` - -SetReservation sets Reservation field to given value. - -### HasReservation - -`func (o *V0037JobProperties) HasReservation() bool` - -HasReservation returns a boolean if a field has been set. - -### GetSignal - -`func (o *V0037JobProperties) GetSignal() string` - -GetSignal returns the Signal field if non-nil, zero value otherwise. - -### GetSignalOk - -`func (o *V0037JobProperties) GetSignalOk() (*string, bool)` - -GetSignalOk returns a tuple with the Signal field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetSignal - -`func (o *V0037JobProperties) SetSignal(v string)` - -SetSignal sets Signal field to given value. - -### HasSignal - -`func (o *V0037JobProperties) HasSignal() bool` - -HasSignal returns a boolean if a field has been set. - -### GetSocketsPerNode - -`func (o *V0037JobProperties) GetSocketsPerNode() int32` - -GetSocketsPerNode returns the SocketsPerNode field if non-nil, zero value otherwise. - -### GetSocketsPerNodeOk - -`func (o *V0037JobProperties) GetSocketsPerNodeOk() (*int32, bool)` - -GetSocketsPerNodeOk returns a tuple with the SocketsPerNode field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetSocketsPerNode - -`func (o *V0037JobProperties) SetSocketsPerNode(v int32)` - -SetSocketsPerNode sets SocketsPerNode field to given value. - -### HasSocketsPerNode - -`func (o *V0037JobProperties) HasSocketsPerNode() bool` - -HasSocketsPerNode returns a boolean if a field has been set. - -### GetSpreadJob - -`func (o *V0037JobProperties) GetSpreadJob() bool` - -GetSpreadJob returns the SpreadJob field if non-nil, zero value otherwise. - -### GetSpreadJobOk - -`func (o *V0037JobProperties) GetSpreadJobOk() (*bool, bool)` - -GetSpreadJobOk returns a tuple with the SpreadJob field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetSpreadJob - -`func (o *V0037JobProperties) SetSpreadJob(v bool)` - -SetSpreadJob sets SpreadJob field to given value. - -### HasSpreadJob - -`func (o *V0037JobProperties) HasSpreadJob() bool` - -HasSpreadJob returns a boolean if a field has been set. - -### GetStandardError - -`func (o *V0037JobProperties) GetStandardError() string` - -GetStandardError returns the StandardError field if non-nil, zero value otherwise. - -### GetStandardErrorOk - -`func (o *V0037JobProperties) GetStandardErrorOk() (*string, bool)` - -GetStandardErrorOk returns a tuple with the StandardError field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetStandardError - -`func (o *V0037JobProperties) SetStandardError(v string)` - -SetStandardError sets StandardError field to given value. - -### HasStandardError - -`func (o *V0037JobProperties) HasStandardError() bool` - -HasStandardError returns a boolean if a field has been set. - -### GetStandardInput - -`func (o *V0037JobProperties) GetStandardInput() string` - -GetStandardInput returns the StandardInput field if non-nil, zero value otherwise. - -### GetStandardInputOk - -`func (o *V0037JobProperties) GetStandardInputOk() (*string, bool)` - -GetStandardInputOk returns a tuple with the StandardInput field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetStandardInput - -`func (o *V0037JobProperties) SetStandardInput(v string)` - -SetStandardInput sets StandardInput field to given value. - -### HasStandardInput - -`func (o *V0037JobProperties) HasStandardInput() bool` - -HasStandardInput returns a boolean if a field has been set. - -### GetStandardOutput - -`func (o *V0037JobProperties) GetStandardOutput() string` - -GetStandardOutput returns the StandardOutput field if non-nil, zero value otherwise. - -### GetStandardOutputOk - -`func (o *V0037JobProperties) GetStandardOutputOk() (*string, bool)` - -GetStandardOutputOk returns a tuple with the StandardOutput field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetStandardOutput - -`func (o *V0037JobProperties) SetStandardOutput(v string)` - -SetStandardOutput sets StandardOutput field to given value. - -### HasStandardOutput - -`func (o *V0037JobProperties) HasStandardOutput() bool` - -HasStandardOutput returns a boolean if a field has been set. - -### GetTasks - -`func (o *V0037JobProperties) GetTasks() int32` - -GetTasks returns the Tasks field if non-nil, zero value otherwise. - -### GetTasksOk - -`func (o *V0037JobProperties) GetTasksOk() (*int32, bool)` - -GetTasksOk returns a tuple with the Tasks field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetTasks - -`func (o *V0037JobProperties) SetTasks(v int32)` - -SetTasks sets Tasks field to given value. - -### HasTasks - -`func (o *V0037JobProperties) HasTasks() bool` - -HasTasks returns a boolean if a field has been set. - -### GetTasksPerCore - -`func (o *V0037JobProperties) GetTasksPerCore() int32` - -GetTasksPerCore returns the TasksPerCore field if non-nil, zero value otherwise. - -### GetTasksPerCoreOk - -`func (o *V0037JobProperties) GetTasksPerCoreOk() (*int32, bool)` - -GetTasksPerCoreOk returns a tuple with the TasksPerCore field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetTasksPerCore - -`func (o *V0037JobProperties) SetTasksPerCore(v int32)` - -SetTasksPerCore sets TasksPerCore field to given value. - -### HasTasksPerCore - -`func (o *V0037JobProperties) HasTasksPerCore() bool` - -HasTasksPerCore returns a boolean if a field has been set. - -### GetTasksPerNode - -`func (o *V0037JobProperties) GetTasksPerNode() int32` - -GetTasksPerNode returns the TasksPerNode field if non-nil, zero value otherwise. - -### GetTasksPerNodeOk - -`func (o *V0037JobProperties) GetTasksPerNodeOk() (*int32, bool)` - -GetTasksPerNodeOk returns a tuple with the TasksPerNode field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetTasksPerNode - -`func (o *V0037JobProperties) SetTasksPerNode(v int32)` - -SetTasksPerNode sets TasksPerNode field to given value. - -### HasTasksPerNode - -`func (o *V0037JobProperties) HasTasksPerNode() bool` - -HasTasksPerNode returns a boolean if a field has been set. - -### GetTasksPerSocket - -`func (o *V0037JobProperties) GetTasksPerSocket() int32` - -GetTasksPerSocket returns the TasksPerSocket field if non-nil, zero value otherwise. - -### GetTasksPerSocketOk - -`func (o *V0037JobProperties) GetTasksPerSocketOk() (*int32, bool)` - -GetTasksPerSocketOk returns a tuple with the TasksPerSocket field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetTasksPerSocket - -`func (o *V0037JobProperties) SetTasksPerSocket(v int32)` - -SetTasksPerSocket sets TasksPerSocket field to given value. - -### HasTasksPerSocket - -`func (o *V0037JobProperties) HasTasksPerSocket() bool` - -HasTasksPerSocket returns a boolean if a field has been set. - -### GetThreadSpecification - -`func (o *V0037JobProperties) GetThreadSpecification() int32` - -GetThreadSpecification returns the ThreadSpecification field if non-nil, zero value otherwise. - -### GetThreadSpecificationOk - -`func (o *V0037JobProperties) GetThreadSpecificationOk() (*int32, bool)` - -GetThreadSpecificationOk returns a tuple with the ThreadSpecification field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetThreadSpecification - -`func (o *V0037JobProperties) SetThreadSpecification(v int32)` - -SetThreadSpecification sets ThreadSpecification field to given value. - -### HasThreadSpecification - -`func (o *V0037JobProperties) HasThreadSpecification() bool` - -HasThreadSpecification returns a boolean if a field has been set. - -### GetThreadsPerCore - -`func (o *V0037JobProperties) GetThreadsPerCore() int32` - -GetThreadsPerCore returns the ThreadsPerCore field if non-nil, zero value otherwise. - -### GetThreadsPerCoreOk - -`func (o *V0037JobProperties) GetThreadsPerCoreOk() (*int32, bool)` - -GetThreadsPerCoreOk returns a tuple with the ThreadsPerCore field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetThreadsPerCore - -`func (o *V0037JobProperties) SetThreadsPerCore(v int32)` - -SetThreadsPerCore sets ThreadsPerCore field to given value. - -### HasThreadsPerCore - -`func (o *V0037JobProperties) HasThreadsPerCore() bool` - -HasThreadsPerCore returns a boolean if a field has been set. - -### GetTimeLimit - -`func (o *V0037JobProperties) GetTimeLimit() int32` - -GetTimeLimit returns the TimeLimit field if non-nil, zero value otherwise. - -### GetTimeLimitOk - -`func (o *V0037JobProperties) GetTimeLimitOk() (*int32, bool)` - -GetTimeLimitOk returns a tuple with the TimeLimit field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetTimeLimit - -`func (o *V0037JobProperties) SetTimeLimit(v int32)` - -SetTimeLimit sets TimeLimit field to given value. - -### HasTimeLimit - -`func (o *V0037JobProperties) HasTimeLimit() bool` - -HasTimeLimit returns a boolean if a field has been set. - -### GetTimeMinimum - -`func (o *V0037JobProperties) GetTimeMinimum() int32` - -GetTimeMinimum returns the TimeMinimum field if non-nil, zero value otherwise. - -### GetTimeMinimumOk - -`func (o *V0037JobProperties) GetTimeMinimumOk() (*int32, bool)` - -GetTimeMinimumOk returns a tuple with the TimeMinimum field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetTimeMinimum - -`func (o *V0037JobProperties) SetTimeMinimum(v int32)` - -SetTimeMinimum sets TimeMinimum field to given value. - -### HasTimeMinimum - -`func (o *V0037JobProperties) HasTimeMinimum() bool` - -HasTimeMinimum returns a boolean if a field has been set. - -### GetWaitAllNodes - -`func (o *V0037JobProperties) GetWaitAllNodes() bool` - -GetWaitAllNodes returns the WaitAllNodes field if non-nil, zero value otherwise. - -### GetWaitAllNodesOk - -`func (o *V0037JobProperties) GetWaitAllNodesOk() (*bool, bool)` - -GetWaitAllNodesOk returns a tuple with the WaitAllNodes field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetWaitAllNodes - -`func (o *V0037JobProperties) SetWaitAllNodes(v bool)` - -SetWaitAllNodes sets WaitAllNodes field to given value. - -### HasWaitAllNodes - -`func (o *V0037JobProperties) HasWaitAllNodes() bool` - -HasWaitAllNodes returns a boolean if a field has been set. - -### GetWckey - -`func (o *V0037JobProperties) GetWckey() string` - -GetWckey returns the Wckey field if non-nil, zero value otherwise. - -### GetWckeyOk - -`func (o *V0037JobProperties) GetWckeyOk() (*string, bool)` - -GetWckeyOk returns a tuple with the Wckey field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetWckey - -`func (o *V0037JobProperties) SetWckey(v string)` - -SetWckey sets Wckey field to given value. - -### HasWckey - -`func (o *V0037JobProperties) HasWckey() bool` - -HasWckey returns a boolean if a field has been set. - - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/internal/api/0.0.37/docs/V0037JobResources.md b/internal/api/0.0.37/docs/V0037JobResources.md deleted file mode 100644 index 627a3cb..0000000 --- a/internal/api/0.0.37/docs/V0037JobResources.md +++ /dev/null @@ -1,134 +0,0 @@ -# V0037JobResources - -## Properties - -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**Nodes** | Pointer to **string** | list of assigned job nodes | [optional] -**AllocatedCpus** | Pointer to **int32** | number of assigned job cpus | [optional] -**AllocatedHosts** | Pointer to **int32** | number of assigned job hosts | [optional] -**AllocatedNodes** | Pointer to [**[]V0037NodeAllocation**](V0037NodeAllocation.md) | node allocations | [optional] - -## Methods - -### NewV0037JobResources - -`func NewV0037JobResources() *V0037JobResources` - -NewV0037JobResources instantiates a new V0037JobResources object -This constructor will assign default values to properties that have it defined, -and makes sure properties required by API are set, but the set of arguments -will change when the set of required properties is changed - -### NewV0037JobResourcesWithDefaults - -`func NewV0037JobResourcesWithDefaults() *V0037JobResources` - -NewV0037JobResourcesWithDefaults instantiates a new V0037JobResources object -This constructor will only assign default values to properties that have it defined, -but it doesn't guarantee that properties required by API are set - -### GetNodes - -`func (o *V0037JobResources) GetNodes() string` - -GetNodes returns the Nodes field if non-nil, zero value otherwise. - -### GetNodesOk - -`func (o *V0037JobResources) GetNodesOk() (*string, bool)` - -GetNodesOk returns a tuple with the Nodes field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetNodes - -`func (o *V0037JobResources) SetNodes(v string)` - -SetNodes sets Nodes field to given value. - -### HasNodes - -`func (o *V0037JobResources) HasNodes() bool` - -HasNodes returns a boolean if a field has been set. - -### GetAllocatedCpus - -`func (o *V0037JobResources) GetAllocatedCpus() int32` - -GetAllocatedCpus returns the AllocatedCpus field if non-nil, zero value otherwise. - -### GetAllocatedCpusOk - -`func (o *V0037JobResources) GetAllocatedCpusOk() (*int32, bool)` - -GetAllocatedCpusOk returns a tuple with the AllocatedCpus field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetAllocatedCpus - -`func (o *V0037JobResources) SetAllocatedCpus(v int32)` - -SetAllocatedCpus sets AllocatedCpus field to given value. - -### HasAllocatedCpus - -`func (o *V0037JobResources) HasAllocatedCpus() bool` - -HasAllocatedCpus returns a boolean if a field has been set. - -### GetAllocatedHosts - -`func (o *V0037JobResources) GetAllocatedHosts() int32` - -GetAllocatedHosts returns the AllocatedHosts field if non-nil, zero value otherwise. - -### GetAllocatedHostsOk - -`func (o *V0037JobResources) GetAllocatedHostsOk() (*int32, bool)` - -GetAllocatedHostsOk returns a tuple with the AllocatedHosts field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetAllocatedHosts - -`func (o *V0037JobResources) SetAllocatedHosts(v int32)` - -SetAllocatedHosts sets AllocatedHosts field to given value. - -### HasAllocatedHosts - -`func (o *V0037JobResources) HasAllocatedHosts() bool` - -HasAllocatedHosts returns a boolean if a field has been set. - -### GetAllocatedNodes - -`func (o *V0037JobResources) GetAllocatedNodes() []V0037NodeAllocation` - -GetAllocatedNodes returns the AllocatedNodes field if non-nil, zero value otherwise. - -### GetAllocatedNodesOk - -`func (o *V0037JobResources) GetAllocatedNodesOk() (*[]V0037NodeAllocation, bool)` - -GetAllocatedNodesOk returns a tuple with the AllocatedNodes field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetAllocatedNodes - -`func (o *V0037JobResources) SetAllocatedNodes(v []V0037NodeAllocation)` - -SetAllocatedNodes sets AllocatedNodes field to given value. - -### HasAllocatedNodes - -`func (o *V0037JobResources) HasAllocatedNodes() bool` - -HasAllocatedNodes returns a boolean if a field has been set. - - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/internal/api/0.0.37/docs/V0037JobResponseProperties.md b/internal/api/0.0.37/docs/V0037JobResponseProperties.md deleted file mode 100644 index 43aa598..0000000 --- a/internal/api/0.0.37/docs/V0037JobResponseProperties.md +++ /dev/null @@ -1,2812 +0,0 @@ -# V0037JobResponseProperties - -## Properties - -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**Account** | Pointer to **string** | Charge resources used by this job to specified account | [optional] -**AccrueTime** | Pointer to **int64** | time job is eligible for running | [optional] -**AdminComment** | Pointer to **string** | administrator's arbitrary comment | [optional] -**ArrayJobId** | Pointer to **string** | job_id of a job array or 0 if N/A | [optional] -**ArrayTaskId** | Pointer to **string** | task_id of a job array | [optional] -**ArrayMaxTasks** | Pointer to **string** | Maximum number of running array tasks | [optional] -**ArrayTaskString** | Pointer to **string** | string expression of task IDs in this record | [optional] -**AssociationId** | Pointer to **string** | association id for job | [optional] -**BatchFeatures** | Pointer to **string** | features required for batch script's node | [optional] -**BatchFlag** | Pointer to **bool** | if batch: queued job with script | [optional] -**BatchHost** | Pointer to **string** | name of host running batch script | [optional] -**Flags** | Pointer to **[]string** | Job flags | [optional] -**BurstBuffer** | Pointer to **string** | burst buffer specifications | [optional] -**BurstBufferState** | Pointer to **string** | burst buffer state info | [optional] -**Cluster** | Pointer to **string** | name of cluster that the job is on | [optional] -**ClusterFeatures** | Pointer to **string** | comma separated list of required cluster features | [optional] -**Command** | Pointer to **string** | command to be executed | [optional] -**Comment** | Pointer to **string** | arbitrary comment | [optional] -**Contiguous** | Pointer to **bool** | job requires contiguous nodes | [optional] -**CoreSpec** | Pointer to **string** | specialized core count | [optional] -**ThreadSpec** | Pointer to **string** | specialized thread count | [optional] -**CoresPerSocket** | Pointer to **string** | cores per socket required by job | [optional] -**BillableTres** | Pointer to **string** | billable TRES | [optional] -**CpusPerTask** | Pointer to **string** | number of processors required for each task | [optional] -**CpuFrequencyMinimum** | Pointer to **string** | Minimum cpu frequency | [optional] -**CpuFrequencyMaximum** | Pointer to **string** | Maximum cpu frequency | [optional] -**CpuFrequencyGovernor** | Pointer to **string** | cpu frequency governor | [optional] -**CpusPerTres** | Pointer to **string** | semicolon delimited list of TRES=# values | [optional] -**Deadline** | Pointer to **string** | job start deadline | [optional] -**DelayBoot** | Pointer to **string** | command to be executed | [optional] -**Dependency** | Pointer to **string** | synchronize job execution with other jobs | [optional] -**DerivedExitCode** | Pointer to **string** | highest exit code of all job steps | [optional] -**EligibleTime** | Pointer to **int64** | time job is eligible for running | [optional] -**EndTime** | Pointer to **int64** | time of termination, actual or expected | [optional] -**ExcludedNodes** | Pointer to **string** | comma separated list of excluded nodes | [optional] -**ExitCode** | Pointer to **int32** | exit code for job | [optional] -**Features** | Pointer to **string** | comma separated list of required features | [optional] -**FederationOrigin** | Pointer to **string** | Origin cluster's name | [optional] -**FederationSiblingsActive** | Pointer to **string** | string of active sibling names | [optional] -**FederationSiblingsViable** | Pointer to **string** | string of viable sibling names | [optional] -**GresDetail** | Pointer to **[]string** | Job flags | [optional] -**GroupId** | Pointer to **string** | group job submitted as | [optional] -**JobId** | Pointer to **string** | job ID | [optional] -**JobResources** | Pointer to [**V0037JobResources**](V0037JobResources.md) | | [optional] -**JobState** | Pointer to **string** | state of the job | [optional] -**LastSchedEvaluation** | Pointer to **string** | last time job was evaluated for scheduling | [optional] -**Licenses** | Pointer to **string** | licenses required by the job | [optional] -**MaxCpus** | Pointer to **string** | maximum number of cpus usable by job | [optional] -**MaxNodes** | Pointer to **string** | maximum number of nodes usable by job | [optional] -**McsLabel** | Pointer to **string** | mcs_label if mcs plugin in use | [optional] -**MemoryPerTres** | Pointer to **string** | semicolon delimited list of TRES=# values | [optional] -**Name** | Pointer to **string** | name of the job | [optional] -**Nodes** | Pointer to **string** | list of nodes allocated to job | [optional] -**Nice** | Pointer to **string** | requested priority change | [optional] -**TasksPerCore** | Pointer to **string** | number of tasks to invoke on each core | [optional] -**TasksPerSocket** | Pointer to **string** | number of tasks to invoke on each socket | [optional] -**TasksPerBoard** | Pointer to **string** | number of tasks to invoke on each board | [optional] -**Cpus** | Pointer to **string** | minimum number of cpus required by job | [optional] -**NodeCount** | Pointer to **string** | minimum number of nodes required by job | [optional] -**Tasks** | Pointer to **string** | requested task count | [optional] -**HetJobId** | Pointer to **string** | job ID of hetjob leader | [optional] -**HetJobIdSet** | Pointer to **string** | job IDs for all components | [optional] -**HetJobOffset** | Pointer to **string** | HetJob component offset from leader | [optional] -**Partition** | Pointer to **string** | name of assigned partition | [optional] -**MemoryPerNode** | Pointer to **string** | minimum real memory per node | [optional] -**MemoryPerCpu** | Pointer to **string** | minimum real memory per cpu | [optional] -**MinimumCpusPerNode** | Pointer to **string** | minimum # CPUs per node | [optional] -**MinimumTmpDiskPerNode** | Pointer to **string** | minimum tmp disk per node | [optional] -**PreemptTime** | Pointer to **int64** | preemption signal time | [optional] -**PreSusTime** | Pointer to **int64** | time job ran prior to last suspend | [optional] -**Priority** | Pointer to **string** | relative priority of the job | [optional] -**Profile** | Pointer to **[]string** | Job profiling requested | [optional] -**Qos** | Pointer to **string** | Quality of Service | [optional] -**Reboot** | Pointer to **bool** | node reboot requested before start | [optional] -**RequiredNodes** | Pointer to **string** | comma separated list of required nodes | [optional] -**Requeue** | Pointer to **bool** | enable or disable job requeue option | [optional] -**ResizeTime** | Pointer to **int64** | time of latest size change | [optional] -**RestartCnt** | Pointer to **string** | count of job restarts | [optional] -**ResvName** | Pointer to **string** | reservation name | [optional] -**Shared** | Pointer to **string** | type and if job can share nodes with other jobs | [optional] -**ShowFlags** | Pointer to **[]string** | details requested | [optional] -**SocketsPerBoard** | Pointer to **string** | sockets per board required by job | [optional] -**SocketsPerNode** | Pointer to **string** | sockets per node required by job | [optional] -**StartTime** | Pointer to **int64** | time execution begins, actual or expected | [optional] -**StateDescription** | Pointer to **string** | optional details for state_reason | [optional] -**StateReason** | Pointer to **string** | reason job still pending or failed | [optional] -**StandardError** | Pointer to **string** | pathname of job's stderr file | [optional] -**StandardInput** | Pointer to **string** | pathname of job's stdin file | [optional] -**StandardOutput** | Pointer to **string** | pathname of job's stdout file | [optional] -**SubmitTime** | Pointer to **int64** | time of job submission | [optional] -**SuspendTime** | Pointer to **int64** | time job last suspended or resumed | [optional] -**SystemComment** | Pointer to **string** | slurmctld's arbitrary comment | [optional] -**TimeLimit** | Pointer to **string** | maximum run time in minutes | [optional] -**TimeMinimum** | Pointer to **string** | minimum run time in minutes | [optional] -**ThreadsPerCore** | Pointer to **string** | threads per core required by job | [optional] -**TresBind** | Pointer to **string** | Task to TRES binding directives | [optional] -**TresFreq** | Pointer to **string** | TRES frequency directives | [optional] -**TresPerJob** | Pointer to **string** | semicolon delimited list of TRES=# values | [optional] -**TresPerNode** | Pointer to **string** | semicolon delimited list of TRES=# values | [optional] -**TresPerSocket** | Pointer to **string** | semicolon delimited list of TRES=# values | [optional] -**TresPerTask** | Pointer to **string** | semicolon delimited list of TRES=# values | [optional] -**TresReqStr** | Pointer to **string** | tres reqeusted in the job | [optional] -**TresAllocStr** | Pointer to **string** | tres used in the job | [optional] -**UserId** | Pointer to **string** | user id the job runs as | [optional] -**UserName** | Pointer to **string** | user the job runs as | [optional] -**Wckey** | Pointer to **string** | wckey for job | [optional] -**CurrentWorkingDirectory** | Pointer to **string** | pathname of working directory | [optional] - -## Methods - -### NewV0037JobResponseProperties - -`func NewV0037JobResponseProperties() *V0037JobResponseProperties` - -NewV0037JobResponseProperties instantiates a new V0037JobResponseProperties object -This constructor will assign default values to properties that have it defined, -and makes sure properties required by API are set, but the set of arguments -will change when the set of required properties is changed - -### NewV0037JobResponsePropertiesWithDefaults - -`func NewV0037JobResponsePropertiesWithDefaults() *V0037JobResponseProperties` - -NewV0037JobResponsePropertiesWithDefaults instantiates a new V0037JobResponseProperties object -This constructor will only assign default values to properties that have it defined, -but it doesn't guarantee that properties required by API are set - -### GetAccount - -`func (o *V0037JobResponseProperties) GetAccount() string` - -GetAccount returns the Account field if non-nil, zero value otherwise. - -### GetAccountOk - -`func (o *V0037JobResponseProperties) GetAccountOk() (*string, bool)` - -GetAccountOk returns a tuple with the Account field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetAccount - -`func (o *V0037JobResponseProperties) SetAccount(v string)` - -SetAccount sets Account field to given value. - -### HasAccount - -`func (o *V0037JobResponseProperties) HasAccount() bool` - -HasAccount returns a boolean if a field has been set. - -### GetAccrueTime - -`func (o *V0037JobResponseProperties) GetAccrueTime() int64` - -GetAccrueTime returns the AccrueTime field if non-nil, zero value otherwise. - -### GetAccrueTimeOk - -`func (o *V0037JobResponseProperties) GetAccrueTimeOk() (*int64, bool)` - -GetAccrueTimeOk returns a tuple with the AccrueTime field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetAccrueTime - -`func (o *V0037JobResponseProperties) SetAccrueTime(v int64)` - -SetAccrueTime sets AccrueTime field to given value. - -### HasAccrueTime - -`func (o *V0037JobResponseProperties) HasAccrueTime() bool` - -HasAccrueTime returns a boolean if a field has been set. - -### GetAdminComment - -`func (o *V0037JobResponseProperties) GetAdminComment() string` - -GetAdminComment returns the AdminComment field if non-nil, zero value otherwise. - -### GetAdminCommentOk - -`func (o *V0037JobResponseProperties) GetAdminCommentOk() (*string, bool)` - -GetAdminCommentOk returns a tuple with the AdminComment field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetAdminComment - -`func (o *V0037JobResponseProperties) SetAdminComment(v string)` - -SetAdminComment sets AdminComment field to given value. - -### HasAdminComment - -`func (o *V0037JobResponseProperties) HasAdminComment() bool` - -HasAdminComment returns a boolean if a field has been set. - -### GetArrayJobId - -`func (o *V0037JobResponseProperties) GetArrayJobId() string` - -GetArrayJobId returns the ArrayJobId field if non-nil, zero value otherwise. - -### GetArrayJobIdOk - -`func (o *V0037JobResponseProperties) GetArrayJobIdOk() (*string, bool)` - -GetArrayJobIdOk returns a tuple with the ArrayJobId field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetArrayJobId - -`func (o *V0037JobResponseProperties) SetArrayJobId(v string)` - -SetArrayJobId sets ArrayJobId field to given value. - -### HasArrayJobId - -`func (o *V0037JobResponseProperties) HasArrayJobId() bool` - -HasArrayJobId returns a boolean if a field has been set. - -### GetArrayTaskId - -`func (o *V0037JobResponseProperties) GetArrayTaskId() string` - -GetArrayTaskId returns the ArrayTaskId field if non-nil, zero value otherwise. - -### GetArrayTaskIdOk - -`func (o *V0037JobResponseProperties) GetArrayTaskIdOk() (*string, bool)` - -GetArrayTaskIdOk returns a tuple with the ArrayTaskId field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetArrayTaskId - -`func (o *V0037JobResponseProperties) SetArrayTaskId(v string)` - -SetArrayTaskId sets ArrayTaskId field to given value. - -### HasArrayTaskId - -`func (o *V0037JobResponseProperties) HasArrayTaskId() bool` - -HasArrayTaskId returns a boolean if a field has been set. - -### GetArrayMaxTasks - -`func (o *V0037JobResponseProperties) GetArrayMaxTasks() string` - -GetArrayMaxTasks returns the ArrayMaxTasks field if non-nil, zero value otherwise. - -### GetArrayMaxTasksOk - -`func (o *V0037JobResponseProperties) GetArrayMaxTasksOk() (*string, bool)` - -GetArrayMaxTasksOk returns a tuple with the ArrayMaxTasks field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetArrayMaxTasks - -`func (o *V0037JobResponseProperties) SetArrayMaxTasks(v string)` - -SetArrayMaxTasks sets ArrayMaxTasks field to given value. - -### HasArrayMaxTasks - -`func (o *V0037JobResponseProperties) HasArrayMaxTasks() bool` - -HasArrayMaxTasks returns a boolean if a field has been set. - -### GetArrayTaskString - -`func (o *V0037JobResponseProperties) GetArrayTaskString() string` - -GetArrayTaskString returns the ArrayTaskString field if non-nil, zero value otherwise. - -### GetArrayTaskStringOk - -`func (o *V0037JobResponseProperties) GetArrayTaskStringOk() (*string, bool)` - -GetArrayTaskStringOk returns a tuple with the ArrayTaskString field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetArrayTaskString - -`func (o *V0037JobResponseProperties) SetArrayTaskString(v string)` - -SetArrayTaskString sets ArrayTaskString field to given value. - -### HasArrayTaskString - -`func (o *V0037JobResponseProperties) HasArrayTaskString() bool` - -HasArrayTaskString returns a boolean if a field has been set. - -### GetAssociationId - -`func (o *V0037JobResponseProperties) GetAssociationId() string` - -GetAssociationId returns the AssociationId field if non-nil, zero value otherwise. - -### GetAssociationIdOk - -`func (o *V0037JobResponseProperties) GetAssociationIdOk() (*string, bool)` - -GetAssociationIdOk returns a tuple with the AssociationId field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetAssociationId - -`func (o *V0037JobResponseProperties) SetAssociationId(v string)` - -SetAssociationId sets AssociationId field to given value. - -### HasAssociationId - -`func (o *V0037JobResponseProperties) HasAssociationId() bool` - -HasAssociationId returns a boolean if a field has been set. - -### GetBatchFeatures - -`func (o *V0037JobResponseProperties) GetBatchFeatures() string` - -GetBatchFeatures returns the BatchFeatures field if non-nil, zero value otherwise. - -### GetBatchFeaturesOk - -`func (o *V0037JobResponseProperties) GetBatchFeaturesOk() (*string, bool)` - -GetBatchFeaturesOk returns a tuple with the BatchFeatures field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetBatchFeatures - -`func (o *V0037JobResponseProperties) SetBatchFeatures(v string)` - -SetBatchFeatures sets BatchFeatures field to given value. - -### HasBatchFeatures - -`func (o *V0037JobResponseProperties) HasBatchFeatures() bool` - -HasBatchFeatures returns a boolean if a field has been set. - -### GetBatchFlag - -`func (o *V0037JobResponseProperties) GetBatchFlag() bool` - -GetBatchFlag returns the BatchFlag field if non-nil, zero value otherwise. - -### GetBatchFlagOk - -`func (o *V0037JobResponseProperties) GetBatchFlagOk() (*bool, bool)` - -GetBatchFlagOk returns a tuple with the BatchFlag field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetBatchFlag - -`func (o *V0037JobResponseProperties) SetBatchFlag(v bool)` - -SetBatchFlag sets BatchFlag field to given value. - -### HasBatchFlag - -`func (o *V0037JobResponseProperties) HasBatchFlag() bool` - -HasBatchFlag returns a boolean if a field has been set. - -### GetBatchHost - -`func (o *V0037JobResponseProperties) GetBatchHost() string` - -GetBatchHost returns the BatchHost field if non-nil, zero value otherwise. - -### GetBatchHostOk - -`func (o *V0037JobResponseProperties) GetBatchHostOk() (*string, bool)` - -GetBatchHostOk returns a tuple with the BatchHost field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetBatchHost - -`func (o *V0037JobResponseProperties) SetBatchHost(v string)` - -SetBatchHost sets BatchHost field to given value. - -### HasBatchHost - -`func (o *V0037JobResponseProperties) HasBatchHost() bool` - -HasBatchHost returns a boolean if a field has been set. - -### GetFlags - -`func (o *V0037JobResponseProperties) GetFlags() []string` - -GetFlags returns the Flags field if non-nil, zero value otherwise. - -### GetFlagsOk - -`func (o *V0037JobResponseProperties) GetFlagsOk() (*[]string, bool)` - -GetFlagsOk returns a tuple with the Flags field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetFlags - -`func (o *V0037JobResponseProperties) SetFlags(v []string)` - -SetFlags sets Flags field to given value. - -### HasFlags - -`func (o *V0037JobResponseProperties) HasFlags() bool` - -HasFlags returns a boolean if a field has been set. - -### GetBurstBuffer - -`func (o *V0037JobResponseProperties) GetBurstBuffer() string` - -GetBurstBuffer returns the BurstBuffer field if non-nil, zero value otherwise. - -### GetBurstBufferOk - -`func (o *V0037JobResponseProperties) GetBurstBufferOk() (*string, bool)` - -GetBurstBufferOk returns a tuple with the BurstBuffer field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetBurstBuffer - -`func (o *V0037JobResponseProperties) SetBurstBuffer(v string)` - -SetBurstBuffer sets BurstBuffer field to given value. - -### HasBurstBuffer - -`func (o *V0037JobResponseProperties) HasBurstBuffer() bool` - -HasBurstBuffer returns a boolean if a field has been set. - -### GetBurstBufferState - -`func (o *V0037JobResponseProperties) GetBurstBufferState() string` - -GetBurstBufferState returns the BurstBufferState field if non-nil, zero value otherwise. - -### GetBurstBufferStateOk - -`func (o *V0037JobResponseProperties) GetBurstBufferStateOk() (*string, bool)` - -GetBurstBufferStateOk returns a tuple with the BurstBufferState field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetBurstBufferState - -`func (o *V0037JobResponseProperties) SetBurstBufferState(v string)` - -SetBurstBufferState sets BurstBufferState field to given value. - -### HasBurstBufferState - -`func (o *V0037JobResponseProperties) HasBurstBufferState() bool` - -HasBurstBufferState returns a boolean if a field has been set. - -### GetCluster - -`func (o *V0037JobResponseProperties) GetCluster() string` - -GetCluster returns the Cluster field if non-nil, zero value otherwise. - -### GetClusterOk - -`func (o *V0037JobResponseProperties) GetClusterOk() (*string, bool)` - -GetClusterOk returns a tuple with the Cluster field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetCluster - -`func (o *V0037JobResponseProperties) SetCluster(v string)` - -SetCluster sets Cluster field to given value. - -### HasCluster - -`func (o *V0037JobResponseProperties) HasCluster() bool` - -HasCluster returns a boolean if a field has been set. - -### GetClusterFeatures - -`func (o *V0037JobResponseProperties) GetClusterFeatures() string` - -GetClusterFeatures returns the ClusterFeatures field if non-nil, zero value otherwise. - -### GetClusterFeaturesOk - -`func (o *V0037JobResponseProperties) GetClusterFeaturesOk() (*string, bool)` - -GetClusterFeaturesOk returns a tuple with the ClusterFeatures field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetClusterFeatures - -`func (o *V0037JobResponseProperties) SetClusterFeatures(v string)` - -SetClusterFeatures sets ClusterFeatures field to given value. - -### HasClusterFeatures - -`func (o *V0037JobResponseProperties) HasClusterFeatures() bool` - -HasClusterFeatures returns a boolean if a field has been set. - -### GetCommand - -`func (o *V0037JobResponseProperties) GetCommand() string` - -GetCommand returns the Command field if non-nil, zero value otherwise. - -### GetCommandOk - -`func (o *V0037JobResponseProperties) GetCommandOk() (*string, bool)` - -GetCommandOk returns a tuple with the Command field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetCommand - -`func (o *V0037JobResponseProperties) SetCommand(v string)` - -SetCommand sets Command field to given value. - -### HasCommand - -`func (o *V0037JobResponseProperties) HasCommand() bool` - -HasCommand returns a boolean if a field has been set. - -### GetComment - -`func (o *V0037JobResponseProperties) GetComment() string` - -GetComment returns the Comment field if non-nil, zero value otherwise. - -### GetCommentOk - -`func (o *V0037JobResponseProperties) GetCommentOk() (*string, bool)` - -GetCommentOk returns a tuple with the Comment field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetComment - -`func (o *V0037JobResponseProperties) SetComment(v string)` - -SetComment sets Comment field to given value. - -### HasComment - -`func (o *V0037JobResponseProperties) HasComment() bool` - -HasComment returns a boolean if a field has been set. - -### GetContiguous - -`func (o *V0037JobResponseProperties) GetContiguous() bool` - -GetContiguous returns the Contiguous field if non-nil, zero value otherwise. - -### GetContiguousOk - -`func (o *V0037JobResponseProperties) GetContiguousOk() (*bool, bool)` - -GetContiguousOk returns a tuple with the Contiguous field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetContiguous - -`func (o *V0037JobResponseProperties) SetContiguous(v bool)` - -SetContiguous sets Contiguous field to given value. - -### HasContiguous - -`func (o *V0037JobResponseProperties) HasContiguous() bool` - -HasContiguous returns a boolean if a field has been set. - -### GetCoreSpec - -`func (o *V0037JobResponseProperties) GetCoreSpec() string` - -GetCoreSpec returns the CoreSpec field if non-nil, zero value otherwise. - -### GetCoreSpecOk - -`func (o *V0037JobResponseProperties) GetCoreSpecOk() (*string, bool)` - -GetCoreSpecOk returns a tuple with the CoreSpec field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetCoreSpec - -`func (o *V0037JobResponseProperties) SetCoreSpec(v string)` - -SetCoreSpec sets CoreSpec field to given value. - -### HasCoreSpec - -`func (o *V0037JobResponseProperties) HasCoreSpec() bool` - -HasCoreSpec returns a boolean if a field has been set. - -### GetThreadSpec - -`func (o *V0037JobResponseProperties) GetThreadSpec() string` - -GetThreadSpec returns the ThreadSpec field if non-nil, zero value otherwise. - -### GetThreadSpecOk - -`func (o *V0037JobResponseProperties) GetThreadSpecOk() (*string, bool)` - -GetThreadSpecOk returns a tuple with the ThreadSpec field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetThreadSpec - -`func (o *V0037JobResponseProperties) SetThreadSpec(v string)` - -SetThreadSpec sets ThreadSpec field to given value. - -### HasThreadSpec - -`func (o *V0037JobResponseProperties) HasThreadSpec() bool` - -HasThreadSpec returns a boolean if a field has been set. - -### GetCoresPerSocket - -`func (o *V0037JobResponseProperties) GetCoresPerSocket() string` - -GetCoresPerSocket returns the CoresPerSocket field if non-nil, zero value otherwise. - -### GetCoresPerSocketOk - -`func (o *V0037JobResponseProperties) GetCoresPerSocketOk() (*string, bool)` - -GetCoresPerSocketOk returns a tuple with the CoresPerSocket field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetCoresPerSocket - -`func (o *V0037JobResponseProperties) SetCoresPerSocket(v string)` - -SetCoresPerSocket sets CoresPerSocket field to given value. - -### HasCoresPerSocket - -`func (o *V0037JobResponseProperties) HasCoresPerSocket() bool` - -HasCoresPerSocket returns a boolean if a field has been set. - -### GetBillableTres - -`func (o *V0037JobResponseProperties) GetBillableTres() string` - -GetBillableTres returns the BillableTres field if non-nil, zero value otherwise. - -### GetBillableTresOk - -`func (o *V0037JobResponseProperties) GetBillableTresOk() (*string, bool)` - -GetBillableTresOk returns a tuple with the BillableTres field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetBillableTres - -`func (o *V0037JobResponseProperties) SetBillableTres(v string)` - -SetBillableTres sets BillableTres field to given value. - -### HasBillableTres - -`func (o *V0037JobResponseProperties) HasBillableTres() bool` - -HasBillableTres returns a boolean if a field has been set. - -### GetCpusPerTask - -`func (o *V0037JobResponseProperties) GetCpusPerTask() string` - -GetCpusPerTask returns the CpusPerTask field if non-nil, zero value otherwise. - -### GetCpusPerTaskOk - -`func (o *V0037JobResponseProperties) GetCpusPerTaskOk() (*string, bool)` - -GetCpusPerTaskOk returns a tuple with the CpusPerTask field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetCpusPerTask - -`func (o *V0037JobResponseProperties) SetCpusPerTask(v string)` - -SetCpusPerTask sets CpusPerTask field to given value. - -### HasCpusPerTask - -`func (o *V0037JobResponseProperties) HasCpusPerTask() bool` - -HasCpusPerTask returns a boolean if a field has been set. - -### GetCpuFrequencyMinimum - -`func (o *V0037JobResponseProperties) GetCpuFrequencyMinimum() string` - -GetCpuFrequencyMinimum returns the CpuFrequencyMinimum field if non-nil, zero value otherwise. - -### GetCpuFrequencyMinimumOk - -`func (o *V0037JobResponseProperties) GetCpuFrequencyMinimumOk() (*string, bool)` - -GetCpuFrequencyMinimumOk returns a tuple with the CpuFrequencyMinimum field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetCpuFrequencyMinimum - -`func (o *V0037JobResponseProperties) SetCpuFrequencyMinimum(v string)` - -SetCpuFrequencyMinimum sets CpuFrequencyMinimum field to given value. - -### HasCpuFrequencyMinimum - -`func (o *V0037JobResponseProperties) HasCpuFrequencyMinimum() bool` - -HasCpuFrequencyMinimum returns a boolean if a field has been set. - -### GetCpuFrequencyMaximum - -`func (o *V0037JobResponseProperties) GetCpuFrequencyMaximum() string` - -GetCpuFrequencyMaximum returns the CpuFrequencyMaximum field if non-nil, zero value otherwise. - -### GetCpuFrequencyMaximumOk - -`func (o *V0037JobResponseProperties) GetCpuFrequencyMaximumOk() (*string, bool)` - -GetCpuFrequencyMaximumOk returns a tuple with the CpuFrequencyMaximum field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetCpuFrequencyMaximum - -`func (o *V0037JobResponseProperties) SetCpuFrequencyMaximum(v string)` - -SetCpuFrequencyMaximum sets CpuFrequencyMaximum field to given value. - -### HasCpuFrequencyMaximum - -`func (o *V0037JobResponseProperties) HasCpuFrequencyMaximum() bool` - -HasCpuFrequencyMaximum returns a boolean if a field has been set. - -### GetCpuFrequencyGovernor - -`func (o *V0037JobResponseProperties) GetCpuFrequencyGovernor() string` - -GetCpuFrequencyGovernor returns the CpuFrequencyGovernor field if non-nil, zero value otherwise. - -### GetCpuFrequencyGovernorOk - -`func (o *V0037JobResponseProperties) GetCpuFrequencyGovernorOk() (*string, bool)` - -GetCpuFrequencyGovernorOk returns a tuple with the CpuFrequencyGovernor field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetCpuFrequencyGovernor - -`func (o *V0037JobResponseProperties) SetCpuFrequencyGovernor(v string)` - -SetCpuFrequencyGovernor sets CpuFrequencyGovernor field to given value. - -### HasCpuFrequencyGovernor - -`func (o *V0037JobResponseProperties) HasCpuFrequencyGovernor() bool` - -HasCpuFrequencyGovernor returns a boolean if a field has been set. - -### GetCpusPerTres - -`func (o *V0037JobResponseProperties) GetCpusPerTres() string` - -GetCpusPerTres returns the CpusPerTres field if non-nil, zero value otherwise. - -### GetCpusPerTresOk - -`func (o *V0037JobResponseProperties) GetCpusPerTresOk() (*string, bool)` - -GetCpusPerTresOk returns a tuple with the CpusPerTres field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetCpusPerTres - -`func (o *V0037JobResponseProperties) SetCpusPerTres(v string)` - -SetCpusPerTres sets CpusPerTres field to given value. - -### HasCpusPerTres - -`func (o *V0037JobResponseProperties) HasCpusPerTres() bool` - -HasCpusPerTres returns a boolean if a field has been set. - -### GetDeadline - -`func (o *V0037JobResponseProperties) GetDeadline() string` - -GetDeadline returns the Deadline field if non-nil, zero value otherwise. - -### GetDeadlineOk - -`func (o *V0037JobResponseProperties) GetDeadlineOk() (*string, bool)` - -GetDeadlineOk returns a tuple with the Deadline field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetDeadline - -`func (o *V0037JobResponseProperties) SetDeadline(v string)` - -SetDeadline sets Deadline field to given value. - -### HasDeadline - -`func (o *V0037JobResponseProperties) HasDeadline() bool` - -HasDeadline returns a boolean if a field has been set. - -### GetDelayBoot - -`func (o *V0037JobResponseProperties) GetDelayBoot() string` - -GetDelayBoot returns the DelayBoot field if non-nil, zero value otherwise. - -### GetDelayBootOk - -`func (o *V0037JobResponseProperties) GetDelayBootOk() (*string, bool)` - -GetDelayBootOk returns a tuple with the DelayBoot field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetDelayBoot - -`func (o *V0037JobResponseProperties) SetDelayBoot(v string)` - -SetDelayBoot sets DelayBoot field to given value. - -### HasDelayBoot - -`func (o *V0037JobResponseProperties) HasDelayBoot() bool` - -HasDelayBoot returns a boolean if a field has been set. - -### GetDependency - -`func (o *V0037JobResponseProperties) GetDependency() string` - -GetDependency returns the Dependency field if non-nil, zero value otherwise. - -### GetDependencyOk - -`func (o *V0037JobResponseProperties) GetDependencyOk() (*string, bool)` - -GetDependencyOk returns a tuple with the Dependency field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetDependency - -`func (o *V0037JobResponseProperties) SetDependency(v string)` - -SetDependency sets Dependency field to given value. - -### HasDependency - -`func (o *V0037JobResponseProperties) HasDependency() bool` - -HasDependency returns a boolean if a field has been set. - -### GetDerivedExitCode - -`func (o *V0037JobResponseProperties) GetDerivedExitCode() string` - -GetDerivedExitCode returns the DerivedExitCode field if non-nil, zero value otherwise. - -### GetDerivedExitCodeOk - -`func (o *V0037JobResponseProperties) GetDerivedExitCodeOk() (*string, bool)` - -GetDerivedExitCodeOk returns a tuple with the DerivedExitCode field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetDerivedExitCode - -`func (o *V0037JobResponseProperties) SetDerivedExitCode(v string)` - -SetDerivedExitCode sets DerivedExitCode field to given value. - -### HasDerivedExitCode - -`func (o *V0037JobResponseProperties) HasDerivedExitCode() bool` - -HasDerivedExitCode returns a boolean if a field has been set. - -### GetEligibleTime - -`func (o *V0037JobResponseProperties) GetEligibleTime() int64` - -GetEligibleTime returns the EligibleTime field if non-nil, zero value otherwise. - -### GetEligibleTimeOk - -`func (o *V0037JobResponseProperties) GetEligibleTimeOk() (*int64, bool)` - -GetEligibleTimeOk returns a tuple with the EligibleTime field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetEligibleTime - -`func (o *V0037JobResponseProperties) SetEligibleTime(v int64)` - -SetEligibleTime sets EligibleTime field to given value. - -### HasEligibleTime - -`func (o *V0037JobResponseProperties) HasEligibleTime() bool` - -HasEligibleTime returns a boolean if a field has been set. - -### GetEndTime - -`func (o *V0037JobResponseProperties) GetEndTime() int64` - -GetEndTime returns the EndTime field if non-nil, zero value otherwise. - -### GetEndTimeOk - -`func (o *V0037JobResponseProperties) GetEndTimeOk() (*int64, bool)` - -GetEndTimeOk returns a tuple with the EndTime field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetEndTime - -`func (o *V0037JobResponseProperties) SetEndTime(v int64)` - -SetEndTime sets EndTime field to given value. - -### HasEndTime - -`func (o *V0037JobResponseProperties) HasEndTime() bool` - -HasEndTime returns a boolean if a field has been set. - -### GetExcludedNodes - -`func (o *V0037JobResponseProperties) GetExcludedNodes() string` - -GetExcludedNodes returns the ExcludedNodes field if non-nil, zero value otherwise. - -### GetExcludedNodesOk - -`func (o *V0037JobResponseProperties) GetExcludedNodesOk() (*string, bool)` - -GetExcludedNodesOk returns a tuple with the ExcludedNodes field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetExcludedNodes - -`func (o *V0037JobResponseProperties) SetExcludedNodes(v string)` - -SetExcludedNodes sets ExcludedNodes field to given value. - -### HasExcludedNodes - -`func (o *V0037JobResponseProperties) HasExcludedNodes() bool` - -HasExcludedNodes returns a boolean if a field has been set. - -### GetExitCode - -`func (o *V0037JobResponseProperties) GetExitCode() int32` - -GetExitCode returns the ExitCode field if non-nil, zero value otherwise. - -### GetExitCodeOk - -`func (o *V0037JobResponseProperties) GetExitCodeOk() (*int32, bool)` - -GetExitCodeOk returns a tuple with the ExitCode field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetExitCode - -`func (o *V0037JobResponseProperties) SetExitCode(v int32)` - -SetExitCode sets ExitCode field to given value. - -### HasExitCode - -`func (o *V0037JobResponseProperties) HasExitCode() bool` - -HasExitCode returns a boolean if a field has been set. - -### GetFeatures - -`func (o *V0037JobResponseProperties) GetFeatures() string` - -GetFeatures returns the Features field if non-nil, zero value otherwise. - -### GetFeaturesOk - -`func (o *V0037JobResponseProperties) GetFeaturesOk() (*string, bool)` - -GetFeaturesOk returns a tuple with the Features field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetFeatures - -`func (o *V0037JobResponseProperties) SetFeatures(v string)` - -SetFeatures sets Features field to given value. - -### HasFeatures - -`func (o *V0037JobResponseProperties) HasFeatures() bool` - -HasFeatures returns a boolean if a field has been set. - -### GetFederationOrigin - -`func (o *V0037JobResponseProperties) GetFederationOrigin() string` - -GetFederationOrigin returns the FederationOrigin field if non-nil, zero value otherwise. - -### GetFederationOriginOk - -`func (o *V0037JobResponseProperties) GetFederationOriginOk() (*string, bool)` - -GetFederationOriginOk returns a tuple with the FederationOrigin field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetFederationOrigin - -`func (o *V0037JobResponseProperties) SetFederationOrigin(v string)` - -SetFederationOrigin sets FederationOrigin field to given value. - -### HasFederationOrigin - -`func (o *V0037JobResponseProperties) HasFederationOrigin() bool` - -HasFederationOrigin returns a boolean if a field has been set. - -### GetFederationSiblingsActive - -`func (o *V0037JobResponseProperties) GetFederationSiblingsActive() string` - -GetFederationSiblingsActive returns the FederationSiblingsActive field if non-nil, zero value otherwise. - -### GetFederationSiblingsActiveOk - -`func (o *V0037JobResponseProperties) GetFederationSiblingsActiveOk() (*string, bool)` - -GetFederationSiblingsActiveOk returns a tuple with the FederationSiblingsActive field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetFederationSiblingsActive - -`func (o *V0037JobResponseProperties) SetFederationSiblingsActive(v string)` - -SetFederationSiblingsActive sets FederationSiblingsActive field to given value. - -### HasFederationSiblingsActive - -`func (o *V0037JobResponseProperties) HasFederationSiblingsActive() bool` - -HasFederationSiblingsActive returns a boolean if a field has been set. - -### GetFederationSiblingsViable - -`func (o *V0037JobResponseProperties) GetFederationSiblingsViable() string` - -GetFederationSiblingsViable returns the FederationSiblingsViable field if non-nil, zero value otherwise. - -### GetFederationSiblingsViableOk - -`func (o *V0037JobResponseProperties) GetFederationSiblingsViableOk() (*string, bool)` - -GetFederationSiblingsViableOk returns a tuple with the FederationSiblingsViable field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetFederationSiblingsViable - -`func (o *V0037JobResponseProperties) SetFederationSiblingsViable(v string)` - -SetFederationSiblingsViable sets FederationSiblingsViable field to given value. - -### HasFederationSiblingsViable - -`func (o *V0037JobResponseProperties) HasFederationSiblingsViable() bool` - -HasFederationSiblingsViable returns a boolean if a field has been set. - -### GetGresDetail - -`func (o *V0037JobResponseProperties) GetGresDetail() []string` - -GetGresDetail returns the GresDetail field if non-nil, zero value otherwise. - -### GetGresDetailOk - -`func (o *V0037JobResponseProperties) GetGresDetailOk() (*[]string, bool)` - -GetGresDetailOk returns a tuple with the GresDetail field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetGresDetail - -`func (o *V0037JobResponseProperties) SetGresDetail(v []string)` - -SetGresDetail sets GresDetail field to given value. - -### HasGresDetail - -`func (o *V0037JobResponseProperties) HasGresDetail() bool` - -HasGresDetail returns a boolean if a field has been set. - -### GetGroupId - -`func (o *V0037JobResponseProperties) GetGroupId() string` - -GetGroupId returns the GroupId field if non-nil, zero value otherwise. - -### GetGroupIdOk - -`func (o *V0037JobResponseProperties) GetGroupIdOk() (*string, bool)` - -GetGroupIdOk returns a tuple with the GroupId field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetGroupId - -`func (o *V0037JobResponseProperties) SetGroupId(v string)` - -SetGroupId sets GroupId field to given value. - -### HasGroupId - -`func (o *V0037JobResponseProperties) HasGroupId() bool` - -HasGroupId returns a boolean if a field has been set. - -### GetJobId - -`func (o *V0037JobResponseProperties) GetJobId() string` - -GetJobId returns the JobId field if non-nil, zero value otherwise. - -### GetJobIdOk - -`func (o *V0037JobResponseProperties) GetJobIdOk() (*string, bool)` - -GetJobIdOk returns a tuple with the JobId field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetJobId - -`func (o *V0037JobResponseProperties) SetJobId(v string)` - -SetJobId sets JobId field to given value. - -### HasJobId - -`func (o *V0037JobResponseProperties) HasJobId() bool` - -HasJobId returns a boolean if a field has been set. - -### GetJobResources - -`func (o *V0037JobResponseProperties) GetJobResources() V0037JobResources` - -GetJobResources returns the JobResources field if non-nil, zero value otherwise. - -### GetJobResourcesOk - -`func (o *V0037JobResponseProperties) GetJobResourcesOk() (*V0037JobResources, bool)` - -GetJobResourcesOk returns a tuple with the JobResources field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetJobResources - -`func (o *V0037JobResponseProperties) SetJobResources(v V0037JobResources)` - -SetJobResources sets JobResources field to given value. - -### HasJobResources - -`func (o *V0037JobResponseProperties) HasJobResources() bool` - -HasJobResources returns a boolean if a field has been set. - -### GetJobState - -`func (o *V0037JobResponseProperties) GetJobState() string` - -GetJobState returns the JobState field if non-nil, zero value otherwise. - -### GetJobStateOk - -`func (o *V0037JobResponseProperties) GetJobStateOk() (*string, bool)` - -GetJobStateOk returns a tuple with the JobState field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetJobState - -`func (o *V0037JobResponseProperties) SetJobState(v string)` - -SetJobState sets JobState field to given value. - -### HasJobState - -`func (o *V0037JobResponseProperties) HasJobState() bool` - -HasJobState returns a boolean if a field has been set. - -### GetLastSchedEvaluation - -`func (o *V0037JobResponseProperties) GetLastSchedEvaluation() string` - -GetLastSchedEvaluation returns the LastSchedEvaluation field if non-nil, zero value otherwise. - -### GetLastSchedEvaluationOk - -`func (o *V0037JobResponseProperties) GetLastSchedEvaluationOk() (*string, bool)` - -GetLastSchedEvaluationOk returns a tuple with the LastSchedEvaluation field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetLastSchedEvaluation - -`func (o *V0037JobResponseProperties) SetLastSchedEvaluation(v string)` - -SetLastSchedEvaluation sets LastSchedEvaluation field to given value. - -### HasLastSchedEvaluation - -`func (o *V0037JobResponseProperties) HasLastSchedEvaluation() bool` - -HasLastSchedEvaluation returns a boolean if a field has been set. - -### GetLicenses - -`func (o *V0037JobResponseProperties) GetLicenses() string` - -GetLicenses returns the Licenses field if non-nil, zero value otherwise. - -### GetLicensesOk - -`func (o *V0037JobResponseProperties) GetLicensesOk() (*string, bool)` - -GetLicensesOk returns a tuple with the Licenses field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetLicenses - -`func (o *V0037JobResponseProperties) SetLicenses(v string)` - -SetLicenses sets Licenses field to given value. - -### HasLicenses - -`func (o *V0037JobResponseProperties) HasLicenses() bool` - -HasLicenses returns a boolean if a field has been set. - -### GetMaxCpus - -`func (o *V0037JobResponseProperties) GetMaxCpus() string` - -GetMaxCpus returns the MaxCpus field if non-nil, zero value otherwise. - -### GetMaxCpusOk - -`func (o *V0037JobResponseProperties) GetMaxCpusOk() (*string, bool)` - -GetMaxCpusOk returns a tuple with the MaxCpus field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetMaxCpus - -`func (o *V0037JobResponseProperties) SetMaxCpus(v string)` - -SetMaxCpus sets MaxCpus field to given value. - -### HasMaxCpus - -`func (o *V0037JobResponseProperties) HasMaxCpus() bool` - -HasMaxCpus returns a boolean if a field has been set. - -### GetMaxNodes - -`func (o *V0037JobResponseProperties) GetMaxNodes() string` - -GetMaxNodes returns the MaxNodes field if non-nil, zero value otherwise. - -### GetMaxNodesOk - -`func (o *V0037JobResponseProperties) GetMaxNodesOk() (*string, bool)` - -GetMaxNodesOk returns a tuple with the MaxNodes field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetMaxNodes - -`func (o *V0037JobResponseProperties) SetMaxNodes(v string)` - -SetMaxNodes sets MaxNodes field to given value. - -### HasMaxNodes - -`func (o *V0037JobResponseProperties) HasMaxNodes() bool` - -HasMaxNodes returns a boolean if a field has been set. - -### GetMcsLabel - -`func (o *V0037JobResponseProperties) GetMcsLabel() string` - -GetMcsLabel returns the McsLabel field if non-nil, zero value otherwise. - -### GetMcsLabelOk - -`func (o *V0037JobResponseProperties) GetMcsLabelOk() (*string, bool)` - -GetMcsLabelOk returns a tuple with the McsLabel field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetMcsLabel - -`func (o *V0037JobResponseProperties) SetMcsLabel(v string)` - -SetMcsLabel sets McsLabel field to given value. - -### HasMcsLabel - -`func (o *V0037JobResponseProperties) HasMcsLabel() bool` - -HasMcsLabel returns a boolean if a field has been set. - -### GetMemoryPerTres - -`func (o *V0037JobResponseProperties) GetMemoryPerTres() string` - -GetMemoryPerTres returns the MemoryPerTres field if non-nil, zero value otherwise. - -### GetMemoryPerTresOk - -`func (o *V0037JobResponseProperties) GetMemoryPerTresOk() (*string, bool)` - -GetMemoryPerTresOk returns a tuple with the MemoryPerTres field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetMemoryPerTres - -`func (o *V0037JobResponseProperties) SetMemoryPerTres(v string)` - -SetMemoryPerTres sets MemoryPerTres field to given value. - -### HasMemoryPerTres - -`func (o *V0037JobResponseProperties) HasMemoryPerTres() bool` - -HasMemoryPerTres returns a boolean if a field has been set. - -### GetName - -`func (o *V0037JobResponseProperties) GetName() string` - -GetName returns the Name field if non-nil, zero value otherwise. - -### GetNameOk - -`func (o *V0037JobResponseProperties) GetNameOk() (*string, bool)` - -GetNameOk returns a tuple with the Name field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetName - -`func (o *V0037JobResponseProperties) SetName(v string)` - -SetName sets Name field to given value. - -### HasName - -`func (o *V0037JobResponseProperties) HasName() bool` - -HasName returns a boolean if a field has been set. - -### GetNodes - -`func (o *V0037JobResponseProperties) GetNodes() string` - -GetNodes returns the Nodes field if non-nil, zero value otherwise. - -### GetNodesOk - -`func (o *V0037JobResponseProperties) GetNodesOk() (*string, bool)` - -GetNodesOk returns a tuple with the Nodes field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetNodes - -`func (o *V0037JobResponseProperties) SetNodes(v string)` - -SetNodes sets Nodes field to given value. - -### HasNodes - -`func (o *V0037JobResponseProperties) HasNodes() bool` - -HasNodes returns a boolean if a field has been set. - -### GetNice - -`func (o *V0037JobResponseProperties) GetNice() string` - -GetNice returns the Nice field if non-nil, zero value otherwise. - -### GetNiceOk - -`func (o *V0037JobResponseProperties) GetNiceOk() (*string, bool)` - -GetNiceOk returns a tuple with the Nice field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetNice - -`func (o *V0037JobResponseProperties) SetNice(v string)` - -SetNice sets Nice field to given value. - -### HasNice - -`func (o *V0037JobResponseProperties) HasNice() bool` - -HasNice returns a boolean if a field has been set. - -### GetTasksPerCore - -`func (o *V0037JobResponseProperties) GetTasksPerCore() string` - -GetTasksPerCore returns the TasksPerCore field if non-nil, zero value otherwise. - -### GetTasksPerCoreOk - -`func (o *V0037JobResponseProperties) GetTasksPerCoreOk() (*string, bool)` - -GetTasksPerCoreOk returns a tuple with the TasksPerCore field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetTasksPerCore - -`func (o *V0037JobResponseProperties) SetTasksPerCore(v string)` - -SetTasksPerCore sets TasksPerCore field to given value. - -### HasTasksPerCore - -`func (o *V0037JobResponseProperties) HasTasksPerCore() bool` - -HasTasksPerCore returns a boolean if a field has been set. - -### GetTasksPerSocket - -`func (o *V0037JobResponseProperties) GetTasksPerSocket() string` - -GetTasksPerSocket returns the TasksPerSocket field if non-nil, zero value otherwise. - -### GetTasksPerSocketOk - -`func (o *V0037JobResponseProperties) GetTasksPerSocketOk() (*string, bool)` - -GetTasksPerSocketOk returns a tuple with the TasksPerSocket field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetTasksPerSocket - -`func (o *V0037JobResponseProperties) SetTasksPerSocket(v string)` - -SetTasksPerSocket sets TasksPerSocket field to given value. - -### HasTasksPerSocket - -`func (o *V0037JobResponseProperties) HasTasksPerSocket() bool` - -HasTasksPerSocket returns a boolean if a field has been set. - -### GetTasksPerBoard - -`func (o *V0037JobResponseProperties) GetTasksPerBoard() string` - -GetTasksPerBoard returns the TasksPerBoard field if non-nil, zero value otherwise. - -### GetTasksPerBoardOk - -`func (o *V0037JobResponseProperties) GetTasksPerBoardOk() (*string, bool)` - -GetTasksPerBoardOk returns a tuple with the TasksPerBoard field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetTasksPerBoard - -`func (o *V0037JobResponseProperties) SetTasksPerBoard(v string)` - -SetTasksPerBoard sets TasksPerBoard field to given value. - -### HasTasksPerBoard - -`func (o *V0037JobResponseProperties) HasTasksPerBoard() bool` - -HasTasksPerBoard returns a boolean if a field has been set. - -### GetCpus - -`func (o *V0037JobResponseProperties) GetCpus() string` - -GetCpus returns the Cpus field if non-nil, zero value otherwise. - -### GetCpusOk - -`func (o *V0037JobResponseProperties) GetCpusOk() (*string, bool)` - -GetCpusOk returns a tuple with the Cpus field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetCpus - -`func (o *V0037JobResponseProperties) SetCpus(v string)` - -SetCpus sets Cpus field to given value. - -### HasCpus - -`func (o *V0037JobResponseProperties) HasCpus() bool` - -HasCpus returns a boolean if a field has been set. - -### GetNodeCount - -`func (o *V0037JobResponseProperties) GetNodeCount() string` - -GetNodeCount returns the NodeCount field if non-nil, zero value otherwise. - -### GetNodeCountOk - -`func (o *V0037JobResponseProperties) GetNodeCountOk() (*string, bool)` - -GetNodeCountOk returns a tuple with the NodeCount field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetNodeCount - -`func (o *V0037JobResponseProperties) SetNodeCount(v string)` - -SetNodeCount sets NodeCount field to given value. - -### HasNodeCount - -`func (o *V0037JobResponseProperties) HasNodeCount() bool` - -HasNodeCount returns a boolean if a field has been set. - -### GetTasks - -`func (o *V0037JobResponseProperties) GetTasks() string` - -GetTasks returns the Tasks field if non-nil, zero value otherwise. - -### GetTasksOk - -`func (o *V0037JobResponseProperties) GetTasksOk() (*string, bool)` - -GetTasksOk returns a tuple with the Tasks field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetTasks - -`func (o *V0037JobResponseProperties) SetTasks(v string)` - -SetTasks sets Tasks field to given value. - -### HasTasks - -`func (o *V0037JobResponseProperties) HasTasks() bool` - -HasTasks returns a boolean if a field has been set. - -### GetHetJobId - -`func (o *V0037JobResponseProperties) GetHetJobId() string` - -GetHetJobId returns the HetJobId field if non-nil, zero value otherwise. - -### GetHetJobIdOk - -`func (o *V0037JobResponseProperties) GetHetJobIdOk() (*string, bool)` - -GetHetJobIdOk returns a tuple with the HetJobId field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetHetJobId - -`func (o *V0037JobResponseProperties) SetHetJobId(v string)` - -SetHetJobId sets HetJobId field to given value. - -### HasHetJobId - -`func (o *V0037JobResponseProperties) HasHetJobId() bool` - -HasHetJobId returns a boolean if a field has been set. - -### GetHetJobIdSet - -`func (o *V0037JobResponseProperties) GetHetJobIdSet() string` - -GetHetJobIdSet returns the HetJobIdSet field if non-nil, zero value otherwise. - -### GetHetJobIdSetOk - -`func (o *V0037JobResponseProperties) GetHetJobIdSetOk() (*string, bool)` - -GetHetJobIdSetOk returns a tuple with the HetJobIdSet field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetHetJobIdSet - -`func (o *V0037JobResponseProperties) SetHetJobIdSet(v string)` - -SetHetJobIdSet sets HetJobIdSet field to given value. - -### HasHetJobIdSet - -`func (o *V0037JobResponseProperties) HasHetJobIdSet() bool` - -HasHetJobIdSet returns a boolean if a field has been set. - -### GetHetJobOffset - -`func (o *V0037JobResponseProperties) GetHetJobOffset() string` - -GetHetJobOffset returns the HetJobOffset field if non-nil, zero value otherwise. - -### GetHetJobOffsetOk - -`func (o *V0037JobResponseProperties) GetHetJobOffsetOk() (*string, bool)` - -GetHetJobOffsetOk returns a tuple with the HetJobOffset field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetHetJobOffset - -`func (o *V0037JobResponseProperties) SetHetJobOffset(v string)` - -SetHetJobOffset sets HetJobOffset field to given value. - -### HasHetJobOffset - -`func (o *V0037JobResponseProperties) HasHetJobOffset() bool` - -HasHetJobOffset returns a boolean if a field has been set. - -### GetPartition - -`func (o *V0037JobResponseProperties) GetPartition() string` - -GetPartition returns the Partition field if non-nil, zero value otherwise. - -### GetPartitionOk - -`func (o *V0037JobResponseProperties) GetPartitionOk() (*string, bool)` - -GetPartitionOk returns a tuple with the Partition field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetPartition - -`func (o *V0037JobResponseProperties) SetPartition(v string)` - -SetPartition sets Partition field to given value. - -### HasPartition - -`func (o *V0037JobResponseProperties) HasPartition() bool` - -HasPartition returns a boolean if a field has been set. - -### GetMemoryPerNode - -`func (o *V0037JobResponseProperties) GetMemoryPerNode() string` - -GetMemoryPerNode returns the MemoryPerNode field if non-nil, zero value otherwise. - -### GetMemoryPerNodeOk - -`func (o *V0037JobResponseProperties) GetMemoryPerNodeOk() (*string, bool)` - -GetMemoryPerNodeOk returns a tuple with the MemoryPerNode field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetMemoryPerNode - -`func (o *V0037JobResponseProperties) SetMemoryPerNode(v string)` - -SetMemoryPerNode sets MemoryPerNode field to given value. - -### HasMemoryPerNode - -`func (o *V0037JobResponseProperties) HasMemoryPerNode() bool` - -HasMemoryPerNode returns a boolean if a field has been set. - -### GetMemoryPerCpu - -`func (o *V0037JobResponseProperties) GetMemoryPerCpu() string` - -GetMemoryPerCpu returns the MemoryPerCpu field if non-nil, zero value otherwise. - -### GetMemoryPerCpuOk - -`func (o *V0037JobResponseProperties) GetMemoryPerCpuOk() (*string, bool)` - -GetMemoryPerCpuOk returns a tuple with the MemoryPerCpu field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetMemoryPerCpu - -`func (o *V0037JobResponseProperties) SetMemoryPerCpu(v string)` - -SetMemoryPerCpu sets MemoryPerCpu field to given value. - -### HasMemoryPerCpu - -`func (o *V0037JobResponseProperties) HasMemoryPerCpu() bool` - -HasMemoryPerCpu returns a boolean if a field has been set. - -### GetMinimumCpusPerNode - -`func (o *V0037JobResponseProperties) GetMinimumCpusPerNode() string` - -GetMinimumCpusPerNode returns the MinimumCpusPerNode field if non-nil, zero value otherwise. - -### GetMinimumCpusPerNodeOk - -`func (o *V0037JobResponseProperties) GetMinimumCpusPerNodeOk() (*string, bool)` - -GetMinimumCpusPerNodeOk returns a tuple with the MinimumCpusPerNode field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetMinimumCpusPerNode - -`func (o *V0037JobResponseProperties) SetMinimumCpusPerNode(v string)` - -SetMinimumCpusPerNode sets MinimumCpusPerNode field to given value. - -### HasMinimumCpusPerNode - -`func (o *V0037JobResponseProperties) HasMinimumCpusPerNode() bool` - -HasMinimumCpusPerNode returns a boolean if a field has been set. - -### GetMinimumTmpDiskPerNode - -`func (o *V0037JobResponseProperties) GetMinimumTmpDiskPerNode() string` - -GetMinimumTmpDiskPerNode returns the MinimumTmpDiskPerNode field if non-nil, zero value otherwise. - -### GetMinimumTmpDiskPerNodeOk - -`func (o *V0037JobResponseProperties) GetMinimumTmpDiskPerNodeOk() (*string, bool)` - -GetMinimumTmpDiskPerNodeOk returns a tuple with the MinimumTmpDiskPerNode field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetMinimumTmpDiskPerNode - -`func (o *V0037JobResponseProperties) SetMinimumTmpDiskPerNode(v string)` - -SetMinimumTmpDiskPerNode sets MinimumTmpDiskPerNode field to given value. - -### HasMinimumTmpDiskPerNode - -`func (o *V0037JobResponseProperties) HasMinimumTmpDiskPerNode() bool` - -HasMinimumTmpDiskPerNode returns a boolean if a field has been set. - -### GetPreemptTime - -`func (o *V0037JobResponseProperties) GetPreemptTime() int64` - -GetPreemptTime returns the PreemptTime field if non-nil, zero value otherwise. - -### GetPreemptTimeOk - -`func (o *V0037JobResponseProperties) GetPreemptTimeOk() (*int64, bool)` - -GetPreemptTimeOk returns a tuple with the PreemptTime field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetPreemptTime - -`func (o *V0037JobResponseProperties) SetPreemptTime(v int64)` - -SetPreemptTime sets PreemptTime field to given value. - -### HasPreemptTime - -`func (o *V0037JobResponseProperties) HasPreemptTime() bool` - -HasPreemptTime returns a boolean if a field has been set. - -### GetPreSusTime - -`func (o *V0037JobResponseProperties) GetPreSusTime() int64` - -GetPreSusTime returns the PreSusTime field if non-nil, zero value otherwise. - -### GetPreSusTimeOk - -`func (o *V0037JobResponseProperties) GetPreSusTimeOk() (*int64, bool)` - -GetPreSusTimeOk returns a tuple with the PreSusTime field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetPreSusTime - -`func (o *V0037JobResponseProperties) SetPreSusTime(v int64)` - -SetPreSusTime sets PreSusTime field to given value. - -### HasPreSusTime - -`func (o *V0037JobResponseProperties) HasPreSusTime() bool` - -HasPreSusTime returns a boolean if a field has been set. - -### GetPriority - -`func (o *V0037JobResponseProperties) GetPriority() string` - -GetPriority returns the Priority field if non-nil, zero value otherwise. - -### GetPriorityOk - -`func (o *V0037JobResponseProperties) GetPriorityOk() (*string, bool)` - -GetPriorityOk returns a tuple with the Priority field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetPriority - -`func (o *V0037JobResponseProperties) SetPriority(v string)` - -SetPriority sets Priority field to given value. - -### HasPriority - -`func (o *V0037JobResponseProperties) HasPriority() bool` - -HasPriority returns a boolean if a field has been set. - -### GetProfile - -`func (o *V0037JobResponseProperties) GetProfile() []string` - -GetProfile returns the Profile field if non-nil, zero value otherwise. - -### GetProfileOk - -`func (o *V0037JobResponseProperties) GetProfileOk() (*[]string, bool)` - -GetProfileOk returns a tuple with the Profile field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetProfile - -`func (o *V0037JobResponseProperties) SetProfile(v []string)` - -SetProfile sets Profile field to given value. - -### HasProfile - -`func (o *V0037JobResponseProperties) HasProfile() bool` - -HasProfile returns a boolean if a field has been set. - -### GetQos - -`func (o *V0037JobResponseProperties) GetQos() string` - -GetQos returns the Qos field if non-nil, zero value otherwise. - -### GetQosOk - -`func (o *V0037JobResponseProperties) GetQosOk() (*string, bool)` - -GetQosOk returns a tuple with the Qos field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetQos - -`func (o *V0037JobResponseProperties) SetQos(v string)` - -SetQos sets Qos field to given value. - -### HasQos - -`func (o *V0037JobResponseProperties) HasQos() bool` - -HasQos returns a boolean if a field has been set. - -### GetReboot - -`func (o *V0037JobResponseProperties) GetReboot() bool` - -GetReboot returns the Reboot field if non-nil, zero value otherwise. - -### GetRebootOk - -`func (o *V0037JobResponseProperties) GetRebootOk() (*bool, bool)` - -GetRebootOk returns a tuple with the Reboot field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetReboot - -`func (o *V0037JobResponseProperties) SetReboot(v bool)` - -SetReboot sets Reboot field to given value. - -### HasReboot - -`func (o *V0037JobResponseProperties) HasReboot() bool` - -HasReboot returns a boolean if a field has been set. - -### GetRequiredNodes - -`func (o *V0037JobResponseProperties) GetRequiredNodes() string` - -GetRequiredNodes returns the RequiredNodes field if non-nil, zero value otherwise. - -### GetRequiredNodesOk - -`func (o *V0037JobResponseProperties) GetRequiredNodesOk() (*string, bool)` - -GetRequiredNodesOk returns a tuple with the RequiredNodes field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetRequiredNodes - -`func (o *V0037JobResponseProperties) SetRequiredNodes(v string)` - -SetRequiredNodes sets RequiredNodes field to given value. - -### HasRequiredNodes - -`func (o *V0037JobResponseProperties) HasRequiredNodes() bool` - -HasRequiredNodes returns a boolean if a field has been set. - -### GetRequeue - -`func (o *V0037JobResponseProperties) GetRequeue() bool` - -GetRequeue returns the Requeue field if non-nil, zero value otherwise. - -### GetRequeueOk - -`func (o *V0037JobResponseProperties) GetRequeueOk() (*bool, bool)` - -GetRequeueOk returns a tuple with the Requeue field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetRequeue - -`func (o *V0037JobResponseProperties) SetRequeue(v bool)` - -SetRequeue sets Requeue field to given value. - -### HasRequeue - -`func (o *V0037JobResponseProperties) HasRequeue() bool` - -HasRequeue returns a boolean if a field has been set. - -### GetResizeTime - -`func (o *V0037JobResponseProperties) GetResizeTime() int64` - -GetResizeTime returns the ResizeTime field if non-nil, zero value otherwise. - -### GetResizeTimeOk - -`func (o *V0037JobResponseProperties) GetResizeTimeOk() (*int64, bool)` - -GetResizeTimeOk returns a tuple with the ResizeTime field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetResizeTime - -`func (o *V0037JobResponseProperties) SetResizeTime(v int64)` - -SetResizeTime sets ResizeTime field to given value. - -### HasResizeTime - -`func (o *V0037JobResponseProperties) HasResizeTime() bool` - -HasResizeTime returns a boolean if a field has been set. - -### GetRestartCnt - -`func (o *V0037JobResponseProperties) GetRestartCnt() string` - -GetRestartCnt returns the RestartCnt field if non-nil, zero value otherwise. - -### GetRestartCntOk - -`func (o *V0037JobResponseProperties) GetRestartCntOk() (*string, bool)` - -GetRestartCntOk returns a tuple with the RestartCnt field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetRestartCnt - -`func (o *V0037JobResponseProperties) SetRestartCnt(v string)` - -SetRestartCnt sets RestartCnt field to given value. - -### HasRestartCnt - -`func (o *V0037JobResponseProperties) HasRestartCnt() bool` - -HasRestartCnt returns a boolean if a field has been set. - -### GetResvName - -`func (o *V0037JobResponseProperties) GetResvName() string` - -GetResvName returns the ResvName field if non-nil, zero value otherwise. - -### GetResvNameOk - -`func (o *V0037JobResponseProperties) GetResvNameOk() (*string, bool)` - -GetResvNameOk returns a tuple with the ResvName field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetResvName - -`func (o *V0037JobResponseProperties) SetResvName(v string)` - -SetResvName sets ResvName field to given value. - -### HasResvName - -`func (o *V0037JobResponseProperties) HasResvName() bool` - -HasResvName returns a boolean if a field has been set. - -### GetShared - -`func (o *V0037JobResponseProperties) GetShared() string` - -GetShared returns the Shared field if non-nil, zero value otherwise. - -### GetSharedOk - -`func (o *V0037JobResponseProperties) GetSharedOk() (*string, bool)` - -GetSharedOk returns a tuple with the Shared field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetShared - -`func (o *V0037JobResponseProperties) SetShared(v string)` - -SetShared sets Shared field to given value. - -### HasShared - -`func (o *V0037JobResponseProperties) HasShared() bool` - -HasShared returns a boolean if a field has been set. - -### GetShowFlags - -`func (o *V0037JobResponseProperties) GetShowFlags() []string` - -GetShowFlags returns the ShowFlags field if non-nil, zero value otherwise. - -### GetShowFlagsOk - -`func (o *V0037JobResponseProperties) GetShowFlagsOk() (*[]string, bool)` - -GetShowFlagsOk returns a tuple with the ShowFlags field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetShowFlags - -`func (o *V0037JobResponseProperties) SetShowFlags(v []string)` - -SetShowFlags sets ShowFlags field to given value. - -### HasShowFlags - -`func (o *V0037JobResponseProperties) HasShowFlags() bool` - -HasShowFlags returns a boolean if a field has been set. - -### GetSocketsPerBoard - -`func (o *V0037JobResponseProperties) GetSocketsPerBoard() string` - -GetSocketsPerBoard returns the SocketsPerBoard field if non-nil, zero value otherwise. - -### GetSocketsPerBoardOk - -`func (o *V0037JobResponseProperties) GetSocketsPerBoardOk() (*string, bool)` - -GetSocketsPerBoardOk returns a tuple with the SocketsPerBoard field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetSocketsPerBoard - -`func (o *V0037JobResponseProperties) SetSocketsPerBoard(v string)` - -SetSocketsPerBoard sets SocketsPerBoard field to given value. - -### HasSocketsPerBoard - -`func (o *V0037JobResponseProperties) HasSocketsPerBoard() bool` - -HasSocketsPerBoard returns a boolean if a field has been set. - -### GetSocketsPerNode - -`func (o *V0037JobResponseProperties) GetSocketsPerNode() string` - -GetSocketsPerNode returns the SocketsPerNode field if non-nil, zero value otherwise. - -### GetSocketsPerNodeOk - -`func (o *V0037JobResponseProperties) GetSocketsPerNodeOk() (*string, bool)` - -GetSocketsPerNodeOk returns a tuple with the SocketsPerNode field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetSocketsPerNode - -`func (o *V0037JobResponseProperties) SetSocketsPerNode(v string)` - -SetSocketsPerNode sets SocketsPerNode field to given value. - -### HasSocketsPerNode - -`func (o *V0037JobResponseProperties) HasSocketsPerNode() bool` - -HasSocketsPerNode returns a boolean if a field has been set. - -### GetStartTime - -`func (o *V0037JobResponseProperties) GetStartTime() int64` - -GetStartTime returns the StartTime field if non-nil, zero value otherwise. - -### GetStartTimeOk - -`func (o *V0037JobResponseProperties) GetStartTimeOk() (*int64, bool)` - -GetStartTimeOk returns a tuple with the StartTime field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetStartTime - -`func (o *V0037JobResponseProperties) SetStartTime(v int64)` - -SetStartTime sets StartTime field to given value. - -### HasStartTime - -`func (o *V0037JobResponseProperties) HasStartTime() bool` - -HasStartTime returns a boolean if a field has been set. - -### GetStateDescription - -`func (o *V0037JobResponseProperties) GetStateDescription() string` - -GetStateDescription returns the StateDescription field if non-nil, zero value otherwise. - -### GetStateDescriptionOk - -`func (o *V0037JobResponseProperties) GetStateDescriptionOk() (*string, bool)` - -GetStateDescriptionOk returns a tuple with the StateDescription field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetStateDescription - -`func (o *V0037JobResponseProperties) SetStateDescription(v string)` - -SetStateDescription sets StateDescription field to given value. - -### HasStateDescription - -`func (o *V0037JobResponseProperties) HasStateDescription() bool` - -HasStateDescription returns a boolean if a field has been set. - -### GetStateReason - -`func (o *V0037JobResponseProperties) GetStateReason() string` - -GetStateReason returns the StateReason field if non-nil, zero value otherwise. - -### GetStateReasonOk - -`func (o *V0037JobResponseProperties) GetStateReasonOk() (*string, bool)` - -GetStateReasonOk returns a tuple with the StateReason field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetStateReason - -`func (o *V0037JobResponseProperties) SetStateReason(v string)` - -SetStateReason sets StateReason field to given value. - -### HasStateReason - -`func (o *V0037JobResponseProperties) HasStateReason() bool` - -HasStateReason returns a boolean if a field has been set. - -### GetStandardError - -`func (o *V0037JobResponseProperties) GetStandardError() string` - -GetStandardError returns the StandardError field if non-nil, zero value otherwise. - -### GetStandardErrorOk - -`func (o *V0037JobResponseProperties) GetStandardErrorOk() (*string, bool)` - -GetStandardErrorOk returns a tuple with the StandardError field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetStandardError - -`func (o *V0037JobResponseProperties) SetStandardError(v string)` - -SetStandardError sets StandardError field to given value. - -### HasStandardError - -`func (o *V0037JobResponseProperties) HasStandardError() bool` - -HasStandardError returns a boolean if a field has been set. - -### GetStandardInput - -`func (o *V0037JobResponseProperties) GetStandardInput() string` - -GetStandardInput returns the StandardInput field if non-nil, zero value otherwise. - -### GetStandardInputOk - -`func (o *V0037JobResponseProperties) GetStandardInputOk() (*string, bool)` - -GetStandardInputOk returns a tuple with the StandardInput field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetStandardInput - -`func (o *V0037JobResponseProperties) SetStandardInput(v string)` - -SetStandardInput sets StandardInput field to given value. - -### HasStandardInput - -`func (o *V0037JobResponseProperties) HasStandardInput() bool` - -HasStandardInput returns a boolean if a field has been set. - -### GetStandardOutput - -`func (o *V0037JobResponseProperties) GetStandardOutput() string` - -GetStandardOutput returns the StandardOutput field if non-nil, zero value otherwise. - -### GetStandardOutputOk - -`func (o *V0037JobResponseProperties) GetStandardOutputOk() (*string, bool)` - -GetStandardOutputOk returns a tuple with the StandardOutput field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetStandardOutput - -`func (o *V0037JobResponseProperties) SetStandardOutput(v string)` - -SetStandardOutput sets StandardOutput field to given value. - -### HasStandardOutput - -`func (o *V0037JobResponseProperties) HasStandardOutput() bool` - -HasStandardOutput returns a boolean if a field has been set. - -### GetSubmitTime - -`func (o *V0037JobResponseProperties) GetSubmitTime() int64` - -GetSubmitTime returns the SubmitTime field if non-nil, zero value otherwise. - -### GetSubmitTimeOk - -`func (o *V0037JobResponseProperties) GetSubmitTimeOk() (*int64, bool)` - -GetSubmitTimeOk returns a tuple with the SubmitTime field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetSubmitTime - -`func (o *V0037JobResponseProperties) SetSubmitTime(v int64)` - -SetSubmitTime sets SubmitTime field to given value. - -### HasSubmitTime - -`func (o *V0037JobResponseProperties) HasSubmitTime() bool` - -HasSubmitTime returns a boolean if a field has been set. - -### GetSuspendTime - -`func (o *V0037JobResponseProperties) GetSuspendTime() int64` - -GetSuspendTime returns the SuspendTime field if non-nil, zero value otherwise. - -### GetSuspendTimeOk - -`func (o *V0037JobResponseProperties) GetSuspendTimeOk() (*int64, bool)` - -GetSuspendTimeOk returns a tuple with the SuspendTime field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetSuspendTime - -`func (o *V0037JobResponseProperties) SetSuspendTime(v int64)` - -SetSuspendTime sets SuspendTime field to given value. - -### HasSuspendTime - -`func (o *V0037JobResponseProperties) HasSuspendTime() bool` - -HasSuspendTime returns a boolean if a field has been set. - -### GetSystemComment - -`func (o *V0037JobResponseProperties) GetSystemComment() string` - -GetSystemComment returns the SystemComment field if non-nil, zero value otherwise. - -### GetSystemCommentOk - -`func (o *V0037JobResponseProperties) GetSystemCommentOk() (*string, bool)` - -GetSystemCommentOk returns a tuple with the SystemComment field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetSystemComment - -`func (o *V0037JobResponseProperties) SetSystemComment(v string)` - -SetSystemComment sets SystemComment field to given value. - -### HasSystemComment - -`func (o *V0037JobResponseProperties) HasSystemComment() bool` - -HasSystemComment returns a boolean if a field has been set. - -### GetTimeLimit - -`func (o *V0037JobResponseProperties) GetTimeLimit() string` - -GetTimeLimit returns the TimeLimit field if non-nil, zero value otherwise. - -### GetTimeLimitOk - -`func (o *V0037JobResponseProperties) GetTimeLimitOk() (*string, bool)` - -GetTimeLimitOk returns a tuple with the TimeLimit field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetTimeLimit - -`func (o *V0037JobResponseProperties) SetTimeLimit(v string)` - -SetTimeLimit sets TimeLimit field to given value. - -### HasTimeLimit - -`func (o *V0037JobResponseProperties) HasTimeLimit() bool` - -HasTimeLimit returns a boolean if a field has been set. - -### GetTimeMinimum - -`func (o *V0037JobResponseProperties) GetTimeMinimum() string` - -GetTimeMinimum returns the TimeMinimum field if non-nil, zero value otherwise. - -### GetTimeMinimumOk - -`func (o *V0037JobResponseProperties) GetTimeMinimumOk() (*string, bool)` - -GetTimeMinimumOk returns a tuple with the TimeMinimum field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetTimeMinimum - -`func (o *V0037JobResponseProperties) SetTimeMinimum(v string)` - -SetTimeMinimum sets TimeMinimum field to given value. - -### HasTimeMinimum - -`func (o *V0037JobResponseProperties) HasTimeMinimum() bool` - -HasTimeMinimum returns a boolean if a field has been set. - -### GetThreadsPerCore - -`func (o *V0037JobResponseProperties) GetThreadsPerCore() string` - -GetThreadsPerCore returns the ThreadsPerCore field if non-nil, zero value otherwise. - -### GetThreadsPerCoreOk - -`func (o *V0037JobResponseProperties) GetThreadsPerCoreOk() (*string, bool)` - -GetThreadsPerCoreOk returns a tuple with the ThreadsPerCore field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetThreadsPerCore - -`func (o *V0037JobResponseProperties) SetThreadsPerCore(v string)` - -SetThreadsPerCore sets ThreadsPerCore field to given value. - -### HasThreadsPerCore - -`func (o *V0037JobResponseProperties) HasThreadsPerCore() bool` - -HasThreadsPerCore returns a boolean if a field has been set. - -### GetTresBind - -`func (o *V0037JobResponseProperties) GetTresBind() string` - -GetTresBind returns the TresBind field if non-nil, zero value otherwise. - -### GetTresBindOk - -`func (o *V0037JobResponseProperties) GetTresBindOk() (*string, bool)` - -GetTresBindOk returns a tuple with the TresBind field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetTresBind - -`func (o *V0037JobResponseProperties) SetTresBind(v string)` - -SetTresBind sets TresBind field to given value. - -### HasTresBind - -`func (o *V0037JobResponseProperties) HasTresBind() bool` - -HasTresBind returns a boolean if a field has been set. - -### GetTresFreq - -`func (o *V0037JobResponseProperties) GetTresFreq() string` - -GetTresFreq returns the TresFreq field if non-nil, zero value otherwise. - -### GetTresFreqOk - -`func (o *V0037JobResponseProperties) GetTresFreqOk() (*string, bool)` - -GetTresFreqOk returns a tuple with the TresFreq field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetTresFreq - -`func (o *V0037JobResponseProperties) SetTresFreq(v string)` - -SetTresFreq sets TresFreq field to given value. - -### HasTresFreq - -`func (o *V0037JobResponseProperties) HasTresFreq() bool` - -HasTresFreq returns a boolean if a field has been set. - -### GetTresPerJob - -`func (o *V0037JobResponseProperties) GetTresPerJob() string` - -GetTresPerJob returns the TresPerJob field if non-nil, zero value otherwise. - -### GetTresPerJobOk - -`func (o *V0037JobResponseProperties) GetTresPerJobOk() (*string, bool)` - -GetTresPerJobOk returns a tuple with the TresPerJob field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetTresPerJob - -`func (o *V0037JobResponseProperties) SetTresPerJob(v string)` - -SetTresPerJob sets TresPerJob field to given value. - -### HasTresPerJob - -`func (o *V0037JobResponseProperties) HasTresPerJob() bool` - -HasTresPerJob returns a boolean if a field has been set. - -### GetTresPerNode - -`func (o *V0037JobResponseProperties) GetTresPerNode() string` - -GetTresPerNode returns the TresPerNode field if non-nil, zero value otherwise. - -### GetTresPerNodeOk - -`func (o *V0037JobResponseProperties) GetTresPerNodeOk() (*string, bool)` - -GetTresPerNodeOk returns a tuple with the TresPerNode field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetTresPerNode - -`func (o *V0037JobResponseProperties) SetTresPerNode(v string)` - -SetTresPerNode sets TresPerNode field to given value. - -### HasTresPerNode - -`func (o *V0037JobResponseProperties) HasTresPerNode() bool` - -HasTresPerNode returns a boolean if a field has been set. - -### GetTresPerSocket - -`func (o *V0037JobResponseProperties) GetTresPerSocket() string` - -GetTresPerSocket returns the TresPerSocket field if non-nil, zero value otherwise. - -### GetTresPerSocketOk - -`func (o *V0037JobResponseProperties) GetTresPerSocketOk() (*string, bool)` - -GetTresPerSocketOk returns a tuple with the TresPerSocket field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetTresPerSocket - -`func (o *V0037JobResponseProperties) SetTresPerSocket(v string)` - -SetTresPerSocket sets TresPerSocket field to given value. - -### HasTresPerSocket - -`func (o *V0037JobResponseProperties) HasTresPerSocket() bool` - -HasTresPerSocket returns a boolean if a field has been set. - -### GetTresPerTask - -`func (o *V0037JobResponseProperties) GetTresPerTask() string` - -GetTresPerTask returns the TresPerTask field if non-nil, zero value otherwise. - -### GetTresPerTaskOk - -`func (o *V0037JobResponseProperties) GetTresPerTaskOk() (*string, bool)` - -GetTresPerTaskOk returns a tuple with the TresPerTask field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetTresPerTask - -`func (o *V0037JobResponseProperties) SetTresPerTask(v string)` - -SetTresPerTask sets TresPerTask field to given value. - -### HasTresPerTask - -`func (o *V0037JobResponseProperties) HasTresPerTask() bool` - -HasTresPerTask returns a boolean if a field has been set. - -### GetTresReqStr - -`func (o *V0037JobResponseProperties) GetTresReqStr() string` - -GetTresReqStr returns the TresReqStr field if non-nil, zero value otherwise. - -### GetTresReqStrOk - -`func (o *V0037JobResponseProperties) GetTresReqStrOk() (*string, bool)` - -GetTresReqStrOk returns a tuple with the TresReqStr field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetTresReqStr - -`func (o *V0037JobResponseProperties) SetTresReqStr(v string)` - -SetTresReqStr sets TresReqStr field to given value. - -### HasTresReqStr - -`func (o *V0037JobResponseProperties) HasTresReqStr() bool` - -HasTresReqStr returns a boolean if a field has been set. - -### GetTresAllocStr - -`func (o *V0037JobResponseProperties) GetTresAllocStr() string` - -GetTresAllocStr returns the TresAllocStr field if non-nil, zero value otherwise. - -### GetTresAllocStrOk - -`func (o *V0037JobResponseProperties) GetTresAllocStrOk() (*string, bool)` - -GetTresAllocStrOk returns a tuple with the TresAllocStr field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetTresAllocStr - -`func (o *V0037JobResponseProperties) SetTresAllocStr(v string)` - -SetTresAllocStr sets TresAllocStr field to given value. - -### HasTresAllocStr - -`func (o *V0037JobResponseProperties) HasTresAllocStr() bool` - -HasTresAllocStr returns a boolean if a field has been set. - -### GetUserId - -`func (o *V0037JobResponseProperties) GetUserId() string` - -GetUserId returns the UserId field if non-nil, zero value otherwise. - -### GetUserIdOk - -`func (o *V0037JobResponseProperties) GetUserIdOk() (*string, bool)` - -GetUserIdOk returns a tuple with the UserId field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetUserId - -`func (o *V0037JobResponseProperties) SetUserId(v string)` - -SetUserId sets UserId field to given value. - -### HasUserId - -`func (o *V0037JobResponseProperties) HasUserId() bool` - -HasUserId returns a boolean if a field has been set. - -### GetUserName - -`func (o *V0037JobResponseProperties) GetUserName() string` - -GetUserName returns the UserName field if non-nil, zero value otherwise. - -### GetUserNameOk - -`func (o *V0037JobResponseProperties) GetUserNameOk() (*string, bool)` - -GetUserNameOk returns a tuple with the UserName field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetUserName - -`func (o *V0037JobResponseProperties) SetUserName(v string)` - -SetUserName sets UserName field to given value. - -### HasUserName - -`func (o *V0037JobResponseProperties) HasUserName() bool` - -HasUserName returns a boolean if a field has been set. - -### GetWckey - -`func (o *V0037JobResponseProperties) GetWckey() string` - -GetWckey returns the Wckey field if non-nil, zero value otherwise. - -### GetWckeyOk - -`func (o *V0037JobResponseProperties) GetWckeyOk() (*string, bool)` - -GetWckeyOk returns a tuple with the Wckey field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetWckey - -`func (o *V0037JobResponseProperties) SetWckey(v string)` - -SetWckey sets Wckey field to given value. - -### HasWckey - -`func (o *V0037JobResponseProperties) HasWckey() bool` - -HasWckey returns a boolean if a field has been set. - -### GetCurrentWorkingDirectory - -`func (o *V0037JobResponseProperties) GetCurrentWorkingDirectory() string` - -GetCurrentWorkingDirectory returns the CurrentWorkingDirectory field if non-nil, zero value otherwise. - -### GetCurrentWorkingDirectoryOk - -`func (o *V0037JobResponseProperties) GetCurrentWorkingDirectoryOk() (*string, bool)` - -GetCurrentWorkingDirectoryOk returns a tuple with the CurrentWorkingDirectory field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetCurrentWorkingDirectory - -`func (o *V0037JobResponseProperties) SetCurrentWorkingDirectory(v string)` - -SetCurrentWorkingDirectory sets CurrentWorkingDirectory field to given value. - -### HasCurrentWorkingDirectory - -`func (o *V0037JobResponseProperties) HasCurrentWorkingDirectory() bool` - -HasCurrentWorkingDirectory returns a boolean if a field has been set. - - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/internal/api/0.0.37/docs/V0037JobSubmission.md b/internal/api/0.0.37/docs/V0037JobSubmission.md deleted file mode 100644 index 5ecd255..0000000 --- a/internal/api/0.0.37/docs/V0037JobSubmission.md +++ /dev/null @@ -1,103 +0,0 @@ -# V0037JobSubmission - -## Properties - -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**Script** | **string** | Executable script (full contents) to run in batch step | -**Job** | Pointer to [**V0037JobProperties**](V0037JobProperties.md) | | [optional] -**Jobs** | Pointer to [**[]V0037JobProperties**](V0037JobProperties.md) | Properties of an HetJob | [optional] - -## Methods - -### NewV0037JobSubmission - -`func NewV0037JobSubmission(script string, ) *V0037JobSubmission` - -NewV0037JobSubmission instantiates a new V0037JobSubmission object -This constructor will assign default values to properties that have it defined, -and makes sure properties required by API are set, but the set of arguments -will change when the set of required properties is changed - -### NewV0037JobSubmissionWithDefaults - -`func NewV0037JobSubmissionWithDefaults() *V0037JobSubmission` - -NewV0037JobSubmissionWithDefaults instantiates a new V0037JobSubmission object -This constructor will only assign default values to properties that have it defined, -but it doesn't guarantee that properties required by API are set - -### GetScript - -`func (o *V0037JobSubmission) GetScript() string` - -GetScript returns the Script field if non-nil, zero value otherwise. - -### GetScriptOk - -`func (o *V0037JobSubmission) GetScriptOk() (*string, bool)` - -GetScriptOk returns a tuple with the Script field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetScript - -`func (o *V0037JobSubmission) SetScript(v string)` - -SetScript sets Script field to given value. - - -### GetJob - -`func (o *V0037JobSubmission) GetJob() V0037JobProperties` - -GetJob returns the Job field if non-nil, zero value otherwise. - -### GetJobOk - -`func (o *V0037JobSubmission) GetJobOk() (*V0037JobProperties, bool)` - -GetJobOk returns a tuple with the Job field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetJob - -`func (o *V0037JobSubmission) SetJob(v V0037JobProperties)` - -SetJob sets Job field to given value. - -### HasJob - -`func (o *V0037JobSubmission) HasJob() bool` - -HasJob returns a boolean if a field has been set. - -### GetJobs - -`func (o *V0037JobSubmission) GetJobs() []V0037JobProperties` - -GetJobs returns the Jobs field if non-nil, zero value otherwise. - -### GetJobsOk - -`func (o *V0037JobSubmission) GetJobsOk() (*[]V0037JobProperties, bool)` - -GetJobsOk returns a tuple with the Jobs field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetJobs - -`func (o *V0037JobSubmission) SetJobs(v []V0037JobProperties)` - -SetJobs sets Jobs field to given value. - -### HasJobs - -`func (o *V0037JobSubmission) HasJobs() bool` - -HasJobs returns a boolean if a field has been set. - - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/internal/api/0.0.37/docs/V0037JobSubmissionResponse.md b/internal/api/0.0.37/docs/V0037JobSubmissionResponse.md deleted file mode 100644 index 52ab5b4..0000000 --- a/internal/api/0.0.37/docs/V0037JobSubmissionResponse.md +++ /dev/null @@ -1,134 +0,0 @@ -# V0037JobSubmissionResponse - -## Properties - -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**Errors** | Pointer to [**[]V0037Error**](V0037Error.md) | slurm errors | [optional] -**JobId** | Pointer to **int32** | new job ID | [optional] -**StepId** | Pointer to **string** | new job step ID | [optional] -**JobSubmitUserMsg** | Pointer to **string** | Message to user from job_submit plugin | [optional] - -## Methods - -### NewV0037JobSubmissionResponse - -`func NewV0037JobSubmissionResponse() *V0037JobSubmissionResponse` - -NewV0037JobSubmissionResponse instantiates a new V0037JobSubmissionResponse object -This constructor will assign default values to properties that have it defined, -and makes sure properties required by API are set, but the set of arguments -will change when the set of required properties is changed - -### NewV0037JobSubmissionResponseWithDefaults - -`func NewV0037JobSubmissionResponseWithDefaults() *V0037JobSubmissionResponse` - -NewV0037JobSubmissionResponseWithDefaults instantiates a new V0037JobSubmissionResponse object -This constructor will only assign default values to properties that have it defined, -but it doesn't guarantee that properties required by API are set - -### GetErrors - -`func (o *V0037JobSubmissionResponse) GetErrors() []V0037Error` - -GetErrors returns the Errors field if non-nil, zero value otherwise. - -### GetErrorsOk - -`func (o *V0037JobSubmissionResponse) GetErrorsOk() (*[]V0037Error, bool)` - -GetErrorsOk returns a tuple with the Errors field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetErrors - -`func (o *V0037JobSubmissionResponse) SetErrors(v []V0037Error)` - -SetErrors sets Errors field to given value. - -### HasErrors - -`func (o *V0037JobSubmissionResponse) HasErrors() bool` - -HasErrors returns a boolean if a field has been set. - -### GetJobId - -`func (o *V0037JobSubmissionResponse) GetJobId() int32` - -GetJobId returns the JobId field if non-nil, zero value otherwise. - -### GetJobIdOk - -`func (o *V0037JobSubmissionResponse) GetJobIdOk() (*int32, bool)` - -GetJobIdOk returns a tuple with the JobId field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetJobId - -`func (o *V0037JobSubmissionResponse) SetJobId(v int32)` - -SetJobId sets JobId field to given value. - -### HasJobId - -`func (o *V0037JobSubmissionResponse) HasJobId() bool` - -HasJobId returns a boolean if a field has been set. - -### GetStepId - -`func (o *V0037JobSubmissionResponse) GetStepId() string` - -GetStepId returns the StepId field if non-nil, zero value otherwise. - -### GetStepIdOk - -`func (o *V0037JobSubmissionResponse) GetStepIdOk() (*string, bool)` - -GetStepIdOk returns a tuple with the StepId field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetStepId - -`func (o *V0037JobSubmissionResponse) SetStepId(v string)` - -SetStepId sets StepId field to given value. - -### HasStepId - -`func (o *V0037JobSubmissionResponse) HasStepId() bool` - -HasStepId returns a boolean if a field has been set. - -### GetJobSubmitUserMsg - -`func (o *V0037JobSubmissionResponse) GetJobSubmitUserMsg() string` - -GetJobSubmitUserMsg returns the JobSubmitUserMsg field if non-nil, zero value otherwise. - -### GetJobSubmitUserMsgOk - -`func (o *V0037JobSubmissionResponse) GetJobSubmitUserMsgOk() (*string, bool)` - -GetJobSubmitUserMsgOk returns a tuple with the JobSubmitUserMsg field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetJobSubmitUserMsg - -`func (o *V0037JobSubmissionResponse) SetJobSubmitUserMsg(v string)` - -SetJobSubmitUserMsg sets JobSubmitUserMsg field to given value. - -### HasJobSubmitUserMsg - -`func (o *V0037JobSubmissionResponse) HasJobSubmitUserMsg() bool` - -HasJobSubmitUserMsg returns a boolean if a field has been set. - - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/internal/api/0.0.37/docs/V0037JobsResponse.md b/internal/api/0.0.37/docs/V0037JobsResponse.md deleted file mode 100644 index c95d838..0000000 --- a/internal/api/0.0.37/docs/V0037JobsResponse.md +++ /dev/null @@ -1,82 +0,0 @@ -# V0037JobsResponse - -## Properties - -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**Errors** | Pointer to [**[]V0037Error**](V0037Error.md) | slurm errors | [optional] -**Jobs** | Pointer to [**[]V0037JobResponseProperties**](V0037JobResponseProperties.md) | job descriptions | [optional] - -## Methods - -### NewV0037JobsResponse - -`func NewV0037JobsResponse() *V0037JobsResponse` - -NewV0037JobsResponse instantiates a new V0037JobsResponse object -This constructor will assign default values to properties that have it defined, -and makes sure properties required by API are set, but the set of arguments -will change when the set of required properties is changed - -### NewV0037JobsResponseWithDefaults - -`func NewV0037JobsResponseWithDefaults() *V0037JobsResponse` - -NewV0037JobsResponseWithDefaults instantiates a new V0037JobsResponse object -This constructor will only assign default values to properties that have it defined, -but it doesn't guarantee that properties required by API are set - -### GetErrors - -`func (o *V0037JobsResponse) GetErrors() []V0037Error` - -GetErrors returns the Errors field if non-nil, zero value otherwise. - -### GetErrorsOk - -`func (o *V0037JobsResponse) GetErrorsOk() (*[]V0037Error, bool)` - -GetErrorsOk returns a tuple with the Errors field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetErrors - -`func (o *V0037JobsResponse) SetErrors(v []V0037Error)` - -SetErrors sets Errors field to given value. - -### HasErrors - -`func (o *V0037JobsResponse) HasErrors() bool` - -HasErrors returns a boolean if a field has been set. - -### GetJobs - -`func (o *V0037JobsResponse) GetJobs() []V0037JobResponseProperties` - -GetJobs returns the Jobs field if non-nil, zero value otherwise. - -### GetJobsOk - -`func (o *V0037JobsResponse) GetJobsOk() (*[]V0037JobResponseProperties, bool)` - -GetJobsOk returns a tuple with the Jobs field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetJobs - -`func (o *V0037JobsResponse) SetJobs(v []V0037JobResponseProperties)` - -SetJobs sets Jobs field to given value. - -### HasJobs - -`func (o *V0037JobsResponse) HasJobs() bool` - -HasJobs returns a boolean if a field has been set. - - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/internal/api/0.0.37/docs/V0037Node.md b/internal/api/0.0.37/docs/V0037Node.md deleted file mode 100644 index e3a828c..0000000 --- a/internal/api/0.0.37/docs/V0037Node.md +++ /dev/null @@ -1,1122 +0,0 @@ -# V0037Node - -## Properties - -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**Architecture** | Pointer to **string** | computer architecture | [optional] -**BurstbufferNetworkAddress** | Pointer to **string** | BcastAddr | [optional] -**Boards** | Pointer to **int32** | total number of boards per node | [optional] -**BootTime** | Pointer to **int64** | timestamp of node boot | [optional] -**Cores** | Pointer to **int32** | number of cores per socket | [optional] -**CpuBinding** | Pointer to **int32** | Default task binding | [optional] -**CpuLoad** | Pointer to **int64** | CPU load * 100 | [optional] -**FreeMemory** | Pointer to **int32** | free memory in MiB | [optional] -**Cpus** | Pointer to **int32** | configured count of cpus running on the node | [optional] -**Features** | Pointer to **string** | | [optional] -**ActiveFeatures** | Pointer to **string** | list of a node's available features | [optional] -**Gres** | Pointer to **string** | list of a node's generic resources | [optional] -**GresDrained** | Pointer to **string** | list of drained GRES | [optional] -**GresUsed** | Pointer to **string** | list of GRES in current use | [optional] -**McsLabel** | Pointer to **string** | mcs label if mcs plugin in use | [optional] -**Name** | Pointer to **string** | node name to slurm | [optional] -**NextStateAfterReboot** | Pointer to **string** | state after reboot | [optional] -**NextStateAfterRebootFlags** | Pointer to **[]string** | node state flags | [optional] -**Address** | Pointer to **string** | state after reboot | [optional] -**Hostname** | Pointer to **string** | node's hostname | [optional] -**State** | Pointer to **string** | current node state | [optional] -**StateFlags** | Pointer to **[]string** | node state flags | [optional] -**OperatingSystem** | Pointer to **string** | operating system | [optional] -**Owner** | Pointer to **string** | User allowed to use this node | [optional] -**Partitions** | Pointer to **[]string** | assigned partitions | [optional] -**Port** | Pointer to **int32** | TCP port number of the slurmd | [optional] -**RealMemory** | Pointer to **int32** | configured MB of real memory on the node | [optional] -**Reason** | Pointer to **string** | reason for node being DOWN or DRAINING | [optional] -**ReasonChangedAt** | Pointer to **int32** | Time stamp when reason was set | [optional] -**ReasonSetByUser** | Pointer to **string** | User that set the reason | [optional] -**SlurmdStartTime** | Pointer to **int64** | timestamp of slurmd startup | [optional] -**Sockets** | Pointer to **int32** | total number of sockets per node | [optional] -**Threads** | Pointer to **int32** | number of threads per core | [optional] -**TemporaryDisk** | Pointer to **int32** | configured MB of total disk in TMP_FS | [optional] -**Weight** | Pointer to **int32** | arbitrary priority of node for scheduling | [optional] -**Tres** | Pointer to **string** | TRES on node | [optional] -**TresUsed** | Pointer to **string** | TRES used on node | [optional] -**TresWeighted** | Pointer to **float64** | TRES weight used on node | [optional] -**SlurmdVersion** | Pointer to **string** | Slurmd version | [optional] -**AllocCpus** | Pointer to **int64** | Allocated CPUs | [optional] -**IdleCpus** | Pointer to **int64** | Idle CPUs | [optional] -**AllocMemory** | Pointer to **int64** | Allocated memory (MB) | [optional] - -## Methods - -### NewV0037Node - -`func NewV0037Node() *V0037Node` - -NewV0037Node instantiates a new V0037Node object -This constructor will assign default values to properties that have it defined, -and makes sure properties required by API are set, but the set of arguments -will change when the set of required properties is changed - -### NewV0037NodeWithDefaults - -`func NewV0037NodeWithDefaults() *V0037Node` - -NewV0037NodeWithDefaults instantiates a new V0037Node object -This constructor will only assign default values to properties that have it defined, -but it doesn't guarantee that properties required by API are set - -### GetArchitecture - -`func (o *V0037Node) GetArchitecture() string` - -GetArchitecture returns the Architecture field if non-nil, zero value otherwise. - -### GetArchitectureOk - -`func (o *V0037Node) GetArchitectureOk() (*string, bool)` - -GetArchitectureOk returns a tuple with the Architecture field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetArchitecture - -`func (o *V0037Node) SetArchitecture(v string)` - -SetArchitecture sets Architecture field to given value. - -### HasArchitecture - -`func (o *V0037Node) HasArchitecture() bool` - -HasArchitecture returns a boolean if a field has been set. - -### GetBurstbufferNetworkAddress - -`func (o *V0037Node) GetBurstbufferNetworkAddress() string` - -GetBurstbufferNetworkAddress returns the BurstbufferNetworkAddress field if non-nil, zero value otherwise. - -### GetBurstbufferNetworkAddressOk - -`func (o *V0037Node) GetBurstbufferNetworkAddressOk() (*string, bool)` - -GetBurstbufferNetworkAddressOk returns a tuple with the BurstbufferNetworkAddress field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetBurstbufferNetworkAddress - -`func (o *V0037Node) SetBurstbufferNetworkAddress(v string)` - -SetBurstbufferNetworkAddress sets BurstbufferNetworkAddress field to given value. - -### HasBurstbufferNetworkAddress - -`func (o *V0037Node) HasBurstbufferNetworkAddress() bool` - -HasBurstbufferNetworkAddress returns a boolean if a field has been set. - -### GetBoards - -`func (o *V0037Node) GetBoards() int32` - -GetBoards returns the Boards field if non-nil, zero value otherwise. - -### GetBoardsOk - -`func (o *V0037Node) GetBoardsOk() (*int32, bool)` - -GetBoardsOk returns a tuple with the Boards field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetBoards - -`func (o *V0037Node) SetBoards(v int32)` - -SetBoards sets Boards field to given value. - -### HasBoards - -`func (o *V0037Node) HasBoards() bool` - -HasBoards returns a boolean if a field has been set. - -### GetBootTime - -`func (o *V0037Node) GetBootTime() int64` - -GetBootTime returns the BootTime field if non-nil, zero value otherwise. - -### GetBootTimeOk - -`func (o *V0037Node) GetBootTimeOk() (*int64, bool)` - -GetBootTimeOk returns a tuple with the BootTime field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetBootTime - -`func (o *V0037Node) SetBootTime(v int64)` - -SetBootTime sets BootTime field to given value. - -### HasBootTime - -`func (o *V0037Node) HasBootTime() bool` - -HasBootTime returns a boolean if a field has been set. - -### GetCores - -`func (o *V0037Node) GetCores() int32` - -GetCores returns the Cores field if non-nil, zero value otherwise. - -### GetCoresOk - -`func (o *V0037Node) GetCoresOk() (*int32, bool)` - -GetCoresOk returns a tuple with the Cores field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetCores - -`func (o *V0037Node) SetCores(v int32)` - -SetCores sets Cores field to given value. - -### HasCores - -`func (o *V0037Node) HasCores() bool` - -HasCores returns a boolean if a field has been set. - -### GetCpuBinding - -`func (o *V0037Node) GetCpuBinding() int32` - -GetCpuBinding returns the CpuBinding field if non-nil, zero value otherwise. - -### GetCpuBindingOk - -`func (o *V0037Node) GetCpuBindingOk() (*int32, bool)` - -GetCpuBindingOk returns a tuple with the CpuBinding field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetCpuBinding - -`func (o *V0037Node) SetCpuBinding(v int32)` - -SetCpuBinding sets CpuBinding field to given value. - -### HasCpuBinding - -`func (o *V0037Node) HasCpuBinding() bool` - -HasCpuBinding returns a boolean if a field has been set. - -### GetCpuLoad - -`func (o *V0037Node) GetCpuLoad() int64` - -GetCpuLoad returns the CpuLoad field if non-nil, zero value otherwise. - -### GetCpuLoadOk - -`func (o *V0037Node) GetCpuLoadOk() (*int64, bool)` - -GetCpuLoadOk returns a tuple with the CpuLoad field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetCpuLoad - -`func (o *V0037Node) SetCpuLoad(v int64)` - -SetCpuLoad sets CpuLoad field to given value. - -### HasCpuLoad - -`func (o *V0037Node) HasCpuLoad() bool` - -HasCpuLoad returns a boolean if a field has been set. - -### GetFreeMemory - -`func (o *V0037Node) GetFreeMemory() int32` - -GetFreeMemory returns the FreeMemory field if non-nil, zero value otherwise. - -### GetFreeMemoryOk - -`func (o *V0037Node) GetFreeMemoryOk() (*int32, bool)` - -GetFreeMemoryOk returns a tuple with the FreeMemory field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetFreeMemory - -`func (o *V0037Node) SetFreeMemory(v int32)` - -SetFreeMemory sets FreeMemory field to given value. - -### HasFreeMemory - -`func (o *V0037Node) HasFreeMemory() bool` - -HasFreeMemory returns a boolean if a field has been set. - -### GetCpus - -`func (o *V0037Node) GetCpus() int32` - -GetCpus returns the Cpus field if non-nil, zero value otherwise. - -### GetCpusOk - -`func (o *V0037Node) GetCpusOk() (*int32, bool)` - -GetCpusOk returns a tuple with the Cpus field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetCpus - -`func (o *V0037Node) SetCpus(v int32)` - -SetCpus sets Cpus field to given value. - -### HasCpus - -`func (o *V0037Node) HasCpus() bool` - -HasCpus returns a boolean if a field has been set. - -### GetFeatures - -`func (o *V0037Node) GetFeatures() string` - -GetFeatures returns the Features field if non-nil, zero value otherwise. - -### GetFeaturesOk - -`func (o *V0037Node) GetFeaturesOk() (*string, bool)` - -GetFeaturesOk returns a tuple with the Features field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetFeatures - -`func (o *V0037Node) SetFeatures(v string)` - -SetFeatures sets Features field to given value. - -### HasFeatures - -`func (o *V0037Node) HasFeatures() bool` - -HasFeatures returns a boolean if a field has been set. - -### GetActiveFeatures - -`func (o *V0037Node) GetActiveFeatures() string` - -GetActiveFeatures returns the ActiveFeatures field if non-nil, zero value otherwise. - -### GetActiveFeaturesOk - -`func (o *V0037Node) GetActiveFeaturesOk() (*string, bool)` - -GetActiveFeaturesOk returns a tuple with the ActiveFeatures field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetActiveFeatures - -`func (o *V0037Node) SetActiveFeatures(v string)` - -SetActiveFeatures sets ActiveFeatures field to given value. - -### HasActiveFeatures - -`func (o *V0037Node) HasActiveFeatures() bool` - -HasActiveFeatures returns a boolean if a field has been set. - -### GetGres - -`func (o *V0037Node) GetGres() string` - -GetGres returns the Gres field if non-nil, zero value otherwise. - -### GetGresOk - -`func (o *V0037Node) GetGresOk() (*string, bool)` - -GetGresOk returns a tuple with the Gres field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetGres - -`func (o *V0037Node) SetGres(v string)` - -SetGres sets Gres field to given value. - -### HasGres - -`func (o *V0037Node) HasGres() bool` - -HasGres returns a boolean if a field has been set. - -### GetGresDrained - -`func (o *V0037Node) GetGresDrained() string` - -GetGresDrained returns the GresDrained field if non-nil, zero value otherwise. - -### GetGresDrainedOk - -`func (o *V0037Node) GetGresDrainedOk() (*string, bool)` - -GetGresDrainedOk returns a tuple with the GresDrained field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetGresDrained - -`func (o *V0037Node) SetGresDrained(v string)` - -SetGresDrained sets GresDrained field to given value. - -### HasGresDrained - -`func (o *V0037Node) HasGresDrained() bool` - -HasGresDrained returns a boolean if a field has been set. - -### GetGresUsed - -`func (o *V0037Node) GetGresUsed() string` - -GetGresUsed returns the GresUsed field if non-nil, zero value otherwise. - -### GetGresUsedOk - -`func (o *V0037Node) GetGresUsedOk() (*string, bool)` - -GetGresUsedOk returns a tuple with the GresUsed field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetGresUsed - -`func (o *V0037Node) SetGresUsed(v string)` - -SetGresUsed sets GresUsed field to given value. - -### HasGresUsed - -`func (o *V0037Node) HasGresUsed() bool` - -HasGresUsed returns a boolean if a field has been set. - -### GetMcsLabel - -`func (o *V0037Node) GetMcsLabel() string` - -GetMcsLabel returns the McsLabel field if non-nil, zero value otherwise. - -### GetMcsLabelOk - -`func (o *V0037Node) GetMcsLabelOk() (*string, bool)` - -GetMcsLabelOk returns a tuple with the McsLabel field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetMcsLabel - -`func (o *V0037Node) SetMcsLabel(v string)` - -SetMcsLabel sets McsLabel field to given value. - -### HasMcsLabel - -`func (o *V0037Node) HasMcsLabel() bool` - -HasMcsLabel returns a boolean if a field has been set. - -### GetName - -`func (o *V0037Node) GetName() string` - -GetName returns the Name field if non-nil, zero value otherwise. - -### GetNameOk - -`func (o *V0037Node) GetNameOk() (*string, bool)` - -GetNameOk returns a tuple with the Name field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetName - -`func (o *V0037Node) SetName(v string)` - -SetName sets Name field to given value. - -### HasName - -`func (o *V0037Node) HasName() bool` - -HasName returns a boolean if a field has been set. - -### GetNextStateAfterReboot - -`func (o *V0037Node) GetNextStateAfterReboot() string` - -GetNextStateAfterReboot returns the NextStateAfterReboot field if non-nil, zero value otherwise. - -### GetNextStateAfterRebootOk - -`func (o *V0037Node) GetNextStateAfterRebootOk() (*string, bool)` - -GetNextStateAfterRebootOk returns a tuple with the NextStateAfterReboot field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetNextStateAfterReboot - -`func (o *V0037Node) SetNextStateAfterReboot(v string)` - -SetNextStateAfterReboot sets NextStateAfterReboot field to given value. - -### HasNextStateAfterReboot - -`func (o *V0037Node) HasNextStateAfterReboot() bool` - -HasNextStateAfterReboot returns a boolean if a field has been set. - -### GetNextStateAfterRebootFlags - -`func (o *V0037Node) GetNextStateAfterRebootFlags() []string` - -GetNextStateAfterRebootFlags returns the NextStateAfterRebootFlags field if non-nil, zero value otherwise. - -### GetNextStateAfterRebootFlagsOk - -`func (o *V0037Node) GetNextStateAfterRebootFlagsOk() (*[]string, bool)` - -GetNextStateAfterRebootFlagsOk returns a tuple with the NextStateAfterRebootFlags field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetNextStateAfterRebootFlags - -`func (o *V0037Node) SetNextStateAfterRebootFlags(v []string)` - -SetNextStateAfterRebootFlags sets NextStateAfterRebootFlags field to given value. - -### HasNextStateAfterRebootFlags - -`func (o *V0037Node) HasNextStateAfterRebootFlags() bool` - -HasNextStateAfterRebootFlags returns a boolean if a field has been set. - -### GetAddress - -`func (o *V0037Node) GetAddress() string` - -GetAddress returns the Address field if non-nil, zero value otherwise. - -### GetAddressOk - -`func (o *V0037Node) GetAddressOk() (*string, bool)` - -GetAddressOk returns a tuple with the Address field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetAddress - -`func (o *V0037Node) SetAddress(v string)` - -SetAddress sets Address field to given value. - -### HasAddress - -`func (o *V0037Node) HasAddress() bool` - -HasAddress returns a boolean if a field has been set. - -### GetHostname - -`func (o *V0037Node) GetHostname() string` - -GetHostname returns the Hostname field if non-nil, zero value otherwise. - -### GetHostnameOk - -`func (o *V0037Node) GetHostnameOk() (*string, bool)` - -GetHostnameOk returns a tuple with the Hostname field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetHostname - -`func (o *V0037Node) SetHostname(v string)` - -SetHostname sets Hostname field to given value. - -### HasHostname - -`func (o *V0037Node) HasHostname() bool` - -HasHostname returns a boolean if a field has been set. - -### GetState - -`func (o *V0037Node) GetState() string` - -GetState returns the State field if non-nil, zero value otherwise. - -### GetStateOk - -`func (o *V0037Node) GetStateOk() (*string, bool)` - -GetStateOk returns a tuple with the State field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetState - -`func (o *V0037Node) SetState(v string)` - -SetState sets State field to given value. - -### HasState - -`func (o *V0037Node) HasState() bool` - -HasState returns a boolean if a field has been set. - -### GetStateFlags - -`func (o *V0037Node) GetStateFlags() []string` - -GetStateFlags returns the StateFlags field if non-nil, zero value otherwise. - -### GetStateFlagsOk - -`func (o *V0037Node) GetStateFlagsOk() (*[]string, bool)` - -GetStateFlagsOk returns a tuple with the StateFlags field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetStateFlags - -`func (o *V0037Node) SetStateFlags(v []string)` - -SetStateFlags sets StateFlags field to given value. - -### HasStateFlags - -`func (o *V0037Node) HasStateFlags() bool` - -HasStateFlags returns a boolean if a field has been set. - -### GetOperatingSystem - -`func (o *V0037Node) GetOperatingSystem() string` - -GetOperatingSystem returns the OperatingSystem field if non-nil, zero value otherwise. - -### GetOperatingSystemOk - -`func (o *V0037Node) GetOperatingSystemOk() (*string, bool)` - -GetOperatingSystemOk returns a tuple with the OperatingSystem field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetOperatingSystem - -`func (o *V0037Node) SetOperatingSystem(v string)` - -SetOperatingSystem sets OperatingSystem field to given value. - -### HasOperatingSystem - -`func (o *V0037Node) HasOperatingSystem() bool` - -HasOperatingSystem returns a boolean if a field has been set. - -### GetOwner - -`func (o *V0037Node) GetOwner() string` - -GetOwner returns the Owner field if non-nil, zero value otherwise. - -### GetOwnerOk - -`func (o *V0037Node) GetOwnerOk() (*string, bool)` - -GetOwnerOk returns a tuple with the Owner field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetOwner - -`func (o *V0037Node) SetOwner(v string)` - -SetOwner sets Owner field to given value. - -### HasOwner - -`func (o *V0037Node) HasOwner() bool` - -HasOwner returns a boolean if a field has been set. - -### GetPartitions - -`func (o *V0037Node) GetPartitions() []string` - -GetPartitions returns the Partitions field if non-nil, zero value otherwise. - -### GetPartitionsOk - -`func (o *V0037Node) GetPartitionsOk() (*[]string, bool)` - -GetPartitionsOk returns a tuple with the Partitions field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetPartitions - -`func (o *V0037Node) SetPartitions(v []string)` - -SetPartitions sets Partitions field to given value. - -### HasPartitions - -`func (o *V0037Node) HasPartitions() bool` - -HasPartitions returns a boolean if a field has been set. - -### GetPort - -`func (o *V0037Node) GetPort() int32` - -GetPort returns the Port field if non-nil, zero value otherwise. - -### GetPortOk - -`func (o *V0037Node) GetPortOk() (*int32, bool)` - -GetPortOk returns a tuple with the Port field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetPort - -`func (o *V0037Node) SetPort(v int32)` - -SetPort sets Port field to given value. - -### HasPort - -`func (o *V0037Node) HasPort() bool` - -HasPort returns a boolean if a field has been set. - -### GetRealMemory - -`func (o *V0037Node) GetRealMemory() int32` - -GetRealMemory returns the RealMemory field if non-nil, zero value otherwise. - -### GetRealMemoryOk - -`func (o *V0037Node) GetRealMemoryOk() (*int32, bool)` - -GetRealMemoryOk returns a tuple with the RealMemory field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetRealMemory - -`func (o *V0037Node) SetRealMemory(v int32)` - -SetRealMemory sets RealMemory field to given value. - -### HasRealMemory - -`func (o *V0037Node) HasRealMemory() bool` - -HasRealMemory returns a boolean if a field has been set. - -### GetReason - -`func (o *V0037Node) GetReason() string` - -GetReason returns the Reason field if non-nil, zero value otherwise. - -### GetReasonOk - -`func (o *V0037Node) GetReasonOk() (*string, bool)` - -GetReasonOk returns a tuple with the Reason field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetReason - -`func (o *V0037Node) SetReason(v string)` - -SetReason sets Reason field to given value. - -### HasReason - -`func (o *V0037Node) HasReason() bool` - -HasReason returns a boolean if a field has been set. - -### GetReasonChangedAt - -`func (o *V0037Node) GetReasonChangedAt() int32` - -GetReasonChangedAt returns the ReasonChangedAt field if non-nil, zero value otherwise. - -### GetReasonChangedAtOk - -`func (o *V0037Node) GetReasonChangedAtOk() (*int32, bool)` - -GetReasonChangedAtOk returns a tuple with the ReasonChangedAt field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetReasonChangedAt - -`func (o *V0037Node) SetReasonChangedAt(v int32)` - -SetReasonChangedAt sets ReasonChangedAt field to given value. - -### HasReasonChangedAt - -`func (o *V0037Node) HasReasonChangedAt() bool` - -HasReasonChangedAt returns a boolean if a field has been set. - -### GetReasonSetByUser - -`func (o *V0037Node) GetReasonSetByUser() string` - -GetReasonSetByUser returns the ReasonSetByUser field if non-nil, zero value otherwise. - -### GetReasonSetByUserOk - -`func (o *V0037Node) GetReasonSetByUserOk() (*string, bool)` - -GetReasonSetByUserOk returns a tuple with the ReasonSetByUser field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetReasonSetByUser - -`func (o *V0037Node) SetReasonSetByUser(v string)` - -SetReasonSetByUser sets ReasonSetByUser field to given value. - -### HasReasonSetByUser - -`func (o *V0037Node) HasReasonSetByUser() bool` - -HasReasonSetByUser returns a boolean if a field has been set. - -### GetSlurmdStartTime - -`func (o *V0037Node) GetSlurmdStartTime() int64` - -GetSlurmdStartTime returns the SlurmdStartTime field if non-nil, zero value otherwise. - -### GetSlurmdStartTimeOk - -`func (o *V0037Node) GetSlurmdStartTimeOk() (*int64, bool)` - -GetSlurmdStartTimeOk returns a tuple with the SlurmdStartTime field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetSlurmdStartTime - -`func (o *V0037Node) SetSlurmdStartTime(v int64)` - -SetSlurmdStartTime sets SlurmdStartTime field to given value. - -### HasSlurmdStartTime - -`func (o *V0037Node) HasSlurmdStartTime() bool` - -HasSlurmdStartTime returns a boolean if a field has been set. - -### GetSockets - -`func (o *V0037Node) GetSockets() int32` - -GetSockets returns the Sockets field if non-nil, zero value otherwise. - -### GetSocketsOk - -`func (o *V0037Node) GetSocketsOk() (*int32, bool)` - -GetSocketsOk returns a tuple with the Sockets field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetSockets - -`func (o *V0037Node) SetSockets(v int32)` - -SetSockets sets Sockets field to given value. - -### HasSockets - -`func (o *V0037Node) HasSockets() bool` - -HasSockets returns a boolean if a field has been set. - -### GetThreads - -`func (o *V0037Node) GetThreads() int32` - -GetThreads returns the Threads field if non-nil, zero value otherwise. - -### GetThreadsOk - -`func (o *V0037Node) GetThreadsOk() (*int32, bool)` - -GetThreadsOk returns a tuple with the Threads field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetThreads - -`func (o *V0037Node) SetThreads(v int32)` - -SetThreads sets Threads field to given value. - -### HasThreads - -`func (o *V0037Node) HasThreads() bool` - -HasThreads returns a boolean if a field has been set. - -### GetTemporaryDisk - -`func (o *V0037Node) GetTemporaryDisk() int32` - -GetTemporaryDisk returns the TemporaryDisk field if non-nil, zero value otherwise. - -### GetTemporaryDiskOk - -`func (o *V0037Node) GetTemporaryDiskOk() (*int32, bool)` - -GetTemporaryDiskOk returns a tuple with the TemporaryDisk field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetTemporaryDisk - -`func (o *V0037Node) SetTemporaryDisk(v int32)` - -SetTemporaryDisk sets TemporaryDisk field to given value. - -### HasTemporaryDisk - -`func (o *V0037Node) HasTemporaryDisk() bool` - -HasTemporaryDisk returns a boolean if a field has been set. - -### GetWeight - -`func (o *V0037Node) GetWeight() int32` - -GetWeight returns the Weight field if non-nil, zero value otherwise. - -### GetWeightOk - -`func (o *V0037Node) GetWeightOk() (*int32, bool)` - -GetWeightOk returns a tuple with the Weight field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetWeight - -`func (o *V0037Node) SetWeight(v int32)` - -SetWeight sets Weight field to given value. - -### HasWeight - -`func (o *V0037Node) HasWeight() bool` - -HasWeight returns a boolean if a field has been set. - -### GetTres - -`func (o *V0037Node) GetTres() string` - -GetTres returns the Tres field if non-nil, zero value otherwise. - -### GetTresOk - -`func (o *V0037Node) GetTresOk() (*string, bool)` - -GetTresOk returns a tuple with the Tres field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetTres - -`func (o *V0037Node) SetTres(v string)` - -SetTres sets Tres field to given value. - -### HasTres - -`func (o *V0037Node) HasTres() bool` - -HasTres returns a boolean if a field has been set. - -### GetTresUsed - -`func (o *V0037Node) GetTresUsed() string` - -GetTresUsed returns the TresUsed field if non-nil, zero value otherwise. - -### GetTresUsedOk - -`func (o *V0037Node) GetTresUsedOk() (*string, bool)` - -GetTresUsedOk returns a tuple with the TresUsed field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetTresUsed - -`func (o *V0037Node) SetTresUsed(v string)` - -SetTresUsed sets TresUsed field to given value. - -### HasTresUsed - -`func (o *V0037Node) HasTresUsed() bool` - -HasTresUsed returns a boolean if a field has been set. - -### GetTresWeighted - -`func (o *V0037Node) GetTresWeighted() float64` - -GetTresWeighted returns the TresWeighted field if non-nil, zero value otherwise. - -### GetTresWeightedOk - -`func (o *V0037Node) GetTresWeightedOk() (*float64, bool)` - -GetTresWeightedOk returns a tuple with the TresWeighted field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetTresWeighted - -`func (o *V0037Node) SetTresWeighted(v float64)` - -SetTresWeighted sets TresWeighted field to given value. - -### HasTresWeighted - -`func (o *V0037Node) HasTresWeighted() bool` - -HasTresWeighted returns a boolean if a field has been set. - -### GetSlurmdVersion - -`func (o *V0037Node) GetSlurmdVersion() string` - -GetSlurmdVersion returns the SlurmdVersion field if non-nil, zero value otherwise. - -### GetSlurmdVersionOk - -`func (o *V0037Node) GetSlurmdVersionOk() (*string, bool)` - -GetSlurmdVersionOk returns a tuple with the SlurmdVersion field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetSlurmdVersion - -`func (o *V0037Node) SetSlurmdVersion(v string)` - -SetSlurmdVersion sets SlurmdVersion field to given value. - -### HasSlurmdVersion - -`func (o *V0037Node) HasSlurmdVersion() bool` - -HasSlurmdVersion returns a boolean if a field has been set. - -### GetAllocCpus - -`func (o *V0037Node) GetAllocCpus() int64` - -GetAllocCpus returns the AllocCpus field if non-nil, zero value otherwise. - -### GetAllocCpusOk - -`func (o *V0037Node) GetAllocCpusOk() (*int64, bool)` - -GetAllocCpusOk returns a tuple with the AllocCpus field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetAllocCpus - -`func (o *V0037Node) SetAllocCpus(v int64)` - -SetAllocCpus sets AllocCpus field to given value. - -### HasAllocCpus - -`func (o *V0037Node) HasAllocCpus() bool` - -HasAllocCpus returns a boolean if a field has been set. - -### GetIdleCpus - -`func (o *V0037Node) GetIdleCpus() int64` - -GetIdleCpus returns the IdleCpus field if non-nil, zero value otherwise. - -### GetIdleCpusOk - -`func (o *V0037Node) GetIdleCpusOk() (*int64, bool)` - -GetIdleCpusOk returns a tuple with the IdleCpus field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetIdleCpus - -`func (o *V0037Node) SetIdleCpus(v int64)` - -SetIdleCpus sets IdleCpus field to given value. - -### HasIdleCpus - -`func (o *V0037Node) HasIdleCpus() bool` - -HasIdleCpus returns a boolean if a field has been set. - -### GetAllocMemory - -`func (o *V0037Node) GetAllocMemory() int64` - -GetAllocMemory returns the AllocMemory field if non-nil, zero value otherwise. - -### GetAllocMemoryOk - -`func (o *V0037Node) GetAllocMemoryOk() (*int64, bool)` - -GetAllocMemoryOk returns a tuple with the AllocMemory field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetAllocMemory - -`func (o *V0037Node) SetAllocMemory(v int64)` - -SetAllocMemory sets AllocMemory field to given value. - -### HasAllocMemory - -`func (o *V0037Node) HasAllocMemory() bool` - -HasAllocMemory returns a boolean if a field has been set. - - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/internal/api/0.0.37/docs/V0037NodeAllocation.md b/internal/api/0.0.37/docs/V0037NodeAllocation.md deleted file mode 100644 index 6e70545..0000000 --- a/internal/api/0.0.37/docs/V0037NodeAllocation.md +++ /dev/null @@ -1,134 +0,0 @@ -# V0037NodeAllocation - -## Properties - -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**Memory** | Pointer to **int32** | amount of assigned job memory | [optional] -**Cpus** | Pointer to **map[string]interface{}** | amount of assigned job CPUs | [optional] -**Sockets** | Pointer to **map[string]interface{}** | assignment status of each socket by socket id | [optional] -**Cores** | Pointer to **map[string]interface{}** | assignment status of each core by core id | [optional] - -## Methods - -### NewV0037NodeAllocation - -`func NewV0037NodeAllocation() *V0037NodeAllocation` - -NewV0037NodeAllocation instantiates a new V0037NodeAllocation object -This constructor will assign default values to properties that have it defined, -and makes sure properties required by API are set, but the set of arguments -will change when the set of required properties is changed - -### NewV0037NodeAllocationWithDefaults - -`func NewV0037NodeAllocationWithDefaults() *V0037NodeAllocation` - -NewV0037NodeAllocationWithDefaults instantiates a new V0037NodeAllocation object -This constructor will only assign default values to properties that have it defined, -but it doesn't guarantee that properties required by API are set - -### GetMemory - -`func (o *V0037NodeAllocation) GetMemory() int32` - -GetMemory returns the Memory field if non-nil, zero value otherwise. - -### GetMemoryOk - -`func (o *V0037NodeAllocation) GetMemoryOk() (*int32, bool)` - -GetMemoryOk returns a tuple with the Memory field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetMemory - -`func (o *V0037NodeAllocation) SetMemory(v int32)` - -SetMemory sets Memory field to given value. - -### HasMemory - -`func (o *V0037NodeAllocation) HasMemory() bool` - -HasMemory returns a boolean if a field has been set. - -### GetCpus - -`func (o *V0037NodeAllocation) GetCpus() map[string]interface{}` - -GetCpus returns the Cpus field if non-nil, zero value otherwise. - -### GetCpusOk - -`func (o *V0037NodeAllocation) GetCpusOk() (*map[string]interface{}, bool)` - -GetCpusOk returns a tuple with the Cpus field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetCpus - -`func (o *V0037NodeAllocation) SetCpus(v map[string]interface{})` - -SetCpus sets Cpus field to given value. - -### HasCpus - -`func (o *V0037NodeAllocation) HasCpus() bool` - -HasCpus returns a boolean if a field has been set. - -### GetSockets - -`func (o *V0037NodeAllocation) GetSockets() map[string]interface{}` - -GetSockets returns the Sockets field if non-nil, zero value otherwise. - -### GetSocketsOk - -`func (o *V0037NodeAllocation) GetSocketsOk() (*map[string]interface{}, bool)` - -GetSocketsOk returns a tuple with the Sockets field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetSockets - -`func (o *V0037NodeAllocation) SetSockets(v map[string]interface{})` - -SetSockets sets Sockets field to given value. - -### HasSockets - -`func (o *V0037NodeAllocation) HasSockets() bool` - -HasSockets returns a boolean if a field has been set. - -### GetCores - -`func (o *V0037NodeAllocation) GetCores() map[string]interface{}` - -GetCores returns the Cores field if non-nil, zero value otherwise. - -### GetCoresOk - -`func (o *V0037NodeAllocation) GetCoresOk() (*map[string]interface{}, bool)` - -GetCoresOk returns a tuple with the Cores field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetCores - -`func (o *V0037NodeAllocation) SetCores(v map[string]interface{})` - -SetCores sets Cores field to given value. - -### HasCores - -`func (o *V0037NodeAllocation) HasCores() bool` - -HasCores returns a boolean if a field has been set. - - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/internal/api/0.0.37/docs/V0037NodesResponse.md b/internal/api/0.0.37/docs/V0037NodesResponse.md deleted file mode 100644 index 31618c6..0000000 --- a/internal/api/0.0.37/docs/V0037NodesResponse.md +++ /dev/null @@ -1,82 +0,0 @@ -# V0037NodesResponse - -## Properties - -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**Errors** | Pointer to [**[]V0037Error**](V0037Error.md) | slurm errors | [optional] -**Nodes** | Pointer to [**[]V0037Node**](V0037Node.md) | nodes info | [optional] - -## Methods - -### NewV0037NodesResponse - -`func NewV0037NodesResponse() *V0037NodesResponse` - -NewV0037NodesResponse instantiates a new V0037NodesResponse object -This constructor will assign default values to properties that have it defined, -and makes sure properties required by API are set, but the set of arguments -will change when the set of required properties is changed - -### NewV0037NodesResponseWithDefaults - -`func NewV0037NodesResponseWithDefaults() *V0037NodesResponse` - -NewV0037NodesResponseWithDefaults instantiates a new V0037NodesResponse object -This constructor will only assign default values to properties that have it defined, -but it doesn't guarantee that properties required by API are set - -### GetErrors - -`func (o *V0037NodesResponse) GetErrors() []V0037Error` - -GetErrors returns the Errors field if non-nil, zero value otherwise. - -### GetErrorsOk - -`func (o *V0037NodesResponse) GetErrorsOk() (*[]V0037Error, bool)` - -GetErrorsOk returns a tuple with the Errors field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetErrors - -`func (o *V0037NodesResponse) SetErrors(v []V0037Error)` - -SetErrors sets Errors field to given value. - -### HasErrors - -`func (o *V0037NodesResponse) HasErrors() bool` - -HasErrors returns a boolean if a field has been set. - -### GetNodes - -`func (o *V0037NodesResponse) GetNodes() []V0037Node` - -GetNodes returns the Nodes field if non-nil, zero value otherwise. - -### GetNodesOk - -`func (o *V0037NodesResponse) GetNodesOk() (*[]V0037Node, bool)` - -GetNodesOk returns a tuple with the Nodes field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetNodes - -`func (o *V0037NodesResponse) SetNodes(v []V0037Node)` - -SetNodes sets Nodes field to given value. - -### HasNodes - -`func (o *V0037NodesResponse) HasNodes() bool` - -HasNodes returns a boolean if a field has been set. - - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/internal/api/0.0.37/docs/V0037Partition.md b/internal/api/0.0.37/docs/V0037Partition.md deleted file mode 100644 index a155c2c..0000000 --- a/internal/api/0.0.37/docs/V0037Partition.md +++ /dev/null @@ -1,758 +0,0 @@ -# V0037Partition - -## Properties - -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**Flags** | Pointer to **[]string** | partition options | [optional] -**PreemptionMode** | Pointer to **[]string** | preemption type | [optional] -**AllowedAllocationNodes** | Pointer to **string** | list names of allowed allocating nodes | [optional] -**AllowedAccounts** | Pointer to **string** | comma delimited list of accounts | [optional] -**AllowedGroups** | Pointer to **string** | comma delimited list of groups | [optional] -**AllowedQos** | Pointer to **string** | comma delimited list of qos | [optional] -**Alternative** | Pointer to **string** | name of alternate partition | [optional] -**BillingWeights** | Pointer to **string** | TRES billing weights | [optional] -**DefaultMemoryPerCpu** | Pointer to **int64** | default MB memory per allocated CPU | [optional] -**DefaultTimeLimit** | Pointer to **int64** | default time limit (minutes) | [optional] -**DeniedAccounts** | Pointer to **string** | comma delimited list of denied accounts | [optional] -**DeniedQos** | Pointer to **string** | comma delimited list of denied qos | [optional] -**PreemptionGraceTime** | Pointer to **int64** | preemption grace time (seconds) | [optional] -**MaximumCpusPerNode** | Pointer to **int32** | maximum allocated CPUs per node | [optional] -**MaximumMemoryPerNode** | Pointer to **int64** | maximum memory per allocated CPU (MiB) | [optional] -**MaximumNodesPerJob** | Pointer to **int32** | Max nodes per job | [optional] -**MaxTimeLimit** | Pointer to **int64** | Max time limit per job | [optional] -**MinNodesPerJob** | Pointer to **int32** | Min number of nodes per job | [optional] -**Name** | Pointer to **string** | Partition name | [optional] -**Nodes** | Pointer to **string** | list names of nodes in partition | [optional] -**OverTimeLimit** | Pointer to **int32** | job's time limit can be exceeded by this number of minutes before cancellation | [optional] -**PriorityJobFactor** | Pointer to **int32** | job priority weight factor | [optional] -**PriorityTier** | Pointer to **int32** | tier for scheduling and preemption | [optional] -**Qos** | Pointer to **string** | partition QOS name | [optional] -**State** | Pointer to **string** | Partition state | [optional] -**TotalCpus** | Pointer to **int32** | Total cpus in partition | [optional] -**TotalNodes** | Pointer to **int32** | Total number of nodes in partition | [optional] -**Tres** | Pointer to **string** | configured TRES in partition | [optional] - -## Methods - -### NewV0037Partition - -`func NewV0037Partition() *V0037Partition` - -NewV0037Partition instantiates a new V0037Partition object -This constructor will assign default values to properties that have it defined, -and makes sure properties required by API are set, but the set of arguments -will change when the set of required properties is changed - -### NewV0037PartitionWithDefaults - -`func NewV0037PartitionWithDefaults() *V0037Partition` - -NewV0037PartitionWithDefaults instantiates a new V0037Partition object -This constructor will only assign default values to properties that have it defined, -but it doesn't guarantee that properties required by API are set - -### GetFlags - -`func (o *V0037Partition) GetFlags() []string` - -GetFlags returns the Flags field if non-nil, zero value otherwise. - -### GetFlagsOk - -`func (o *V0037Partition) GetFlagsOk() (*[]string, bool)` - -GetFlagsOk returns a tuple with the Flags field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetFlags - -`func (o *V0037Partition) SetFlags(v []string)` - -SetFlags sets Flags field to given value. - -### HasFlags - -`func (o *V0037Partition) HasFlags() bool` - -HasFlags returns a boolean if a field has been set. - -### GetPreemptionMode - -`func (o *V0037Partition) GetPreemptionMode() []string` - -GetPreemptionMode returns the PreemptionMode field if non-nil, zero value otherwise. - -### GetPreemptionModeOk - -`func (o *V0037Partition) GetPreemptionModeOk() (*[]string, bool)` - -GetPreemptionModeOk returns a tuple with the PreemptionMode field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetPreemptionMode - -`func (o *V0037Partition) SetPreemptionMode(v []string)` - -SetPreemptionMode sets PreemptionMode field to given value. - -### HasPreemptionMode - -`func (o *V0037Partition) HasPreemptionMode() bool` - -HasPreemptionMode returns a boolean if a field has been set. - -### GetAllowedAllocationNodes - -`func (o *V0037Partition) GetAllowedAllocationNodes() string` - -GetAllowedAllocationNodes returns the AllowedAllocationNodes field if non-nil, zero value otherwise. - -### GetAllowedAllocationNodesOk - -`func (o *V0037Partition) GetAllowedAllocationNodesOk() (*string, bool)` - -GetAllowedAllocationNodesOk returns a tuple with the AllowedAllocationNodes field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetAllowedAllocationNodes - -`func (o *V0037Partition) SetAllowedAllocationNodes(v string)` - -SetAllowedAllocationNodes sets AllowedAllocationNodes field to given value. - -### HasAllowedAllocationNodes - -`func (o *V0037Partition) HasAllowedAllocationNodes() bool` - -HasAllowedAllocationNodes returns a boolean if a field has been set. - -### GetAllowedAccounts - -`func (o *V0037Partition) GetAllowedAccounts() string` - -GetAllowedAccounts returns the AllowedAccounts field if non-nil, zero value otherwise. - -### GetAllowedAccountsOk - -`func (o *V0037Partition) GetAllowedAccountsOk() (*string, bool)` - -GetAllowedAccountsOk returns a tuple with the AllowedAccounts field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetAllowedAccounts - -`func (o *V0037Partition) SetAllowedAccounts(v string)` - -SetAllowedAccounts sets AllowedAccounts field to given value. - -### HasAllowedAccounts - -`func (o *V0037Partition) HasAllowedAccounts() bool` - -HasAllowedAccounts returns a boolean if a field has been set. - -### GetAllowedGroups - -`func (o *V0037Partition) GetAllowedGroups() string` - -GetAllowedGroups returns the AllowedGroups field if non-nil, zero value otherwise. - -### GetAllowedGroupsOk - -`func (o *V0037Partition) GetAllowedGroupsOk() (*string, bool)` - -GetAllowedGroupsOk returns a tuple with the AllowedGroups field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetAllowedGroups - -`func (o *V0037Partition) SetAllowedGroups(v string)` - -SetAllowedGroups sets AllowedGroups field to given value. - -### HasAllowedGroups - -`func (o *V0037Partition) HasAllowedGroups() bool` - -HasAllowedGroups returns a boolean if a field has been set. - -### GetAllowedQos - -`func (o *V0037Partition) GetAllowedQos() string` - -GetAllowedQos returns the AllowedQos field if non-nil, zero value otherwise. - -### GetAllowedQosOk - -`func (o *V0037Partition) GetAllowedQosOk() (*string, bool)` - -GetAllowedQosOk returns a tuple with the AllowedQos field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetAllowedQos - -`func (o *V0037Partition) SetAllowedQos(v string)` - -SetAllowedQos sets AllowedQos field to given value. - -### HasAllowedQos - -`func (o *V0037Partition) HasAllowedQos() bool` - -HasAllowedQos returns a boolean if a field has been set. - -### GetAlternative - -`func (o *V0037Partition) GetAlternative() string` - -GetAlternative returns the Alternative field if non-nil, zero value otherwise. - -### GetAlternativeOk - -`func (o *V0037Partition) GetAlternativeOk() (*string, bool)` - -GetAlternativeOk returns a tuple with the Alternative field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetAlternative - -`func (o *V0037Partition) SetAlternative(v string)` - -SetAlternative sets Alternative field to given value. - -### HasAlternative - -`func (o *V0037Partition) HasAlternative() bool` - -HasAlternative returns a boolean if a field has been set. - -### GetBillingWeights - -`func (o *V0037Partition) GetBillingWeights() string` - -GetBillingWeights returns the BillingWeights field if non-nil, zero value otherwise. - -### GetBillingWeightsOk - -`func (o *V0037Partition) GetBillingWeightsOk() (*string, bool)` - -GetBillingWeightsOk returns a tuple with the BillingWeights field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetBillingWeights - -`func (o *V0037Partition) SetBillingWeights(v string)` - -SetBillingWeights sets BillingWeights field to given value. - -### HasBillingWeights - -`func (o *V0037Partition) HasBillingWeights() bool` - -HasBillingWeights returns a boolean if a field has been set. - -### GetDefaultMemoryPerCpu - -`func (o *V0037Partition) GetDefaultMemoryPerCpu() int64` - -GetDefaultMemoryPerCpu returns the DefaultMemoryPerCpu field if non-nil, zero value otherwise. - -### GetDefaultMemoryPerCpuOk - -`func (o *V0037Partition) GetDefaultMemoryPerCpuOk() (*int64, bool)` - -GetDefaultMemoryPerCpuOk returns a tuple with the DefaultMemoryPerCpu field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetDefaultMemoryPerCpu - -`func (o *V0037Partition) SetDefaultMemoryPerCpu(v int64)` - -SetDefaultMemoryPerCpu sets DefaultMemoryPerCpu field to given value. - -### HasDefaultMemoryPerCpu - -`func (o *V0037Partition) HasDefaultMemoryPerCpu() bool` - -HasDefaultMemoryPerCpu returns a boolean if a field has been set. - -### GetDefaultTimeLimit - -`func (o *V0037Partition) GetDefaultTimeLimit() int64` - -GetDefaultTimeLimit returns the DefaultTimeLimit field if non-nil, zero value otherwise. - -### GetDefaultTimeLimitOk - -`func (o *V0037Partition) GetDefaultTimeLimitOk() (*int64, bool)` - -GetDefaultTimeLimitOk returns a tuple with the DefaultTimeLimit field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetDefaultTimeLimit - -`func (o *V0037Partition) SetDefaultTimeLimit(v int64)` - -SetDefaultTimeLimit sets DefaultTimeLimit field to given value. - -### HasDefaultTimeLimit - -`func (o *V0037Partition) HasDefaultTimeLimit() bool` - -HasDefaultTimeLimit returns a boolean if a field has been set. - -### GetDeniedAccounts - -`func (o *V0037Partition) GetDeniedAccounts() string` - -GetDeniedAccounts returns the DeniedAccounts field if non-nil, zero value otherwise. - -### GetDeniedAccountsOk - -`func (o *V0037Partition) GetDeniedAccountsOk() (*string, bool)` - -GetDeniedAccountsOk returns a tuple with the DeniedAccounts field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetDeniedAccounts - -`func (o *V0037Partition) SetDeniedAccounts(v string)` - -SetDeniedAccounts sets DeniedAccounts field to given value. - -### HasDeniedAccounts - -`func (o *V0037Partition) HasDeniedAccounts() bool` - -HasDeniedAccounts returns a boolean if a field has been set. - -### GetDeniedQos - -`func (o *V0037Partition) GetDeniedQos() string` - -GetDeniedQos returns the DeniedQos field if non-nil, zero value otherwise. - -### GetDeniedQosOk - -`func (o *V0037Partition) GetDeniedQosOk() (*string, bool)` - -GetDeniedQosOk returns a tuple with the DeniedQos field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetDeniedQos - -`func (o *V0037Partition) SetDeniedQos(v string)` - -SetDeniedQos sets DeniedQos field to given value. - -### HasDeniedQos - -`func (o *V0037Partition) HasDeniedQos() bool` - -HasDeniedQos returns a boolean if a field has been set. - -### GetPreemptionGraceTime - -`func (o *V0037Partition) GetPreemptionGraceTime() int64` - -GetPreemptionGraceTime returns the PreemptionGraceTime field if non-nil, zero value otherwise. - -### GetPreemptionGraceTimeOk - -`func (o *V0037Partition) GetPreemptionGraceTimeOk() (*int64, bool)` - -GetPreemptionGraceTimeOk returns a tuple with the PreemptionGraceTime field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetPreemptionGraceTime - -`func (o *V0037Partition) SetPreemptionGraceTime(v int64)` - -SetPreemptionGraceTime sets PreemptionGraceTime field to given value. - -### HasPreemptionGraceTime - -`func (o *V0037Partition) HasPreemptionGraceTime() bool` - -HasPreemptionGraceTime returns a boolean if a field has been set. - -### GetMaximumCpusPerNode - -`func (o *V0037Partition) GetMaximumCpusPerNode() int32` - -GetMaximumCpusPerNode returns the MaximumCpusPerNode field if non-nil, zero value otherwise. - -### GetMaximumCpusPerNodeOk - -`func (o *V0037Partition) GetMaximumCpusPerNodeOk() (*int32, bool)` - -GetMaximumCpusPerNodeOk returns a tuple with the MaximumCpusPerNode field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetMaximumCpusPerNode - -`func (o *V0037Partition) SetMaximumCpusPerNode(v int32)` - -SetMaximumCpusPerNode sets MaximumCpusPerNode field to given value. - -### HasMaximumCpusPerNode - -`func (o *V0037Partition) HasMaximumCpusPerNode() bool` - -HasMaximumCpusPerNode returns a boolean if a field has been set. - -### GetMaximumMemoryPerNode - -`func (o *V0037Partition) GetMaximumMemoryPerNode() int64` - -GetMaximumMemoryPerNode returns the MaximumMemoryPerNode field if non-nil, zero value otherwise. - -### GetMaximumMemoryPerNodeOk - -`func (o *V0037Partition) GetMaximumMemoryPerNodeOk() (*int64, bool)` - -GetMaximumMemoryPerNodeOk returns a tuple with the MaximumMemoryPerNode field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetMaximumMemoryPerNode - -`func (o *V0037Partition) SetMaximumMemoryPerNode(v int64)` - -SetMaximumMemoryPerNode sets MaximumMemoryPerNode field to given value. - -### HasMaximumMemoryPerNode - -`func (o *V0037Partition) HasMaximumMemoryPerNode() bool` - -HasMaximumMemoryPerNode returns a boolean if a field has been set. - -### GetMaximumNodesPerJob - -`func (o *V0037Partition) GetMaximumNodesPerJob() int32` - -GetMaximumNodesPerJob returns the MaximumNodesPerJob field if non-nil, zero value otherwise. - -### GetMaximumNodesPerJobOk - -`func (o *V0037Partition) GetMaximumNodesPerJobOk() (*int32, bool)` - -GetMaximumNodesPerJobOk returns a tuple with the MaximumNodesPerJob field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetMaximumNodesPerJob - -`func (o *V0037Partition) SetMaximumNodesPerJob(v int32)` - -SetMaximumNodesPerJob sets MaximumNodesPerJob field to given value. - -### HasMaximumNodesPerJob - -`func (o *V0037Partition) HasMaximumNodesPerJob() bool` - -HasMaximumNodesPerJob returns a boolean if a field has been set. - -### GetMaxTimeLimit - -`func (o *V0037Partition) GetMaxTimeLimit() int64` - -GetMaxTimeLimit returns the MaxTimeLimit field if non-nil, zero value otherwise. - -### GetMaxTimeLimitOk - -`func (o *V0037Partition) GetMaxTimeLimitOk() (*int64, bool)` - -GetMaxTimeLimitOk returns a tuple with the MaxTimeLimit field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetMaxTimeLimit - -`func (o *V0037Partition) SetMaxTimeLimit(v int64)` - -SetMaxTimeLimit sets MaxTimeLimit field to given value. - -### HasMaxTimeLimit - -`func (o *V0037Partition) HasMaxTimeLimit() bool` - -HasMaxTimeLimit returns a boolean if a field has been set. - -### GetMinNodesPerJob - -`func (o *V0037Partition) GetMinNodesPerJob() int32` - -GetMinNodesPerJob returns the MinNodesPerJob field if non-nil, zero value otherwise. - -### GetMinNodesPerJobOk - -`func (o *V0037Partition) GetMinNodesPerJobOk() (*int32, bool)` - -GetMinNodesPerJobOk returns a tuple with the MinNodesPerJob field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetMinNodesPerJob - -`func (o *V0037Partition) SetMinNodesPerJob(v int32)` - -SetMinNodesPerJob sets MinNodesPerJob field to given value. - -### HasMinNodesPerJob - -`func (o *V0037Partition) HasMinNodesPerJob() bool` - -HasMinNodesPerJob returns a boolean if a field has been set. - -### GetName - -`func (o *V0037Partition) GetName() string` - -GetName returns the Name field if non-nil, zero value otherwise. - -### GetNameOk - -`func (o *V0037Partition) GetNameOk() (*string, bool)` - -GetNameOk returns a tuple with the Name field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetName - -`func (o *V0037Partition) SetName(v string)` - -SetName sets Name field to given value. - -### HasName - -`func (o *V0037Partition) HasName() bool` - -HasName returns a boolean if a field has been set. - -### GetNodes - -`func (o *V0037Partition) GetNodes() string` - -GetNodes returns the Nodes field if non-nil, zero value otherwise. - -### GetNodesOk - -`func (o *V0037Partition) GetNodesOk() (*string, bool)` - -GetNodesOk returns a tuple with the Nodes field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetNodes - -`func (o *V0037Partition) SetNodes(v string)` - -SetNodes sets Nodes field to given value. - -### HasNodes - -`func (o *V0037Partition) HasNodes() bool` - -HasNodes returns a boolean if a field has been set. - -### GetOverTimeLimit - -`func (o *V0037Partition) GetOverTimeLimit() int32` - -GetOverTimeLimit returns the OverTimeLimit field if non-nil, zero value otherwise. - -### GetOverTimeLimitOk - -`func (o *V0037Partition) GetOverTimeLimitOk() (*int32, bool)` - -GetOverTimeLimitOk returns a tuple with the OverTimeLimit field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetOverTimeLimit - -`func (o *V0037Partition) SetOverTimeLimit(v int32)` - -SetOverTimeLimit sets OverTimeLimit field to given value. - -### HasOverTimeLimit - -`func (o *V0037Partition) HasOverTimeLimit() bool` - -HasOverTimeLimit returns a boolean if a field has been set. - -### GetPriorityJobFactor - -`func (o *V0037Partition) GetPriorityJobFactor() int32` - -GetPriorityJobFactor returns the PriorityJobFactor field if non-nil, zero value otherwise. - -### GetPriorityJobFactorOk - -`func (o *V0037Partition) GetPriorityJobFactorOk() (*int32, bool)` - -GetPriorityJobFactorOk returns a tuple with the PriorityJobFactor field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetPriorityJobFactor - -`func (o *V0037Partition) SetPriorityJobFactor(v int32)` - -SetPriorityJobFactor sets PriorityJobFactor field to given value. - -### HasPriorityJobFactor - -`func (o *V0037Partition) HasPriorityJobFactor() bool` - -HasPriorityJobFactor returns a boolean if a field has been set. - -### GetPriorityTier - -`func (o *V0037Partition) GetPriorityTier() int32` - -GetPriorityTier returns the PriorityTier field if non-nil, zero value otherwise. - -### GetPriorityTierOk - -`func (o *V0037Partition) GetPriorityTierOk() (*int32, bool)` - -GetPriorityTierOk returns a tuple with the PriorityTier field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetPriorityTier - -`func (o *V0037Partition) SetPriorityTier(v int32)` - -SetPriorityTier sets PriorityTier field to given value. - -### HasPriorityTier - -`func (o *V0037Partition) HasPriorityTier() bool` - -HasPriorityTier returns a boolean if a field has been set. - -### GetQos - -`func (o *V0037Partition) GetQos() string` - -GetQos returns the Qos field if non-nil, zero value otherwise. - -### GetQosOk - -`func (o *V0037Partition) GetQosOk() (*string, bool)` - -GetQosOk returns a tuple with the Qos field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetQos - -`func (o *V0037Partition) SetQos(v string)` - -SetQos sets Qos field to given value. - -### HasQos - -`func (o *V0037Partition) HasQos() bool` - -HasQos returns a boolean if a field has been set. - -### GetState - -`func (o *V0037Partition) GetState() string` - -GetState returns the State field if non-nil, zero value otherwise. - -### GetStateOk - -`func (o *V0037Partition) GetStateOk() (*string, bool)` - -GetStateOk returns a tuple with the State field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetState - -`func (o *V0037Partition) SetState(v string)` - -SetState sets State field to given value. - -### HasState - -`func (o *V0037Partition) HasState() bool` - -HasState returns a boolean if a field has been set. - -### GetTotalCpus - -`func (o *V0037Partition) GetTotalCpus() int32` - -GetTotalCpus returns the TotalCpus field if non-nil, zero value otherwise. - -### GetTotalCpusOk - -`func (o *V0037Partition) GetTotalCpusOk() (*int32, bool)` - -GetTotalCpusOk returns a tuple with the TotalCpus field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetTotalCpus - -`func (o *V0037Partition) SetTotalCpus(v int32)` - -SetTotalCpus sets TotalCpus field to given value. - -### HasTotalCpus - -`func (o *V0037Partition) HasTotalCpus() bool` - -HasTotalCpus returns a boolean if a field has been set. - -### GetTotalNodes - -`func (o *V0037Partition) GetTotalNodes() int32` - -GetTotalNodes returns the TotalNodes field if non-nil, zero value otherwise. - -### GetTotalNodesOk - -`func (o *V0037Partition) GetTotalNodesOk() (*int32, bool)` - -GetTotalNodesOk returns a tuple with the TotalNodes field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetTotalNodes - -`func (o *V0037Partition) SetTotalNodes(v int32)` - -SetTotalNodes sets TotalNodes field to given value. - -### HasTotalNodes - -`func (o *V0037Partition) HasTotalNodes() bool` - -HasTotalNodes returns a boolean if a field has been set. - -### GetTres - -`func (o *V0037Partition) GetTres() string` - -GetTres returns the Tres field if non-nil, zero value otherwise. - -### GetTresOk - -`func (o *V0037Partition) GetTresOk() (*string, bool)` - -GetTresOk returns a tuple with the Tres field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetTres - -`func (o *V0037Partition) SetTres(v string)` - -SetTres sets Tres field to given value. - -### HasTres - -`func (o *V0037Partition) HasTres() bool` - -HasTres returns a boolean if a field has been set. - - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/internal/api/0.0.37/docs/V0037PartitionsResponse.md b/internal/api/0.0.37/docs/V0037PartitionsResponse.md deleted file mode 100644 index 1570922..0000000 --- a/internal/api/0.0.37/docs/V0037PartitionsResponse.md +++ /dev/null @@ -1,82 +0,0 @@ -# V0037PartitionsResponse - -## Properties - -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**Errors** | Pointer to [**[]V0037Error**](V0037Error.md) | slurm errors | [optional] -**Partitions** | Pointer to [**[]V0037Partition**](V0037Partition.md) | partition info | [optional] - -## Methods - -### NewV0037PartitionsResponse - -`func NewV0037PartitionsResponse() *V0037PartitionsResponse` - -NewV0037PartitionsResponse instantiates a new V0037PartitionsResponse object -This constructor will assign default values to properties that have it defined, -and makes sure properties required by API are set, but the set of arguments -will change when the set of required properties is changed - -### NewV0037PartitionsResponseWithDefaults - -`func NewV0037PartitionsResponseWithDefaults() *V0037PartitionsResponse` - -NewV0037PartitionsResponseWithDefaults instantiates a new V0037PartitionsResponse object -This constructor will only assign default values to properties that have it defined, -but it doesn't guarantee that properties required by API are set - -### GetErrors - -`func (o *V0037PartitionsResponse) GetErrors() []V0037Error` - -GetErrors returns the Errors field if non-nil, zero value otherwise. - -### GetErrorsOk - -`func (o *V0037PartitionsResponse) GetErrorsOk() (*[]V0037Error, bool)` - -GetErrorsOk returns a tuple with the Errors field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetErrors - -`func (o *V0037PartitionsResponse) SetErrors(v []V0037Error)` - -SetErrors sets Errors field to given value. - -### HasErrors - -`func (o *V0037PartitionsResponse) HasErrors() bool` - -HasErrors returns a boolean if a field has been set. - -### GetPartitions - -`func (o *V0037PartitionsResponse) GetPartitions() []V0037Partition` - -GetPartitions returns the Partitions field if non-nil, zero value otherwise. - -### GetPartitionsOk - -`func (o *V0037PartitionsResponse) GetPartitionsOk() (*[]V0037Partition, bool)` - -GetPartitionsOk returns a tuple with the Partitions field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetPartitions - -`func (o *V0037PartitionsResponse) SetPartitions(v []V0037Partition)` - -SetPartitions sets Partitions field to given value. - -### HasPartitions - -`func (o *V0037PartitionsResponse) HasPartitions() bool` - -HasPartitions returns a boolean if a field has been set. - - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/internal/api/0.0.37/docs/V0037Ping.md b/internal/api/0.0.37/docs/V0037Ping.md deleted file mode 100644 index 2b8836a..0000000 --- a/internal/api/0.0.37/docs/V0037Ping.md +++ /dev/null @@ -1,134 +0,0 @@ -# V0037Ping - -## Properties - -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**Hostname** | Pointer to **string** | slurm controller hostname | [optional] -**Ping** | Pointer to **string** | slurm controller host up | [optional] -**Mode** | Pointer to **string** | slurm controller mode | [optional] -**Status** | Pointer to **int32** | slurm controller status | [optional] - -## Methods - -### NewV0037Ping - -`func NewV0037Ping() *V0037Ping` - -NewV0037Ping instantiates a new V0037Ping object -This constructor will assign default values to properties that have it defined, -and makes sure properties required by API are set, but the set of arguments -will change when the set of required properties is changed - -### NewV0037PingWithDefaults - -`func NewV0037PingWithDefaults() *V0037Ping` - -NewV0037PingWithDefaults instantiates a new V0037Ping object -This constructor will only assign default values to properties that have it defined, -but it doesn't guarantee that properties required by API are set - -### GetHostname - -`func (o *V0037Ping) GetHostname() string` - -GetHostname returns the Hostname field if non-nil, zero value otherwise. - -### GetHostnameOk - -`func (o *V0037Ping) GetHostnameOk() (*string, bool)` - -GetHostnameOk returns a tuple with the Hostname field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetHostname - -`func (o *V0037Ping) SetHostname(v string)` - -SetHostname sets Hostname field to given value. - -### HasHostname - -`func (o *V0037Ping) HasHostname() bool` - -HasHostname returns a boolean if a field has been set. - -### GetPing - -`func (o *V0037Ping) GetPing() string` - -GetPing returns the Ping field if non-nil, zero value otherwise. - -### GetPingOk - -`func (o *V0037Ping) GetPingOk() (*string, bool)` - -GetPingOk returns a tuple with the Ping field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetPing - -`func (o *V0037Ping) SetPing(v string)` - -SetPing sets Ping field to given value. - -### HasPing - -`func (o *V0037Ping) HasPing() bool` - -HasPing returns a boolean if a field has been set. - -### GetMode - -`func (o *V0037Ping) GetMode() string` - -GetMode returns the Mode field if non-nil, zero value otherwise. - -### GetModeOk - -`func (o *V0037Ping) GetModeOk() (*string, bool)` - -GetModeOk returns a tuple with the Mode field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetMode - -`func (o *V0037Ping) SetMode(v string)` - -SetMode sets Mode field to given value. - -### HasMode - -`func (o *V0037Ping) HasMode() bool` - -HasMode returns a boolean if a field has been set. - -### GetStatus - -`func (o *V0037Ping) GetStatus() int32` - -GetStatus returns the Status field if non-nil, zero value otherwise. - -### GetStatusOk - -`func (o *V0037Ping) GetStatusOk() (*int32, bool)` - -GetStatusOk returns a tuple with the Status field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetStatus - -`func (o *V0037Ping) SetStatus(v int32)` - -SetStatus sets Status field to given value. - -### HasStatus - -`func (o *V0037Ping) HasStatus() bool` - -HasStatus returns a boolean if a field has been set. - - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/internal/api/0.0.37/docs/V0037Pings.md b/internal/api/0.0.37/docs/V0037Pings.md deleted file mode 100644 index e7f5d8b..0000000 --- a/internal/api/0.0.37/docs/V0037Pings.md +++ /dev/null @@ -1,82 +0,0 @@ -# V0037Pings - -## Properties - -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**Errors** | Pointer to [**[]V0037Error**](V0037Error.md) | slurm errors | [optional] -**Pings** | Pointer to [**[]V0037Ping**](V0037Ping.md) | slurm controller pings | [optional] - -## Methods - -### NewV0037Pings - -`func NewV0037Pings() *V0037Pings` - -NewV0037Pings instantiates a new V0037Pings object -This constructor will assign default values to properties that have it defined, -and makes sure properties required by API are set, but the set of arguments -will change when the set of required properties is changed - -### NewV0037PingsWithDefaults - -`func NewV0037PingsWithDefaults() *V0037Pings` - -NewV0037PingsWithDefaults instantiates a new V0037Pings object -This constructor will only assign default values to properties that have it defined, -but it doesn't guarantee that properties required by API are set - -### GetErrors - -`func (o *V0037Pings) GetErrors() []V0037Error` - -GetErrors returns the Errors field if non-nil, zero value otherwise. - -### GetErrorsOk - -`func (o *V0037Pings) GetErrorsOk() (*[]V0037Error, bool)` - -GetErrorsOk returns a tuple with the Errors field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetErrors - -`func (o *V0037Pings) SetErrors(v []V0037Error)` - -SetErrors sets Errors field to given value. - -### HasErrors - -`func (o *V0037Pings) HasErrors() bool` - -HasErrors returns a boolean if a field has been set. - -### GetPings - -`func (o *V0037Pings) GetPings() []V0037Ping` - -GetPings returns the Pings field if non-nil, zero value otherwise. - -### GetPingsOk - -`func (o *V0037Pings) GetPingsOk() (*[]V0037Ping, bool)` - -GetPingsOk returns a tuple with the Pings field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetPings - -`func (o *V0037Pings) SetPings(v []V0037Ping)` - -SetPings sets Pings field to given value. - -### HasPings - -`func (o *V0037Pings) HasPings() bool` - -HasPings returns a boolean if a field has been set. - - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/internal/api/0.0.37/docs/V0037Reservation.md b/internal/api/0.0.37/docs/V0037Reservation.md deleted file mode 100644 index 8818e3f..0000000 --- a/internal/api/0.0.37/docs/V0037Reservation.md +++ /dev/null @@ -1,524 +0,0 @@ -# V0037Reservation - -## Properties - -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**Accounts** | Pointer to **string** | Allowed accounts | [optional] -**BurstBuffer** | Pointer to **string** | Reserved burst buffer | [optional] -**CoreCount** | Pointer to **int32** | Number of reserved cores | [optional] -**CoreSpecCnt** | Pointer to **int32** | Number of reserved specialized cores | [optional] -**EndTime** | Pointer to **int32** | End time of the reservation | [optional] -**Features** | Pointer to **string** | List of features | [optional] -**Flags** | Pointer to **[]string** | Reservation options | [optional] -**Groups** | Pointer to **string** | List of groups permitted to use the reserved nodes | [optional] -**Licenses** | Pointer to **string** | List of licenses | [optional] -**MaxStartDelay** | Pointer to **int32** | Maximum delay in which jobs outside of the reservation will be permitted to overlap once any jobs are queued for the reservation | [optional] -**Name** | Pointer to **string** | Reservationn name | [optional] -**NodeCount** | Pointer to **int32** | Count of nodes reserved | [optional] -**NodeList** | Pointer to **string** | List of reserved nodes | [optional] -**Partition** | Pointer to **string** | Partition | [optional] -**PurgeCompleted** | Pointer to [**V0037ReservationPurgeCompleted**](V0037ReservationPurgeCompleted.md) | | [optional] -**StartTime** | Pointer to **int32** | Start time of reservation | [optional] -**Watts** | Pointer to **int32** | amount of power to reserve in watts | [optional] -**Tres** | Pointer to **string** | List of TRES | [optional] -**Users** | Pointer to **string** | List of users | [optional] - -## Methods - -### NewV0037Reservation - -`func NewV0037Reservation() *V0037Reservation` - -NewV0037Reservation instantiates a new V0037Reservation object -This constructor will assign default values to properties that have it defined, -and makes sure properties required by API are set, but the set of arguments -will change when the set of required properties is changed - -### NewV0037ReservationWithDefaults - -`func NewV0037ReservationWithDefaults() *V0037Reservation` - -NewV0037ReservationWithDefaults instantiates a new V0037Reservation object -This constructor will only assign default values to properties that have it defined, -but it doesn't guarantee that properties required by API are set - -### GetAccounts - -`func (o *V0037Reservation) GetAccounts() string` - -GetAccounts returns the Accounts field if non-nil, zero value otherwise. - -### GetAccountsOk - -`func (o *V0037Reservation) GetAccountsOk() (*string, bool)` - -GetAccountsOk returns a tuple with the Accounts field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetAccounts - -`func (o *V0037Reservation) SetAccounts(v string)` - -SetAccounts sets Accounts field to given value. - -### HasAccounts - -`func (o *V0037Reservation) HasAccounts() bool` - -HasAccounts returns a boolean if a field has been set. - -### GetBurstBuffer - -`func (o *V0037Reservation) GetBurstBuffer() string` - -GetBurstBuffer returns the BurstBuffer field if non-nil, zero value otherwise. - -### GetBurstBufferOk - -`func (o *V0037Reservation) GetBurstBufferOk() (*string, bool)` - -GetBurstBufferOk returns a tuple with the BurstBuffer field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetBurstBuffer - -`func (o *V0037Reservation) SetBurstBuffer(v string)` - -SetBurstBuffer sets BurstBuffer field to given value. - -### HasBurstBuffer - -`func (o *V0037Reservation) HasBurstBuffer() bool` - -HasBurstBuffer returns a boolean if a field has been set. - -### GetCoreCount - -`func (o *V0037Reservation) GetCoreCount() int32` - -GetCoreCount returns the CoreCount field if non-nil, zero value otherwise. - -### GetCoreCountOk - -`func (o *V0037Reservation) GetCoreCountOk() (*int32, bool)` - -GetCoreCountOk returns a tuple with the CoreCount field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetCoreCount - -`func (o *V0037Reservation) SetCoreCount(v int32)` - -SetCoreCount sets CoreCount field to given value. - -### HasCoreCount - -`func (o *V0037Reservation) HasCoreCount() bool` - -HasCoreCount returns a boolean if a field has been set. - -### GetCoreSpecCnt - -`func (o *V0037Reservation) GetCoreSpecCnt() int32` - -GetCoreSpecCnt returns the CoreSpecCnt field if non-nil, zero value otherwise. - -### GetCoreSpecCntOk - -`func (o *V0037Reservation) GetCoreSpecCntOk() (*int32, bool)` - -GetCoreSpecCntOk returns a tuple with the CoreSpecCnt field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetCoreSpecCnt - -`func (o *V0037Reservation) SetCoreSpecCnt(v int32)` - -SetCoreSpecCnt sets CoreSpecCnt field to given value. - -### HasCoreSpecCnt - -`func (o *V0037Reservation) HasCoreSpecCnt() bool` - -HasCoreSpecCnt returns a boolean if a field has been set. - -### GetEndTime - -`func (o *V0037Reservation) GetEndTime() int32` - -GetEndTime returns the EndTime field if non-nil, zero value otherwise. - -### GetEndTimeOk - -`func (o *V0037Reservation) GetEndTimeOk() (*int32, bool)` - -GetEndTimeOk returns a tuple with the EndTime field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetEndTime - -`func (o *V0037Reservation) SetEndTime(v int32)` - -SetEndTime sets EndTime field to given value. - -### HasEndTime - -`func (o *V0037Reservation) HasEndTime() bool` - -HasEndTime returns a boolean if a field has been set. - -### GetFeatures - -`func (o *V0037Reservation) GetFeatures() string` - -GetFeatures returns the Features field if non-nil, zero value otherwise. - -### GetFeaturesOk - -`func (o *V0037Reservation) GetFeaturesOk() (*string, bool)` - -GetFeaturesOk returns a tuple with the Features field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetFeatures - -`func (o *V0037Reservation) SetFeatures(v string)` - -SetFeatures sets Features field to given value. - -### HasFeatures - -`func (o *V0037Reservation) HasFeatures() bool` - -HasFeatures returns a boolean if a field has been set. - -### GetFlags - -`func (o *V0037Reservation) GetFlags() []string` - -GetFlags returns the Flags field if non-nil, zero value otherwise. - -### GetFlagsOk - -`func (o *V0037Reservation) GetFlagsOk() (*[]string, bool)` - -GetFlagsOk returns a tuple with the Flags field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetFlags - -`func (o *V0037Reservation) SetFlags(v []string)` - -SetFlags sets Flags field to given value. - -### HasFlags - -`func (o *V0037Reservation) HasFlags() bool` - -HasFlags returns a boolean if a field has been set. - -### GetGroups - -`func (o *V0037Reservation) GetGroups() string` - -GetGroups returns the Groups field if non-nil, zero value otherwise. - -### GetGroupsOk - -`func (o *V0037Reservation) GetGroupsOk() (*string, bool)` - -GetGroupsOk returns a tuple with the Groups field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetGroups - -`func (o *V0037Reservation) SetGroups(v string)` - -SetGroups sets Groups field to given value. - -### HasGroups - -`func (o *V0037Reservation) HasGroups() bool` - -HasGroups returns a boolean if a field has been set. - -### GetLicenses - -`func (o *V0037Reservation) GetLicenses() string` - -GetLicenses returns the Licenses field if non-nil, zero value otherwise. - -### GetLicensesOk - -`func (o *V0037Reservation) GetLicensesOk() (*string, bool)` - -GetLicensesOk returns a tuple with the Licenses field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetLicenses - -`func (o *V0037Reservation) SetLicenses(v string)` - -SetLicenses sets Licenses field to given value. - -### HasLicenses - -`func (o *V0037Reservation) HasLicenses() bool` - -HasLicenses returns a boolean if a field has been set. - -### GetMaxStartDelay - -`func (o *V0037Reservation) GetMaxStartDelay() int32` - -GetMaxStartDelay returns the MaxStartDelay field if non-nil, zero value otherwise. - -### GetMaxStartDelayOk - -`func (o *V0037Reservation) GetMaxStartDelayOk() (*int32, bool)` - -GetMaxStartDelayOk returns a tuple with the MaxStartDelay field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetMaxStartDelay - -`func (o *V0037Reservation) SetMaxStartDelay(v int32)` - -SetMaxStartDelay sets MaxStartDelay field to given value. - -### HasMaxStartDelay - -`func (o *V0037Reservation) HasMaxStartDelay() bool` - -HasMaxStartDelay returns a boolean if a field has been set. - -### GetName - -`func (o *V0037Reservation) GetName() string` - -GetName returns the Name field if non-nil, zero value otherwise. - -### GetNameOk - -`func (o *V0037Reservation) GetNameOk() (*string, bool)` - -GetNameOk returns a tuple with the Name field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetName - -`func (o *V0037Reservation) SetName(v string)` - -SetName sets Name field to given value. - -### HasName - -`func (o *V0037Reservation) HasName() bool` - -HasName returns a boolean if a field has been set. - -### GetNodeCount - -`func (o *V0037Reservation) GetNodeCount() int32` - -GetNodeCount returns the NodeCount field if non-nil, zero value otherwise. - -### GetNodeCountOk - -`func (o *V0037Reservation) GetNodeCountOk() (*int32, bool)` - -GetNodeCountOk returns a tuple with the NodeCount field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetNodeCount - -`func (o *V0037Reservation) SetNodeCount(v int32)` - -SetNodeCount sets NodeCount field to given value. - -### HasNodeCount - -`func (o *V0037Reservation) HasNodeCount() bool` - -HasNodeCount returns a boolean if a field has been set. - -### GetNodeList - -`func (o *V0037Reservation) GetNodeList() string` - -GetNodeList returns the NodeList field if non-nil, zero value otherwise. - -### GetNodeListOk - -`func (o *V0037Reservation) GetNodeListOk() (*string, bool)` - -GetNodeListOk returns a tuple with the NodeList field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetNodeList - -`func (o *V0037Reservation) SetNodeList(v string)` - -SetNodeList sets NodeList field to given value. - -### HasNodeList - -`func (o *V0037Reservation) HasNodeList() bool` - -HasNodeList returns a boolean if a field has been set. - -### GetPartition - -`func (o *V0037Reservation) GetPartition() string` - -GetPartition returns the Partition field if non-nil, zero value otherwise. - -### GetPartitionOk - -`func (o *V0037Reservation) GetPartitionOk() (*string, bool)` - -GetPartitionOk returns a tuple with the Partition field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetPartition - -`func (o *V0037Reservation) SetPartition(v string)` - -SetPartition sets Partition field to given value. - -### HasPartition - -`func (o *V0037Reservation) HasPartition() bool` - -HasPartition returns a boolean if a field has been set. - -### GetPurgeCompleted - -`func (o *V0037Reservation) GetPurgeCompleted() V0037ReservationPurgeCompleted` - -GetPurgeCompleted returns the PurgeCompleted field if non-nil, zero value otherwise. - -### GetPurgeCompletedOk - -`func (o *V0037Reservation) GetPurgeCompletedOk() (*V0037ReservationPurgeCompleted, bool)` - -GetPurgeCompletedOk returns a tuple with the PurgeCompleted field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetPurgeCompleted - -`func (o *V0037Reservation) SetPurgeCompleted(v V0037ReservationPurgeCompleted)` - -SetPurgeCompleted sets PurgeCompleted field to given value. - -### HasPurgeCompleted - -`func (o *V0037Reservation) HasPurgeCompleted() bool` - -HasPurgeCompleted returns a boolean if a field has been set. - -### GetStartTime - -`func (o *V0037Reservation) GetStartTime() int32` - -GetStartTime returns the StartTime field if non-nil, zero value otherwise. - -### GetStartTimeOk - -`func (o *V0037Reservation) GetStartTimeOk() (*int32, bool)` - -GetStartTimeOk returns a tuple with the StartTime field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetStartTime - -`func (o *V0037Reservation) SetStartTime(v int32)` - -SetStartTime sets StartTime field to given value. - -### HasStartTime - -`func (o *V0037Reservation) HasStartTime() bool` - -HasStartTime returns a boolean if a field has been set. - -### GetWatts - -`func (o *V0037Reservation) GetWatts() int32` - -GetWatts returns the Watts field if non-nil, zero value otherwise. - -### GetWattsOk - -`func (o *V0037Reservation) GetWattsOk() (*int32, bool)` - -GetWattsOk returns a tuple with the Watts field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetWatts - -`func (o *V0037Reservation) SetWatts(v int32)` - -SetWatts sets Watts field to given value. - -### HasWatts - -`func (o *V0037Reservation) HasWatts() bool` - -HasWatts returns a boolean if a field has been set. - -### GetTres - -`func (o *V0037Reservation) GetTres() string` - -GetTres returns the Tres field if non-nil, zero value otherwise. - -### GetTresOk - -`func (o *V0037Reservation) GetTresOk() (*string, bool)` - -GetTresOk returns a tuple with the Tres field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetTres - -`func (o *V0037Reservation) SetTres(v string)` - -SetTres sets Tres field to given value. - -### HasTres - -`func (o *V0037Reservation) HasTres() bool` - -HasTres returns a boolean if a field has been set. - -### GetUsers - -`func (o *V0037Reservation) GetUsers() string` - -GetUsers returns the Users field if non-nil, zero value otherwise. - -### GetUsersOk - -`func (o *V0037Reservation) GetUsersOk() (*string, bool)` - -GetUsersOk returns a tuple with the Users field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetUsers - -`func (o *V0037Reservation) SetUsers(v string)` - -SetUsers sets Users field to given value. - -### HasUsers - -`func (o *V0037Reservation) HasUsers() bool` - -HasUsers returns a boolean if a field has been set. - - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/internal/api/0.0.37/docs/V0037ReservationPurgeCompleted.md b/internal/api/0.0.37/docs/V0037ReservationPurgeCompleted.md deleted file mode 100644 index 68b86e1..0000000 --- a/internal/api/0.0.37/docs/V0037ReservationPurgeCompleted.md +++ /dev/null @@ -1,56 +0,0 @@ -# V0037ReservationPurgeCompleted - -## Properties - -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**Time** | Pointer to **int32** | amount of seconds this reservation will sit idle until it is revoked | [optional] - -## Methods - -### NewV0037ReservationPurgeCompleted - -`func NewV0037ReservationPurgeCompleted() *V0037ReservationPurgeCompleted` - -NewV0037ReservationPurgeCompleted instantiates a new V0037ReservationPurgeCompleted object -This constructor will assign default values to properties that have it defined, -and makes sure properties required by API are set, but the set of arguments -will change when the set of required properties is changed - -### NewV0037ReservationPurgeCompletedWithDefaults - -`func NewV0037ReservationPurgeCompletedWithDefaults() *V0037ReservationPurgeCompleted` - -NewV0037ReservationPurgeCompletedWithDefaults instantiates a new V0037ReservationPurgeCompleted object -This constructor will only assign default values to properties that have it defined, -but it doesn't guarantee that properties required by API are set - -### GetTime - -`func (o *V0037ReservationPurgeCompleted) GetTime() int32` - -GetTime returns the Time field if non-nil, zero value otherwise. - -### GetTimeOk - -`func (o *V0037ReservationPurgeCompleted) GetTimeOk() (*int32, bool)` - -GetTimeOk returns a tuple with the Time field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetTime - -`func (o *V0037ReservationPurgeCompleted) SetTime(v int32)` - -SetTime sets Time field to given value. - -### HasTime - -`func (o *V0037ReservationPurgeCompleted) HasTime() bool` - -HasTime returns a boolean if a field has been set. - - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/internal/api/0.0.37/docs/V0037ReservationsResponse.md b/internal/api/0.0.37/docs/V0037ReservationsResponse.md deleted file mode 100644 index b5fae86..0000000 --- a/internal/api/0.0.37/docs/V0037ReservationsResponse.md +++ /dev/null @@ -1,82 +0,0 @@ -# V0037ReservationsResponse - -## Properties - -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**Errors** | Pointer to [**[]V0037Error**](V0037Error.md) | slurm errors | [optional] -**Reservations** | Pointer to [**[]V0037Reservation**](V0037Reservation.md) | reservation info | [optional] - -## Methods - -### NewV0037ReservationsResponse - -`func NewV0037ReservationsResponse() *V0037ReservationsResponse` - -NewV0037ReservationsResponse instantiates a new V0037ReservationsResponse object -This constructor will assign default values to properties that have it defined, -and makes sure properties required by API are set, but the set of arguments -will change when the set of required properties is changed - -### NewV0037ReservationsResponseWithDefaults - -`func NewV0037ReservationsResponseWithDefaults() *V0037ReservationsResponse` - -NewV0037ReservationsResponseWithDefaults instantiates a new V0037ReservationsResponse object -This constructor will only assign default values to properties that have it defined, -but it doesn't guarantee that properties required by API are set - -### GetErrors - -`func (o *V0037ReservationsResponse) GetErrors() []V0037Error` - -GetErrors returns the Errors field if non-nil, zero value otherwise. - -### GetErrorsOk - -`func (o *V0037ReservationsResponse) GetErrorsOk() (*[]V0037Error, bool)` - -GetErrorsOk returns a tuple with the Errors field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetErrors - -`func (o *V0037ReservationsResponse) SetErrors(v []V0037Error)` - -SetErrors sets Errors field to given value. - -### HasErrors - -`func (o *V0037ReservationsResponse) HasErrors() bool` - -HasErrors returns a boolean if a field has been set. - -### GetReservations - -`func (o *V0037ReservationsResponse) GetReservations() []V0037Reservation` - -GetReservations returns the Reservations field if non-nil, zero value otherwise. - -### GetReservationsOk - -`func (o *V0037ReservationsResponse) GetReservationsOk() (*[]V0037Reservation, bool)` - -GetReservationsOk returns a tuple with the Reservations field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetReservations - -`func (o *V0037ReservationsResponse) SetReservations(v []V0037Reservation)` - -SetReservations sets Reservations field to given value. - -### HasReservations - -`func (o *V0037ReservationsResponse) HasReservations() bool` - -HasReservations returns a boolean if a field has been set. - - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/internal/api/0.0.37/docs/V0037Signal.md b/internal/api/0.0.37/docs/V0037Signal.md deleted file mode 100644 index 213d264..0000000 --- a/internal/api/0.0.37/docs/V0037Signal.md +++ /dev/null @@ -1,39 +0,0 @@ -# V0037Signal - -## Enum - - -* `HUP` (value: `"HUP"`) - -* `INT` (value: `"INT"`) - -* `QUIT` (value: `"QUIT"`) - -* `ABRT` (value: `"ABRT"`) - -* `KILL` (value: `"KILL"`) - -* `ALRM` (value: `"ALRM"`) - -* `TERM` (value: `"TERM"`) - -* `USR1` (value: `"USR1"`) - -* `USR2` (value: `"USR2"`) - -* `URG` (value: `"URG"`) - -* `CONT` (value: `"CONT"`) - -* `STOP` (value: `"STOP"`) - -* `TSTP` (value: `"TSTP"`) - -* `TTIN` (value: `"TTIN"`) - -* `TTOU` (value: `"TTOU"`) - - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/internal/api/0.0.37/git_push.sh b/internal/api/0.0.37/git_push.sh deleted file mode 100644 index f53a75d..0000000 --- a/internal/api/0.0.37/git_push.sh +++ /dev/null @@ -1,57 +0,0 @@ -#!/bin/sh -# ref: https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/ -# -# Usage example: /bin/sh ./git_push.sh wing328 openapi-petstore-perl "minor update" "gitlab.com" - -git_user_id=$1 -git_repo_id=$2 -release_note=$3 -git_host=$4 - -if [ "$git_host" = "" ]; then - git_host="github.com" - echo "[INFO] No command line input provided. Set \$git_host to $git_host" -fi - -if [ "$git_user_id" = "" ]; then - git_user_id="GIT_USER_ID" - echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id" -fi - -if [ "$git_repo_id" = "" ]; then - git_repo_id="GIT_REPO_ID" - echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id" -fi - -if [ "$release_note" = "" ]; then - release_note="Minor update" - echo "[INFO] No command line input provided. Set \$release_note to $release_note" -fi - -# Initialize the local directory as a Git repository -git init - -# Adds the files in the local repository and stages them for commit. -git add . - -# Commits the tracked changes and prepares them to be pushed to a remote repository. -git commit -m "$release_note" - -# Sets the new remote -git_remote=$(git remote) -if [ "$git_remote" = "" ]; then # git remote not defined - - if [ "$GIT_TOKEN" = "" ]; then - echo "[INFO] \$GIT_TOKEN (environment variable) is not set. Using the git credential in your environment." - git remote add origin https://${git_host}/${git_user_id}/${git_repo_id}.git - else - git remote add origin https://${git_user_id}:"${GIT_TOKEN}"@${git_host}/${git_user_id}/${git_repo_id}.git - fi - -fi - -git pull origin master - -# Pushes (Forces) the changes in the local repository up to the remote repository -echo "Git pushing to https://${git_host}/${git_user_id}/${git_repo_id}.git" -git push origin master 2>&1 | grep -v 'To https' diff --git a/internal/api/0.0.37/go.mod b/internal/api/0.0.37/go.mod deleted file mode 100644 index 7fca7ee..0000000 --- a/internal/api/0.0.37/go.mod +++ /dev/null @@ -1,6 +0,0 @@ -module github.com/GIT_USER_ID/GIT_REPO_ID - -go 1.18 - -require ( -) diff --git a/internal/api/0.0.37/go.sum b/internal/api/0.0.37/go.sum deleted file mode 100644 index c966c8d..0000000 --- a/internal/api/0.0.37/go.sum +++ /dev/null @@ -1,11 +0,0 @@ -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e h1:bRhVy7zSSasaqNksaRZiA5EEI+Ei4I1nO5Jh72wfHlg= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 h1:YUO/7uOKsKeq9UokNS62b8FYywz3ker1l1vDZRCRefw= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= diff --git a/internal/api/0.0.37/model_v0_0_37_diag.go b/internal/api/0.0.37/model_v0_0_37_diag.go deleted file mode 100644 index d4f6df9..0000000 --- a/internal/api/0.0.37/model_v0_0_37_diag.go +++ /dev/null @@ -1,164 +0,0 @@ -/* -Slurm Rest API - -API to access and control Slurm. - -API version: 0.0.37 -Contact: sales@schedmd.com -*/ - -// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. - -package openapi - -import ( - "encoding/json" -) - -// checks if the V0037Diag type satisfies the MappedNullable interface at compile time -var _ MappedNullable = &V0037Diag{} - -// V0037Diag struct for V0037Diag -type V0037Diag struct { - // slurm errors - Errors []V0037Error `json:"errors,omitempty"` - Statistics *V0037DiagStatistics `json:"statistics,omitempty"` -} - -// NewV0037Diag instantiates a new V0037Diag object -// This constructor will assign default values to properties that have it defined, -// and makes sure properties required by API are set, but the set of arguments -// will change when the set of required properties is changed -func NewV0037Diag() *V0037Diag { - this := V0037Diag{} - return &this -} - -// NewV0037DiagWithDefaults instantiates a new V0037Diag object -// This constructor will only assign default values to properties that have it defined, -// but it doesn't guarantee that properties required by API are set -func NewV0037DiagWithDefaults() *V0037Diag { - this := V0037Diag{} - return &this -} - -// GetErrors returns the Errors field value if set, zero value otherwise. -func (o *V0037Diag) GetErrors() []V0037Error { - if o == nil || IsNil(o.Errors) { - var ret []V0037Error - return ret - } - return o.Errors -} - -// GetErrorsOk returns a tuple with the Errors field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Diag) GetErrorsOk() ([]V0037Error, bool) { - if o == nil || IsNil(o.Errors) { - return nil, false - } - return o.Errors, true -} - -// HasErrors returns a boolean if a field has been set. -func (o *V0037Diag) HasErrors() bool { - if o != nil && !IsNil(o.Errors) { - return true - } - - return false -} - -// SetErrors gets a reference to the given []V0037Error and assigns it to the Errors field. -func (o *V0037Diag) SetErrors(v []V0037Error) { - o.Errors = v -} - -// GetStatistics returns the Statistics field value if set, zero value otherwise. -func (o *V0037Diag) GetStatistics() V0037DiagStatistics { - if o == nil || IsNil(o.Statistics) { - var ret V0037DiagStatistics - return ret - } - return *o.Statistics -} - -// GetStatisticsOk returns a tuple with the Statistics field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Diag) GetStatisticsOk() (*V0037DiagStatistics, bool) { - if o == nil || IsNil(o.Statistics) { - return nil, false - } - return o.Statistics, true -} - -// HasStatistics returns a boolean if a field has been set. -func (o *V0037Diag) HasStatistics() bool { - if o != nil && !IsNil(o.Statistics) { - return true - } - - return false -} - -// SetStatistics gets a reference to the given V0037DiagStatistics and assigns it to the Statistics field. -func (o *V0037Diag) SetStatistics(v V0037DiagStatistics) { - o.Statistics = &v -} - -func (o V0037Diag) MarshalJSON() ([]byte, error) { - toSerialize,err := o.ToMap() - if err != nil { - return []byte{}, err - } - return json.Marshal(toSerialize) -} - -func (o V0037Diag) ToMap() (map[string]interface{}, error) { - toSerialize := map[string]interface{}{} - if !IsNil(o.Errors) { - toSerialize["errors"] = o.Errors - } - if !IsNil(o.Statistics) { - toSerialize["statistics"] = o.Statistics - } - return toSerialize, nil -} - -type NullableV0037Diag struct { - value *V0037Diag - isSet bool -} - -func (v NullableV0037Diag) Get() *V0037Diag { - return v.value -} - -func (v *NullableV0037Diag) Set(val *V0037Diag) { - v.value = val - v.isSet = true -} - -func (v NullableV0037Diag) IsSet() bool { - return v.isSet -} - -func (v *NullableV0037Diag) Unset() { - v.value = nil - v.isSet = false -} - -func NewNullableV0037Diag(val *V0037Diag) *NullableV0037Diag { - return &NullableV0037Diag{value: val, isSet: true} -} - -func (v NullableV0037Diag) MarshalJSON() ([]byte, error) { - return json.Marshal(v.value) -} - -func (v *NullableV0037Diag) UnmarshalJSON(src []byte) error { - v.isSet = true - return json.Unmarshal(src, &v.value) -} - - diff --git a/internal/api/0.0.37/model_v0_0_37_diag_statistics.go b/internal/api/0.0.37/model_v0_0_37_diag_statistics.go deleted file mode 100644 index 943d51e..0000000 --- a/internal/api/0.0.37/model_v0_0_37_diag_statistics.go +++ /dev/null @@ -1,1534 +0,0 @@ -/* -Slurm Rest API - -API to access and control Slurm. - -API version: 0.0.37 -Contact: sales@schedmd.com -*/ - -// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. - -package openapi - -import ( - "encoding/json" -) - -// checks if the V0037DiagStatistics type satisfies the MappedNullable interface at compile time -var _ MappedNullable = &V0037DiagStatistics{} - -// V0037DiagStatistics Slurm statistics -type V0037DiagStatistics struct { - // partition records packed - PartsPacked *int32 `json:"parts_packed,omitempty"` - // generation time - ReqTime *int32 `json:"req_time,omitempty"` - // data since - ReqTimeStart *int32 `json:"req_time_start,omitempty"` - // Server thread count - ServerThreadCount *int32 `json:"server_thread_count,omitempty"` - // Agent queue size - AgentQueueSize *int32 `json:"agent_queue_size,omitempty"` - // Agent count - AgentCount *int32 `json:"agent_count,omitempty"` - // Agent thread count - AgentThreadCount *int32 `json:"agent_thread_count,omitempty"` - // DBD Agent queue size - DbdAgentQueueSize *int32 `json:"dbd_agent_queue_size,omitempty"` - // Latency for 1000 calls to gettimeofday() - GettimeofdayLatency *int32 `json:"gettimeofday_latency,omitempty"` - // Main Schedule max cycle - ScheduleCycleMax *int32 `json:"schedule_cycle_max,omitempty"` - // Main Schedule last cycle - ScheduleCycleLast *int32 `json:"schedule_cycle_last,omitempty"` - // Main Schedule cycle iterations - ScheduleCycleTotal *int32 `json:"schedule_cycle_total,omitempty"` - // Average time for Schedule Max cycle - ScheduleCycleMean *int32 `json:"schedule_cycle_mean,omitempty"` - // Average depth for Schedule Max cycle - ScheduleCycleMeanDepth *int32 `json:"schedule_cycle_mean_depth,omitempty"` - // Main Schedule Cycles per minute - ScheduleCyclePerMinute *int32 `json:"schedule_cycle_per_minute,omitempty"` - // Main Schedule Last queue length - ScheduleQueueLength *int32 `json:"schedule_queue_length,omitempty"` - // Job submitted - JobsSubmitted *int32 `json:"jobs_submitted,omitempty"` - // Job started - JobsStarted *int32 `json:"jobs_started,omitempty"` - // Job completed - JobsCompleted *int32 `json:"jobs_completed,omitempty"` - // Job cancelled - JobsCanceled *int32 `json:"jobs_canceled,omitempty"` - // Job failed - JobsFailed *int32 `json:"jobs_failed,omitempty"` - // Job pending - JobsPending *int32 `json:"jobs_pending,omitempty"` - // Job running - JobsRunning *int32 `json:"jobs_running,omitempty"` - // Job states timestamp - JobStatesTs *int32 `json:"job_states_ts,omitempty"` - // Total backfilled jobs (since last slurm start) - BfBackfilledJobs *int32 `json:"bf_backfilled_jobs,omitempty"` - // Total backfilled jobs (since last stats cycle start) - BfLastBackfilledJobs *int32 `json:"bf_last_backfilled_jobs,omitempty"` - // Total backfilled heterogeneous job components - BfBackfilledHetJobs *int32 `json:"bf_backfilled_het_jobs,omitempty"` - // Backfill Schedule Total cycles - BfCycleCounter *int32 `json:"bf_cycle_counter,omitempty"` - // Backfill Schedule Mean cycle - BfCycleMean *int32 `json:"bf_cycle_mean,omitempty"` - // Backfill Schedule Max cycle time - BfCycleMax *int32 `json:"bf_cycle_max,omitempty"` - // Backfill Schedule Last depth cycle - BfLastDepth *int32 `json:"bf_last_depth,omitempty"` - // Backfill Schedule Mean cycle (try sched) - BfLastDepthTry *int32 `json:"bf_last_depth_try,omitempty"` - // Backfill Schedule Depth Mean - BfDepthMean *int32 `json:"bf_depth_mean,omitempty"` - // Backfill Schedule Depth Mean (try sched) - BfDepthMeanTry *int32 `json:"bf_depth_mean_try,omitempty"` - // Backfill Schedule Last cycle time - BfCycleLast *int32 `json:"bf_cycle_last,omitempty"` - // Backfill Schedule Last queue length - BfQueueLen *int32 `json:"bf_queue_len,omitempty"` - // Backfill Schedule Mean queue length - BfQueueLenMean *int32 `json:"bf_queue_len_mean,omitempty"` - // Last cycle timestamp - BfWhenLastCycle *int32 `json:"bf_when_last_cycle,omitempty"` - // Backfill Schedule currently active - BfActive *bool `json:"bf_active,omitempty"` -} - -// NewV0037DiagStatistics instantiates a new V0037DiagStatistics object -// This constructor will assign default values to properties that have it defined, -// and makes sure properties required by API are set, but the set of arguments -// will change when the set of required properties is changed -func NewV0037DiagStatistics() *V0037DiagStatistics { - this := V0037DiagStatistics{} - return &this -} - -// NewV0037DiagStatisticsWithDefaults instantiates a new V0037DiagStatistics object -// This constructor will only assign default values to properties that have it defined, -// but it doesn't guarantee that properties required by API are set -func NewV0037DiagStatisticsWithDefaults() *V0037DiagStatistics { - this := V0037DiagStatistics{} - return &this -} - -// GetPartsPacked returns the PartsPacked field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetPartsPacked() int32 { - if o == nil || IsNil(o.PartsPacked) { - var ret int32 - return ret - } - return *o.PartsPacked -} - -// GetPartsPackedOk returns a tuple with the PartsPacked field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetPartsPackedOk() (*int32, bool) { - if o == nil || IsNil(o.PartsPacked) { - return nil, false - } - return o.PartsPacked, true -} - -// HasPartsPacked returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasPartsPacked() bool { - if o != nil && !IsNil(o.PartsPacked) { - return true - } - - return false -} - -// SetPartsPacked gets a reference to the given int32 and assigns it to the PartsPacked field. -func (o *V0037DiagStatistics) SetPartsPacked(v int32) { - o.PartsPacked = &v -} - -// GetReqTime returns the ReqTime field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetReqTime() int32 { - if o == nil || IsNil(o.ReqTime) { - var ret int32 - return ret - } - return *o.ReqTime -} - -// GetReqTimeOk returns a tuple with the ReqTime field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetReqTimeOk() (*int32, bool) { - if o == nil || IsNil(o.ReqTime) { - return nil, false - } - return o.ReqTime, true -} - -// HasReqTime returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasReqTime() bool { - if o != nil && !IsNil(o.ReqTime) { - return true - } - - return false -} - -// SetReqTime gets a reference to the given int32 and assigns it to the ReqTime field. -func (o *V0037DiagStatistics) SetReqTime(v int32) { - o.ReqTime = &v -} - -// GetReqTimeStart returns the ReqTimeStart field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetReqTimeStart() int32 { - if o == nil || IsNil(o.ReqTimeStart) { - var ret int32 - return ret - } - return *o.ReqTimeStart -} - -// GetReqTimeStartOk returns a tuple with the ReqTimeStart field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetReqTimeStartOk() (*int32, bool) { - if o == nil || IsNil(o.ReqTimeStart) { - return nil, false - } - return o.ReqTimeStart, true -} - -// HasReqTimeStart returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasReqTimeStart() bool { - if o != nil && !IsNil(o.ReqTimeStart) { - return true - } - - return false -} - -// SetReqTimeStart gets a reference to the given int32 and assigns it to the ReqTimeStart field. -func (o *V0037DiagStatistics) SetReqTimeStart(v int32) { - o.ReqTimeStart = &v -} - -// GetServerThreadCount returns the ServerThreadCount field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetServerThreadCount() int32 { - if o == nil || IsNil(o.ServerThreadCount) { - var ret int32 - return ret - } - return *o.ServerThreadCount -} - -// GetServerThreadCountOk returns a tuple with the ServerThreadCount field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetServerThreadCountOk() (*int32, bool) { - if o == nil || IsNil(o.ServerThreadCount) { - return nil, false - } - return o.ServerThreadCount, true -} - -// HasServerThreadCount returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasServerThreadCount() bool { - if o != nil && !IsNil(o.ServerThreadCount) { - return true - } - - return false -} - -// SetServerThreadCount gets a reference to the given int32 and assigns it to the ServerThreadCount field. -func (o *V0037DiagStatistics) SetServerThreadCount(v int32) { - o.ServerThreadCount = &v -} - -// GetAgentQueueSize returns the AgentQueueSize field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetAgentQueueSize() int32 { - if o == nil || IsNil(o.AgentQueueSize) { - var ret int32 - return ret - } - return *o.AgentQueueSize -} - -// GetAgentQueueSizeOk returns a tuple with the AgentQueueSize field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetAgentQueueSizeOk() (*int32, bool) { - if o == nil || IsNil(o.AgentQueueSize) { - return nil, false - } - return o.AgentQueueSize, true -} - -// HasAgentQueueSize returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasAgentQueueSize() bool { - if o != nil && !IsNil(o.AgentQueueSize) { - return true - } - - return false -} - -// SetAgentQueueSize gets a reference to the given int32 and assigns it to the AgentQueueSize field. -func (o *V0037DiagStatistics) SetAgentQueueSize(v int32) { - o.AgentQueueSize = &v -} - -// GetAgentCount returns the AgentCount field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetAgentCount() int32 { - if o == nil || IsNil(o.AgentCount) { - var ret int32 - return ret - } - return *o.AgentCount -} - -// GetAgentCountOk returns a tuple with the AgentCount field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetAgentCountOk() (*int32, bool) { - if o == nil || IsNil(o.AgentCount) { - return nil, false - } - return o.AgentCount, true -} - -// HasAgentCount returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasAgentCount() bool { - if o != nil && !IsNil(o.AgentCount) { - return true - } - - return false -} - -// SetAgentCount gets a reference to the given int32 and assigns it to the AgentCount field. -func (o *V0037DiagStatistics) SetAgentCount(v int32) { - o.AgentCount = &v -} - -// GetAgentThreadCount returns the AgentThreadCount field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetAgentThreadCount() int32 { - if o == nil || IsNil(o.AgentThreadCount) { - var ret int32 - return ret - } - return *o.AgentThreadCount -} - -// GetAgentThreadCountOk returns a tuple with the AgentThreadCount field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetAgentThreadCountOk() (*int32, bool) { - if o == nil || IsNil(o.AgentThreadCount) { - return nil, false - } - return o.AgentThreadCount, true -} - -// HasAgentThreadCount returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasAgentThreadCount() bool { - if o != nil && !IsNil(o.AgentThreadCount) { - return true - } - - return false -} - -// SetAgentThreadCount gets a reference to the given int32 and assigns it to the AgentThreadCount field. -func (o *V0037DiagStatistics) SetAgentThreadCount(v int32) { - o.AgentThreadCount = &v -} - -// GetDbdAgentQueueSize returns the DbdAgentQueueSize field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetDbdAgentQueueSize() int32 { - if o == nil || IsNil(o.DbdAgentQueueSize) { - var ret int32 - return ret - } - return *o.DbdAgentQueueSize -} - -// GetDbdAgentQueueSizeOk returns a tuple with the DbdAgentQueueSize field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetDbdAgentQueueSizeOk() (*int32, bool) { - if o == nil || IsNil(o.DbdAgentQueueSize) { - return nil, false - } - return o.DbdAgentQueueSize, true -} - -// HasDbdAgentQueueSize returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasDbdAgentQueueSize() bool { - if o != nil && !IsNil(o.DbdAgentQueueSize) { - return true - } - - return false -} - -// SetDbdAgentQueueSize gets a reference to the given int32 and assigns it to the DbdAgentQueueSize field. -func (o *V0037DiagStatistics) SetDbdAgentQueueSize(v int32) { - o.DbdAgentQueueSize = &v -} - -// GetGettimeofdayLatency returns the GettimeofdayLatency field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetGettimeofdayLatency() int32 { - if o == nil || IsNil(o.GettimeofdayLatency) { - var ret int32 - return ret - } - return *o.GettimeofdayLatency -} - -// GetGettimeofdayLatencyOk returns a tuple with the GettimeofdayLatency field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetGettimeofdayLatencyOk() (*int32, bool) { - if o == nil || IsNil(o.GettimeofdayLatency) { - return nil, false - } - return o.GettimeofdayLatency, true -} - -// HasGettimeofdayLatency returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasGettimeofdayLatency() bool { - if o != nil && !IsNil(o.GettimeofdayLatency) { - return true - } - - return false -} - -// SetGettimeofdayLatency gets a reference to the given int32 and assigns it to the GettimeofdayLatency field. -func (o *V0037DiagStatistics) SetGettimeofdayLatency(v int32) { - o.GettimeofdayLatency = &v -} - -// GetScheduleCycleMax returns the ScheduleCycleMax field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetScheduleCycleMax() int32 { - if o == nil || IsNil(o.ScheduleCycleMax) { - var ret int32 - return ret - } - return *o.ScheduleCycleMax -} - -// GetScheduleCycleMaxOk returns a tuple with the ScheduleCycleMax field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetScheduleCycleMaxOk() (*int32, bool) { - if o == nil || IsNil(o.ScheduleCycleMax) { - return nil, false - } - return o.ScheduleCycleMax, true -} - -// HasScheduleCycleMax returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasScheduleCycleMax() bool { - if o != nil && !IsNil(o.ScheduleCycleMax) { - return true - } - - return false -} - -// SetScheduleCycleMax gets a reference to the given int32 and assigns it to the ScheduleCycleMax field. -func (o *V0037DiagStatistics) SetScheduleCycleMax(v int32) { - o.ScheduleCycleMax = &v -} - -// GetScheduleCycleLast returns the ScheduleCycleLast field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetScheduleCycleLast() int32 { - if o == nil || IsNil(o.ScheduleCycleLast) { - var ret int32 - return ret - } - return *o.ScheduleCycleLast -} - -// GetScheduleCycleLastOk returns a tuple with the ScheduleCycleLast field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetScheduleCycleLastOk() (*int32, bool) { - if o == nil || IsNil(o.ScheduleCycleLast) { - return nil, false - } - return o.ScheduleCycleLast, true -} - -// HasScheduleCycleLast returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasScheduleCycleLast() bool { - if o != nil && !IsNil(o.ScheduleCycleLast) { - return true - } - - return false -} - -// SetScheduleCycleLast gets a reference to the given int32 and assigns it to the ScheduleCycleLast field. -func (o *V0037DiagStatistics) SetScheduleCycleLast(v int32) { - o.ScheduleCycleLast = &v -} - -// GetScheduleCycleTotal returns the ScheduleCycleTotal field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetScheduleCycleTotal() int32 { - if o == nil || IsNil(o.ScheduleCycleTotal) { - var ret int32 - return ret - } - return *o.ScheduleCycleTotal -} - -// GetScheduleCycleTotalOk returns a tuple with the ScheduleCycleTotal field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetScheduleCycleTotalOk() (*int32, bool) { - if o == nil || IsNil(o.ScheduleCycleTotal) { - return nil, false - } - return o.ScheduleCycleTotal, true -} - -// HasScheduleCycleTotal returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasScheduleCycleTotal() bool { - if o != nil && !IsNil(o.ScheduleCycleTotal) { - return true - } - - return false -} - -// SetScheduleCycleTotal gets a reference to the given int32 and assigns it to the ScheduleCycleTotal field. -func (o *V0037DiagStatistics) SetScheduleCycleTotal(v int32) { - o.ScheduleCycleTotal = &v -} - -// GetScheduleCycleMean returns the ScheduleCycleMean field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetScheduleCycleMean() int32 { - if o == nil || IsNil(o.ScheduleCycleMean) { - var ret int32 - return ret - } - return *o.ScheduleCycleMean -} - -// GetScheduleCycleMeanOk returns a tuple with the ScheduleCycleMean field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetScheduleCycleMeanOk() (*int32, bool) { - if o == nil || IsNil(o.ScheduleCycleMean) { - return nil, false - } - return o.ScheduleCycleMean, true -} - -// HasScheduleCycleMean returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasScheduleCycleMean() bool { - if o != nil && !IsNil(o.ScheduleCycleMean) { - return true - } - - return false -} - -// SetScheduleCycleMean gets a reference to the given int32 and assigns it to the ScheduleCycleMean field. -func (o *V0037DiagStatistics) SetScheduleCycleMean(v int32) { - o.ScheduleCycleMean = &v -} - -// GetScheduleCycleMeanDepth returns the ScheduleCycleMeanDepth field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetScheduleCycleMeanDepth() int32 { - if o == nil || IsNil(o.ScheduleCycleMeanDepth) { - var ret int32 - return ret - } - return *o.ScheduleCycleMeanDepth -} - -// GetScheduleCycleMeanDepthOk returns a tuple with the ScheduleCycleMeanDepth field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetScheduleCycleMeanDepthOk() (*int32, bool) { - if o == nil || IsNil(o.ScheduleCycleMeanDepth) { - return nil, false - } - return o.ScheduleCycleMeanDepth, true -} - -// HasScheduleCycleMeanDepth returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasScheduleCycleMeanDepth() bool { - if o != nil && !IsNil(o.ScheduleCycleMeanDepth) { - return true - } - - return false -} - -// SetScheduleCycleMeanDepth gets a reference to the given int32 and assigns it to the ScheduleCycleMeanDepth field. -func (o *V0037DiagStatistics) SetScheduleCycleMeanDepth(v int32) { - o.ScheduleCycleMeanDepth = &v -} - -// GetScheduleCyclePerMinute returns the ScheduleCyclePerMinute field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetScheduleCyclePerMinute() int32 { - if o == nil || IsNil(o.ScheduleCyclePerMinute) { - var ret int32 - return ret - } - return *o.ScheduleCyclePerMinute -} - -// GetScheduleCyclePerMinuteOk returns a tuple with the ScheduleCyclePerMinute field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetScheduleCyclePerMinuteOk() (*int32, bool) { - if o == nil || IsNil(o.ScheduleCyclePerMinute) { - return nil, false - } - return o.ScheduleCyclePerMinute, true -} - -// HasScheduleCyclePerMinute returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasScheduleCyclePerMinute() bool { - if o != nil && !IsNil(o.ScheduleCyclePerMinute) { - return true - } - - return false -} - -// SetScheduleCyclePerMinute gets a reference to the given int32 and assigns it to the ScheduleCyclePerMinute field. -func (o *V0037DiagStatistics) SetScheduleCyclePerMinute(v int32) { - o.ScheduleCyclePerMinute = &v -} - -// GetScheduleQueueLength returns the ScheduleQueueLength field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetScheduleQueueLength() int32 { - if o == nil || IsNil(o.ScheduleQueueLength) { - var ret int32 - return ret - } - return *o.ScheduleQueueLength -} - -// GetScheduleQueueLengthOk returns a tuple with the ScheduleQueueLength field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetScheduleQueueLengthOk() (*int32, bool) { - if o == nil || IsNil(o.ScheduleQueueLength) { - return nil, false - } - return o.ScheduleQueueLength, true -} - -// HasScheduleQueueLength returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasScheduleQueueLength() bool { - if o != nil && !IsNil(o.ScheduleQueueLength) { - return true - } - - return false -} - -// SetScheduleQueueLength gets a reference to the given int32 and assigns it to the ScheduleQueueLength field. -func (o *V0037DiagStatistics) SetScheduleQueueLength(v int32) { - o.ScheduleQueueLength = &v -} - -// GetJobsSubmitted returns the JobsSubmitted field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetJobsSubmitted() int32 { - if o == nil || IsNil(o.JobsSubmitted) { - var ret int32 - return ret - } - return *o.JobsSubmitted -} - -// GetJobsSubmittedOk returns a tuple with the JobsSubmitted field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetJobsSubmittedOk() (*int32, bool) { - if o == nil || IsNil(o.JobsSubmitted) { - return nil, false - } - return o.JobsSubmitted, true -} - -// HasJobsSubmitted returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasJobsSubmitted() bool { - if o != nil && !IsNil(o.JobsSubmitted) { - return true - } - - return false -} - -// SetJobsSubmitted gets a reference to the given int32 and assigns it to the JobsSubmitted field. -func (o *V0037DiagStatistics) SetJobsSubmitted(v int32) { - o.JobsSubmitted = &v -} - -// GetJobsStarted returns the JobsStarted field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetJobsStarted() int32 { - if o == nil || IsNil(o.JobsStarted) { - var ret int32 - return ret - } - return *o.JobsStarted -} - -// GetJobsStartedOk returns a tuple with the JobsStarted field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetJobsStartedOk() (*int32, bool) { - if o == nil || IsNil(o.JobsStarted) { - return nil, false - } - return o.JobsStarted, true -} - -// HasJobsStarted returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasJobsStarted() bool { - if o != nil && !IsNil(o.JobsStarted) { - return true - } - - return false -} - -// SetJobsStarted gets a reference to the given int32 and assigns it to the JobsStarted field. -func (o *V0037DiagStatistics) SetJobsStarted(v int32) { - o.JobsStarted = &v -} - -// GetJobsCompleted returns the JobsCompleted field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetJobsCompleted() int32 { - if o == nil || IsNil(o.JobsCompleted) { - var ret int32 - return ret - } - return *o.JobsCompleted -} - -// GetJobsCompletedOk returns a tuple with the JobsCompleted field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetJobsCompletedOk() (*int32, bool) { - if o == nil || IsNil(o.JobsCompleted) { - return nil, false - } - return o.JobsCompleted, true -} - -// HasJobsCompleted returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasJobsCompleted() bool { - if o != nil && !IsNil(o.JobsCompleted) { - return true - } - - return false -} - -// SetJobsCompleted gets a reference to the given int32 and assigns it to the JobsCompleted field. -func (o *V0037DiagStatistics) SetJobsCompleted(v int32) { - o.JobsCompleted = &v -} - -// GetJobsCanceled returns the JobsCanceled field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetJobsCanceled() int32 { - if o == nil || IsNil(o.JobsCanceled) { - var ret int32 - return ret - } - return *o.JobsCanceled -} - -// GetJobsCanceledOk returns a tuple with the JobsCanceled field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetJobsCanceledOk() (*int32, bool) { - if o == nil || IsNil(o.JobsCanceled) { - return nil, false - } - return o.JobsCanceled, true -} - -// HasJobsCanceled returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasJobsCanceled() bool { - if o != nil && !IsNil(o.JobsCanceled) { - return true - } - - return false -} - -// SetJobsCanceled gets a reference to the given int32 and assigns it to the JobsCanceled field. -func (o *V0037DiagStatistics) SetJobsCanceled(v int32) { - o.JobsCanceled = &v -} - -// GetJobsFailed returns the JobsFailed field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetJobsFailed() int32 { - if o == nil || IsNil(o.JobsFailed) { - var ret int32 - return ret - } - return *o.JobsFailed -} - -// GetJobsFailedOk returns a tuple with the JobsFailed field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetJobsFailedOk() (*int32, bool) { - if o == nil || IsNil(o.JobsFailed) { - return nil, false - } - return o.JobsFailed, true -} - -// HasJobsFailed returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasJobsFailed() bool { - if o != nil && !IsNil(o.JobsFailed) { - return true - } - - return false -} - -// SetJobsFailed gets a reference to the given int32 and assigns it to the JobsFailed field. -func (o *V0037DiagStatistics) SetJobsFailed(v int32) { - o.JobsFailed = &v -} - -// GetJobsPending returns the JobsPending field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetJobsPending() int32 { - if o == nil || IsNil(o.JobsPending) { - var ret int32 - return ret - } - return *o.JobsPending -} - -// GetJobsPendingOk returns a tuple with the JobsPending field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetJobsPendingOk() (*int32, bool) { - if o == nil || IsNil(o.JobsPending) { - return nil, false - } - return o.JobsPending, true -} - -// HasJobsPending returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasJobsPending() bool { - if o != nil && !IsNil(o.JobsPending) { - return true - } - - return false -} - -// SetJobsPending gets a reference to the given int32 and assigns it to the JobsPending field. -func (o *V0037DiagStatistics) SetJobsPending(v int32) { - o.JobsPending = &v -} - -// GetJobsRunning returns the JobsRunning field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetJobsRunning() int32 { - if o == nil || IsNil(o.JobsRunning) { - var ret int32 - return ret - } - return *o.JobsRunning -} - -// GetJobsRunningOk returns a tuple with the JobsRunning field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetJobsRunningOk() (*int32, bool) { - if o == nil || IsNil(o.JobsRunning) { - return nil, false - } - return o.JobsRunning, true -} - -// HasJobsRunning returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasJobsRunning() bool { - if o != nil && !IsNil(o.JobsRunning) { - return true - } - - return false -} - -// SetJobsRunning gets a reference to the given int32 and assigns it to the JobsRunning field. -func (o *V0037DiagStatistics) SetJobsRunning(v int32) { - o.JobsRunning = &v -} - -// GetJobStatesTs returns the JobStatesTs field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetJobStatesTs() int32 { - if o == nil || IsNil(o.JobStatesTs) { - var ret int32 - return ret - } - return *o.JobStatesTs -} - -// GetJobStatesTsOk returns a tuple with the JobStatesTs field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetJobStatesTsOk() (*int32, bool) { - if o == nil || IsNil(o.JobStatesTs) { - return nil, false - } - return o.JobStatesTs, true -} - -// HasJobStatesTs returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasJobStatesTs() bool { - if o != nil && !IsNil(o.JobStatesTs) { - return true - } - - return false -} - -// SetJobStatesTs gets a reference to the given int32 and assigns it to the JobStatesTs field. -func (o *V0037DiagStatistics) SetJobStatesTs(v int32) { - o.JobStatesTs = &v -} - -// GetBfBackfilledJobs returns the BfBackfilledJobs field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetBfBackfilledJobs() int32 { - if o == nil || IsNil(o.BfBackfilledJobs) { - var ret int32 - return ret - } - return *o.BfBackfilledJobs -} - -// GetBfBackfilledJobsOk returns a tuple with the BfBackfilledJobs field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetBfBackfilledJobsOk() (*int32, bool) { - if o == nil || IsNil(o.BfBackfilledJobs) { - return nil, false - } - return o.BfBackfilledJobs, true -} - -// HasBfBackfilledJobs returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasBfBackfilledJobs() bool { - if o != nil && !IsNil(o.BfBackfilledJobs) { - return true - } - - return false -} - -// SetBfBackfilledJobs gets a reference to the given int32 and assigns it to the BfBackfilledJobs field. -func (o *V0037DiagStatistics) SetBfBackfilledJobs(v int32) { - o.BfBackfilledJobs = &v -} - -// GetBfLastBackfilledJobs returns the BfLastBackfilledJobs field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetBfLastBackfilledJobs() int32 { - if o == nil || IsNil(o.BfLastBackfilledJobs) { - var ret int32 - return ret - } - return *o.BfLastBackfilledJobs -} - -// GetBfLastBackfilledJobsOk returns a tuple with the BfLastBackfilledJobs field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetBfLastBackfilledJobsOk() (*int32, bool) { - if o == nil || IsNil(o.BfLastBackfilledJobs) { - return nil, false - } - return o.BfLastBackfilledJobs, true -} - -// HasBfLastBackfilledJobs returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasBfLastBackfilledJobs() bool { - if o != nil && !IsNil(o.BfLastBackfilledJobs) { - return true - } - - return false -} - -// SetBfLastBackfilledJobs gets a reference to the given int32 and assigns it to the BfLastBackfilledJobs field. -func (o *V0037DiagStatistics) SetBfLastBackfilledJobs(v int32) { - o.BfLastBackfilledJobs = &v -} - -// GetBfBackfilledHetJobs returns the BfBackfilledHetJobs field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetBfBackfilledHetJobs() int32 { - if o == nil || IsNil(o.BfBackfilledHetJobs) { - var ret int32 - return ret - } - return *o.BfBackfilledHetJobs -} - -// GetBfBackfilledHetJobsOk returns a tuple with the BfBackfilledHetJobs field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetBfBackfilledHetJobsOk() (*int32, bool) { - if o == nil || IsNil(o.BfBackfilledHetJobs) { - return nil, false - } - return o.BfBackfilledHetJobs, true -} - -// HasBfBackfilledHetJobs returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasBfBackfilledHetJobs() bool { - if o != nil && !IsNil(o.BfBackfilledHetJobs) { - return true - } - - return false -} - -// SetBfBackfilledHetJobs gets a reference to the given int32 and assigns it to the BfBackfilledHetJobs field. -func (o *V0037DiagStatistics) SetBfBackfilledHetJobs(v int32) { - o.BfBackfilledHetJobs = &v -} - -// GetBfCycleCounter returns the BfCycleCounter field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetBfCycleCounter() int32 { - if o == nil || IsNil(o.BfCycleCounter) { - var ret int32 - return ret - } - return *o.BfCycleCounter -} - -// GetBfCycleCounterOk returns a tuple with the BfCycleCounter field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetBfCycleCounterOk() (*int32, bool) { - if o == nil || IsNil(o.BfCycleCounter) { - return nil, false - } - return o.BfCycleCounter, true -} - -// HasBfCycleCounter returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasBfCycleCounter() bool { - if o != nil && !IsNil(o.BfCycleCounter) { - return true - } - - return false -} - -// SetBfCycleCounter gets a reference to the given int32 and assigns it to the BfCycleCounter field. -func (o *V0037DiagStatistics) SetBfCycleCounter(v int32) { - o.BfCycleCounter = &v -} - -// GetBfCycleMean returns the BfCycleMean field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetBfCycleMean() int32 { - if o == nil || IsNil(o.BfCycleMean) { - var ret int32 - return ret - } - return *o.BfCycleMean -} - -// GetBfCycleMeanOk returns a tuple with the BfCycleMean field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetBfCycleMeanOk() (*int32, bool) { - if o == nil || IsNil(o.BfCycleMean) { - return nil, false - } - return o.BfCycleMean, true -} - -// HasBfCycleMean returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasBfCycleMean() bool { - if o != nil && !IsNil(o.BfCycleMean) { - return true - } - - return false -} - -// SetBfCycleMean gets a reference to the given int32 and assigns it to the BfCycleMean field. -func (o *V0037DiagStatistics) SetBfCycleMean(v int32) { - o.BfCycleMean = &v -} - -// GetBfCycleMax returns the BfCycleMax field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetBfCycleMax() int32 { - if o == nil || IsNil(o.BfCycleMax) { - var ret int32 - return ret - } - return *o.BfCycleMax -} - -// GetBfCycleMaxOk returns a tuple with the BfCycleMax field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetBfCycleMaxOk() (*int32, bool) { - if o == nil || IsNil(o.BfCycleMax) { - return nil, false - } - return o.BfCycleMax, true -} - -// HasBfCycleMax returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasBfCycleMax() bool { - if o != nil && !IsNil(o.BfCycleMax) { - return true - } - - return false -} - -// SetBfCycleMax gets a reference to the given int32 and assigns it to the BfCycleMax field. -func (o *V0037DiagStatistics) SetBfCycleMax(v int32) { - o.BfCycleMax = &v -} - -// GetBfLastDepth returns the BfLastDepth field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetBfLastDepth() int32 { - if o == nil || IsNil(o.BfLastDepth) { - var ret int32 - return ret - } - return *o.BfLastDepth -} - -// GetBfLastDepthOk returns a tuple with the BfLastDepth field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetBfLastDepthOk() (*int32, bool) { - if o == nil || IsNil(o.BfLastDepth) { - return nil, false - } - return o.BfLastDepth, true -} - -// HasBfLastDepth returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasBfLastDepth() bool { - if o != nil && !IsNil(o.BfLastDepth) { - return true - } - - return false -} - -// SetBfLastDepth gets a reference to the given int32 and assigns it to the BfLastDepth field. -func (o *V0037DiagStatistics) SetBfLastDepth(v int32) { - o.BfLastDepth = &v -} - -// GetBfLastDepthTry returns the BfLastDepthTry field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetBfLastDepthTry() int32 { - if o == nil || IsNil(o.BfLastDepthTry) { - var ret int32 - return ret - } - return *o.BfLastDepthTry -} - -// GetBfLastDepthTryOk returns a tuple with the BfLastDepthTry field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetBfLastDepthTryOk() (*int32, bool) { - if o == nil || IsNil(o.BfLastDepthTry) { - return nil, false - } - return o.BfLastDepthTry, true -} - -// HasBfLastDepthTry returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasBfLastDepthTry() bool { - if o != nil && !IsNil(o.BfLastDepthTry) { - return true - } - - return false -} - -// SetBfLastDepthTry gets a reference to the given int32 and assigns it to the BfLastDepthTry field. -func (o *V0037DiagStatistics) SetBfLastDepthTry(v int32) { - o.BfLastDepthTry = &v -} - -// GetBfDepthMean returns the BfDepthMean field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetBfDepthMean() int32 { - if o == nil || IsNil(o.BfDepthMean) { - var ret int32 - return ret - } - return *o.BfDepthMean -} - -// GetBfDepthMeanOk returns a tuple with the BfDepthMean field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetBfDepthMeanOk() (*int32, bool) { - if o == nil || IsNil(o.BfDepthMean) { - return nil, false - } - return o.BfDepthMean, true -} - -// HasBfDepthMean returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasBfDepthMean() bool { - if o != nil && !IsNil(o.BfDepthMean) { - return true - } - - return false -} - -// SetBfDepthMean gets a reference to the given int32 and assigns it to the BfDepthMean field. -func (o *V0037DiagStatistics) SetBfDepthMean(v int32) { - o.BfDepthMean = &v -} - -// GetBfDepthMeanTry returns the BfDepthMeanTry field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetBfDepthMeanTry() int32 { - if o == nil || IsNil(o.BfDepthMeanTry) { - var ret int32 - return ret - } - return *o.BfDepthMeanTry -} - -// GetBfDepthMeanTryOk returns a tuple with the BfDepthMeanTry field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetBfDepthMeanTryOk() (*int32, bool) { - if o == nil || IsNil(o.BfDepthMeanTry) { - return nil, false - } - return o.BfDepthMeanTry, true -} - -// HasBfDepthMeanTry returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasBfDepthMeanTry() bool { - if o != nil && !IsNil(o.BfDepthMeanTry) { - return true - } - - return false -} - -// SetBfDepthMeanTry gets a reference to the given int32 and assigns it to the BfDepthMeanTry field. -func (o *V0037DiagStatistics) SetBfDepthMeanTry(v int32) { - o.BfDepthMeanTry = &v -} - -// GetBfCycleLast returns the BfCycleLast field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetBfCycleLast() int32 { - if o == nil || IsNil(o.BfCycleLast) { - var ret int32 - return ret - } - return *o.BfCycleLast -} - -// GetBfCycleLastOk returns a tuple with the BfCycleLast field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetBfCycleLastOk() (*int32, bool) { - if o == nil || IsNil(o.BfCycleLast) { - return nil, false - } - return o.BfCycleLast, true -} - -// HasBfCycleLast returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasBfCycleLast() bool { - if o != nil && !IsNil(o.BfCycleLast) { - return true - } - - return false -} - -// SetBfCycleLast gets a reference to the given int32 and assigns it to the BfCycleLast field. -func (o *V0037DiagStatistics) SetBfCycleLast(v int32) { - o.BfCycleLast = &v -} - -// GetBfQueueLen returns the BfQueueLen field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetBfQueueLen() int32 { - if o == nil || IsNil(o.BfQueueLen) { - var ret int32 - return ret - } - return *o.BfQueueLen -} - -// GetBfQueueLenOk returns a tuple with the BfQueueLen field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetBfQueueLenOk() (*int32, bool) { - if o == nil || IsNil(o.BfQueueLen) { - return nil, false - } - return o.BfQueueLen, true -} - -// HasBfQueueLen returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasBfQueueLen() bool { - if o != nil && !IsNil(o.BfQueueLen) { - return true - } - - return false -} - -// SetBfQueueLen gets a reference to the given int32 and assigns it to the BfQueueLen field. -func (o *V0037DiagStatistics) SetBfQueueLen(v int32) { - o.BfQueueLen = &v -} - -// GetBfQueueLenMean returns the BfQueueLenMean field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetBfQueueLenMean() int32 { - if o == nil || IsNil(o.BfQueueLenMean) { - var ret int32 - return ret - } - return *o.BfQueueLenMean -} - -// GetBfQueueLenMeanOk returns a tuple with the BfQueueLenMean field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetBfQueueLenMeanOk() (*int32, bool) { - if o == nil || IsNil(o.BfQueueLenMean) { - return nil, false - } - return o.BfQueueLenMean, true -} - -// HasBfQueueLenMean returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasBfQueueLenMean() bool { - if o != nil && !IsNil(o.BfQueueLenMean) { - return true - } - - return false -} - -// SetBfQueueLenMean gets a reference to the given int32 and assigns it to the BfQueueLenMean field. -func (o *V0037DiagStatistics) SetBfQueueLenMean(v int32) { - o.BfQueueLenMean = &v -} - -// GetBfWhenLastCycle returns the BfWhenLastCycle field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetBfWhenLastCycle() int32 { - if o == nil || IsNil(o.BfWhenLastCycle) { - var ret int32 - return ret - } - return *o.BfWhenLastCycle -} - -// GetBfWhenLastCycleOk returns a tuple with the BfWhenLastCycle field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetBfWhenLastCycleOk() (*int32, bool) { - if o == nil || IsNil(o.BfWhenLastCycle) { - return nil, false - } - return o.BfWhenLastCycle, true -} - -// HasBfWhenLastCycle returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasBfWhenLastCycle() bool { - if o != nil && !IsNil(o.BfWhenLastCycle) { - return true - } - - return false -} - -// SetBfWhenLastCycle gets a reference to the given int32 and assigns it to the BfWhenLastCycle field. -func (o *V0037DiagStatistics) SetBfWhenLastCycle(v int32) { - o.BfWhenLastCycle = &v -} - -// GetBfActive returns the BfActive field value if set, zero value otherwise. -func (o *V0037DiagStatistics) GetBfActive() bool { - if o == nil || IsNil(o.BfActive) { - var ret bool - return ret - } - return *o.BfActive -} - -// GetBfActiveOk returns a tuple with the BfActive field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037DiagStatistics) GetBfActiveOk() (*bool, bool) { - if o == nil || IsNil(o.BfActive) { - return nil, false - } - return o.BfActive, true -} - -// HasBfActive returns a boolean if a field has been set. -func (o *V0037DiagStatistics) HasBfActive() bool { - if o != nil && !IsNil(o.BfActive) { - return true - } - - return false -} - -// SetBfActive gets a reference to the given bool and assigns it to the BfActive field. -func (o *V0037DiagStatistics) SetBfActive(v bool) { - o.BfActive = &v -} - -func (o V0037DiagStatistics) MarshalJSON() ([]byte, error) { - toSerialize,err := o.ToMap() - if err != nil { - return []byte{}, err - } - return json.Marshal(toSerialize) -} - -func (o V0037DiagStatistics) ToMap() (map[string]interface{}, error) { - toSerialize := map[string]interface{}{} - if !IsNil(o.PartsPacked) { - toSerialize["parts_packed"] = o.PartsPacked - } - if !IsNil(o.ReqTime) { - toSerialize["req_time"] = o.ReqTime - } - if !IsNil(o.ReqTimeStart) { - toSerialize["req_time_start"] = o.ReqTimeStart - } - if !IsNil(o.ServerThreadCount) { - toSerialize["server_thread_count"] = o.ServerThreadCount - } - if !IsNil(o.AgentQueueSize) { - toSerialize["agent_queue_size"] = o.AgentQueueSize - } - if !IsNil(o.AgentCount) { - toSerialize["agent_count"] = o.AgentCount - } - if !IsNil(o.AgentThreadCount) { - toSerialize["agent_thread_count"] = o.AgentThreadCount - } - if !IsNil(o.DbdAgentQueueSize) { - toSerialize["dbd_agent_queue_size"] = o.DbdAgentQueueSize - } - if !IsNil(o.GettimeofdayLatency) { - toSerialize["gettimeofday_latency"] = o.GettimeofdayLatency - } - if !IsNil(o.ScheduleCycleMax) { - toSerialize["schedule_cycle_max"] = o.ScheduleCycleMax - } - if !IsNil(o.ScheduleCycleLast) { - toSerialize["schedule_cycle_last"] = o.ScheduleCycleLast - } - if !IsNil(o.ScheduleCycleTotal) { - toSerialize["schedule_cycle_total"] = o.ScheduleCycleTotal - } - if !IsNil(o.ScheduleCycleMean) { - toSerialize["schedule_cycle_mean"] = o.ScheduleCycleMean - } - if !IsNil(o.ScheduleCycleMeanDepth) { - toSerialize["schedule_cycle_mean_depth"] = o.ScheduleCycleMeanDepth - } - if !IsNil(o.ScheduleCyclePerMinute) { - toSerialize["schedule_cycle_per_minute"] = o.ScheduleCyclePerMinute - } - if !IsNil(o.ScheduleQueueLength) { - toSerialize["schedule_queue_length"] = o.ScheduleQueueLength - } - if !IsNil(o.JobsSubmitted) { - toSerialize["jobs_submitted"] = o.JobsSubmitted - } - if !IsNil(o.JobsStarted) { - toSerialize["jobs_started"] = o.JobsStarted - } - if !IsNil(o.JobsCompleted) { - toSerialize["jobs_completed"] = o.JobsCompleted - } - if !IsNil(o.JobsCanceled) { - toSerialize["jobs_canceled"] = o.JobsCanceled - } - if !IsNil(o.JobsFailed) { - toSerialize["jobs_failed"] = o.JobsFailed - } - if !IsNil(o.JobsPending) { - toSerialize["jobs_pending"] = o.JobsPending - } - if !IsNil(o.JobsRunning) { - toSerialize["jobs_running"] = o.JobsRunning - } - if !IsNil(o.JobStatesTs) { - toSerialize["job_states_ts"] = o.JobStatesTs - } - if !IsNil(o.BfBackfilledJobs) { - toSerialize["bf_backfilled_jobs"] = o.BfBackfilledJobs - } - if !IsNil(o.BfLastBackfilledJobs) { - toSerialize["bf_last_backfilled_jobs"] = o.BfLastBackfilledJobs - } - if !IsNil(o.BfBackfilledHetJobs) { - toSerialize["bf_backfilled_het_jobs"] = o.BfBackfilledHetJobs - } - if !IsNil(o.BfCycleCounter) { - toSerialize["bf_cycle_counter"] = o.BfCycleCounter - } - if !IsNil(o.BfCycleMean) { - toSerialize["bf_cycle_mean"] = o.BfCycleMean - } - if !IsNil(o.BfCycleMax) { - toSerialize["bf_cycle_max"] = o.BfCycleMax - } - if !IsNil(o.BfLastDepth) { - toSerialize["bf_last_depth"] = o.BfLastDepth - } - if !IsNil(o.BfLastDepthTry) { - toSerialize["bf_last_depth_try"] = o.BfLastDepthTry - } - if !IsNil(o.BfDepthMean) { - toSerialize["bf_depth_mean"] = o.BfDepthMean - } - if !IsNil(o.BfDepthMeanTry) { - toSerialize["bf_depth_mean_try"] = o.BfDepthMeanTry - } - if !IsNil(o.BfCycleLast) { - toSerialize["bf_cycle_last"] = o.BfCycleLast - } - if !IsNil(o.BfQueueLen) { - toSerialize["bf_queue_len"] = o.BfQueueLen - } - if !IsNil(o.BfQueueLenMean) { - toSerialize["bf_queue_len_mean"] = o.BfQueueLenMean - } - if !IsNil(o.BfWhenLastCycle) { - toSerialize["bf_when_last_cycle"] = o.BfWhenLastCycle - } - if !IsNil(o.BfActive) { - toSerialize["bf_active"] = o.BfActive - } - return toSerialize, nil -} - -type NullableV0037DiagStatistics struct { - value *V0037DiagStatistics - isSet bool -} - -func (v NullableV0037DiagStatistics) Get() *V0037DiagStatistics { - return v.value -} - -func (v *NullableV0037DiagStatistics) Set(val *V0037DiagStatistics) { - v.value = val - v.isSet = true -} - -func (v NullableV0037DiagStatistics) IsSet() bool { - return v.isSet -} - -func (v *NullableV0037DiagStatistics) Unset() { - v.value = nil - v.isSet = false -} - -func NewNullableV0037DiagStatistics(val *V0037DiagStatistics) *NullableV0037DiagStatistics { - return &NullableV0037DiagStatistics{value: val, isSet: true} -} - -func (v NullableV0037DiagStatistics) MarshalJSON() ([]byte, error) { - return json.Marshal(v.value) -} - -func (v *NullableV0037DiagStatistics) UnmarshalJSON(src []byte) error { - v.isSet = true - return json.Unmarshal(src, &v.value) -} - - diff --git a/internal/api/0.0.37/model_v0_0_37_error.go b/internal/api/0.0.37/model_v0_0_37_error.go deleted file mode 100644 index 51f251c..0000000 --- a/internal/api/0.0.37/model_v0_0_37_error.go +++ /dev/null @@ -1,165 +0,0 @@ -/* -Slurm Rest API - -API to access and control Slurm. - -API version: 0.0.37 -Contact: sales@schedmd.com -*/ - -// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. - -package openapi - -import ( - "encoding/json" -) - -// checks if the V0037Error type satisfies the MappedNullable interface at compile time -var _ MappedNullable = &V0037Error{} - -// V0037Error struct for V0037Error -type V0037Error struct { - // error message - Error *string `json:"error,omitempty"` - // error number - Errno *int32 `json:"errno,omitempty"` -} - -// NewV0037Error instantiates a new V0037Error object -// This constructor will assign default values to properties that have it defined, -// and makes sure properties required by API are set, but the set of arguments -// will change when the set of required properties is changed -func NewV0037Error() *V0037Error { - this := V0037Error{} - return &this -} - -// NewV0037ErrorWithDefaults instantiates a new V0037Error object -// This constructor will only assign default values to properties that have it defined, -// but it doesn't guarantee that properties required by API are set -func NewV0037ErrorWithDefaults() *V0037Error { - this := V0037Error{} - return &this -} - -// GetError returns the Error field value if set, zero value otherwise. -func (o *V0037Error) GetError() string { - if o == nil || IsNil(o.Error) { - var ret string - return ret - } - return *o.Error -} - -// GetErrorOk returns a tuple with the Error field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Error) GetErrorOk() (*string, bool) { - if o == nil || IsNil(o.Error) { - return nil, false - } - return o.Error, true -} - -// HasError returns a boolean if a field has been set. -func (o *V0037Error) HasError() bool { - if o != nil && !IsNil(o.Error) { - return true - } - - return false -} - -// SetError gets a reference to the given string and assigns it to the Error field. -func (o *V0037Error) SetError(v string) { - o.Error = &v -} - -// GetErrno returns the Errno field value if set, zero value otherwise. -func (o *V0037Error) GetErrno() int32 { - if o == nil || IsNil(o.Errno) { - var ret int32 - return ret - } - return *o.Errno -} - -// GetErrnoOk returns a tuple with the Errno field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Error) GetErrnoOk() (*int32, bool) { - if o == nil || IsNil(o.Errno) { - return nil, false - } - return o.Errno, true -} - -// HasErrno returns a boolean if a field has been set. -func (o *V0037Error) HasErrno() bool { - if o != nil && !IsNil(o.Errno) { - return true - } - - return false -} - -// SetErrno gets a reference to the given int32 and assigns it to the Errno field. -func (o *V0037Error) SetErrno(v int32) { - o.Errno = &v -} - -func (o V0037Error) MarshalJSON() ([]byte, error) { - toSerialize,err := o.ToMap() - if err != nil { - return []byte{}, err - } - return json.Marshal(toSerialize) -} - -func (o V0037Error) ToMap() (map[string]interface{}, error) { - toSerialize := map[string]interface{}{} - if !IsNil(o.Error) { - toSerialize["error"] = o.Error - } - if !IsNil(o.Errno) { - toSerialize["errno"] = o.Errno - } - return toSerialize, nil -} - -type NullableV0037Error struct { - value *V0037Error - isSet bool -} - -func (v NullableV0037Error) Get() *V0037Error { - return v.value -} - -func (v *NullableV0037Error) Set(val *V0037Error) { - v.value = val - v.isSet = true -} - -func (v NullableV0037Error) IsSet() bool { - return v.isSet -} - -func (v *NullableV0037Error) Unset() { - v.value = nil - v.isSet = false -} - -func NewNullableV0037Error(val *V0037Error) *NullableV0037Error { - return &NullableV0037Error{value: val, isSet: true} -} - -func (v NullableV0037Error) MarshalJSON() ([]byte, error) { - return json.Marshal(v.value) -} - -func (v *NullableV0037Error) UnmarshalJSON(src []byte) error { - v.isSet = true - return json.Unmarshal(src, &v.value) -} - - diff --git a/internal/api/0.0.37/model_v0_0_37_job_properties.go b/internal/api/0.0.37/model_v0_0_37_job_properties.go deleted file mode 100644 index be76aec..0000000 --- a/internal/api/0.0.37/model_v0_0_37_job_properties.go +++ /dev/null @@ -1,2713 +0,0 @@ -/* -Slurm Rest API - -API to access and control Slurm. - -API version: 0.0.37 -Contact: sales@schedmd.com -*/ - -// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. - -package openapi - -import ( - "encoding/json" -) - -// checks if the V0037JobProperties type satisfies the MappedNullable interface at compile time -var _ MappedNullable = &V0037JobProperties{} - -// V0037JobProperties struct for V0037JobProperties -type V0037JobProperties struct { - // Charge resources used by this job to specified account. - Account *string `json:"account,omitempty"` - // Define the job accounting and profiling sampling intervals. - AccountGatherFrequency *string `json:"account_gather_frequency,omitempty"` - // Arguments to the script. - Argv []string `json:"argv,omitempty"` - // Submit a job array, multiple jobs to be executed with identical parameters. The indexes specification identifies what array index values should be used. - Array *string `json:"array,omitempty"` - // features required for batch script's node - BatchFeatures *string `json:"batch_features,omitempty"` - // Submit the batch script to the Slurm controller immediately, like normal, but tell the controller to defer the allocation of the job until the specified time. - BeginTime *int64 `json:"begin_time,omitempty"` - // Burst buffer specification. - BurstBuffer *string `json:"burst_buffer,omitempty"` - // Specifies features that a federated cluster must have to have a sibling job submitted to it. - ClusterConstraint *string `json:"cluster_constraint,omitempty"` - // An arbitrary comment. - Comment *string `json:"comment,omitempty"` - // node features required by job. - Constraints *string `json:"constraints,omitempty"` - // Count of specialized threads per node reserved by the job for system operations and not used by the application. - CoreSpecification *int32 `json:"core_specification,omitempty"` - // Restrict node selection to nodes with at least the specified number of cores per socket. - CoresPerSocket *int32 `json:"cores_per_socket,omitempty"` - // Cpu binding - CpuBinding *string `json:"cpu_binding,omitempty"` - // Cpu binding hint - CpuBindingHint *string `json:"cpu_binding_hint,omitempty"` - // Request that job steps initiated by srun commands inside this sbatch script be run at some requested frequency if possible, on the CPUs selected for the step on the compute node(s). - CpuFrequency *string `json:"cpu_frequency,omitempty"` - // Number of CPUs requested per allocated GPU. - CpusPerGpu *string `json:"cpus_per_gpu,omitempty"` - // Advise the Slurm controller that ensuing job steps will require ncpus number of processors per task. - CpusPerTask *int32 `json:"cpus_per_task,omitempty"` - // Instruct Slurm to connect the batch script's standard output directly to the file name. - CurrentWorkingDirectory *string `json:"current_working_directory,omitempty"` - // Remove the job if no ending is possible before this deadline (start > (deadline - time[-min])). - Deadline *string `json:"deadline,omitempty"` - // Do not reboot nodes in order to satisfied this job's feature specification if the job has been eligible to run for less than this time period. - DelayBoot *int32 `json:"delay_boot,omitempty"` - // Defer the start of this job until the specified dependencies have been satisfied completed. - Dependency *string `json:"dependency,omitempty"` - // Specify alternate distribution methods for remote processes. - Distribution *string `json:"distribution,omitempty"` - // Dictionary of environment entries. - Environment map[string]interface{} `json:"environment"` - // The job allocation can share nodes just other users with the \"user\" option or with the \"mcs\" option). - Exclusive *string `json:"exclusive,omitempty"` - // Load new login environment for user on job node. - GetUserEnvironment *bool `json:"get_user_environment,omitempty"` - // Specifies a comma delimited list of generic consumable resources. - Gres *string `json:"gres,omitempty"` - // Specify generic resource task binding options. - GresFlags *string `json:"gres_flags,omitempty"` - // Requested binding of tasks to GPU. - GpuBinding *string `json:"gpu_binding,omitempty"` - // Requested GPU frequency. - GpuFrequency *string `json:"gpu_frequency,omitempty"` - // GPUs per job. - Gpus *string `json:"gpus,omitempty"` - // GPUs per node. - GpusPerNode *string `json:"gpus_per_node,omitempty"` - // GPUs per socket. - GpusPerSocket *string `json:"gpus_per_socket,omitempty"` - // GPUs per task. - GpusPerTask *string `json:"gpus_per_task,omitempty"` - // Specify the job is to be submitted in a held state (priority of zero). - Hold *bool `json:"hold,omitempty"` - // If a job has an invalid dependency, then Slurm is to terminate it. - KillOnInvalidDependency *bool `json:"kill_on_invalid_dependency,omitempty"` - // Specification of licenses (or other resources available on all nodes of the cluster) which must be allocated to this job. - Licenses *string `json:"licenses,omitempty"` - // Notify user by email when certain event types occur. - MailType *string `json:"mail_type,omitempty"` - // User to receive email notification of state changes as defined by mail_type. - MailUser *string `json:"mail_user,omitempty"` - // This parameter is a group among the groups of the user. - McsLabel *string `json:"mcs_label,omitempty"` - // Bind tasks to memory. - MemoryBinding *string `json:"memory_binding,omitempty"` - // Minimum real memory per cpu (MB). - MemoryPerCpu *int32 `json:"memory_per_cpu,omitempty"` - // Minimum memory required per allocated GPU. - MemoryPerGpu *int32 `json:"memory_per_gpu,omitempty"` - // Minimum real memory per node (MB). - MemoryPerNode *int32 `json:"memory_per_node,omitempty"` - // Minimum number of CPUs per node. - MinimumCpusPerNode *int32 `json:"minimum_cpus_per_node,omitempty"` - // If a range of node counts is given, prefer the smaller count. - MinimumNodes *bool `json:"minimum_nodes,omitempty"` - // Specify a name for the job allocation. - Name *string `json:"name,omitempty"` - // Run the job with an adjusted scheduling priority within Slurm. - Nice *string `json:"nice,omitempty"` - // Do not automatically terminate a job if one of the nodes it has been allocated fails. - NoKill *bool `json:"no_kill,omitempty"` - // Request that a minimum of minnodes nodes and a maximum node count. - Nodes []int32 `json:"nodes,omitempty"` - // Open the output and error files using append or truncate mode as specified. - OpenMode *string `json:"open_mode,omitempty"` - // Request a specific partition for the resource allocation. - Partition *string `json:"partition,omitempty"` - // Request a specific job priority. - Priority *string `json:"priority,omitempty"` - // Request a quality of service for the job. - Qos *string `json:"qos,omitempty"` - // Specifies that the batch job should eligible to being requeue. - Requeue *bool `json:"requeue,omitempty"` - // Allocate resources for the job from the named reservation. - Reservation *string `json:"reservation,omitempty"` - // When a job is within sig_time seconds of its end time, send it the signal sig_num. - Signal *string `json:"signal,omitempty"` - // Restrict node selection to nodes with at least the specified number of sockets. - SocketsPerNode *int32 `json:"sockets_per_node,omitempty"` - // Spread the job allocation over as many nodes as possible and attempt to evenly distribute tasks across the allocated nodes. - SpreadJob *bool `json:"spread_job,omitempty"` - // Instruct Slurm to connect the batch script's standard error directly to the file name. - StandardError *string `json:"standard_error,omitempty"` - // Instruct Slurm to connect the batch script's standard input directly to the file name specified. - StandardInput *string `json:"standard_input,omitempty"` - // Instruct Slurm to connect the batch script's standard output directly to the file name. - StandardOutput *string `json:"standard_output,omitempty"` - // Advises the Slurm controller that job steps run within the allocation will launch a maximum of number tasks and to provide for sufficient resources. - Tasks *int32 `json:"tasks,omitempty"` - // Request the maximum ntasks be invoked on each core. - TasksPerCore *int32 `json:"tasks_per_core,omitempty"` - // Request the maximum ntasks be invoked on each node. - TasksPerNode *int32 `json:"tasks_per_node,omitempty"` - // Request the maximum ntasks be invoked on each socket. - TasksPerSocket *int32 `json:"tasks_per_socket,omitempty"` - // Count of specialized threads per node reserved by the job for system operations and not used by the application. - ThreadSpecification *int32 `json:"thread_specification,omitempty"` - // Restrict node selection to nodes with at least the specified number of threads per core. - ThreadsPerCore *int32 `json:"threads_per_core,omitempty"` - // Step time limit. - TimeLimit *int32 `json:"time_limit,omitempty"` - // Minimum run time in minutes. - TimeMinimum *int32 `json:"time_minimum,omitempty"` - // Do not begin execution until all nodes are ready for use. - WaitAllNodes *bool `json:"wait_all_nodes,omitempty"` - // Specify wckey to be used with job. - Wckey *string `json:"wckey,omitempty"` -} - -// NewV0037JobProperties instantiates a new V0037JobProperties object -// This constructor will assign default values to properties that have it defined, -// and makes sure properties required by API are set, but the set of arguments -// will change when the set of required properties is changed -func NewV0037JobProperties(environment map[string]interface{}) *V0037JobProperties { - this := V0037JobProperties{} - this.Environment = environment - var openMode string = "append" - this.OpenMode = &openMode - return &this -} - -// NewV0037JobPropertiesWithDefaults instantiates a new V0037JobProperties object -// This constructor will only assign default values to properties that have it defined, -// but it doesn't guarantee that properties required by API are set -func NewV0037JobPropertiesWithDefaults() *V0037JobProperties { - this := V0037JobProperties{} - var openMode string = "append" - this.OpenMode = &openMode - return &this -} - -// GetAccount returns the Account field value if set, zero value otherwise. -func (o *V0037JobProperties) GetAccount() string { - if o == nil || IsNil(o.Account) { - var ret string - return ret - } - return *o.Account -} - -// GetAccountOk returns a tuple with the Account field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetAccountOk() (*string, bool) { - if o == nil || IsNil(o.Account) { - return nil, false - } - return o.Account, true -} - -// HasAccount returns a boolean if a field has been set. -func (o *V0037JobProperties) HasAccount() bool { - if o != nil && !IsNil(o.Account) { - return true - } - - return false -} - -// SetAccount gets a reference to the given string and assigns it to the Account field. -func (o *V0037JobProperties) SetAccount(v string) { - o.Account = &v -} - -// GetAccountGatherFrequency returns the AccountGatherFrequency field value if set, zero value otherwise. -func (o *V0037JobProperties) GetAccountGatherFrequency() string { - if o == nil || IsNil(o.AccountGatherFrequency) { - var ret string - return ret - } - return *o.AccountGatherFrequency -} - -// GetAccountGatherFrequencyOk returns a tuple with the AccountGatherFrequency field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetAccountGatherFrequencyOk() (*string, bool) { - if o == nil || IsNil(o.AccountGatherFrequency) { - return nil, false - } - return o.AccountGatherFrequency, true -} - -// HasAccountGatherFrequency returns a boolean if a field has been set. -func (o *V0037JobProperties) HasAccountGatherFrequency() bool { - if o != nil && !IsNil(o.AccountGatherFrequency) { - return true - } - - return false -} - -// SetAccountGatherFrequency gets a reference to the given string and assigns it to the AccountGatherFrequency field. -func (o *V0037JobProperties) SetAccountGatherFrequency(v string) { - o.AccountGatherFrequency = &v -} - -// GetArgv returns the Argv field value if set, zero value otherwise. -func (o *V0037JobProperties) GetArgv() []string { - if o == nil || IsNil(o.Argv) { - var ret []string - return ret - } - return o.Argv -} - -// GetArgvOk returns a tuple with the Argv field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetArgvOk() ([]string, bool) { - if o == nil || IsNil(o.Argv) { - return nil, false - } - return o.Argv, true -} - -// HasArgv returns a boolean if a field has been set. -func (o *V0037JobProperties) HasArgv() bool { - if o != nil && !IsNil(o.Argv) { - return true - } - - return false -} - -// SetArgv gets a reference to the given []string and assigns it to the Argv field. -func (o *V0037JobProperties) SetArgv(v []string) { - o.Argv = v -} - -// GetArray returns the Array field value if set, zero value otherwise. -func (o *V0037JobProperties) GetArray() string { - if o == nil || IsNil(o.Array) { - var ret string - return ret - } - return *o.Array -} - -// GetArrayOk returns a tuple with the Array field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetArrayOk() (*string, bool) { - if o == nil || IsNil(o.Array) { - return nil, false - } - return o.Array, true -} - -// HasArray returns a boolean if a field has been set. -func (o *V0037JobProperties) HasArray() bool { - if o != nil && !IsNil(o.Array) { - return true - } - - return false -} - -// SetArray gets a reference to the given string and assigns it to the Array field. -func (o *V0037JobProperties) SetArray(v string) { - o.Array = &v -} - -// GetBatchFeatures returns the BatchFeatures field value if set, zero value otherwise. -func (o *V0037JobProperties) GetBatchFeatures() string { - if o == nil || IsNil(o.BatchFeatures) { - var ret string - return ret - } - return *o.BatchFeatures -} - -// GetBatchFeaturesOk returns a tuple with the BatchFeatures field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetBatchFeaturesOk() (*string, bool) { - if o == nil || IsNil(o.BatchFeatures) { - return nil, false - } - return o.BatchFeatures, true -} - -// HasBatchFeatures returns a boolean if a field has been set. -func (o *V0037JobProperties) HasBatchFeatures() bool { - if o != nil && !IsNil(o.BatchFeatures) { - return true - } - - return false -} - -// SetBatchFeatures gets a reference to the given string and assigns it to the BatchFeatures field. -func (o *V0037JobProperties) SetBatchFeatures(v string) { - o.BatchFeatures = &v -} - -// GetBeginTime returns the BeginTime field value if set, zero value otherwise. -func (o *V0037JobProperties) GetBeginTime() int64 { - if o == nil || IsNil(o.BeginTime) { - var ret int64 - return ret - } - return *o.BeginTime -} - -// GetBeginTimeOk returns a tuple with the BeginTime field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetBeginTimeOk() (*int64, bool) { - if o == nil || IsNil(o.BeginTime) { - return nil, false - } - return o.BeginTime, true -} - -// HasBeginTime returns a boolean if a field has been set. -func (o *V0037JobProperties) HasBeginTime() bool { - if o != nil && !IsNil(o.BeginTime) { - return true - } - - return false -} - -// SetBeginTime gets a reference to the given int64 and assigns it to the BeginTime field. -func (o *V0037JobProperties) SetBeginTime(v int64) { - o.BeginTime = &v -} - -// GetBurstBuffer returns the BurstBuffer field value if set, zero value otherwise. -func (o *V0037JobProperties) GetBurstBuffer() string { - if o == nil || IsNil(o.BurstBuffer) { - var ret string - return ret - } - return *o.BurstBuffer -} - -// GetBurstBufferOk returns a tuple with the BurstBuffer field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetBurstBufferOk() (*string, bool) { - if o == nil || IsNil(o.BurstBuffer) { - return nil, false - } - return o.BurstBuffer, true -} - -// HasBurstBuffer returns a boolean if a field has been set. -func (o *V0037JobProperties) HasBurstBuffer() bool { - if o != nil && !IsNil(o.BurstBuffer) { - return true - } - - return false -} - -// SetBurstBuffer gets a reference to the given string and assigns it to the BurstBuffer field. -func (o *V0037JobProperties) SetBurstBuffer(v string) { - o.BurstBuffer = &v -} - -// GetClusterConstraint returns the ClusterConstraint field value if set, zero value otherwise. -func (o *V0037JobProperties) GetClusterConstraint() string { - if o == nil || IsNil(o.ClusterConstraint) { - var ret string - return ret - } - return *o.ClusterConstraint -} - -// GetClusterConstraintOk returns a tuple with the ClusterConstraint field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetClusterConstraintOk() (*string, bool) { - if o == nil || IsNil(o.ClusterConstraint) { - return nil, false - } - return o.ClusterConstraint, true -} - -// HasClusterConstraint returns a boolean if a field has been set. -func (o *V0037JobProperties) HasClusterConstraint() bool { - if o != nil && !IsNil(o.ClusterConstraint) { - return true - } - - return false -} - -// SetClusterConstraint gets a reference to the given string and assigns it to the ClusterConstraint field. -func (o *V0037JobProperties) SetClusterConstraint(v string) { - o.ClusterConstraint = &v -} - -// GetComment returns the Comment field value if set, zero value otherwise. -func (o *V0037JobProperties) GetComment() string { - if o == nil || IsNil(o.Comment) { - var ret string - return ret - } - return *o.Comment -} - -// GetCommentOk returns a tuple with the Comment field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetCommentOk() (*string, bool) { - if o == nil || IsNil(o.Comment) { - return nil, false - } - return o.Comment, true -} - -// HasComment returns a boolean if a field has been set. -func (o *V0037JobProperties) HasComment() bool { - if o != nil && !IsNil(o.Comment) { - return true - } - - return false -} - -// SetComment gets a reference to the given string and assigns it to the Comment field. -func (o *V0037JobProperties) SetComment(v string) { - o.Comment = &v -} - -// GetConstraints returns the Constraints field value if set, zero value otherwise. -func (o *V0037JobProperties) GetConstraints() string { - if o == nil || IsNil(o.Constraints) { - var ret string - return ret - } - return *o.Constraints -} - -// GetConstraintsOk returns a tuple with the Constraints field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetConstraintsOk() (*string, bool) { - if o == nil || IsNil(o.Constraints) { - return nil, false - } - return o.Constraints, true -} - -// HasConstraints returns a boolean if a field has been set. -func (o *V0037JobProperties) HasConstraints() bool { - if o != nil && !IsNil(o.Constraints) { - return true - } - - return false -} - -// SetConstraints gets a reference to the given string and assigns it to the Constraints field. -func (o *V0037JobProperties) SetConstraints(v string) { - o.Constraints = &v -} - -// GetCoreSpecification returns the CoreSpecification field value if set, zero value otherwise. -func (o *V0037JobProperties) GetCoreSpecification() int32 { - if o == nil || IsNil(o.CoreSpecification) { - var ret int32 - return ret - } - return *o.CoreSpecification -} - -// GetCoreSpecificationOk returns a tuple with the CoreSpecification field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetCoreSpecificationOk() (*int32, bool) { - if o == nil || IsNil(o.CoreSpecification) { - return nil, false - } - return o.CoreSpecification, true -} - -// HasCoreSpecification returns a boolean if a field has been set. -func (o *V0037JobProperties) HasCoreSpecification() bool { - if o != nil && !IsNil(o.CoreSpecification) { - return true - } - - return false -} - -// SetCoreSpecification gets a reference to the given int32 and assigns it to the CoreSpecification field. -func (o *V0037JobProperties) SetCoreSpecification(v int32) { - o.CoreSpecification = &v -} - -// GetCoresPerSocket returns the CoresPerSocket field value if set, zero value otherwise. -func (o *V0037JobProperties) GetCoresPerSocket() int32 { - if o == nil || IsNil(o.CoresPerSocket) { - var ret int32 - return ret - } - return *o.CoresPerSocket -} - -// GetCoresPerSocketOk returns a tuple with the CoresPerSocket field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetCoresPerSocketOk() (*int32, bool) { - if o == nil || IsNil(o.CoresPerSocket) { - return nil, false - } - return o.CoresPerSocket, true -} - -// HasCoresPerSocket returns a boolean if a field has been set. -func (o *V0037JobProperties) HasCoresPerSocket() bool { - if o != nil && !IsNil(o.CoresPerSocket) { - return true - } - - return false -} - -// SetCoresPerSocket gets a reference to the given int32 and assigns it to the CoresPerSocket field. -func (o *V0037JobProperties) SetCoresPerSocket(v int32) { - o.CoresPerSocket = &v -} - -// GetCpuBinding returns the CpuBinding field value if set, zero value otherwise. -func (o *V0037JobProperties) GetCpuBinding() string { - if o == nil || IsNil(o.CpuBinding) { - var ret string - return ret - } - return *o.CpuBinding -} - -// GetCpuBindingOk returns a tuple with the CpuBinding field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetCpuBindingOk() (*string, bool) { - if o == nil || IsNil(o.CpuBinding) { - return nil, false - } - return o.CpuBinding, true -} - -// HasCpuBinding returns a boolean if a field has been set. -func (o *V0037JobProperties) HasCpuBinding() bool { - if o != nil && !IsNil(o.CpuBinding) { - return true - } - - return false -} - -// SetCpuBinding gets a reference to the given string and assigns it to the CpuBinding field. -func (o *V0037JobProperties) SetCpuBinding(v string) { - o.CpuBinding = &v -} - -// GetCpuBindingHint returns the CpuBindingHint field value if set, zero value otherwise. -func (o *V0037JobProperties) GetCpuBindingHint() string { - if o == nil || IsNil(o.CpuBindingHint) { - var ret string - return ret - } - return *o.CpuBindingHint -} - -// GetCpuBindingHintOk returns a tuple with the CpuBindingHint field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetCpuBindingHintOk() (*string, bool) { - if o == nil || IsNil(o.CpuBindingHint) { - return nil, false - } - return o.CpuBindingHint, true -} - -// HasCpuBindingHint returns a boolean if a field has been set. -func (o *V0037JobProperties) HasCpuBindingHint() bool { - if o != nil && !IsNil(o.CpuBindingHint) { - return true - } - - return false -} - -// SetCpuBindingHint gets a reference to the given string and assigns it to the CpuBindingHint field. -func (o *V0037JobProperties) SetCpuBindingHint(v string) { - o.CpuBindingHint = &v -} - -// GetCpuFrequency returns the CpuFrequency field value if set, zero value otherwise. -func (o *V0037JobProperties) GetCpuFrequency() string { - if o == nil || IsNil(o.CpuFrequency) { - var ret string - return ret - } - return *o.CpuFrequency -} - -// GetCpuFrequencyOk returns a tuple with the CpuFrequency field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetCpuFrequencyOk() (*string, bool) { - if o == nil || IsNil(o.CpuFrequency) { - return nil, false - } - return o.CpuFrequency, true -} - -// HasCpuFrequency returns a boolean if a field has been set. -func (o *V0037JobProperties) HasCpuFrequency() bool { - if o != nil && !IsNil(o.CpuFrequency) { - return true - } - - return false -} - -// SetCpuFrequency gets a reference to the given string and assigns it to the CpuFrequency field. -func (o *V0037JobProperties) SetCpuFrequency(v string) { - o.CpuFrequency = &v -} - -// GetCpusPerGpu returns the CpusPerGpu field value if set, zero value otherwise. -func (o *V0037JobProperties) GetCpusPerGpu() string { - if o == nil || IsNil(o.CpusPerGpu) { - var ret string - return ret - } - return *o.CpusPerGpu -} - -// GetCpusPerGpuOk returns a tuple with the CpusPerGpu field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetCpusPerGpuOk() (*string, bool) { - if o == nil || IsNil(o.CpusPerGpu) { - return nil, false - } - return o.CpusPerGpu, true -} - -// HasCpusPerGpu returns a boolean if a field has been set. -func (o *V0037JobProperties) HasCpusPerGpu() bool { - if o != nil && !IsNil(o.CpusPerGpu) { - return true - } - - return false -} - -// SetCpusPerGpu gets a reference to the given string and assigns it to the CpusPerGpu field. -func (o *V0037JobProperties) SetCpusPerGpu(v string) { - o.CpusPerGpu = &v -} - -// GetCpusPerTask returns the CpusPerTask field value if set, zero value otherwise. -func (o *V0037JobProperties) GetCpusPerTask() int32 { - if o == nil || IsNil(o.CpusPerTask) { - var ret int32 - return ret - } - return *o.CpusPerTask -} - -// GetCpusPerTaskOk returns a tuple with the CpusPerTask field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetCpusPerTaskOk() (*int32, bool) { - if o == nil || IsNil(o.CpusPerTask) { - return nil, false - } - return o.CpusPerTask, true -} - -// HasCpusPerTask returns a boolean if a field has been set. -func (o *V0037JobProperties) HasCpusPerTask() bool { - if o != nil && !IsNil(o.CpusPerTask) { - return true - } - - return false -} - -// SetCpusPerTask gets a reference to the given int32 and assigns it to the CpusPerTask field. -func (o *V0037JobProperties) SetCpusPerTask(v int32) { - o.CpusPerTask = &v -} - -// GetCurrentWorkingDirectory returns the CurrentWorkingDirectory field value if set, zero value otherwise. -func (o *V0037JobProperties) GetCurrentWorkingDirectory() string { - if o == nil || IsNil(o.CurrentWorkingDirectory) { - var ret string - return ret - } - return *o.CurrentWorkingDirectory -} - -// GetCurrentWorkingDirectoryOk returns a tuple with the CurrentWorkingDirectory field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetCurrentWorkingDirectoryOk() (*string, bool) { - if o == nil || IsNil(o.CurrentWorkingDirectory) { - return nil, false - } - return o.CurrentWorkingDirectory, true -} - -// HasCurrentWorkingDirectory returns a boolean if a field has been set. -func (o *V0037JobProperties) HasCurrentWorkingDirectory() bool { - if o != nil && !IsNil(o.CurrentWorkingDirectory) { - return true - } - - return false -} - -// SetCurrentWorkingDirectory gets a reference to the given string and assigns it to the CurrentWorkingDirectory field. -func (o *V0037JobProperties) SetCurrentWorkingDirectory(v string) { - o.CurrentWorkingDirectory = &v -} - -// GetDeadline returns the Deadline field value if set, zero value otherwise. -func (o *V0037JobProperties) GetDeadline() string { - if o == nil || IsNil(o.Deadline) { - var ret string - return ret - } - return *o.Deadline -} - -// GetDeadlineOk returns a tuple with the Deadline field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetDeadlineOk() (*string, bool) { - if o == nil || IsNil(o.Deadline) { - return nil, false - } - return o.Deadline, true -} - -// HasDeadline returns a boolean if a field has been set. -func (o *V0037JobProperties) HasDeadline() bool { - if o != nil && !IsNil(o.Deadline) { - return true - } - - return false -} - -// SetDeadline gets a reference to the given string and assigns it to the Deadline field. -func (o *V0037JobProperties) SetDeadline(v string) { - o.Deadline = &v -} - -// GetDelayBoot returns the DelayBoot field value if set, zero value otherwise. -func (o *V0037JobProperties) GetDelayBoot() int32 { - if o == nil || IsNil(o.DelayBoot) { - var ret int32 - return ret - } - return *o.DelayBoot -} - -// GetDelayBootOk returns a tuple with the DelayBoot field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetDelayBootOk() (*int32, bool) { - if o == nil || IsNil(o.DelayBoot) { - return nil, false - } - return o.DelayBoot, true -} - -// HasDelayBoot returns a boolean if a field has been set. -func (o *V0037JobProperties) HasDelayBoot() bool { - if o != nil && !IsNil(o.DelayBoot) { - return true - } - - return false -} - -// SetDelayBoot gets a reference to the given int32 and assigns it to the DelayBoot field. -func (o *V0037JobProperties) SetDelayBoot(v int32) { - o.DelayBoot = &v -} - -// GetDependency returns the Dependency field value if set, zero value otherwise. -func (o *V0037JobProperties) GetDependency() string { - if o == nil || IsNil(o.Dependency) { - var ret string - return ret - } - return *o.Dependency -} - -// GetDependencyOk returns a tuple with the Dependency field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetDependencyOk() (*string, bool) { - if o == nil || IsNil(o.Dependency) { - return nil, false - } - return o.Dependency, true -} - -// HasDependency returns a boolean if a field has been set. -func (o *V0037JobProperties) HasDependency() bool { - if o != nil && !IsNil(o.Dependency) { - return true - } - - return false -} - -// SetDependency gets a reference to the given string and assigns it to the Dependency field. -func (o *V0037JobProperties) SetDependency(v string) { - o.Dependency = &v -} - -// GetDistribution returns the Distribution field value if set, zero value otherwise. -func (o *V0037JobProperties) GetDistribution() string { - if o == nil || IsNil(o.Distribution) { - var ret string - return ret - } - return *o.Distribution -} - -// GetDistributionOk returns a tuple with the Distribution field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetDistributionOk() (*string, bool) { - if o == nil || IsNil(o.Distribution) { - return nil, false - } - return o.Distribution, true -} - -// HasDistribution returns a boolean if a field has been set. -func (o *V0037JobProperties) HasDistribution() bool { - if o != nil && !IsNil(o.Distribution) { - return true - } - - return false -} - -// SetDistribution gets a reference to the given string and assigns it to the Distribution field. -func (o *V0037JobProperties) SetDistribution(v string) { - o.Distribution = &v -} - -// GetEnvironment returns the Environment field value -func (o *V0037JobProperties) GetEnvironment() map[string]interface{} { - if o == nil { - var ret map[string]interface{} - return ret - } - - return o.Environment -} - -// GetEnvironmentOk returns a tuple with the Environment field value -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetEnvironmentOk() (map[string]interface{}, bool) { - if o == nil { - return map[string]interface{}{}, false - } - return o.Environment, true -} - -// SetEnvironment sets field value -func (o *V0037JobProperties) SetEnvironment(v map[string]interface{}) { - o.Environment = v -} - -// GetExclusive returns the Exclusive field value if set, zero value otherwise. -func (o *V0037JobProperties) GetExclusive() string { - if o == nil || IsNil(o.Exclusive) { - var ret string - return ret - } - return *o.Exclusive -} - -// GetExclusiveOk returns a tuple with the Exclusive field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetExclusiveOk() (*string, bool) { - if o == nil || IsNil(o.Exclusive) { - return nil, false - } - return o.Exclusive, true -} - -// HasExclusive returns a boolean if a field has been set. -func (o *V0037JobProperties) HasExclusive() bool { - if o != nil && !IsNil(o.Exclusive) { - return true - } - - return false -} - -// SetExclusive gets a reference to the given string and assigns it to the Exclusive field. -func (o *V0037JobProperties) SetExclusive(v string) { - o.Exclusive = &v -} - -// GetGetUserEnvironment returns the GetUserEnvironment field value if set, zero value otherwise. -func (o *V0037JobProperties) GetGetUserEnvironment() bool { - if o == nil || IsNil(o.GetUserEnvironment) { - var ret bool - return ret - } - return *o.GetUserEnvironment -} - -// GetGetUserEnvironmentOk returns a tuple with the GetUserEnvironment field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetGetUserEnvironmentOk() (*bool, bool) { - if o == nil || IsNil(o.GetUserEnvironment) { - return nil, false - } - return o.GetUserEnvironment, true -} - -// HasGetUserEnvironment returns a boolean if a field has been set. -func (o *V0037JobProperties) HasGetUserEnvironment() bool { - if o != nil && !IsNil(o.GetUserEnvironment) { - return true - } - - return false -} - -// SetGetUserEnvironment gets a reference to the given bool and assigns it to the GetUserEnvironment field. -func (o *V0037JobProperties) SetGetUserEnvironment(v bool) { - o.GetUserEnvironment = &v -} - -// GetGres returns the Gres field value if set, zero value otherwise. -func (o *V0037JobProperties) GetGres() string { - if o == nil || IsNil(o.Gres) { - var ret string - return ret - } - return *o.Gres -} - -// GetGresOk returns a tuple with the Gres field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetGresOk() (*string, bool) { - if o == nil || IsNil(o.Gres) { - return nil, false - } - return o.Gres, true -} - -// HasGres returns a boolean if a field has been set. -func (o *V0037JobProperties) HasGres() bool { - if o != nil && !IsNil(o.Gres) { - return true - } - - return false -} - -// SetGres gets a reference to the given string and assigns it to the Gres field. -func (o *V0037JobProperties) SetGres(v string) { - o.Gres = &v -} - -// GetGresFlags returns the GresFlags field value if set, zero value otherwise. -func (o *V0037JobProperties) GetGresFlags() string { - if o == nil || IsNil(o.GresFlags) { - var ret string - return ret - } - return *o.GresFlags -} - -// GetGresFlagsOk returns a tuple with the GresFlags field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetGresFlagsOk() (*string, bool) { - if o == nil || IsNil(o.GresFlags) { - return nil, false - } - return o.GresFlags, true -} - -// HasGresFlags returns a boolean if a field has been set. -func (o *V0037JobProperties) HasGresFlags() bool { - if o != nil && !IsNil(o.GresFlags) { - return true - } - - return false -} - -// SetGresFlags gets a reference to the given string and assigns it to the GresFlags field. -func (o *V0037JobProperties) SetGresFlags(v string) { - o.GresFlags = &v -} - -// GetGpuBinding returns the GpuBinding field value if set, zero value otherwise. -func (o *V0037JobProperties) GetGpuBinding() string { - if o == nil || IsNil(o.GpuBinding) { - var ret string - return ret - } - return *o.GpuBinding -} - -// GetGpuBindingOk returns a tuple with the GpuBinding field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetGpuBindingOk() (*string, bool) { - if o == nil || IsNil(o.GpuBinding) { - return nil, false - } - return o.GpuBinding, true -} - -// HasGpuBinding returns a boolean if a field has been set. -func (o *V0037JobProperties) HasGpuBinding() bool { - if o != nil && !IsNil(o.GpuBinding) { - return true - } - - return false -} - -// SetGpuBinding gets a reference to the given string and assigns it to the GpuBinding field. -func (o *V0037JobProperties) SetGpuBinding(v string) { - o.GpuBinding = &v -} - -// GetGpuFrequency returns the GpuFrequency field value if set, zero value otherwise. -func (o *V0037JobProperties) GetGpuFrequency() string { - if o == nil || IsNil(o.GpuFrequency) { - var ret string - return ret - } - return *o.GpuFrequency -} - -// GetGpuFrequencyOk returns a tuple with the GpuFrequency field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetGpuFrequencyOk() (*string, bool) { - if o == nil || IsNil(o.GpuFrequency) { - return nil, false - } - return o.GpuFrequency, true -} - -// HasGpuFrequency returns a boolean if a field has been set. -func (o *V0037JobProperties) HasGpuFrequency() bool { - if o != nil && !IsNil(o.GpuFrequency) { - return true - } - - return false -} - -// SetGpuFrequency gets a reference to the given string and assigns it to the GpuFrequency field. -func (o *V0037JobProperties) SetGpuFrequency(v string) { - o.GpuFrequency = &v -} - -// GetGpus returns the Gpus field value if set, zero value otherwise. -func (o *V0037JobProperties) GetGpus() string { - if o == nil || IsNil(o.Gpus) { - var ret string - return ret - } - return *o.Gpus -} - -// GetGpusOk returns a tuple with the Gpus field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetGpusOk() (*string, bool) { - if o == nil || IsNil(o.Gpus) { - return nil, false - } - return o.Gpus, true -} - -// HasGpus returns a boolean if a field has been set. -func (o *V0037JobProperties) HasGpus() bool { - if o != nil && !IsNil(o.Gpus) { - return true - } - - return false -} - -// SetGpus gets a reference to the given string and assigns it to the Gpus field. -func (o *V0037JobProperties) SetGpus(v string) { - o.Gpus = &v -} - -// GetGpusPerNode returns the GpusPerNode field value if set, zero value otherwise. -func (o *V0037JobProperties) GetGpusPerNode() string { - if o == nil || IsNil(o.GpusPerNode) { - var ret string - return ret - } - return *o.GpusPerNode -} - -// GetGpusPerNodeOk returns a tuple with the GpusPerNode field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetGpusPerNodeOk() (*string, bool) { - if o == nil || IsNil(o.GpusPerNode) { - return nil, false - } - return o.GpusPerNode, true -} - -// HasGpusPerNode returns a boolean if a field has been set. -func (o *V0037JobProperties) HasGpusPerNode() bool { - if o != nil && !IsNil(o.GpusPerNode) { - return true - } - - return false -} - -// SetGpusPerNode gets a reference to the given string and assigns it to the GpusPerNode field. -func (o *V0037JobProperties) SetGpusPerNode(v string) { - o.GpusPerNode = &v -} - -// GetGpusPerSocket returns the GpusPerSocket field value if set, zero value otherwise. -func (o *V0037JobProperties) GetGpusPerSocket() string { - if o == nil || IsNil(o.GpusPerSocket) { - var ret string - return ret - } - return *o.GpusPerSocket -} - -// GetGpusPerSocketOk returns a tuple with the GpusPerSocket field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetGpusPerSocketOk() (*string, bool) { - if o == nil || IsNil(o.GpusPerSocket) { - return nil, false - } - return o.GpusPerSocket, true -} - -// HasGpusPerSocket returns a boolean if a field has been set. -func (o *V0037JobProperties) HasGpusPerSocket() bool { - if o != nil && !IsNil(o.GpusPerSocket) { - return true - } - - return false -} - -// SetGpusPerSocket gets a reference to the given string and assigns it to the GpusPerSocket field. -func (o *V0037JobProperties) SetGpusPerSocket(v string) { - o.GpusPerSocket = &v -} - -// GetGpusPerTask returns the GpusPerTask field value if set, zero value otherwise. -func (o *V0037JobProperties) GetGpusPerTask() string { - if o == nil || IsNil(o.GpusPerTask) { - var ret string - return ret - } - return *o.GpusPerTask -} - -// GetGpusPerTaskOk returns a tuple with the GpusPerTask field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetGpusPerTaskOk() (*string, bool) { - if o == nil || IsNil(o.GpusPerTask) { - return nil, false - } - return o.GpusPerTask, true -} - -// HasGpusPerTask returns a boolean if a field has been set. -func (o *V0037JobProperties) HasGpusPerTask() bool { - if o != nil && !IsNil(o.GpusPerTask) { - return true - } - - return false -} - -// SetGpusPerTask gets a reference to the given string and assigns it to the GpusPerTask field. -func (o *V0037JobProperties) SetGpusPerTask(v string) { - o.GpusPerTask = &v -} - -// GetHold returns the Hold field value if set, zero value otherwise. -func (o *V0037JobProperties) GetHold() bool { - if o == nil || IsNil(o.Hold) { - var ret bool - return ret - } - return *o.Hold -} - -// GetHoldOk returns a tuple with the Hold field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetHoldOk() (*bool, bool) { - if o == nil || IsNil(o.Hold) { - return nil, false - } - return o.Hold, true -} - -// HasHold returns a boolean if a field has been set. -func (o *V0037JobProperties) HasHold() bool { - if o != nil && !IsNil(o.Hold) { - return true - } - - return false -} - -// SetHold gets a reference to the given bool and assigns it to the Hold field. -func (o *V0037JobProperties) SetHold(v bool) { - o.Hold = &v -} - -// GetKillOnInvalidDependency returns the KillOnInvalidDependency field value if set, zero value otherwise. -func (o *V0037JobProperties) GetKillOnInvalidDependency() bool { - if o == nil || IsNil(o.KillOnInvalidDependency) { - var ret bool - return ret - } - return *o.KillOnInvalidDependency -} - -// GetKillOnInvalidDependencyOk returns a tuple with the KillOnInvalidDependency field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetKillOnInvalidDependencyOk() (*bool, bool) { - if o == nil || IsNil(o.KillOnInvalidDependency) { - return nil, false - } - return o.KillOnInvalidDependency, true -} - -// HasKillOnInvalidDependency returns a boolean if a field has been set. -func (o *V0037JobProperties) HasKillOnInvalidDependency() bool { - if o != nil && !IsNil(o.KillOnInvalidDependency) { - return true - } - - return false -} - -// SetKillOnInvalidDependency gets a reference to the given bool and assigns it to the KillOnInvalidDependency field. -func (o *V0037JobProperties) SetKillOnInvalidDependency(v bool) { - o.KillOnInvalidDependency = &v -} - -// GetLicenses returns the Licenses field value if set, zero value otherwise. -func (o *V0037JobProperties) GetLicenses() string { - if o == nil || IsNil(o.Licenses) { - var ret string - return ret - } - return *o.Licenses -} - -// GetLicensesOk returns a tuple with the Licenses field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetLicensesOk() (*string, bool) { - if o == nil || IsNil(o.Licenses) { - return nil, false - } - return o.Licenses, true -} - -// HasLicenses returns a boolean if a field has been set. -func (o *V0037JobProperties) HasLicenses() bool { - if o != nil && !IsNil(o.Licenses) { - return true - } - - return false -} - -// SetLicenses gets a reference to the given string and assigns it to the Licenses field. -func (o *V0037JobProperties) SetLicenses(v string) { - o.Licenses = &v -} - -// GetMailType returns the MailType field value if set, zero value otherwise. -func (o *V0037JobProperties) GetMailType() string { - if o == nil || IsNil(o.MailType) { - var ret string - return ret - } - return *o.MailType -} - -// GetMailTypeOk returns a tuple with the MailType field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetMailTypeOk() (*string, bool) { - if o == nil || IsNil(o.MailType) { - return nil, false - } - return o.MailType, true -} - -// HasMailType returns a boolean if a field has been set. -func (o *V0037JobProperties) HasMailType() bool { - if o != nil && !IsNil(o.MailType) { - return true - } - - return false -} - -// SetMailType gets a reference to the given string and assigns it to the MailType field. -func (o *V0037JobProperties) SetMailType(v string) { - o.MailType = &v -} - -// GetMailUser returns the MailUser field value if set, zero value otherwise. -func (o *V0037JobProperties) GetMailUser() string { - if o == nil || IsNil(o.MailUser) { - var ret string - return ret - } - return *o.MailUser -} - -// GetMailUserOk returns a tuple with the MailUser field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetMailUserOk() (*string, bool) { - if o == nil || IsNil(o.MailUser) { - return nil, false - } - return o.MailUser, true -} - -// HasMailUser returns a boolean if a field has been set. -func (o *V0037JobProperties) HasMailUser() bool { - if o != nil && !IsNil(o.MailUser) { - return true - } - - return false -} - -// SetMailUser gets a reference to the given string and assigns it to the MailUser field. -func (o *V0037JobProperties) SetMailUser(v string) { - o.MailUser = &v -} - -// GetMcsLabel returns the McsLabel field value if set, zero value otherwise. -func (o *V0037JobProperties) GetMcsLabel() string { - if o == nil || IsNil(o.McsLabel) { - var ret string - return ret - } - return *o.McsLabel -} - -// GetMcsLabelOk returns a tuple with the McsLabel field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetMcsLabelOk() (*string, bool) { - if o == nil || IsNil(o.McsLabel) { - return nil, false - } - return o.McsLabel, true -} - -// HasMcsLabel returns a boolean if a field has been set. -func (o *V0037JobProperties) HasMcsLabel() bool { - if o != nil && !IsNil(o.McsLabel) { - return true - } - - return false -} - -// SetMcsLabel gets a reference to the given string and assigns it to the McsLabel field. -func (o *V0037JobProperties) SetMcsLabel(v string) { - o.McsLabel = &v -} - -// GetMemoryBinding returns the MemoryBinding field value if set, zero value otherwise. -func (o *V0037JobProperties) GetMemoryBinding() string { - if o == nil || IsNil(o.MemoryBinding) { - var ret string - return ret - } - return *o.MemoryBinding -} - -// GetMemoryBindingOk returns a tuple with the MemoryBinding field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetMemoryBindingOk() (*string, bool) { - if o == nil || IsNil(o.MemoryBinding) { - return nil, false - } - return o.MemoryBinding, true -} - -// HasMemoryBinding returns a boolean if a field has been set. -func (o *V0037JobProperties) HasMemoryBinding() bool { - if o != nil && !IsNil(o.MemoryBinding) { - return true - } - - return false -} - -// SetMemoryBinding gets a reference to the given string and assigns it to the MemoryBinding field. -func (o *V0037JobProperties) SetMemoryBinding(v string) { - o.MemoryBinding = &v -} - -// GetMemoryPerCpu returns the MemoryPerCpu field value if set, zero value otherwise. -func (o *V0037JobProperties) GetMemoryPerCpu() int32 { - if o == nil || IsNil(o.MemoryPerCpu) { - var ret int32 - return ret - } - return *o.MemoryPerCpu -} - -// GetMemoryPerCpuOk returns a tuple with the MemoryPerCpu field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetMemoryPerCpuOk() (*int32, bool) { - if o == nil || IsNil(o.MemoryPerCpu) { - return nil, false - } - return o.MemoryPerCpu, true -} - -// HasMemoryPerCpu returns a boolean if a field has been set. -func (o *V0037JobProperties) HasMemoryPerCpu() bool { - if o != nil && !IsNil(o.MemoryPerCpu) { - return true - } - - return false -} - -// SetMemoryPerCpu gets a reference to the given int32 and assigns it to the MemoryPerCpu field. -func (o *V0037JobProperties) SetMemoryPerCpu(v int32) { - o.MemoryPerCpu = &v -} - -// GetMemoryPerGpu returns the MemoryPerGpu field value if set, zero value otherwise. -func (o *V0037JobProperties) GetMemoryPerGpu() int32 { - if o == nil || IsNil(o.MemoryPerGpu) { - var ret int32 - return ret - } - return *o.MemoryPerGpu -} - -// GetMemoryPerGpuOk returns a tuple with the MemoryPerGpu field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetMemoryPerGpuOk() (*int32, bool) { - if o == nil || IsNil(o.MemoryPerGpu) { - return nil, false - } - return o.MemoryPerGpu, true -} - -// HasMemoryPerGpu returns a boolean if a field has been set. -func (o *V0037JobProperties) HasMemoryPerGpu() bool { - if o != nil && !IsNil(o.MemoryPerGpu) { - return true - } - - return false -} - -// SetMemoryPerGpu gets a reference to the given int32 and assigns it to the MemoryPerGpu field. -func (o *V0037JobProperties) SetMemoryPerGpu(v int32) { - o.MemoryPerGpu = &v -} - -// GetMemoryPerNode returns the MemoryPerNode field value if set, zero value otherwise. -func (o *V0037JobProperties) GetMemoryPerNode() int32 { - if o == nil || IsNil(o.MemoryPerNode) { - var ret int32 - return ret - } - return *o.MemoryPerNode -} - -// GetMemoryPerNodeOk returns a tuple with the MemoryPerNode field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetMemoryPerNodeOk() (*int32, bool) { - if o == nil || IsNil(o.MemoryPerNode) { - return nil, false - } - return o.MemoryPerNode, true -} - -// HasMemoryPerNode returns a boolean if a field has been set. -func (o *V0037JobProperties) HasMemoryPerNode() bool { - if o != nil && !IsNil(o.MemoryPerNode) { - return true - } - - return false -} - -// SetMemoryPerNode gets a reference to the given int32 and assigns it to the MemoryPerNode field. -func (o *V0037JobProperties) SetMemoryPerNode(v int32) { - o.MemoryPerNode = &v -} - -// GetMinimumCpusPerNode returns the MinimumCpusPerNode field value if set, zero value otherwise. -func (o *V0037JobProperties) GetMinimumCpusPerNode() int32 { - if o == nil || IsNil(o.MinimumCpusPerNode) { - var ret int32 - return ret - } - return *o.MinimumCpusPerNode -} - -// GetMinimumCpusPerNodeOk returns a tuple with the MinimumCpusPerNode field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetMinimumCpusPerNodeOk() (*int32, bool) { - if o == nil || IsNil(o.MinimumCpusPerNode) { - return nil, false - } - return o.MinimumCpusPerNode, true -} - -// HasMinimumCpusPerNode returns a boolean if a field has been set. -func (o *V0037JobProperties) HasMinimumCpusPerNode() bool { - if o != nil && !IsNil(o.MinimumCpusPerNode) { - return true - } - - return false -} - -// SetMinimumCpusPerNode gets a reference to the given int32 and assigns it to the MinimumCpusPerNode field. -func (o *V0037JobProperties) SetMinimumCpusPerNode(v int32) { - o.MinimumCpusPerNode = &v -} - -// GetMinimumNodes returns the MinimumNodes field value if set, zero value otherwise. -func (o *V0037JobProperties) GetMinimumNodes() bool { - if o == nil || IsNil(o.MinimumNodes) { - var ret bool - return ret - } - return *o.MinimumNodes -} - -// GetMinimumNodesOk returns a tuple with the MinimumNodes field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetMinimumNodesOk() (*bool, bool) { - if o == nil || IsNil(o.MinimumNodes) { - return nil, false - } - return o.MinimumNodes, true -} - -// HasMinimumNodes returns a boolean if a field has been set. -func (o *V0037JobProperties) HasMinimumNodes() bool { - if o != nil && !IsNil(o.MinimumNodes) { - return true - } - - return false -} - -// SetMinimumNodes gets a reference to the given bool and assigns it to the MinimumNodes field. -func (o *V0037JobProperties) SetMinimumNodes(v bool) { - o.MinimumNodes = &v -} - -// GetName returns the Name field value if set, zero value otherwise. -func (o *V0037JobProperties) GetName() string { - if o == nil || IsNil(o.Name) { - var ret string - return ret - } - return *o.Name -} - -// GetNameOk returns a tuple with the Name field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetNameOk() (*string, bool) { - if o == nil || IsNil(o.Name) { - return nil, false - } - return o.Name, true -} - -// HasName returns a boolean if a field has been set. -func (o *V0037JobProperties) HasName() bool { - if o != nil && !IsNil(o.Name) { - return true - } - - return false -} - -// SetName gets a reference to the given string and assigns it to the Name field. -func (o *V0037JobProperties) SetName(v string) { - o.Name = &v -} - -// GetNice returns the Nice field value if set, zero value otherwise. -func (o *V0037JobProperties) GetNice() string { - if o == nil || IsNil(o.Nice) { - var ret string - return ret - } - return *o.Nice -} - -// GetNiceOk returns a tuple with the Nice field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetNiceOk() (*string, bool) { - if o == nil || IsNil(o.Nice) { - return nil, false - } - return o.Nice, true -} - -// HasNice returns a boolean if a field has been set. -func (o *V0037JobProperties) HasNice() bool { - if o != nil && !IsNil(o.Nice) { - return true - } - - return false -} - -// SetNice gets a reference to the given string and assigns it to the Nice field. -func (o *V0037JobProperties) SetNice(v string) { - o.Nice = &v -} - -// GetNoKill returns the NoKill field value if set, zero value otherwise. -func (o *V0037JobProperties) GetNoKill() bool { - if o == nil || IsNil(o.NoKill) { - var ret bool - return ret - } - return *o.NoKill -} - -// GetNoKillOk returns a tuple with the NoKill field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetNoKillOk() (*bool, bool) { - if o == nil || IsNil(o.NoKill) { - return nil, false - } - return o.NoKill, true -} - -// HasNoKill returns a boolean if a field has been set. -func (o *V0037JobProperties) HasNoKill() bool { - if o != nil && !IsNil(o.NoKill) { - return true - } - - return false -} - -// SetNoKill gets a reference to the given bool and assigns it to the NoKill field. -func (o *V0037JobProperties) SetNoKill(v bool) { - o.NoKill = &v -} - -// GetNodes returns the Nodes field value if set, zero value otherwise. -func (o *V0037JobProperties) GetNodes() []int32 { - if o == nil || IsNil(o.Nodes) { - var ret []int32 - return ret - } - return o.Nodes -} - -// GetNodesOk returns a tuple with the Nodes field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetNodesOk() ([]int32, bool) { - if o == nil || IsNil(o.Nodes) { - return nil, false - } - return o.Nodes, true -} - -// HasNodes returns a boolean if a field has been set. -func (o *V0037JobProperties) HasNodes() bool { - if o != nil && !IsNil(o.Nodes) { - return true - } - - return false -} - -// SetNodes gets a reference to the given []int32 and assigns it to the Nodes field. -func (o *V0037JobProperties) SetNodes(v []int32) { - o.Nodes = v -} - -// GetOpenMode returns the OpenMode field value if set, zero value otherwise. -func (o *V0037JobProperties) GetOpenMode() string { - if o == nil || IsNil(o.OpenMode) { - var ret string - return ret - } - return *o.OpenMode -} - -// GetOpenModeOk returns a tuple with the OpenMode field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetOpenModeOk() (*string, bool) { - if o == nil || IsNil(o.OpenMode) { - return nil, false - } - return o.OpenMode, true -} - -// HasOpenMode returns a boolean if a field has been set. -func (o *V0037JobProperties) HasOpenMode() bool { - if o != nil && !IsNil(o.OpenMode) { - return true - } - - return false -} - -// SetOpenMode gets a reference to the given string and assigns it to the OpenMode field. -func (o *V0037JobProperties) SetOpenMode(v string) { - o.OpenMode = &v -} - -// GetPartition returns the Partition field value if set, zero value otherwise. -func (o *V0037JobProperties) GetPartition() string { - if o == nil || IsNil(o.Partition) { - var ret string - return ret - } - return *o.Partition -} - -// GetPartitionOk returns a tuple with the Partition field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetPartitionOk() (*string, bool) { - if o == nil || IsNil(o.Partition) { - return nil, false - } - return o.Partition, true -} - -// HasPartition returns a boolean if a field has been set. -func (o *V0037JobProperties) HasPartition() bool { - if o != nil && !IsNil(o.Partition) { - return true - } - - return false -} - -// SetPartition gets a reference to the given string and assigns it to the Partition field. -func (o *V0037JobProperties) SetPartition(v string) { - o.Partition = &v -} - -// GetPriority returns the Priority field value if set, zero value otherwise. -func (o *V0037JobProperties) GetPriority() string { - if o == nil || IsNil(o.Priority) { - var ret string - return ret - } - return *o.Priority -} - -// GetPriorityOk returns a tuple with the Priority field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetPriorityOk() (*string, bool) { - if o == nil || IsNil(o.Priority) { - return nil, false - } - return o.Priority, true -} - -// HasPriority returns a boolean if a field has been set. -func (o *V0037JobProperties) HasPriority() bool { - if o != nil && !IsNil(o.Priority) { - return true - } - - return false -} - -// SetPriority gets a reference to the given string and assigns it to the Priority field. -func (o *V0037JobProperties) SetPriority(v string) { - o.Priority = &v -} - -// GetQos returns the Qos field value if set, zero value otherwise. -func (o *V0037JobProperties) GetQos() string { - if o == nil || IsNil(o.Qos) { - var ret string - return ret - } - return *o.Qos -} - -// GetQosOk returns a tuple with the Qos field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetQosOk() (*string, bool) { - if o == nil || IsNil(o.Qos) { - return nil, false - } - return o.Qos, true -} - -// HasQos returns a boolean if a field has been set. -func (o *V0037JobProperties) HasQos() bool { - if o != nil && !IsNil(o.Qos) { - return true - } - - return false -} - -// SetQos gets a reference to the given string and assigns it to the Qos field. -func (o *V0037JobProperties) SetQos(v string) { - o.Qos = &v -} - -// GetRequeue returns the Requeue field value if set, zero value otherwise. -func (o *V0037JobProperties) GetRequeue() bool { - if o == nil || IsNil(o.Requeue) { - var ret bool - return ret - } - return *o.Requeue -} - -// GetRequeueOk returns a tuple with the Requeue field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetRequeueOk() (*bool, bool) { - if o == nil || IsNil(o.Requeue) { - return nil, false - } - return o.Requeue, true -} - -// HasRequeue returns a boolean if a field has been set. -func (o *V0037JobProperties) HasRequeue() bool { - if o != nil && !IsNil(o.Requeue) { - return true - } - - return false -} - -// SetRequeue gets a reference to the given bool and assigns it to the Requeue field. -func (o *V0037JobProperties) SetRequeue(v bool) { - o.Requeue = &v -} - -// GetReservation returns the Reservation field value if set, zero value otherwise. -func (o *V0037JobProperties) GetReservation() string { - if o == nil || IsNil(o.Reservation) { - var ret string - return ret - } - return *o.Reservation -} - -// GetReservationOk returns a tuple with the Reservation field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetReservationOk() (*string, bool) { - if o == nil || IsNil(o.Reservation) { - return nil, false - } - return o.Reservation, true -} - -// HasReservation returns a boolean if a field has been set. -func (o *V0037JobProperties) HasReservation() bool { - if o != nil && !IsNil(o.Reservation) { - return true - } - - return false -} - -// SetReservation gets a reference to the given string and assigns it to the Reservation field. -func (o *V0037JobProperties) SetReservation(v string) { - o.Reservation = &v -} - -// GetSignal returns the Signal field value if set, zero value otherwise. -func (o *V0037JobProperties) GetSignal() string { - if o == nil || IsNil(o.Signal) { - var ret string - return ret - } - return *o.Signal -} - -// GetSignalOk returns a tuple with the Signal field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetSignalOk() (*string, bool) { - if o == nil || IsNil(o.Signal) { - return nil, false - } - return o.Signal, true -} - -// HasSignal returns a boolean if a field has been set. -func (o *V0037JobProperties) HasSignal() bool { - if o != nil && !IsNil(o.Signal) { - return true - } - - return false -} - -// SetSignal gets a reference to the given string and assigns it to the Signal field. -func (o *V0037JobProperties) SetSignal(v string) { - o.Signal = &v -} - -// GetSocketsPerNode returns the SocketsPerNode field value if set, zero value otherwise. -func (o *V0037JobProperties) GetSocketsPerNode() int32 { - if o == nil || IsNil(o.SocketsPerNode) { - var ret int32 - return ret - } - return *o.SocketsPerNode -} - -// GetSocketsPerNodeOk returns a tuple with the SocketsPerNode field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetSocketsPerNodeOk() (*int32, bool) { - if o == nil || IsNil(o.SocketsPerNode) { - return nil, false - } - return o.SocketsPerNode, true -} - -// HasSocketsPerNode returns a boolean if a field has been set. -func (o *V0037JobProperties) HasSocketsPerNode() bool { - if o != nil && !IsNil(o.SocketsPerNode) { - return true - } - - return false -} - -// SetSocketsPerNode gets a reference to the given int32 and assigns it to the SocketsPerNode field. -func (o *V0037JobProperties) SetSocketsPerNode(v int32) { - o.SocketsPerNode = &v -} - -// GetSpreadJob returns the SpreadJob field value if set, zero value otherwise. -func (o *V0037JobProperties) GetSpreadJob() bool { - if o == nil || IsNil(o.SpreadJob) { - var ret bool - return ret - } - return *o.SpreadJob -} - -// GetSpreadJobOk returns a tuple with the SpreadJob field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetSpreadJobOk() (*bool, bool) { - if o == nil || IsNil(o.SpreadJob) { - return nil, false - } - return o.SpreadJob, true -} - -// HasSpreadJob returns a boolean if a field has been set. -func (o *V0037JobProperties) HasSpreadJob() bool { - if o != nil && !IsNil(o.SpreadJob) { - return true - } - - return false -} - -// SetSpreadJob gets a reference to the given bool and assigns it to the SpreadJob field. -func (o *V0037JobProperties) SetSpreadJob(v bool) { - o.SpreadJob = &v -} - -// GetStandardError returns the StandardError field value if set, zero value otherwise. -func (o *V0037JobProperties) GetStandardError() string { - if o == nil || IsNil(o.StandardError) { - var ret string - return ret - } - return *o.StandardError -} - -// GetStandardErrorOk returns a tuple with the StandardError field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetStandardErrorOk() (*string, bool) { - if o == nil || IsNil(o.StandardError) { - return nil, false - } - return o.StandardError, true -} - -// HasStandardError returns a boolean if a field has been set. -func (o *V0037JobProperties) HasStandardError() bool { - if o != nil && !IsNil(o.StandardError) { - return true - } - - return false -} - -// SetStandardError gets a reference to the given string and assigns it to the StandardError field. -func (o *V0037JobProperties) SetStandardError(v string) { - o.StandardError = &v -} - -// GetStandardInput returns the StandardInput field value if set, zero value otherwise. -func (o *V0037JobProperties) GetStandardInput() string { - if o == nil || IsNil(o.StandardInput) { - var ret string - return ret - } - return *o.StandardInput -} - -// GetStandardInputOk returns a tuple with the StandardInput field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetStandardInputOk() (*string, bool) { - if o == nil || IsNil(o.StandardInput) { - return nil, false - } - return o.StandardInput, true -} - -// HasStandardInput returns a boolean if a field has been set. -func (o *V0037JobProperties) HasStandardInput() bool { - if o != nil && !IsNil(o.StandardInput) { - return true - } - - return false -} - -// SetStandardInput gets a reference to the given string and assigns it to the StandardInput field. -func (o *V0037JobProperties) SetStandardInput(v string) { - o.StandardInput = &v -} - -// GetStandardOutput returns the StandardOutput field value if set, zero value otherwise. -func (o *V0037JobProperties) GetStandardOutput() string { - if o == nil || IsNil(o.StandardOutput) { - var ret string - return ret - } - return *o.StandardOutput -} - -// GetStandardOutputOk returns a tuple with the StandardOutput field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetStandardOutputOk() (*string, bool) { - if o == nil || IsNil(o.StandardOutput) { - return nil, false - } - return o.StandardOutput, true -} - -// HasStandardOutput returns a boolean if a field has been set. -func (o *V0037JobProperties) HasStandardOutput() bool { - if o != nil && !IsNil(o.StandardOutput) { - return true - } - - return false -} - -// SetStandardOutput gets a reference to the given string and assigns it to the StandardOutput field. -func (o *V0037JobProperties) SetStandardOutput(v string) { - o.StandardOutput = &v -} - -// GetTasks returns the Tasks field value if set, zero value otherwise. -func (o *V0037JobProperties) GetTasks() int32 { - if o == nil || IsNil(o.Tasks) { - var ret int32 - return ret - } - return *o.Tasks -} - -// GetTasksOk returns a tuple with the Tasks field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetTasksOk() (*int32, bool) { - if o == nil || IsNil(o.Tasks) { - return nil, false - } - return o.Tasks, true -} - -// HasTasks returns a boolean if a field has been set. -func (o *V0037JobProperties) HasTasks() bool { - if o != nil && !IsNil(o.Tasks) { - return true - } - - return false -} - -// SetTasks gets a reference to the given int32 and assigns it to the Tasks field. -func (o *V0037JobProperties) SetTasks(v int32) { - o.Tasks = &v -} - -// GetTasksPerCore returns the TasksPerCore field value if set, zero value otherwise. -func (o *V0037JobProperties) GetTasksPerCore() int32 { - if o == nil || IsNil(o.TasksPerCore) { - var ret int32 - return ret - } - return *o.TasksPerCore -} - -// GetTasksPerCoreOk returns a tuple with the TasksPerCore field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetTasksPerCoreOk() (*int32, bool) { - if o == nil || IsNil(o.TasksPerCore) { - return nil, false - } - return o.TasksPerCore, true -} - -// HasTasksPerCore returns a boolean if a field has been set. -func (o *V0037JobProperties) HasTasksPerCore() bool { - if o != nil && !IsNil(o.TasksPerCore) { - return true - } - - return false -} - -// SetTasksPerCore gets a reference to the given int32 and assigns it to the TasksPerCore field. -func (o *V0037JobProperties) SetTasksPerCore(v int32) { - o.TasksPerCore = &v -} - -// GetTasksPerNode returns the TasksPerNode field value if set, zero value otherwise. -func (o *V0037JobProperties) GetTasksPerNode() int32 { - if o == nil || IsNil(o.TasksPerNode) { - var ret int32 - return ret - } - return *o.TasksPerNode -} - -// GetTasksPerNodeOk returns a tuple with the TasksPerNode field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetTasksPerNodeOk() (*int32, bool) { - if o == nil || IsNil(o.TasksPerNode) { - return nil, false - } - return o.TasksPerNode, true -} - -// HasTasksPerNode returns a boolean if a field has been set. -func (o *V0037JobProperties) HasTasksPerNode() bool { - if o != nil && !IsNil(o.TasksPerNode) { - return true - } - - return false -} - -// SetTasksPerNode gets a reference to the given int32 and assigns it to the TasksPerNode field. -func (o *V0037JobProperties) SetTasksPerNode(v int32) { - o.TasksPerNode = &v -} - -// GetTasksPerSocket returns the TasksPerSocket field value if set, zero value otherwise. -func (o *V0037JobProperties) GetTasksPerSocket() int32 { - if o == nil || IsNil(o.TasksPerSocket) { - var ret int32 - return ret - } - return *o.TasksPerSocket -} - -// GetTasksPerSocketOk returns a tuple with the TasksPerSocket field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetTasksPerSocketOk() (*int32, bool) { - if o == nil || IsNil(o.TasksPerSocket) { - return nil, false - } - return o.TasksPerSocket, true -} - -// HasTasksPerSocket returns a boolean if a field has been set. -func (o *V0037JobProperties) HasTasksPerSocket() bool { - if o != nil && !IsNil(o.TasksPerSocket) { - return true - } - - return false -} - -// SetTasksPerSocket gets a reference to the given int32 and assigns it to the TasksPerSocket field. -func (o *V0037JobProperties) SetTasksPerSocket(v int32) { - o.TasksPerSocket = &v -} - -// GetThreadSpecification returns the ThreadSpecification field value if set, zero value otherwise. -func (o *V0037JobProperties) GetThreadSpecification() int32 { - if o == nil || IsNil(o.ThreadSpecification) { - var ret int32 - return ret - } - return *o.ThreadSpecification -} - -// GetThreadSpecificationOk returns a tuple with the ThreadSpecification field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetThreadSpecificationOk() (*int32, bool) { - if o == nil || IsNil(o.ThreadSpecification) { - return nil, false - } - return o.ThreadSpecification, true -} - -// HasThreadSpecification returns a boolean if a field has been set. -func (o *V0037JobProperties) HasThreadSpecification() bool { - if o != nil && !IsNil(o.ThreadSpecification) { - return true - } - - return false -} - -// SetThreadSpecification gets a reference to the given int32 and assigns it to the ThreadSpecification field. -func (o *V0037JobProperties) SetThreadSpecification(v int32) { - o.ThreadSpecification = &v -} - -// GetThreadsPerCore returns the ThreadsPerCore field value if set, zero value otherwise. -func (o *V0037JobProperties) GetThreadsPerCore() int32 { - if o == nil || IsNil(o.ThreadsPerCore) { - var ret int32 - return ret - } - return *o.ThreadsPerCore -} - -// GetThreadsPerCoreOk returns a tuple with the ThreadsPerCore field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetThreadsPerCoreOk() (*int32, bool) { - if o == nil || IsNil(o.ThreadsPerCore) { - return nil, false - } - return o.ThreadsPerCore, true -} - -// HasThreadsPerCore returns a boolean if a field has been set. -func (o *V0037JobProperties) HasThreadsPerCore() bool { - if o != nil && !IsNil(o.ThreadsPerCore) { - return true - } - - return false -} - -// SetThreadsPerCore gets a reference to the given int32 and assigns it to the ThreadsPerCore field. -func (o *V0037JobProperties) SetThreadsPerCore(v int32) { - o.ThreadsPerCore = &v -} - -// GetTimeLimit returns the TimeLimit field value if set, zero value otherwise. -func (o *V0037JobProperties) GetTimeLimit() int32 { - if o == nil || IsNil(o.TimeLimit) { - var ret int32 - return ret - } - return *o.TimeLimit -} - -// GetTimeLimitOk returns a tuple with the TimeLimit field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetTimeLimitOk() (*int32, bool) { - if o == nil || IsNil(o.TimeLimit) { - return nil, false - } - return o.TimeLimit, true -} - -// HasTimeLimit returns a boolean if a field has been set. -func (o *V0037JobProperties) HasTimeLimit() bool { - if o != nil && !IsNil(o.TimeLimit) { - return true - } - - return false -} - -// SetTimeLimit gets a reference to the given int32 and assigns it to the TimeLimit field. -func (o *V0037JobProperties) SetTimeLimit(v int32) { - o.TimeLimit = &v -} - -// GetTimeMinimum returns the TimeMinimum field value if set, zero value otherwise. -func (o *V0037JobProperties) GetTimeMinimum() int32 { - if o == nil || IsNil(o.TimeMinimum) { - var ret int32 - return ret - } - return *o.TimeMinimum -} - -// GetTimeMinimumOk returns a tuple with the TimeMinimum field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetTimeMinimumOk() (*int32, bool) { - if o == nil || IsNil(o.TimeMinimum) { - return nil, false - } - return o.TimeMinimum, true -} - -// HasTimeMinimum returns a boolean if a field has been set. -func (o *V0037JobProperties) HasTimeMinimum() bool { - if o != nil && !IsNil(o.TimeMinimum) { - return true - } - - return false -} - -// SetTimeMinimum gets a reference to the given int32 and assigns it to the TimeMinimum field. -func (o *V0037JobProperties) SetTimeMinimum(v int32) { - o.TimeMinimum = &v -} - -// GetWaitAllNodes returns the WaitAllNodes field value if set, zero value otherwise. -func (o *V0037JobProperties) GetWaitAllNodes() bool { - if o == nil || IsNil(o.WaitAllNodes) { - var ret bool - return ret - } - return *o.WaitAllNodes -} - -// GetWaitAllNodesOk returns a tuple with the WaitAllNodes field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetWaitAllNodesOk() (*bool, bool) { - if o == nil || IsNil(o.WaitAllNodes) { - return nil, false - } - return o.WaitAllNodes, true -} - -// HasWaitAllNodes returns a boolean if a field has been set. -func (o *V0037JobProperties) HasWaitAllNodes() bool { - if o != nil && !IsNil(o.WaitAllNodes) { - return true - } - - return false -} - -// SetWaitAllNodes gets a reference to the given bool and assigns it to the WaitAllNodes field. -func (o *V0037JobProperties) SetWaitAllNodes(v bool) { - o.WaitAllNodes = &v -} - -// GetWckey returns the Wckey field value if set, zero value otherwise. -func (o *V0037JobProperties) GetWckey() string { - if o == nil || IsNil(o.Wckey) { - var ret string - return ret - } - return *o.Wckey -} - -// GetWckeyOk returns a tuple with the Wckey field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobProperties) GetWckeyOk() (*string, bool) { - if o == nil || IsNil(o.Wckey) { - return nil, false - } - return o.Wckey, true -} - -// HasWckey returns a boolean if a field has been set. -func (o *V0037JobProperties) HasWckey() bool { - if o != nil && !IsNil(o.Wckey) { - return true - } - - return false -} - -// SetWckey gets a reference to the given string and assigns it to the Wckey field. -func (o *V0037JobProperties) SetWckey(v string) { - o.Wckey = &v -} - -func (o V0037JobProperties) MarshalJSON() ([]byte, error) { - toSerialize,err := o.ToMap() - if err != nil { - return []byte{}, err - } - return json.Marshal(toSerialize) -} - -func (o V0037JobProperties) ToMap() (map[string]interface{}, error) { - toSerialize := map[string]interface{}{} - if !IsNil(o.Account) { - toSerialize["account"] = o.Account - } - if !IsNil(o.AccountGatherFrequency) { - toSerialize["account_gather_frequency"] = o.AccountGatherFrequency - } - if !IsNil(o.Argv) { - toSerialize["argv"] = o.Argv - } - if !IsNil(o.Array) { - toSerialize["array"] = o.Array - } - if !IsNil(o.BatchFeatures) { - toSerialize["batch_features"] = o.BatchFeatures - } - if !IsNil(o.BeginTime) { - toSerialize["begin_time"] = o.BeginTime - } - if !IsNil(o.BurstBuffer) { - toSerialize["burst_buffer"] = o.BurstBuffer - } - if !IsNil(o.ClusterConstraint) { - toSerialize["cluster_constraint"] = o.ClusterConstraint - } - if !IsNil(o.Comment) { - toSerialize["comment"] = o.Comment - } - if !IsNil(o.Constraints) { - toSerialize["constraints"] = o.Constraints - } - if !IsNil(o.CoreSpecification) { - toSerialize["core_specification"] = o.CoreSpecification - } - if !IsNil(o.CoresPerSocket) { - toSerialize["cores_per_socket"] = o.CoresPerSocket - } - if !IsNil(o.CpuBinding) { - toSerialize["cpu_binding"] = o.CpuBinding - } - if !IsNil(o.CpuBindingHint) { - toSerialize["cpu_binding_hint"] = o.CpuBindingHint - } - if !IsNil(o.CpuFrequency) { - toSerialize["cpu_frequency"] = o.CpuFrequency - } - if !IsNil(o.CpusPerGpu) { - toSerialize["cpus_per_gpu"] = o.CpusPerGpu - } - if !IsNil(o.CpusPerTask) { - toSerialize["cpus_per_task"] = o.CpusPerTask - } - if !IsNil(o.CurrentWorkingDirectory) { - toSerialize["current_working_directory"] = o.CurrentWorkingDirectory - } - if !IsNil(o.Deadline) { - toSerialize["deadline"] = o.Deadline - } - if !IsNil(o.DelayBoot) { - toSerialize["delay_boot"] = o.DelayBoot - } - if !IsNil(o.Dependency) { - toSerialize["dependency"] = o.Dependency - } - if !IsNil(o.Distribution) { - toSerialize["distribution"] = o.Distribution - } - toSerialize["environment"] = o.Environment - if !IsNil(o.Exclusive) { - toSerialize["exclusive"] = o.Exclusive - } - if !IsNil(o.GetUserEnvironment) { - toSerialize["get_user_environment"] = o.GetUserEnvironment - } - if !IsNil(o.Gres) { - toSerialize["gres"] = o.Gres - } - if !IsNil(o.GresFlags) { - toSerialize["gres_flags"] = o.GresFlags - } - if !IsNil(o.GpuBinding) { - toSerialize["gpu_binding"] = o.GpuBinding - } - if !IsNil(o.GpuFrequency) { - toSerialize["gpu_frequency"] = o.GpuFrequency - } - if !IsNil(o.Gpus) { - toSerialize["gpus"] = o.Gpus - } - if !IsNil(o.GpusPerNode) { - toSerialize["gpus_per_node"] = o.GpusPerNode - } - if !IsNil(o.GpusPerSocket) { - toSerialize["gpus_per_socket"] = o.GpusPerSocket - } - if !IsNil(o.GpusPerTask) { - toSerialize["gpus_per_task"] = o.GpusPerTask - } - if !IsNil(o.Hold) { - toSerialize["hold"] = o.Hold - } - if !IsNil(o.KillOnInvalidDependency) { - toSerialize["kill_on_invalid_dependency"] = o.KillOnInvalidDependency - } - if !IsNil(o.Licenses) { - toSerialize["licenses"] = o.Licenses - } - if !IsNil(o.MailType) { - toSerialize["mail_type"] = o.MailType - } - if !IsNil(o.MailUser) { - toSerialize["mail_user"] = o.MailUser - } - if !IsNil(o.McsLabel) { - toSerialize["mcs_label"] = o.McsLabel - } - if !IsNil(o.MemoryBinding) { - toSerialize["memory_binding"] = o.MemoryBinding - } - if !IsNil(o.MemoryPerCpu) { - toSerialize["memory_per_cpu"] = o.MemoryPerCpu - } - if !IsNil(o.MemoryPerGpu) { - toSerialize["memory_per_gpu"] = o.MemoryPerGpu - } - if !IsNil(o.MemoryPerNode) { - toSerialize["memory_per_node"] = o.MemoryPerNode - } - if !IsNil(o.MinimumCpusPerNode) { - toSerialize["minimum_cpus_per_node"] = o.MinimumCpusPerNode - } - if !IsNil(o.MinimumNodes) { - toSerialize["minimum_nodes"] = o.MinimumNodes - } - if !IsNil(o.Name) { - toSerialize["name"] = o.Name - } - if !IsNil(o.Nice) { - toSerialize["nice"] = o.Nice - } - if !IsNil(o.NoKill) { - toSerialize["no_kill"] = o.NoKill - } - if !IsNil(o.Nodes) { - toSerialize["nodes"] = o.Nodes - } - if !IsNil(o.OpenMode) { - toSerialize["open_mode"] = o.OpenMode - } - if !IsNil(o.Partition) { - toSerialize["partition"] = o.Partition - } - if !IsNil(o.Priority) { - toSerialize["priority"] = o.Priority - } - if !IsNil(o.Qos) { - toSerialize["qos"] = o.Qos - } - if !IsNil(o.Requeue) { - toSerialize["requeue"] = o.Requeue - } - if !IsNil(o.Reservation) { - toSerialize["reservation"] = o.Reservation - } - if !IsNil(o.Signal) { - toSerialize["signal"] = o.Signal - } - if !IsNil(o.SocketsPerNode) { - toSerialize["sockets_per_node"] = o.SocketsPerNode - } - if !IsNil(o.SpreadJob) { - toSerialize["spread_job"] = o.SpreadJob - } - if !IsNil(o.StandardError) { - toSerialize["standard_error"] = o.StandardError - } - if !IsNil(o.StandardInput) { - toSerialize["standard_input"] = o.StandardInput - } - if !IsNil(o.StandardOutput) { - toSerialize["standard_output"] = o.StandardOutput - } - if !IsNil(o.Tasks) { - toSerialize["tasks"] = o.Tasks - } - if !IsNil(o.TasksPerCore) { - toSerialize["tasks_per_core"] = o.TasksPerCore - } - if !IsNil(o.TasksPerNode) { - toSerialize["tasks_per_node"] = o.TasksPerNode - } - if !IsNil(o.TasksPerSocket) { - toSerialize["tasks_per_socket"] = o.TasksPerSocket - } - if !IsNil(o.ThreadSpecification) { - toSerialize["thread_specification"] = o.ThreadSpecification - } - if !IsNil(o.ThreadsPerCore) { - toSerialize["threads_per_core"] = o.ThreadsPerCore - } - if !IsNil(o.TimeLimit) { - toSerialize["time_limit"] = o.TimeLimit - } - if !IsNil(o.TimeMinimum) { - toSerialize["time_minimum"] = o.TimeMinimum - } - if !IsNil(o.WaitAllNodes) { - toSerialize["wait_all_nodes"] = o.WaitAllNodes - } - if !IsNil(o.Wckey) { - toSerialize["wckey"] = o.Wckey - } - return toSerialize, nil -} - -type NullableV0037JobProperties struct { - value *V0037JobProperties - isSet bool -} - -func (v NullableV0037JobProperties) Get() *V0037JobProperties { - return v.value -} - -func (v *NullableV0037JobProperties) Set(val *V0037JobProperties) { - v.value = val - v.isSet = true -} - -func (v NullableV0037JobProperties) IsSet() bool { - return v.isSet -} - -func (v *NullableV0037JobProperties) Unset() { - v.value = nil - v.isSet = false -} - -func NewNullableV0037JobProperties(val *V0037JobProperties) *NullableV0037JobProperties { - return &NullableV0037JobProperties{value: val, isSet: true} -} - -func (v NullableV0037JobProperties) MarshalJSON() ([]byte, error) { - return json.Marshal(v.value) -} - -func (v *NullableV0037JobProperties) UnmarshalJSON(src []byte) error { - v.isSet = true - return json.Unmarshal(src, &v.value) -} - - diff --git a/internal/api/0.0.37/model_v0_0_37_job_resources.go b/internal/api/0.0.37/model_v0_0_37_job_resources.go deleted file mode 100644 index 88a0f74..0000000 --- a/internal/api/0.0.37/model_v0_0_37_job_resources.go +++ /dev/null @@ -1,239 +0,0 @@ -/* -Slurm Rest API - -API to access and control Slurm. - -API version: 0.0.37 -Contact: sales@schedmd.com -*/ - -// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. - -package openapi - -import ( - "encoding/json" -) - -// checks if the V0037JobResources type satisfies the MappedNullable interface at compile time -var _ MappedNullable = &V0037JobResources{} - -// V0037JobResources struct for V0037JobResources -type V0037JobResources struct { - // list of assigned job nodes - Nodes *string `json:"nodes,omitempty"` - // number of assigned job cpus - AllocatedCpus *int32 `json:"allocated_cpus,omitempty"` - // number of assigned job hosts - AllocatedHosts *int32 `json:"allocated_hosts,omitempty"` - // node allocations - AllocatedNodes []V0037NodeAllocation `json:"allocated_nodes,omitempty"` -} - -// NewV0037JobResources instantiates a new V0037JobResources object -// This constructor will assign default values to properties that have it defined, -// and makes sure properties required by API are set, but the set of arguments -// will change when the set of required properties is changed -func NewV0037JobResources() *V0037JobResources { - this := V0037JobResources{} - return &this -} - -// NewV0037JobResourcesWithDefaults instantiates a new V0037JobResources object -// This constructor will only assign default values to properties that have it defined, -// but it doesn't guarantee that properties required by API are set -func NewV0037JobResourcesWithDefaults() *V0037JobResources { - this := V0037JobResources{} - return &this -} - -// GetNodes returns the Nodes field value if set, zero value otherwise. -func (o *V0037JobResources) GetNodes() string { - if o == nil || IsNil(o.Nodes) { - var ret string - return ret - } - return *o.Nodes -} - -// GetNodesOk returns a tuple with the Nodes field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResources) GetNodesOk() (*string, bool) { - if o == nil || IsNil(o.Nodes) { - return nil, false - } - return o.Nodes, true -} - -// HasNodes returns a boolean if a field has been set. -func (o *V0037JobResources) HasNodes() bool { - if o != nil && !IsNil(o.Nodes) { - return true - } - - return false -} - -// SetNodes gets a reference to the given string and assigns it to the Nodes field. -func (o *V0037JobResources) SetNodes(v string) { - o.Nodes = &v -} - -// GetAllocatedCpus returns the AllocatedCpus field value if set, zero value otherwise. -func (o *V0037JobResources) GetAllocatedCpus() int32 { - if o == nil || IsNil(o.AllocatedCpus) { - var ret int32 - return ret - } - return *o.AllocatedCpus -} - -// GetAllocatedCpusOk returns a tuple with the AllocatedCpus field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResources) GetAllocatedCpusOk() (*int32, bool) { - if o == nil || IsNil(o.AllocatedCpus) { - return nil, false - } - return o.AllocatedCpus, true -} - -// HasAllocatedCpus returns a boolean if a field has been set. -func (o *V0037JobResources) HasAllocatedCpus() bool { - if o != nil && !IsNil(o.AllocatedCpus) { - return true - } - - return false -} - -// SetAllocatedCpus gets a reference to the given int32 and assigns it to the AllocatedCpus field. -func (o *V0037JobResources) SetAllocatedCpus(v int32) { - o.AllocatedCpus = &v -} - -// GetAllocatedHosts returns the AllocatedHosts field value if set, zero value otherwise. -func (o *V0037JobResources) GetAllocatedHosts() int32 { - if o == nil || IsNil(o.AllocatedHosts) { - var ret int32 - return ret - } - return *o.AllocatedHosts -} - -// GetAllocatedHostsOk returns a tuple with the AllocatedHosts field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResources) GetAllocatedHostsOk() (*int32, bool) { - if o == nil || IsNil(o.AllocatedHosts) { - return nil, false - } - return o.AllocatedHosts, true -} - -// HasAllocatedHosts returns a boolean if a field has been set. -func (o *V0037JobResources) HasAllocatedHosts() bool { - if o != nil && !IsNil(o.AllocatedHosts) { - return true - } - - return false -} - -// SetAllocatedHosts gets a reference to the given int32 and assigns it to the AllocatedHosts field. -func (o *V0037JobResources) SetAllocatedHosts(v int32) { - o.AllocatedHosts = &v -} - -// GetAllocatedNodes returns the AllocatedNodes field value if set, zero value otherwise. -func (o *V0037JobResources) GetAllocatedNodes() []V0037NodeAllocation { - if o == nil || IsNil(o.AllocatedNodes) { - var ret []V0037NodeAllocation - return ret - } - return o.AllocatedNodes -} - -// GetAllocatedNodesOk returns a tuple with the AllocatedNodes field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResources) GetAllocatedNodesOk() ([]V0037NodeAllocation, bool) { - if o == nil || IsNil(o.AllocatedNodes) { - return nil, false - } - return o.AllocatedNodes, true -} - -// HasAllocatedNodes returns a boolean if a field has been set. -func (o *V0037JobResources) HasAllocatedNodes() bool { - if o != nil && !IsNil(o.AllocatedNodes) { - return true - } - - return false -} - -// SetAllocatedNodes gets a reference to the given []V0037NodeAllocation and assigns it to the AllocatedNodes field. -func (o *V0037JobResources) SetAllocatedNodes(v []V0037NodeAllocation) { - o.AllocatedNodes = v -} - -func (o V0037JobResources) MarshalJSON() ([]byte, error) { - toSerialize,err := o.ToMap() - if err != nil { - return []byte{}, err - } - return json.Marshal(toSerialize) -} - -func (o V0037JobResources) ToMap() (map[string]interface{}, error) { - toSerialize := map[string]interface{}{} - if !IsNil(o.Nodes) { - toSerialize["nodes"] = o.Nodes - } - if !IsNil(o.AllocatedCpus) { - toSerialize["allocated_cpus"] = o.AllocatedCpus - } - if !IsNil(o.AllocatedHosts) { - toSerialize["allocated_hosts"] = o.AllocatedHosts - } - if !IsNil(o.AllocatedNodes) { - toSerialize["allocated_nodes"] = o.AllocatedNodes - } - return toSerialize, nil -} - -type NullableV0037JobResources struct { - value *V0037JobResources - isSet bool -} - -func (v NullableV0037JobResources) Get() *V0037JobResources { - return v.value -} - -func (v *NullableV0037JobResources) Set(val *V0037JobResources) { - v.value = val - v.isSet = true -} - -func (v NullableV0037JobResources) IsSet() bool { - return v.isSet -} - -func (v *NullableV0037JobResources) Unset() { - v.value = nil - v.isSet = false -} - -func NewNullableV0037JobResources(val *V0037JobResources) *NullableV0037JobResources { - return &NullableV0037JobResources{value: val, isSet: true} -} - -func (v NullableV0037JobResources) MarshalJSON() ([]byte, error) { - return json.Marshal(v.value) -} - -func (v *NullableV0037JobResources) UnmarshalJSON(src []byte) error { - v.isSet = true - return json.Unmarshal(src, &v.value) -} - - diff --git a/internal/api/0.0.37/model_v0_0_37_job_response_properties.go b/internal/api/0.0.37/model_v0_0_37_job_response_properties.go deleted file mode 100644 index 117fe15..0000000 --- a/internal/api/0.0.37/model_v0_0_37_job_response_properties.go +++ /dev/null @@ -1,4049 +0,0 @@ -/* -Slurm Rest API - -API to access and control Slurm. - -API version: 0.0.37 -Contact: sales@schedmd.com -*/ - -// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. - -package openapi - -import ( - "encoding/json" -) - -// checks if the V0037JobResponseProperties type satisfies the MappedNullable interface at compile time -var _ MappedNullable = &V0037JobResponseProperties{} - -// V0037JobResponseProperties struct for V0037JobResponseProperties -type V0037JobResponseProperties struct { - // Charge resources used by this job to specified account - Account *string `json:"account,omitempty"` - // time job is eligible for running - AccrueTime *int64 `json:"accrue_time,omitempty"` - // administrator's arbitrary comment - AdminComment *string `json:"admin_comment,omitempty"` - // job_id of a job array or 0 if N/A - ArrayJobId *string `json:"array_job_id,omitempty"` - // task_id of a job array - ArrayTaskId *string `json:"array_task_id,omitempty"` - // Maximum number of running array tasks - ArrayMaxTasks *string `json:"array_max_tasks,omitempty"` - // string expression of task IDs in this record - ArrayTaskString *string `json:"array_task_string,omitempty"` - // association id for job - AssociationId *string `json:"association_id,omitempty"` - // features required for batch script's node - BatchFeatures *string `json:"batch_features,omitempty"` - // if batch: queued job with script - BatchFlag *bool `json:"batch_flag,omitempty"` - // name of host running batch script - BatchHost *string `json:"batch_host,omitempty"` - // Job flags - Flags []string `json:"flags,omitempty"` - // burst buffer specifications - BurstBuffer *string `json:"burst_buffer,omitempty"` - // burst buffer state info - BurstBufferState *string `json:"burst_buffer_state,omitempty"` - // name of cluster that the job is on - Cluster *string `json:"cluster,omitempty"` - // comma separated list of required cluster features - ClusterFeatures *string `json:"cluster_features,omitempty"` - // command to be executed - Command *string `json:"command,omitempty"` - // arbitrary comment - Comment *string `json:"comment,omitempty"` - // job requires contiguous nodes - Contiguous *bool `json:"contiguous,omitempty"` - // specialized core count - CoreSpec *string `json:"core_spec,omitempty"` - // specialized thread count - ThreadSpec *string `json:"thread_spec,omitempty"` - // cores per socket required by job - CoresPerSocket *string `json:"cores_per_socket,omitempty"` - // billable TRES - BillableTres *string `json:"billable_tres,omitempty"` - // number of processors required for each task - CpusPerTask *string `json:"cpus_per_task,omitempty"` - // Minimum cpu frequency - CpuFrequencyMinimum *string `json:"cpu_frequency_minimum,omitempty"` - // Maximum cpu frequency - CpuFrequencyMaximum *string `json:"cpu_frequency_maximum,omitempty"` - // cpu frequency governor - CpuFrequencyGovernor *string `json:"cpu_frequency_governor,omitempty"` - // semicolon delimited list of TRES=# values - CpusPerTres *string `json:"cpus_per_tres,omitempty"` - // job start deadline - Deadline *string `json:"deadline,omitempty"` - // command to be executed - DelayBoot *string `json:"delay_boot,omitempty"` - // synchronize job execution with other jobs - Dependency *string `json:"dependency,omitempty"` - // highest exit code of all job steps - DerivedExitCode *string `json:"derived_exit_code,omitempty"` - // time job is eligible for running - EligibleTime *int64 `json:"eligible_time,omitempty"` - // time of termination, actual or expected - EndTime *int64 `json:"end_time,omitempty"` - // comma separated list of excluded nodes - ExcludedNodes *string `json:"excluded_nodes,omitempty"` - // exit code for job - ExitCode *int32 `json:"exit_code,omitempty"` - // comma separated list of required features - Features *string `json:"features,omitempty"` - // Origin cluster's name - FederationOrigin *string `json:"federation_origin,omitempty"` - // string of active sibling names - FederationSiblingsActive *string `json:"federation_siblings_active,omitempty"` - // string of viable sibling names - FederationSiblingsViable *string `json:"federation_siblings_viable,omitempty"` - // Job flags - GresDetail []string `json:"gres_detail,omitempty"` - // group job submitted as - GroupId *string `json:"group_id,omitempty"` - // job ID - JobId *string `json:"job_id,omitempty"` - JobResources *V0037JobResources `json:"job_resources,omitempty"` - // state of the job - JobState *string `json:"job_state,omitempty"` - // last time job was evaluated for scheduling - LastSchedEvaluation *string `json:"last_sched_evaluation,omitempty"` - // licenses required by the job - Licenses *string `json:"licenses,omitempty"` - // maximum number of cpus usable by job - MaxCpus *string `json:"max_cpus,omitempty"` - // maximum number of nodes usable by job - MaxNodes *string `json:"max_nodes,omitempty"` - // mcs_label if mcs plugin in use - McsLabel *string `json:"mcs_label,omitempty"` - // semicolon delimited list of TRES=# values - MemoryPerTres *string `json:"memory_per_tres,omitempty"` - // name of the job - Name *string `json:"name,omitempty"` - // list of nodes allocated to job - Nodes *string `json:"nodes,omitempty"` - // requested priority change - Nice *string `json:"nice,omitempty"` - // number of tasks to invoke on each core - TasksPerCore *string `json:"tasks_per_core,omitempty"` - // number of tasks to invoke on each socket - TasksPerSocket *string `json:"tasks_per_socket,omitempty"` - // number of tasks to invoke on each board - TasksPerBoard *string `json:"tasks_per_board,omitempty"` - // minimum number of cpus required by job - Cpus *string `json:"cpus,omitempty"` - // minimum number of nodes required by job - NodeCount *string `json:"node_count,omitempty"` - // requested task count - Tasks *string `json:"tasks,omitempty"` - // job ID of hetjob leader - HetJobId *string `json:"het_job_id,omitempty"` - // job IDs for all components - HetJobIdSet *string `json:"het_job_id_set,omitempty"` - // HetJob component offset from leader - HetJobOffset *string `json:"het_job_offset,omitempty"` - // name of assigned partition - Partition *string `json:"partition,omitempty"` - // minimum real memory per node - MemoryPerNode *string `json:"memory_per_node,omitempty"` - // minimum real memory per cpu - MemoryPerCpu *string `json:"memory_per_cpu,omitempty"` - // minimum # CPUs per node - MinimumCpusPerNode *string `json:"minimum_cpus_per_node,omitempty"` - // minimum tmp disk per node - MinimumTmpDiskPerNode *string `json:"minimum_tmp_disk_per_node,omitempty"` - // preemption signal time - PreemptTime *int64 `json:"preempt_time,omitempty"` - // time job ran prior to last suspend - PreSusTime *int64 `json:"pre_sus_time,omitempty"` - // relative priority of the job - Priority *string `json:"priority,omitempty"` - // Job profiling requested - Profile []string `json:"profile,omitempty"` - // Quality of Service - Qos *string `json:"qos,omitempty"` - // node reboot requested before start - Reboot *bool `json:"reboot,omitempty"` - // comma separated list of required nodes - RequiredNodes *string `json:"required_nodes,omitempty"` - // enable or disable job requeue option - Requeue *bool `json:"requeue,omitempty"` - // time of latest size change - ResizeTime *int64 `json:"resize_time,omitempty"` - // count of job restarts - RestartCnt *string `json:"restart_cnt,omitempty"` - // reservation name - ResvName *string `json:"resv_name,omitempty"` - // type and if job can share nodes with other jobs - Shared *string `json:"shared,omitempty"` - // details requested - ShowFlags []string `json:"show_flags,omitempty"` - // sockets per board required by job - SocketsPerBoard *string `json:"sockets_per_board,omitempty"` - // sockets per node required by job - SocketsPerNode *string `json:"sockets_per_node,omitempty"` - // time execution begins, actual or expected - StartTime *int64 `json:"start_time,omitempty"` - // optional details for state_reason - StateDescription *string `json:"state_description,omitempty"` - // reason job still pending or failed - StateReason *string `json:"state_reason,omitempty"` - // pathname of job's stderr file - StandardError *string `json:"standard_error,omitempty"` - // pathname of job's stdin file - StandardInput *string `json:"standard_input,omitempty"` - // pathname of job's stdout file - StandardOutput *string `json:"standard_output,omitempty"` - // time of job submission - SubmitTime *int64 `json:"submit_time,omitempty"` - // time job last suspended or resumed - SuspendTime *int64 `json:"suspend_time,omitempty"` - // slurmctld's arbitrary comment - SystemComment *string `json:"system_comment,omitempty"` - // maximum run time in minutes - TimeLimit *string `json:"time_limit,omitempty"` - // minimum run time in minutes - TimeMinimum *string `json:"time_minimum,omitempty"` - // threads per core required by job - ThreadsPerCore *string `json:"threads_per_core,omitempty"` - // Task to TRES binding directives - TresBind *string `json:"tres_bind,omitempty"` - // TRES frequency directives - TresFreq *string `json:"tres_freq,omitempty"` - // semicolon delimited list of TRES=# values - TresPerJob *string `json:"tres_per_job,omitempty"` - // semicolon delimited list of TRES=# values - TresPerNode *string `json:"tres_per_node,omitempty"` - // semicolon delimited list of TRES=# values - TresPerSocket *string `json:"tres_per_socket,omitempty"` - // semicolon delimited list of TRES=# values - TresPerTask *string `json:"tres_per_task,omitempty"` - // tres reqeusted in the job - TresReqStr *string `json:"tres_req_str,omitempty"` - // tres used in the job - TresAllocStr *string `json:"tres_alloc_str,omitempty"` - // user id the job runs as - UserId *string `json:"user_id,omitempty"` - // user the job runs as - UserName *string `json:"user_name,omitempty"` - // wckey for job - Wckey *string `json:"wckey,omitempty"` - // pathname of working directory - CurrentWorkingDirectory *string `json:"current_working_directory,omitempty"` -} - -// NewV0037JobResponseProperties instantiates a new V0037JobResponseProperties object -// This constructor will assign default values to properties that have it defined, -// and makes sure properties required by API are set, but the set of arguments -// will change when the set of required properties is changed -func NewV0037JobResponseProperties() *V0037JobResponseProperties { - this := V0037JobResponseProperties{} - return &this -} - -// NewV0037JobResponsePropertiesWithDefaults instantiates a new V0037JobResponseProperties object -// This constructor will only assign default values to properties that have it defined, -// but it doesn't guarantee that properties required by API are set -func NewV0037JobResponsePropertiesWithDefaults() *V0037JobResponseProperties { - this := V0037JobResponseProperties{} - return &this -} - -// GetAccount returns the Account field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetAccount() string { - if o == nil || IsNil(o.Account) { - var ret string - return ret - } - return *o.Account -} - -// GetAccountOk returns a tuple with the Account field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetAccountOk() (*string, bool) { - if o == nil || IsNil(o.Account) { - return nil, false - } - return o.Account, true -} - -// HasAccount returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasAccount() bool { - if o != nil && !IsNil(o.Account) { - return true - } - - return false -} - -// SetAccount gets a reference to the given string and assigns it to the Account field. -func (o *V0037JobResponseProperties) SetAccount(v string) { - o.Account = &v -} - -// GetAccrueTime returns the AccrueTime field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetAccrueTime() int64 { - if o == nil || IsNil(o.AccrueTime) { - var ret int64 - return ret - } - return *o.AccrueTime -} - -// GetAccrueTimeOk returns a tuple with the AccrueTime field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetAccrueTimeOk() (*int64, bool) { - if o == nil || IsNil(o.AccrueTime) { - return nil, false - } - return o.AccrueTime, true -} - -// HasAccrueTime returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasAccrueTime() bool { - if o != nil && !IsNil(o.AccrueTime) { - return true - } - - return false -} - -// SetAccrueTime gets a reference to the given int64 and assigns it to the AccrueTime field. -func (o *V0037JobResponseProperties) SetAccrueTime(v int64) { - o.AccrueTime = &v -} - -// GetAdminComment returns the AdminComment field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetAdminComment() string { - if o == nil || IsNil(o.AdminComment) { - var ret string - return ret - } - return *o.AdminComment -} - -// GetAdminCommentOk returns a tuple with the AdminComment field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetAdminCommentOk() (*string, bool) { - if o == nil || IsNil(o.AdminComment) { - return nil, false - } - return o.AdminComment, true -} - -// HasAdminComment returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasAdminComment() bool { - if o != nil && !IsNil(o.AdminComment) { - return true - } - - return false -} - -// SetAdminComment gets a reference to the given string and assigns it to the AdminComment field. -func (o *V0037JobResponseProperties) SetAdminComment(v string) { - o.AdminComment = &v -} - -// GetArrayJobId returns the ArrayJobId field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetArrayJobId() string { - if o == nil || IsNil(o.ArrayJobId) { - var ret string - return ret - } - return *o.ArrayJobId -} - -// GetArrayJobIdOk returns a tuple with the ArrayJobId field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetArrayJobIdOk() (*string, bool) { - if o == nil || IsNil(o.ArrayJobId) { - return nil, false - } - return o.ArrayJobId, true -} - -// HasArrayJobId returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasArrayJobId() bool { - if o != nil && !IsNil(o.ArrayJobId) { - return true - } - - return false -} - -// SetArrayJobId gets a reference to the given string and assigns it to the ArrayJobId field. -func (o *V0037JobResponseProperties) SetArrayJobId(v string) { - o.ArrayJobId = &v -} - -// GetArrayTaskId returns the ArrayTaskId field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetArrayTaskId() string { - if o == nil || IsNil(o.ArrayTaskId) { - var ret string - return ret - } - return *o.ArrayTaskId -} - -// GetArrayTaskIdOk returns a tuple with the ArrayTaskId field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetArrayTaskIdOk() (*string, bool) { - if o == nil || IsNil(o.ArrayTaskId) { - return nil, false - } - return o.ArrayTaskId, true -} - -// HasArrayTaskId returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasArrayTaskId() bool { - if o != nil && !IsNil(o.ArrayTaskId) { - return true - } - - return false -} - -// SetArrayTaskId gets a reference to the given string and assigns it to the ArrayTaskId field. -func (o *V0037JobResponseProperties) SetArrayTaskId(v string) { - o.ArrayTaskId = &v -} - -// GetArrayMaxTasks returns the ArrayMaxTasks field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetArrayMaxTasks() string { - if o == nil || IsNil(o.ArrayMaxTasks) { - var ret string - return ret - } - return *o.ArrayMaxTasks -} - -// GetArrayMaxTasksOk returns a tuple with the ArrayMaxTasks field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetArrayMaxTasksOk() (*string, bool) { - if o == nil || IsNil(o.ArrayMaxTasks) { - return nil, false - } - return o.ArrayMaxTasks, true -} - -// HasArrayMaxTasks returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasArrayMaxTasks() bool { - if o != nil && !IsNil(o.ArrayMaxTasks) { - return true - } - - return false -} - -// SetArrayMaxTasks gets a reference to the given string and assigns it to the ArrayMaxTasks field. -func (o *V0037JobResponseProperties) SetArrayMaxTasks(v string) { - o.ArrayMaxTasks = &v -} - -// GetArrayTaskString returns the ArrayTaskString field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetArrayTaskString() string { - if o == nil || IsNil(o.ArrayTaskString) { - var ret string - return ret - } - return *o.ArrayTaskString -} - -// GetArrayTaskStringOk returns a tuple with the ArrayTaskString field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetArrayTaskStringOk() (*string, bool) { - if o == nil || IsNil(o.ArrayTaskString) { - return nil, false - } - return o.ArrayTaskString, true -} - -// HasArrayTaskString returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasArrayTaskString() bool { - if o != nil && !IsNil(o.ArrayTaskString) { - return true - } - - return false -} - -// SetArrayTaskString gets a reference to the given string and assigns it to the ArrayTaskString field. -func (o *V0037JobResponseProperties) SetArrayTaskString(v string) { - o.ArrayTaskString = &v -} - -// GetAssociationId returns the AssociationId field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetAssociationId() string { - if o == nil || IsNil(o.AssociationId) { - var ret string - return ret - } - return *o.AssociationId -} - -// GetAssociationIdOk returns a tuple with the AssociationId field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetAssociationIdOk() (*string, bool) { - if o == nil || IsNil(o.AssociationId) { - return nil, false - } - return o.AssociationId, true -} - -// HasAssociationId returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasAssociationId() bool { - if o != nil && !IsNil(o.AssociationId) { - return true - } - - return false -} - -// SetAssociationId gets a reference to the given string and assigns it to the AssociationId field. -func (o *V0037JobResponseProperties) SetAssociationId(v string) { - o.AssociationId = &v -} - -// GetBatchFeatures returns the BatchFeatures field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetBatchFeatures() string { - if o == nil || IsNil(o.BatchFeatures) { - var ret string - return ret - } - return *o.BatchFeatures -} - -// GetBatchFeaturesOk returns a tuple with the BatchFeatures field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetBatchFeaturesOk() (*string, bool) { - if o == nil || IsNil(o.BatchFeatures) { - return nil, false - } - return o.BatchFeatures, true -} - -// HasBatchFeatures returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasBatchFeatures() bool { - if o != nil && !IsNil(o.BatchFeatures) { - return true - } - - return false -} - -// SetBatchFeatures gets a reference to the given string and assigns it to the BatchFeatures field. -func (o *V0037JobResponseProperties) SetBatchFeatures(v string) { - o.BatchFeatures = &v -} - -// GetBatchFlag returns the BatchFlag field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetBatchFlag() bool { - if o == nil || IsNil(o.BatchFlag) { - var ret bool - return ret - } - return *o.BatchFlag -} - -// GetBatchFlagOk returns a tuple with the BatchFlag field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetBatchFlagOk() (*bool, bool) { - if o == nil || IsNil(o.BatchFlag) { - return nil, false - } - return o.BatchFlag, true -} - -// HasBatchFlag returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasBatchFlag() bool { - if o != nil && !IsNil(o.BatchFlag) { - return true - } - - return false -} - -// SetBatchFlag gets a reference to the given bool and assigns it to the BatchFlag field. -func (o *V0037JobResponseProperties) SetBatchFlag(v bool) { - o.BatchFlag = &v -} - -// GetBatchHost returns the BatchHost field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetBatchHost() string { - if o == nil || IsNil(o.BatchHost) { - var ret string - return ret - } - return *o.BatchHost -} - -// GetBatchHostOk returns a tuple with the BatchHost field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetBatchHostOk() (*string, bool) { - if o == nil || IsNil(o.BatchHost) { - return nil, false - } - return o.BatchHost, true -} - -// HasBatchHost returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasBatchHost() bool { - if o != nil && !IsNil(o.BatchHost) { - return true - } - - return false -} - -// SetBatchHost gets a reference to the given string and assigns it to the BatchHost field. -func (o *V0037JobResponseProperties) SetBatchHost(v string) { - o.BatchHost = &v -} - -// GetFlags returns the Flags field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetFlags() []string { - if o == nil || IsNil(o.Flags) { - var ret []string - return ret - } - return o.Flags -} - -// GetFlagsOk returns a tuple with the Flags field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetFlagsOk() ([]string, bool) { - if o == nil || IsNil(o.Flags) { - return nil, false - } - return o.Flags, true -} - -// HasFlags returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasFlags() bool { - if o != nil && !IsNil(o.Flags) { - return true - } - - return false -} - -// SetFlags gets a reference to the given []string and assigns it to the Flags field. -func (o *V0037JobResponseProperties) SetFlags(v []string) { - o.Flags = v -} - -// GetBurstBuffer returns the BurstBuffer field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetBurstBuffer() string { - if o == nil || IsNil(o.BurstBuffer) { - var ret string - return ret - } - return *o.BurstBuffer -} - -// GetBurstBufferOk returns a tuple with the BurstBuffer field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetBurstBufferOk() (*string, bool) { - if o == nil || IsNil(o.BurstBuffer) { - return nil, false - } - return o.BurstBuffer, true -} - -// HasBurstBuffer returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasBurstBuffer() bool { - if o != nil && !IsNil(o.BurstBuffer) { - return true - } - - return false -} - -// SetBurstBuffer gets a reference to the given string and assigns it to the BurstBuffer field. -func (o *V0037JobResponseProperties) SetBurstBuffer(v string) { - o.BurstBuffer = &v -} - -// GetBurstBufferState returns the BurstBufferState field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetBurstBufferState() string { - if o == nil || IsNil(o.BurstBufferState) { - var ret string - return ret - } - return *o.BurstBufferState -} - -// GetBurstBufferStateOk returns a tuple with the BurstBufferState field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetBurstBufferStateOk() (*string, bool) { - if o == nil || IsNil(o.BurstBufferState) { - return nil, false - } - return o.BurstBufferState, true -} - -// HasBurstBufferState returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasBurstBufferState() bool { - if o != nil && !IsNil(o.BurstBufferState) { - return true - } - - return false -} - -// SetBurstBufferState gets a reference to the given string and assigns it to the BurstBufferState field. -func (o *V0037JobResponseProperties) SetBurstBufferState(v string) { - o.BurstBufferState = &v -} - -// GetCluster returns the Cluster field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetCluster() string { - if o == nil || IsNil(o.Cluster) { - var ret string - return ret - } - return *o.Cluster -} - -// GetClusterOk returns a tuple with the Cluster field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetClusterOk() (*string, bool) { - if o == nil || IsNil(o.Cluster) { - return nil, false - } - return o.Cluster, true -} - -// HasCluster returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasCluster() bool { - if o != nil && !IsNil(o.Cluster) { - return true - } - - return false -} - -// SetCluster gets a reference to the given string and assigns it to the Cluster field. -func (o *V0037JobResponseProperties) SetCluster(v string) { - o.Cluster = &v -} - -// GetClusterFeatures returns the ClusterFeatures field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetClusterFeatures() string { - if o == nil || IsNil(o.ClusterFeatures) { - var ret string - return ret - } - return *o.ClusterFeatures -} - -// GetClusterFeaturesOk returns a tuple with the ClusterFeatures field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetClusterFeaturesOk() (*string, bool) { - if o == nil || IsNil(o.ClusterFeatures) { - return nil, false - } - return o.ClusterFeatures, true -} - -// HasClusterFeatures returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasClusterFeatures() bool { - if o != nil && !IsNil(o.ClusterFeatures) { - return true - } - - return false -} - -// SetClusterFeatures gets a reference to the given string and assigns it to the ClusterFeatures field. -func (o *V0037JobResponseProperties) SetClusterFeatures(v string) { - o.ClusterFeatures = &v -} - -// GetCommand returns the Command field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetCommand() string { - if o == nil || IsNil(o.Command) { - var ret string - return ret - } - return *o.Command -} - -// GetCommandOk returns a tuple with the Command field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetCommandOk() (*string, bool) { - if o == nil || IsNil(o.Command) { - return nil, false - } - return o.Command, true -} - -// HasCommand returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasCommand() bool { - if o != nil && !IsNil(o.Command) { - return true - } - - return false -} - -// SetCommand gets a reference to the given string and assigns it to the Command field. -func (o *V0037JobResponseProperties) SetCommand(v string) { - o.Command = &v -} - -// GetComment returns the Comment field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetComment() string { - if o == nil || IsNil(o.Comment) { - var ret string - return ret - } - return *o.Comment -} - -// GetCommentOk returns a tuple with the Comment field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetCommentOk() (*string, bool) { - if o == nil || IsNil(o.Comment) { - return nil, false - } - return o.Comment, true -} - -// HasComment returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasComment() bool { - if o != nil && !IsNil(o.Comment) { - return true - } - - return false -} - -// SetComment gets a reference to the given string and assigns it to the Comment field. -func (o *V0037JobResponseProperties) SetComment(v string) { - o.Comment = &v -} - -// GetContiguous returns the Contiguous field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetContiguous() bool { - if o == nil || IsNil(o.Contiguous) { - var ret bool - return ret - } - return *o.Contiguous -} - -// GetContiguousOk returns a tuple with the Contiguous field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetContiguousOk() (*bool, bool) { - if o == nil || IsNil(o.Contiguous) { - return nil, false - } - return o.Contiguous, true -} - -// HasContiguous returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasContiguous() bool { - if o != nil && !IsNil(o.Contiguous) { - return true - } - - return false -} - -// SetContiguous gets a reference to the given bool and assigns it to the Contiguous field. -func (o *V0037JobResponseProperties) SetContiguous(v bool) { - o.Contiguous = &v -} - -// GetCoreSpec returns the CoreSpec field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetCoreSpec() string { - if o == nil || IsNil(o.CoreSpec) { - var ret string - return ret - } - return *o.CoreSpec -} - -// GetCoreSpecOk returns a tuple with the CoreSpec field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetCoreSpecOk() (*string, bool) { - if o == nil || IsNil(o.CoreSpec) { - return nil, false - } - return o.CoreSpec, true -} - -// HasCoreSpec returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasCoreSpec() bool { - if o != nil && !IsNil(o.CoreSpec) { - return true - } - - return false -} - -// SetCoreSpec gets a reference to the given string and assigns it to the CoreSpec field. -func (o *V0037JobResponseProperties) SetCoreSpec(v string) { - o.CoreSpec = &v -} - -// GetThreadSpec returns the ThreadSpec field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetThreadSpec() string { - if o == nil || IsNil(o.ThreadSpec) { - var ret string - return ret - } - return *o.ThreadSpec -} - -// GetThreadSpecOk returns a tuple with the ThreadSpec field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetThreadSpecOk() (*string, bool) { - if o == nil || IsNil(o.ThreadSpec) { - return nil, false - } - return o.ThreadSpec, true -} - -// HasThreadSpec returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasThreadSpec() bool { - if o != nil && !IsNil(o.ThreadSpec) { - return true - } - - return false -} - -// SetThreadSpec gets a reference to the given string and assigns it to the ThreadSpec field. -func (o *V0037JobResponseProperties) SetThreadSpec(v string) { - o.ThreadSpec = &v -} - -// GetCoresPerSocket returns the CoresPerSocket field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetCoresPerSocket() string { - if o == nil || IsNil(o.CoresPerSocket) { - var ret string - return ret - } - return *o.CoresPerSocket -} - -// GetCoresPerSocketOk returns a tuple with the CoresPerSocket field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetCoresPerSocketOk() (*string, bool) { - if o == nil || IsNil(o.CoresPerSocket) { - return nil, false - } - return o.CoresPerSocket, true -} - -// HasCoresPerSocket returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasCoresPerSocket() bool { - if o != nil && !IsNil(o.CoresPerSocket) { - return true - } - - return false -} - -// SetCoresPerSocket gets a reference to the given string and assigns it to the CoresPerSocket field. -func (o *V0037JobResponseProperties) SetCoresPerSocket(v string) { - o.CoresPerSocket = &v -} - -// GetBillableTres returns the BillableTres field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetBillableTres() string { - if o == nil || IsNil(o.BillableTres) { - var ret string - return ret - } - return *o.BillableTres -} - -// GetBillableTresOk returns a tuple with the BillableTres field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetBillableTresOk() (*string, bool) { - if o == nil || IsNil(o.BillableTres) { - return nil, false - } - return o.BillableTres, true -} - -// HasBillableTres returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasBillableTres() bool { - if o != nil && !IsNil(o.BillableTres) { - return true - } - - return false -} - -// SetBillableTres gets a reference to the given string and assigns it to the BillableTres field. -func (o *V0037JobResponseProperties) SetBillableTres(v string) { - o.BillableTres = &v -} - -// GetCpusPerTask returns the CpusPerTask field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetCpusPerTask() string { - if o == nil || IsNil(o.CpusPerTask) { - var ret string - return ret - } - return *o.CpusPerTask -} - -// GetCpusPerTaskOk returns a tuple with the CpusPerTask field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetCpusPerTaskOk() (*string, bool) { - if o == nil || IsNil(o.CpusPerTask) { - return nil, false - } - return o.CpusPerTask, true -} - -// HasCpusPerTask returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasCpusPerTask() bool { - if o != nil && !IsNil(o.CpusPerTask) { - return true - } - - return false -} - -// SetCpusPerTask gets a reference to the given string and assigns it to the CpusPerTask field. -func (o *V0037JobResponseProperties) SetCpusPerTask(v string) { - o.CpusPerTask = &v -} - -// GetCpuFrequencyMinimum returns the CpuFrequencyMinimum field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetCpuFrequencyMinimum() string { - if o == nil || IsNil(o.CpuFrequencyMinimum) { - var ret string - return ret - } - return *o.CpuFrequencyMinimum -} - -// GetCpuFrequencyMinimumOk returns a tuple with the CpuFrequencyMinimum field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetCpuFrequencyMinimumOk() (*string, bool) { - if o == nil || IsNil(o.CpuFrequencyMinimum) { - return nil, false - } - return o.CpuFrequencyMinimum, true -} - -// HasCpuFrequencyMinimum returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasCpuFrequencyMinimum() bool { - if o != nil && !IsNil(o.CpuFrequencyMinimum) { - return true - } - - return false -} - -// SetCpuFrequencyMinimum gets a reference to the given string and assigns it to the CpuFrequencyMinimum field. -func (o *V0037JobResponseProperties) SetCpuFrequencyMinimum(v string) { - o.CpuFrequencyMinimum = &v -} - -// GetCpuFrequencyMaximum returns the CpuFrequencyMaximum field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetCpuFrequencyMaximum() string { - if o == nil || IsNil(o.CpuFrequencyMaximum) { - var ret string - return ret - } - return *o.CpuFrequencyMaximum -} - -// GetCpuFrequencyMaximumOk returns a tuple with the CpuFrequencyMaximum field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetCpuFrequencyMaximumOk() (*string, bool) { - if o == nil || IsNil(o.CpuFrequencyMaximum) { - return nil, false - } - return o.CpuFrequencyMaximum, true -} - -// HasCpuFrequencyMaximum returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasCpuFrequencyMaximum() bool { - if o != nil && !IsNil(o.CpuFrequencyMaximum) { - return true - } - - return false -} - -// SetCpuFrequencyMaximum gets a reference to the given string and assigns it to the CpuFrequencyMaximum field. -func (o *V0037JobResponseProperties) SetCpuFrequencyMaximum(v string) { - o.CpuFrequencyMaximum = &v -} - -// GetCpuFrequencyGovernor returns the CpuFrequencyGovernor field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetCpuFrequencyGovernor() string { - if o == nil || IsNil(o.CpuFrequencyGovernor) { - var ret string - return ret - } - return *o.CpuFrequencyGovernor -} - -// GetCpuFrequencyGovernorOk returns a tuple with the CpuFrequencyGovernor field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetCpuFrequencyGovernorOk() (*string, bool) { - if o == nil || IsNil(o.CpuFrequencyGovernor) { - return nil, false - } - return o.CpuFrequencyGovernor, true -} - -// HasCpuFrequencyGovernor returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasCpuFrequencyGovernor() bool { - if o != nil && !IsNil(o.CpuFrequencyGovernor) { - return true - } - - return false -} - -// SetCpuFrequencyGovernor gets a reference to the given string and assigns it to the CpuFrequencyGovernor field. -func (o *V0037JobResponseProperties) SetCpuFrequencyGovernor(v string) { - o.CpuFrequencyGovernor = &v -} - -// GetCpusPerTres returns the CpusPerTres field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetCpusPerTres() string { - if o == nil || IsNil(o.CpusPerTres) { - var ret string - return ret - } - return *o.CpusPerTres -} - -// GetCpusPerTresOk returns a tuple with the CpusPerTres field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetCpusPerTresOk() (*string, bool) { - if o == nil || IsNil(o.CpusPerTres) { - return nil, false - } - return o.CpusPerTres, true -} - -// HasCpusPerTres returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasCpusPerTres() bool { - if o != nil && !IsNil(o.CpusPerTres) { - return true - } - - return false -} - -// SetCpusPerTres gets a reference to the given string and assigns it to the CpusPerTres field. -func (o *V0037JobResponseProperties) SetCpusPerTres(v string) { - o.CpusPerTres = &v -} - -// GetDeadline returns the Deadline field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetDeadline() string { - if o == nil || IsNil(o.Deadline) { - var ret string - return ret - } - return *o.Deadline -} - -// GetDeadlineOk returns a tuple with the Deadline field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetDeadlineOk() (*string, bool) { - if o == nil || IsNil(o.Deadline) { - return nil, false - } - return o.Deadline, true -} - -// HasDeadline returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasDeadline() bool { - if o != nil && !IsNil(o.Deadline) { - return true - } - - return false -} - -// SetDeadline gets a reference to the given string and assigns it to the Deadline field. -func (o *V0037JobResponseProperties) SetDeadline(v string) { - o.Deadline = &v -} - -// GetDelayBoot returns the DelayBoot field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetDelayBoot() string { - if o == nil || IsNil(o.DelayBoot) { - var ret string - return ret - } - return *o.DelayBoot -} - -// GetDelayBootOk returns a tuple with the DelayBoot field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetDelayBootOk() (*string, bool) { - if o == nil || IsNil(o.DelayBoot) { - return nil, false - } - return o.DelayBoot, true -} - -// HasDelayBoot returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasDelayBoot() bool { - if o != nil && !IsNil(o.DelayBoot) { - return true - } - - return false -} - -// SetDelayBoot gets a reference to the given string and assigns it to the DelayBoot field. -func (o *V0037JobResponseProperties) SetDelayBoot(v string) { - o.DelayBoot = &v -} - -// GetDependency returns the Dependency field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetDependency() string { - if o == nil || IsNil(o.Dependency) { - var ret string - return ret - } - return *o.Dependency -} - -// GetDependencyOk returns a tuple with the Dependency field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetDependencyOk() (*string, bool) { - if o == nil || IsNil(o.Dependency) { - return nil, false - } - return o.Dependency, true -} - -// HasDependency returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasDependency() bool { - if o != nil && !IsNil(o.Dependency) { - return true - } - - return false -} - -// SetDependency gets a reference to the given string and assigns it to the Dependency field. -func (o *V0037JobResponseProperties) SetDependency(v string) { - o.Dependency = &v -} - -// GetDerivedExitCode returns the DerivedExitCode field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetDerivedExitCode() string { - if o == nil || IsNil(o.DerivedExitCode) { - var ret string - return ret - } - return *o.DerivedExitCode -} - -// GetDerivedExitCodeOk returns a tuple with the DerivedExitCode field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetDerivedExitCodeOk() (*string, bool) { - if o == nil || IsNil(o.DerivedExitCode) { - return nil, false - } - return o.DerivedExitCode, true -} - -// HasDerivedExitCode returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasDerivedExitCode() bool { - if o != nil && !IsNil(o.DerivedExitCode) { - return true - } - - return false -} - -// SetDerivedExitCode gets a reference to the given string and assigns it to the DerivedExitCode field. -func (o *V0037JobResponseProperties) SetDerivedExitCode(v string) { - o.DerivedExitCode = &v -} - -// GetEligibleTime returns the EligibleTime field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetEligibleTime() int64 { - if o == nil || IsNil(o.EligibleTime) { - var ret int64 - return ret - } - return *o.EligibleTime -} - -// GetEligibleTimeOk returns a tuple with the EligibleTime field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetEligibleTimeOk() (*int64, bool) { - if o == nil || IsNil(o.EligibleTime) { - return nil, false - } - return o.EligibleTime, true -} - -// HasEligibleTime returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasEligibleTime() bool { - if o != nil && !IsNil(o.EligibleTime) { - return true - } - - return false -} - -// SetEligibleTime gets a reference to the given int64 and assigns it to the EligibleTime field. -func (o *V0037JobResponseProperties) SetEligibleTime(v int64) { - o.EligibleTime = &v -} - -// GetEndTime returns the EndTime field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetEndTime() int64 { - if o == nil || IsNil(o.EndTime) { - var ret int64 - return ret - } - return *o.EndTime -} - -// GetEndTimeOk returns a tuple with the EndTime field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetEndTimeOk() (*int64, bool) { - if o == nil || IsNil(o.EndTime) { - return nil, false - } - return o.EndTime, true -} - -// HasEndTime returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasEndTime() bool { - if o != nil && !IsNil(o.EndTime) { - return true - } - - return false -} - -// SetEndTime gets a reference to the given int64 and assigns it to the EndTime field. -func (o *V0037JobResponseProperties) SetEndTime(v int64) { - o.EndTime = &v -} - -// GetExcludedNodes returns the ExcludedNodes field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetExcludedNodes() string { - if o == nil || IsNil(o.ExcludedNodes) { - var ret string - return ret - } - return *o.ExcludedNodes -} - -// GetExcludedNodesOk returns a tuple with the ExcludedNodes field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetExcludedNodesOk() (*string, bool) { - if o == nil || IsNil(o.ExcludedNodes) { - return nil, false - } - return o.ExcludedNodes, true -} - -// HasExcludedNodes returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasExcludedNodes() bool { - if o != nil && !IsNil(o.ExcludedNodes) { - return true - } - - return false -} - -// SetExcludedNodes gets a reference to the given string and assigns it to the ExcludedNodes field. -func (o *V0037JobResponseProperties) SetExcludedNodes(v string) { - o.ExcludedNodes = &v -} - -// GetExitCode returns the ExitCode field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetExitCode() int32 { - if o == nil || IsNil(o.ExitCode) { - var ret int32 - return ret - } - return *o.ExitCode -} - -// GetExitCodeOk returns a tuple with the ExitCode field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetExitCodeOk() (*int32, bool) { - if o == nil || IsNil(o.ExitCode) { - return nil, false - } - return o.ExitCode, true -} - -// HasExitCode returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasExitCode() bool { - if o != nil && !IsNil(o.ExitCode) { - return true - } - - return false -} - -// SetExitCode gets a reference to the given int32 and assigns it to the ExitCode field. -func (o *V0037JobResponseProperties) SetExitCode(v int32) { - o.ExitCode = &v -} - -// GetFeatures returns the Features field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetFeatures() string { - if o == nil || IsNil(o.Features) { - var ret string - return ret - } - return *o.Features -} - -// GetFeaturesOk returns a tuple with the Features field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetFeaturesOk() (*string, bool) { - if o == nil || IsNil(o.Features) { - return nil, false - } - return o.Features, true -} - -// HasFeatures returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasFeatures() bool { - if o != nil && !IsNil(o.Features) { - return true - } - - return false -} - -// SetFeatures gets a reference to the given string and assigns it to the Features field. -func (o *V0037JobResponseProperties) SetFeatures(v string) { - o.Features = &v -} - -// GetFederationOrigin returns the FederationOrigin field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetFederationOrigin() string { - if o == nil || IsNil(o.FederationOrigin) { - var ret string - return ret - } - return *o.FederationOrigin -} - -// GetFederationOriginOk returns a tuple with the FederationOrigin field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetFederationOriginOk() (*string, bool) { - if o == nil || IsNil(o.FederationOrigin) { - return nil, false - } - return o.FederationOrigin, true -} - -// HasFederationOrigin returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasFederationOrigin() bool { - if o != nil && !IsNil(o.FederationOrigin) { - return true - } - - return false -} - -// SetFederationOrigin gets a reference to the given string and assigns it to the FederationOrigin field. -func (o *V0037JobResponseProperties) SetFederationOrigin(v string) { - o.FederationOrigin = &v -} - -// GetFederationSiblingsActive returns the FederationSiblingsActive field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetFederationSiblingsActive() string { - if o == nil || IsNil(o.FederationSiblingsActive) { - var ret string - return ret - } - return *o.FederationSiblingsActive -} - -// GetFederationSiblingsActiveOk returns a tuple with the FederationSiblingsActive field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetFederationSiblingsActiveOk() (*string, bool) { - if o == nil || IsNil(o.FederationSiblingsActive) { - return nil, false - } - return o.FederationSiblingsActive, true -} - -// HasFederationSiblingsActive returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasFederationSiblingsActive() bool { - if o != nil && !IsNil(o.FederationSiblingsActive) { - return true - } - - return false -} - -// SetFederationSiblingsActive gets a reference to the given string and assigns it to the FederationSiblingsActive field. -func (o *V0037JobResponseProperties) SetFederationSiblingsActive(v string) { - o.FederationSiblingsActive = &v -} - -// GetFederationSiblingsViable returns the FederationSiblingsViable field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetFederationSiblingsViable() string { - if o == nil || IsNil(o.FederationSiblingsViable) { - var ret string - return ret - } - return *o.FederationSiblingsViable -} - -// GetFederationSiblingsViableOk returns a tuple with the FederationSiblingsViable field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetFederationSiblingsViableOk() (*string, bool) { - if o == nil || IsNil(o.FederationSiblingsViable) { - return nil, false - } - return o.FederationSiblingsViable, true -} - -// HasFederationSiblingsViable returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasFederationSiblingsViable() bool { - if o != nil && !IsNil(o.FederationSiblingsViable) { - return true - } - - return false -} - -// SetFederationSiblingsViable gets a reference to the given string and assigns it to the FederationSiblingsViable field. -func (o *V0037JobResponseProperties) SetFederationSiblingsViable(v string) { - o.FederationSiblingsViable = &v -} - -// GetGresDetail returns the GresDetail field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetGresDetail() []string { - if o == nil || IsNil(o.GresDetail) { - var ret []string - return ret - } - return o.GresDetail -} - -// GetGresDetailOk returns a tuple with the GresDetail field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetGresDetailOk() ([]string, bool) { - if o == nil || IsNil(o.GresDetail) { - return nil, false - } - return o.GresDetail, true -} - -// HasGresDetail returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasGresDetail() bool { - if o != nil && !IsNil(o.GresDetail) { - return true - } - - return false -} - -// SetGresDetail gets a reference to the given []string and assigns it to the GresDetail field. -func (o *V0037JobResponseProperties) SetGresDetail(v []string) { - o.GresDetail = v -} - -// GetGroupId returns the GroupId field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetGroupId() string { - if o == nil || IsNil(o.GroupId) { - var ret string - return ret - } - return *o.GroupId -} - -// GetGroupIdOk returns a tuple with the GroupId field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetGroupIdOk() (*string, bool) { - if o == nil || IsNil(o.GroupId) { - return nil, false - } - return o.GroupId, true -} - -// HasGroupId returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasGroupId() bool { - if o != nil && !IsNil(o.GroupId) { - return true - } - - return false -} - -// SetGroupId gets a reference to the given string and assigns it to the GroupId field. -func (o *V0037JobResponseProperties) SetGroupId(v string) { - o.GroupId = &v -} - -// GetJobId returns the JobId field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetJobId() string { - if o == nil || IsNil(o.JobId) { - var ret string - return ret - } - return *o.JobId -} - -// GetJobIdOk returns a tuple with the JobId field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetJobIdOk() (*string, bool) { - if o == nil || IsNil(o.JobId) { - return nil, false - } - return o.JobId, true -} - -// HasJobId returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasJobId() bool { - if o != nil && !IsNil(o.JobId) { - return true - } - - return false -} - -// SetJobId gets a reference to the given string and assigns it to the JobId field. -func (o *V0037JobResponseProperties) SetJobId(v string) { - o.JobId = &v -} - -// GetJobResources returns the JobResources field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetJobResources() V0037JobResources { - if o == nil || IsNil(o.JobResources) { - var ret V0037JobResources - return ret - } - return *o.JobResources -} - -// GetJobResourcesOk returns a tuple with the JobResources field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetJobResourcesOk() (*V0037JobResources, bool) { - if o == nil || IsNil(o.JobResources) { - return nil, false - } - return o.JobResources, true -} - -// HasJobResources returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasJobResources() bool { - if o != nil && !IsNil(o.JobResources) { - return true - } - - return false -} - -// SetJobResources gets a reference to the given V0037JobResources and assigns it to the JobResources field. -func (o *V0037JobResponseProperties) SetJobResources(v V0037JobResources) { - o.JobResources = &v -} - -// GetJobState returns the JobState field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetJobState() string { - if o == nil || IsNil(o.JobState) { - var ret string - return ret - } - return *o.JobState -} - -// GetJobStateOk returns a tuple with the JobState field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetJobStateOk() (*string, bool) { - if o == nil || IsNil(o.JobState) { - return nil, false - } - return o.JobState, true -} - -// HasJobState returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasJobState() bool { - if o != nil && !IsNil(o.JobState) { - return true - } - - return false -} - -// SetJobState gets a reference to the given string and assigns it to the JobState field. -func (o *V0037JobResponseProperties) SetJobState(v string) { - o.JobState = &v -} - -// GetLastSchedEvaluation returns the LastSchedEvaluation field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetLastSchedEvaluation() string { - if o == nil || IsNil(o.LastSchedEvaluation) { - var ret string - return ret - } - return *o.LastSchedEvaluation -} - -// GetLastSchedEvaluationOk returns a tuple with the LastSchedEvaluation field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetLastSchedEvaluationOk() (*string, bool) { - if o == nil || IsNil(o.LastSchedEvaluation) { - return nil, false - } - return o.LastSchedEvaluation, true -} - -// HasLastSchedEvaluation returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasLastSchedEvaluation() bool { - if o != nil && !IsNil(o.LastSchedEvaluation) { - return true - } - - return false -} - -// SetLastSchedEvaluation gets a reference to the given string and assigns it to the LastSchedEvaluation field. -func (o *V0037JobResponseProperties) SetLastSchedEvaluation(v string) { - o.LastSchedEvaluation = &v -} - -// GetLicenses returns the Licenses field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetLicenses() string { - if o == nil || IsNil(o.Licenses) { - var ret string - return ret - } - return *o.Licenses -} - -// GetLicensesOk returns a tuple with the Licenses field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetLicensesOk() (*string, bool) { - if o == nil || IsNil(o.Licenses) { - return nil, false - } - return o.Licenses, true -} - -// HasLicenses returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasLicenses() bool { - if o != nil && !IsNil(o.Licenses) { - return true - } - - return false -} - -// SetLicenses gets a reference to the given string and assigns it to the Licenses field. -func (o *V0037JobResponseProperties) SetLicenses(v string) { - o.Licenses = &v -} - -// GetMaxCpus returns the MaxCpus field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetMaxCpus() string { - if o == nil || IsNil(o.MaxCpus) { - var ret string - return ret - } - return *o.MaxCpus -} - -// GetMaxCpusOk returns a tuple with the MaxCpus field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetMaxCpusOk() (*string, bool) { - if o == nil || IsNil(o.MaxCpus) { - return nil, false - } - return o.MaxCpus, true -} - -// HasMaxCpus returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasMaxCpus() bool { - if o != nil && !IsNil(o.MaxCpus) { - return true - } - - return false -} - -// SetMaxCpus gets a reference to the given string and assigns it to the MaxCpus field. -func (o *V0037JobResponseProperties) SetMaxCpus(v string) { - o.MaxCpus = &v -} - -// GetMaxNodes returns the MaxNodes field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetMaxNodes() string { - if o == nil || IsNil(o.MaxNodes) { - var ret string - return ret - } - return *o.MaxNodes -} - -// GetMaxNodesOk returns a tuple with the MaxNodes field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetMaxNodesOk() (*string, bool) { - if o == nil || IsNil(o.MaxNodes) { - return nil, false - } - return o.MaxNodes, true -} - -// HasMaxNodes returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasMaxNodes() bool { - if o != nil && !IsNil(o.MaxNodes) { - return true - } - - return false -} - -// SetMaxNodes gets a reference to the given string and assigns it to the MaxNodes field. -func (o *V0037JobResponseProperties) SetMaxNodes(v string) { - o.MaxNodes = &v -} - -// GetMcsLabel returns the McsLabel field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetMcsLabel() string { - if o == nil || IsNil(o.McsLabel) { - var ret string - return ret - } - return *o.McsLabel -} - -// GetMcsLabelOk returns a tuple with the McsLabel field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetMcsLabelOk() (*string, bool) { - if o == nil || IsNil(o.McsLabel) { - return nil, false - } - return o.McsLabel, true -} - -// HasMcsLabel returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasMcsLabel() bool { - if o != nil && !IsNil(o.McsLabel) { - return true - } - - return false -} - -// SetMcsLabel gets a reference to the given string and assigns it to the McsLabel field. -func (o *V0037JobResponseProperties) SetMcsLabel(v string) { - o.McsLabel = &v -} - -// GetMemoryPerTres returns the MemoryPerTres field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetMemoryPerTres() string { - if o == nil || IsNil(o.MemoryPerTres) { - var ret string - return ret - } - return *o.MemoryPerTres -} - -// GetMemoryPerTresOk returns a tuple with the MemoryPerTres field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetMemoryPerTresOk() (*string, bool) { - if o == nil || IsNil(o.MemoryPerTres) { - return nil, false - } - return o.MemoryPerTres, true -} - -// HasMemoryPerTres returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasMemoryPerTres() bool { - if o != nil && !IsNil(o.MemoryPerTres) { - return true - } - - return false -} - -// SetMemoryPerTres gets a reference to the given string and assigns it to the MemoryPerTres field. -func (o *V0037JobResponseProperties) SetMemoryPerTres(v string) { - o.MemoryPerTres = &v -} - -// GetName returns the Name field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetName() string { - if o == nil || IsNil(o.Name) { - var ret string - return ret - } - return *o.Name -} - -// GetNameOk returns a tuple with the Name field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetNameOk() (*string, bool) { - if o == nil || IsNil(o.Name) { - return nil, false - } - return o.Name, true -} - -// HasName returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasName() bool { - if o != nil && !IsNil(o.Name) { - return true - } - - return false -} - -// SetName gets a reference to the given string and assigns it to the Name field. -func (o *V0037JobResponseProperties) SetName(v string) { - o.Name = &v -} - -// GetNodes returns the Nodes field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetNodes() string { - if o == nil || IsNil(o.Nodes) { - var ret string - return ret - } - return *o.Nodes -} - -// GetNodesOk returns a tuple with the Nodes field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetNodesOk() (*string, bool) { - if o == nil || IsNil(o.Nodes) { - return nil, false - } - return o.Nodes, true -} - -// HasNodes returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasNodes() bool { - if o != nil && !IsNil(o.Nodes) { - return true - } - - return false -} - -// SetNodes gets a reference to the given string and assigns it to the Nodes field. -func (o *V0037JobResponseProperties) SetNodes(v string) { - o.Nodes = &v -} - -// GetNice returns the Nice field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetNice() string { - if o == nil || IsNil(o.Nice) { - var ret string - return ret - } - return *o.Nice -} - -// GetNiceOk returns a tuple with the Nice field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetNiceOk() (*string, bool) { - if o == nil || IsNil(o.Nice) { - return nil, false - } - return o.Nice, true -} - -// HasNice returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasNice() bool { - if o != nil && !IsNil(o.Nice) { - return true - } - - return false -} - -// SetNice gets a reference to the given string and assigns it to the Nice field. -func (o *V0037JobResponseProperties) SetNice(v string) { - o.Nice = &v -} - -// GetTasksPerCore returns the TasksPerCore field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetTasksPerCore() string { - if o == nil || IsNil(o.TasksPerCore) { - var ret string - return ret - } - return *o.TasksPerCore -} - -// GetTasksPerCoreOk returns a tuple with the TasksPerCore field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetTasksPerCoreOk() (*string, bool) { - if o == nil || IsNil(o.TasksPerCore) { - return nil, false - } - return o.TasksPerCore, true -} - -// HasTasksPerCore returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasTasksPerCore() bool { - if o != nil && !IsNil(o.TasksPerCore) { - return true - } - - return false -} - -// SetTasksPerCore gets a reference to the given string and assigns it to the TasksPerCore field. -func (o *V0037JobResponseProperties) SetTasksPerCore(v string) { - o.TasksPerCore = &v -} - -// GetTasksPerSocket returns the TasksPerSocket field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetTasksPerSocket() string { - if o == nil || IsNil(o.TasksPerSocket) { - var ret string - return ret - } - return *o.TasksPerSocket -} - -// GetTasksPerSocketOk returns a tuple with the TasksPerSocket field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetTasksPerSocketOk() (*string, bool) { - if o == nil || IsNil(o.TasksPerSocket) { - return nil, false - } - return o.TasksPerSocket, true -} - -// HasTasksPerSocket returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasTasksPerSocket() bool { - if o != nil && !IsNil(o.TasksPerSocket) { - return true - } - - return false -} - -// SetTasksPerSocket gets a reference to the given string and assigns it to the TasksPerSocket field. -func (o *V0037JobResponseProperties) SetTasksPerSocket(v string) { - o.TasksPerSocket = &v -} - -// GetTasksPerBoard returns the TasksPerBoard field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetTasksPerBoard() string { - if o == nil || IsNil(o.TasksPerBoard) { - var ret string - return ret - } - return *o.TasksPerBoard -} - -// GetTasksPerBoardOk returns a tuple with the TasksPerBoard field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetTasksPerBoardOk() (*string, bool) { - if o == nil || IsNil(o.TasksPerBoard) { - return nil, false - } - return o.TasksPerBoard, true -} - -// HasTasksPerBoard returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasTasksPerBoard() bool { - if o != nil && !IsNil(o.TasksPerBoard) { - return true - } - - return false -} - -// SetTasksPerBoard gets a reference to the given string and assigns it to the TasksPerBoard field. -func (o *V0037JobResponseProperties) SetTasksPerBoard(v string) { - o.TasksPerBoard = &v -} - -// GetCpus returns the Cpus field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetCpus() string { - if o == nil || IsNil(o.Cpus) { - var ret string - return ret - } - return *o.Cpus -} - -// GetCpusOk returns a tuple with the Cpus field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetCpusOk() (*string, bool) { - if o == nil || IsNil(o.Cpus) { - return nil, false - } - return o.Cpus, true -} - -// HasCpus returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasCpus() bool { - if o != nil && !IsNil(o.Cpus) { - return true - } - - return false -} - -// SetCpus gets a reference to the given string and assigns it to the Cpus field. -func (o *V0037JobResponseProperties) SetCpus(v string) { - o.Cpus = &v -} - -// GetNodeCount returns the NodeCount field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetNodeCount() string { - if o == nil || IsNil(o.NodeCount) { - var ret string - return ret - } - return *o.NodeCount -} - -// GetNodeCountOk returns a tuple with the NodeCount field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetNodeCountOk() (*string, bool) { - if o == nil || IsNil(o.NodeCount) { - return nil, false - } - return o.NodeCount, true -} - -// HasNodeCount returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasNodeCount() bool { - if o != nil && !IsNil(o.NodeCount) { - return true - } - - return false -} - -// SetNodeCount gets a reference to the given string and assigns it to the NodeCount field. -func (o *V0037JobResponseProperties) SetNodeCount(v string) { - o.NodeCount = &v -} - -// GetTasks returns the Tasks field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetTasks() string { - if o == nil || IsNil(o.Tasks) { - var ret string - return ret - } - return *o.Tasks -} - -// GetTasksOk returns a tuple with the Tasks field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetTasksOk() (*string, bool) { - if o == nil || IsNil(o.Tasks) { - return nil, false - } - return o.Tasks, true -} - -// HasTasks returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasTasks() bool { - if o != nil && !IsNil(o.Tasks) { - return true - } - - return false -} - -// SetTasks gets a reference to the given string and assigns it to the Tasks field. -func (o *V0037JobResponseProperties) SetTasks(v string) { - o.Tasks = &v -} - -// GetHetJobId returns the HetJobId field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetHetJobId() string { - if o == nil || IsNil(o.HetJobId) { - var ret string - return ret - } - return *o.HetJobId -} - -// GetHetJobIdOk returns a tuple with the HetJobId field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetHetJobIdOk() (*string, bool) { - if o == nil || IsNil(o.HetJobId) { - return nil, false - } - return o.HetJobId, true -} - -// HasHetJobId returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasHetJobId() bool { - if o != nil && !IsNil(o.HetJobId) { - return true - } - - return false -} - -// SetHetJobId gets a reference to the given string and assigns it to the HetJobId field. -func (o *V0037JobResponseProperties) SetHetJobId(v string) { - o.HetJobId = &v -} - -// GetHetJobIdSet returns the HetJobIdSet field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetHetJobIdSet() string { - if o == nil || IsNil(o.HetJobIdSet) { - var ret string - return ret - } - return *o.HetJobIdSet -} - -// GetHetJobIdSetOk returns a tuple with the HetJobIdSet field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetHetJobIdSetOk() (*string, bool) { - if o == nil || IsNil(o.HetJobIdSet) { - return nil, false - } - return o.HetJobIdSet, true -} - -// HasHetJobIdSet returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasHetJobIdSet() bool { - if o != nil && !IsNil(o.HetJobIdSet) { - return true - } - - return false -} - -// SetHetJobIdSet gets a reference to the given string and assigns it to the HetJobIdSet field. -func (o *V0037JobResponseProperties) SetHetJobIdSet(v string) { - o.HetJobIdSet = &v -} - -// GetHetJobOffset returns the HetJobOffset field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetHetJobOffset() string { - if o == nil || IsNil(o.HetJobOffset) { - var ret string - return ret - } - return *o.HetJobOffset -} - -// GetHetJobOffsetOk returns a tuple with the HetJobOffset field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetHetJobOffsetOk() (*string, bool) { - if o == nil || IsNil(o.HetJobOffset) { - return nil, false - } - return o.HetJobOffset, true -} - -// HasHetJobOffset returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasHetJobOffset() bool { - if o != nil && !IsNil(o.HetJobOffset) { - return true - } - - return false -} - -// SetHetJobOffset gets a reference to the given string and assigns it to the HetJobOffset field. -func (o *V0037JobResponseProperties) SetHetJobOffset(v string) { - o.HetJobOffset = &v -} - -// GetPartition returns the Partition field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetPartition() string { - if o == nil || IsNil(o.Partition) { - var ret string - return ret - } - return *o.Partition -} - -// GetPartitionOk returns a tuple with the Partition field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetPartitionOk() (*string, bool) { - if o == nil || IsNil(o.Partition) { - return nil, false - } - return o.Partition, true -} - -// HasPartition returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasPartition() bool { - if o != nil && !IsNil(o.Partition) { - return true - } - - return false -} - -// SetPartition gets a reference to the given string and assigns it to the Partition field. -func (o *V0037JobResponseProperties) SetPartition(v string) { - o.Partition = &v -} - -// GetMemoryPerNode returns the MemoryPerNode field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetMemoryPerNode() string { - if o == nil || IsNil(o.MemoryPerNode) { - var ret string - return ret - } - return *o.MemoryPerNode -} - -// GetMemoryPerNodeOk returns a tuple with the MemoryPerNode field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetMemoryPerNodeOk() (*string, bool) { - if o == nil || IsNil(o.MemoryPerNode) { - return nil, false - } - return o.MemoryPerNode, true -} - -// HasMemoryPerNode returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasMemoryPerNode() bool { - if o != nil && !IsNil(o.MemoryPerNode) { - return true - } - - return false -} - -// SetMemoryPerNode gets a reference to the given string and assigns it to the MemoryPerNode field. -func (o *V0037JobResponseProperties) SetMemoryPerNode(v string) { - o.MemoryPerNode = &v -} - -// GetMemoryPerCpu returns the MemoryPerCpu field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetMemoryPerCpu() string { - if o == nil || IsNil(o.MemoryPerCpu) { - var ret string - return ret - } - return *o.MemoryPerCpu -} - -// GetMemoryPerCpuOk returns a tuple with the MemoryPerCpu field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetMemoryPerCpuOk() (*string, bool) { - if o == nil || IsNil(o.MemoryPerCpu) { - return nil, false - } - return o.MemoryPerCpu, true -} - -// HasMemoryPerCpu returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasMemoryPerCpu() bool { - if o != nil && !IsNil(o.MemoryPerCpu) { - return true - } - - return false -} - -// SetMemoryPerCpu gets a reference to the given string and assigns it to the MemoryPerCpu field. -func (o *V0037JobResponseProperties) SetMemoryPerCpu(v string) { - o.MemoryPerCpu = &v -} - -// GetMinimumCpusPerNode returns the MinimumCpusPerNode field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetMinimumCpusPerNode() string { - if o == nil || IsNil(o.MinimumCpusPerNode) { - var ret string - return ret - } - return *o.MinimumCpusPerNode -} - -// GetMinimumCpusPerNodeOk returns a tuple with the MinimumCpusPerNode field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetMinimumCpusPerNodeOk() (*string, bool) { - if o == nil || IsNil(o.MinimumCpusPerNode) { - return nil, false - } - return o.MinimumCpusPerNode, true -} - -// HasMinimumCpusPerNode returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasMinimumCpusPerNode() bool { - if o != nil && !IsNil(o.MinimumCpusPerNode) { - return true - } - - return false -} - -// SetMinimumCpusPerNode gets a reference to the given string and assigns it to the MinimumCpusPerNode field. -func (o *V0037JobResponseProperties) SetMinimumCpusPerNode(v string) { - o.MinimumCpusPerNode = &v -} - -// GetMinimumTmpDiskPerNode returns the MinimumTmpDiskPerNode field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetMinimumTmpDiskPerNode() string { - if o == nil || IsNil(o.MinimumTmpDiskPerNode) { - var ret string - return ret - } - return *o.MinimumTmpDiskPerNode -} - -// GetMinimumTmpDiskPerNodeOk returns a tuple with the MinimumTmpDiskPerNode field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetMinimumTmpDiskPerNodeOk() (*string, bool) { - if o == nil || IsNil(o.MinimumTmpDiskPerNode) { - return nil, false - } - return o.MinimumTmpDiskPerNode, true -} - -// HasMinimumTmpDiskPerNode returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasMinimumTmpDiskPerNode() bool { - if o != nil && !IsNil(o.MinimumTmpDiskPerNode) { - return true - } - - return false -} - -// SetMinimumTmpDiskPerNode gets a reference to the given string and assigns it to the MinimumTmpDiskPerNode field. -func (o *V0037JobResponseProperties) SetMinimumTmpDiskPerNode(v string) { - o.MinimumTmpDiskPerNode = &v -} - -// GetPreemptTime returns the PreemptTime field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetPreemptTime() int64 { - if o == nil || IsNil(o.PreemptTime) { - var ret int64 - return ret - } - return *o.PreemptTime -} - -// GetPreemptTimeOk returns a tuple with the PreemptTime field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetPreemptTimeOk() (*int64, bool) { - if o == nil || IsNil(o.PreemptTime) { - return nil, false - } - return o.PreemptTime, true -} - -// HasPreemptTime returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasPreemptTime() bool { - if o != nil && !IsNil(o.PreemptTime) { - return true - } - - return false -} - -// SetPreemptTime gets a reference to the given int64 and assigns it to the PreemptTime field. -func (o *V0037JobResponseProperties) SetPreemptTime(v int64) { - o.PreemptTime = &v -} - -// GetPreSusTime returns the PreSusTime field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetPreSusTime() int64 { - if o == nil || IsNil(o.PreSusTime) { - var ret int64 - return ret - } - return *o.PreSusTime -} - -// GetPreSusTimeOk returns a tuple with the PreSusTime field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetPreSusTimeOk() (*int64, bool) { - if o == nil || IsNil(o.PreSusTime) { - return nil, false - } - return o.PreSusTime, true -} - -// HasPreSusTime returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasPreSusTime() bool { - if o != nil && !IsNil(o.PreSusTime) { - return true - } - - return false -} - -// SetPreSusTime gets a reference to the given int64 and assigns it to the PreSusTime field. -func (o *V0037JobResponseProperties) SetPreSusTime(v int64) { - o.PreSusTime = &v -} - -// GetPriority returns the Priority field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetPriority() string { - if o == nil || IsNil(o.Priority) { - var ret string - return ret - } - return *o.Priority -} - -// GetPriorityOk returns a tuple with the Priority field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetPriorityOk() (*string, bool) { - if o == nil || IsNil(o.Priority) { - return nil, false - } - return o.Priority, true -} - -// HasPriority returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasPriority() bool { - if o != nil && !IsNil(o.Priority) { - return true - } - - return false -} - -// SetPriority gets a reference to the given string and assigns it to the Priority field. -func (o *V0037JobResponseProperties) SetPriority(v string) { - o.Priority = &v -} - -// GetProfile returns the Profile field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetProfile() []string { - if o == nil || IsNil(o.Profile) { - var ret []string - return ret - } - return o.Profile -} - -// GetProfileOk returns a tuple with the Profile field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetProfileOk() ([]string, bool) { - if o == nil || IsNil(o.Profile) { - return nil, false - } - return o.Profile, true -} - -// HasProfile returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasProfile() bool { - if o != nil && !IsNil(o.Profile) { - return true - } - - return false -} - -// SetProfile gets a reference to the given []string and assigns it to the Profile field. -func (o *V0037JobResponseProperties) SetProfile(v []string) { - o.Profile = v -} - -// GetQos returns the Qos field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetQos() string { - if o == nil || IsNil(o.Qos) { - var ret string - return ret - } - return *o.Qos -} - -// GetQosOk returns a tuple with the Qos field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetQosOk() (*string, bool) { - if o == nil || IsNil(o.Qos) { - return nil, false - } - return o.Qos, true -} - -// HasQos returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasQos() bool { - if o != nil && !IsNil(o.Qos) { - return true - } - - return false -} - -// SetQos gets a reference to the given string and assigns it to the Qos field. -func (o *V0037JobResponseProperties) SetQos(v string) { - o.Qos = &v -} - -// GetReboot returns the Reboot field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetReboot() bool { - if o == nil || IsNil(o.Reboot) { - var ret bool - return ret - } - return *o.Reboot -} - -// GetRebootOk returns a tuple with the Reboot field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetRebootOk() (*bool, bool) { - if o == nil || IsNil(o.Reboot) { - return nil, false - } - return o.Reboot, true -} - -// HasReboot returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasReboot() bool { - if o != nil && !IsNil(o.Reboot) { - return true - } - - return false -} - -// SetReboot gets a reference to the given bool and assigns it to the Reboot field. -func (o *V0037JobResponseProperties) SetReboot(v bool) { - o.Reboot = &v -} - -// GetRequiredNodes returns the RequiredNodes field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetRequiredNodes() string { - if o == nil || IsNil(o.RequiredNodes) { - var ret string - return ret - } - return *o.RequiredNodes -} - -// GetRequiredNodesOk returns a tuple with the RequiredNodes field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetRequiredNodesOk() (*string, bool) { - if o == nil || IsNil(o.RequiredNodes) { - return nil, false - } - return o.RequiredNodes, true -} - -// HasRequiredNodes returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasRequiredNodes() bool { - if o != nil && !IsNil(o.RequiredNodes) { - return true - } - - return false -} - -// SetRequiredNodes gets a reference to the given string and assigns it to the RequiredNodes field. -func (o *V0037JobResponseProperties) SetRequiredNodes(v string) { - o.RequiredNodes = &v -} - -// GetRequeue returns the Requeue field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetRequeue() bool { - if o == nil || IsNil(o.Requeue) { - var ret bool - return ret - } - return *o.Requeue -} - -// GetRequeueOk returns a tuple with the Requeue field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetRequeueOk() (*bool, bool) { - if o == nil || IsNil(o.Requeue) { - return nil, false - } - return o.Requeue, true -} - -// HasRequeue returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasRequeue() bool { - if o != nil && !IsNil(o.Requeue) { - return true - } - - return false -} - -// SetRequeue gets a reference to the given bool and assigns it to the Requeue field. -func (o *V0037JobResponseProperties) SetRequeue(v bool) { - o.Requeue = &v -} - -// GetResizeTime returns the ResizeTime field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetResizeTime() int64 { - if o == nil || IsNil(o.ResizeTime) { - var ret int64 - return ret - } - return *o.ResizeTime -} - -// GetResizeTimeOk returns a tuple with the ResizeTime field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetResizeTimeOk() (*int64, bool) { - if o == nil || IsNil(o.ResizeTime) { - return nil, false - } - return o.ResizeTime, true -} - -// HasResizeTime returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasResizeTime() bool { - if o != nil && !IsNil(o.ResizeTime) { - return true - } - - return false -} - -// SetResizeTime gets a reference to the given int64 and assigns it to the ResizeTime field. -func (o *V0037JobResponseProperties) SetResizeTime(v int64) { - o.ResizeTime = &v -} - -// GetRestartCnt returns the RestartCnt field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetRestartCnt() string { - if o == nil || IsNil(o.RestartCnt) { - var ret string - return ret - } - return *o.RestartCnt -} - -// GetRestartCntOk returns a tuple with the RestartCnt field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetRestartCntOk() (*string, bool) { - if o == nil || IsNil(o.RestartCnt) { - return nil, false - } - return o.RestartCnt, true -} - -// HasRestartCnt returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasRestartCnt() bool { - if o != nil && !IsNil(o.RestartCnt) { - return true - } - - return false -} - -// SetRestartCnt gets a reference to the given string and assigns it to the RestartCnt field. -func (o *V0037JobResponseProperties) SetRestartCnt(v string) { - o.RestartCnt = &v -} - -// GetResvName returns the ResvName field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetResvName() string { - if o == nil || IsNil(o.ResvName) { - var ret string - return ret - } - return *o.ResvName -} - -// GetResvNameOk returns a tuple with the ResvName field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetResvNameOk() (*string, bool) { - if o == nil || IsNil(o.ResvName) { - return nil, false - } - return o.ResvName, true -} - -// HasResvName returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasResvName() bool { - if o != nil && !IsNil(o.ResvName) { - return true - } - - return false -} - -// SetResvName gets a reference to the given string and assigns it to the ResvName field. -func (o *V0037JobResponseProperties) SetResvName(v string) { - o.ResvName = &v -} - -// GetShared returns the Shared field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetShared() string { - if o == nil || IsNil(o.Shared) { - var ret string - return ret - } - return *o.Shared -} - -// GetSharedOk returns a tuple with the Shared field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetSharedOk() (*string, bool) { - if o == nil || IsNil(o.Shared) { - return nil, false - } - return o.Shared, true -} - -// HasShared returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasShared() bool { - if o != nil && !IsNil(o.Shared) { - return true - } - - return false -} - -// SetShared gets a reference to the given string and assigns it to the Shared field. -func (o *V0037JobResponseProperties) SetShared(v string) { - o.Shared = &v -} - -// GetShowFlags returns the ShowFlags field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetShowFlags() []string { - if o == nil || IsNil(o.ShowFlags) { - var ret []string - return ret - } - return o.ShowFlags -} - -// GetShowFlagsOk returns a tuple with the ShowFlags field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetShowFlagsOk() ([]string, bool) { - if o == nil || IsNil(o.ShowFlags) { - return nil, false - } - return o.ShowFlags, true -} - -// HasShowFlags returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasShowFlags() bool { - if o != nil && !IsNil(o.ShowFlags) { - return true - } - - return false -} - -// SetShowFlags gets a reference to the given []string and assigns it to the ShowFlags field. -func (o *V0037JobResponseProperties) SetShowFlags(v []string) { - o.ShowFlags = v -} - -// GetSocketsPerBoard returns the SocketsPerBoard field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetSocketsPerBoard() string { - if o == nil || IsNil(o.SocketsPerBoard) { - var ret string - return ret - } - return *o.SocketsPerBoard -} - -// GetSocketsPerBoardOk returns a tuple with the SocketsPerBoard field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetSocketsPerBoardOk() (*string, bool) { - if o == nil || IsNil(o.SocketsPerBoard) { - return nil, false - } - return o.SocketsPerBoard, true -} - -// HasSocketsPerBoard returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasSocketsPerBoard() bool { - if o != nil && !IsNil(o.SocketsPerBoard) { - return true - } - - return false -} - -// SetSocketsPerBoard gets a reference to the given string and assigns it to the SocketsPerBoard field. -func (o *V0037JobResponseProperties) SetSocketsPerBoard(v string) { - o.SocketsPerBoard = &v -} - -// GetSocketsPerNode returns the SocketsPerNode field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetSocketsPerNode() string { - if o == nil || IsNil(o.SocketsPerNode) { - var ret string - return ret - } - return *o.SocketsPerNode -} - -// GetSocketsPerNodeOk returns a tuple with the SocketsPerNode field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetSocketsPerNodeOk() (*string, bool) { - if o == nil || IsNil(o.SocketsPerNode) { - return nil, false - } - return o.SocketsPerNode, true -} - -// HasSocketsPerNode returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasSocketsPerNode() bool { - if o != nil && !IsNil(o.SocketsPerNode) { - return true - } - - return false -} - -// SetSocketsPerNode gets a reference to the given string and assigns it to the SocketsPerNode field. -func (o *V0037JobResponseProperties) SetSocketsPerNode(v string) { - o.SocketsPerNode = &v -} - -// GetStartTime returns the StartTime field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetStartTime() int64 { - if o == nil || IsNil(o.StartTime) { - var ret int64 - return ret - } - return *o.StartTime -} - -// GetStartTimeOk returns a tuple with the StartTime field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetStartTimeOk() (*int64, bool) { - if o == nil || IsNil(o.StartTime) { - return nil, false - } - return o.StartTime, true -} - -// HasStartTime returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasStartTime() bool { - if o != nil && !IsNil(o.StartTime) { - return true - } - - return false -} - -// SetStartTime gets a reference to the given int64 and assigns it to the StartTime field. -func (o *V0037JobResponseProperties) SetStartTime(v int64) { - o.StartTime = &v -} - -// GetStateDescription returns the StateDescription field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetStateDescription() string { - if o == nil || IsNil(o.StateDescription) { - var ret string - return ret - } - return *o.StateDescription -} - -// GetStateDescriptionOk returns a tuple with the StateDescription field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetStateDescriptionOk() (*string, bool) { - if o == nil || IsNil(o.StateDescription) { - return nil, false - } - return o.StateDescription, true -} - -// HasStateDescription returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasStateDescription() bool { - if o != nil && !IsNil(o.StateDescription) { - return true - } - - return false -} - -// SetStateDescription gets a reference to the given string and assigns it to the StateDescription field. -func (o *V0037JobResponseProperties) SetStateDescription(v string) { - o.StateDescription = &v -} - -// GetStateReason returns the StateReason field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetStateReason() string { - if o == nil || IsNil(o.StateReason) { - var ret string - return ret - } - return *o.StateReason -} - -// GetStateReasonOk returns a tuple with the StateReason field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetStateReasonOk() (*string, bool) { - if o == nil || IsNil(o.StateReason) { - return nil, false - } - return o.StateReason, true -} - -// HasStateReason returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasStateReason() bool { - if o != nil && !IsNil(o.StateReason) { - return true - } - - return false -} - -// SetStateReason gets a reference to the given string and assigns it to the StateReason field. -func (o *V0037JobResponseProperties) SetStateReason(v string) { - o.StateReason = &v -} - -// GetStandardError returns the StandardError field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetStandardError() string { - if o == nil || IsNil(o.StandardError) { - var ret string - return ret - } - return *o.StandardError -} - -// GetStandardErrorOk returns a tuple with the StandardError field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetStandardErrorOk() (*string, bool) { - if o == nil || IsNil(o.StandardError) { - return nil, false - } - return o.StandardError, true -} - -// HasStandardError returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasStandardError() bool { - if o != nil && !IsNil(o.StandardError) { - return true - } - - return false -} - -// SetStandardError gets a reference to the given string and assigns it to the StandardError field. -func (o *V0037JobResponseProperties) SetStandardError(v string) { - o.StandardError = &v -} - -// GetStandardInput returns the StandardInput field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetStandardInput() string { - if o == nil || IsNil(o.StandardInput) { - var ret string - return ret - } - return *o.StandardInput -} - -// GetStandardInputOk returns a tuple with the StandardInput field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetStandardInputOk() (*string, bool) { - if o == nil || IsNil(o.StandardInput) { - return nil, false - } - return o.StandardInput, true -} - -// HasStandardInput returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasStandardInput() bool { - if o != nil && !IsNil(o.StandardInput) { - return true - } - - return false -} - -// SetStandardInput gets a reference to the given string and assigns it to the StandardInput field. -func (o *V0037JobResponseProperties) SetStandardInput(v string) { - o.StandardInput = &v -} - -// GetStandardOutput returns the StandardOutput field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetStandardOutput() string { - if o == nil || IsNil(o.StandardOutput) { - var ret string - return ret - } - return *o.StandardOutput -} - -// GetStandardOutputOk returns a tuple with the StandardOutput field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetStandardOutputOk() (*string, bool) { - if o == nil || IsNil(o.StandardOutput) { - return nil, false - } - return o.StandardOutput, true -} - -// HasStandardOutput returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasStandardOutput() bool { - if o != nil && !IsNil(o.StandardOutput) { - return true - } - - return false -} - -// SetStandardOutput gets a reference to the given string and assigns it to the StandardOutput field. -func (o *V0037JobResponseProperties) SetStandardOutput(v string) { - o.StandardOutput = &v -} - -// GetSubmitTime returns the SubmitTime field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetSubmitTime() int64 { - if o == nil || IsNil(o.SubmitTime) { - var ret int64 - return ret - } - return *o.SubmitTime -} - -// GetSubmitTimeOk returns a tuple with the SubmitTime field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetSubmitTimeOk() (*int64, bool) { - if o == nil || IsNil(o.SubmitTime) { - return nil, false - } - return o.SubmitTime, true -} - -// HasSubmitTime returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasSubmitTime() bool { - if o != nil && !IsNil(o.SubmitTime) { - return true - } - - return false -} - -// SetSubmitTime gets a reference to the given int64 and assigns it to the SubmitTime field. -func (o *V0037JobResponseProperties) SetSubmitTime(v int64) { - o.SubmitTime = &v -} - -// GetSuspendTime returns the SuspendTime field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetSuspendTime() int64 { - if o == nil || IsNil(o.SuspendTime) { - var ret int64 - return ret - } - return *o.SuspendTime -} - -// GetSuspendTimeOk returns a tuple with the SuspendTime field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetSuspendTimeOk() (*int64, bool) { - if o == nil || IsNil(o.SuspendTime) { - return nil, false - } - return o.SuspendTime, true -} - -// HasSuspendTime returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasSuspendTime() bool { - if o != nil && !IsNil(o.SuspendTime) { - return true - } - - return false -} - -// SetSuspendTime gets a reference to the given int64 and assigns it to the SuspendTime field. -func (o *V0037JobResponseProperties) SetSuspendTime(v int64) { - o.SuspendTime = &v -} - -// GetSystemComment returns the SystemComment field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetSystemComment() string { - if o == nil || IsNil(o.SystemComment) { - var ret string - return ret - } - return *o.SystemComment -} - -// GetSystemCommentOk returns a tuple with the SystemComment field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetSystemCommentOk() (*string, bool) { - if o == nil || IsNil(o.SystemComment) { - return nil, false - } - return o.SystemComment, true -} - -// HasSystemComment returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasSystemComment() bool { - if o != nil && !IsNil(o.SystemComment) { - return true - } - - return false -} - -// SetSystemComment gets a reference to the given string and assigns it to the SystemComment field. -func (o *V0037JobResponseProperties) SetSystemComment(v string) { - o.SystemComment = &v -} - -// GetTimeLimit returns the TimeLimit field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetTimeLimit() string { - if o == nil || IsNil(o.TimeLimit) { - var ret string - return ret - } - return *o.TimeLimit -} - -// GetTimeLimitOk returns a tuple with the TimeLimit field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetTimeLimitOk() (*string, bool) { - if o == nil || IsNil(o.TimeLimit) { - return nil, false - } - return o.TimeLimit, true -} - -// HasTimeLimit returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasTimeLimit() bool { - if o != nil && !IsNil(o.TimeLimit) { - return true - } - - return false -} - -// SetTimeLimit gets a reference to the given string and assigns it to the TimeLimit field. -func (o *V0037JobResponseProperties) SetTimeLimit(v string) { - o.TimeLimit = &v -} - -// GetTimeMinimum returns the TimeMinimum field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetTimeMinimum() string { - if o == nil || IsNil(o.TimeMinimum) { - var ret string - return ret - } - return *o.TimeMinimum -} - -// GetTimeMinimumOk returns a tuple with the TimeMinimum field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetTimeMinimumOk() (*string, bool) { - if o == nil || IsNil(o.TimeMinimum) { - return nil, false - } - return o.TimeMinimum, true -} - -// HasTimeMinimum returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasTimeMinimum() bool { - if o != nil && !IsNil(o.TimeMinimum) { - return true - } - - return false -} - -// SetTimeMinimum gets a reference to the given string and assigns it to the TimeMinimum field. -func (o *V0037JobResponseProperties) SetTimeMinimum(v string) { - o.TimeMinimum = &v -} - -// GetThreadsPerCore returns the ThreadsPerCore field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetThreadsPerCore() string { - if o == nil || IsNil(o.ThreadsPerCore) { - var ret string - return ret - } - return *o.ThreadsPerCore -} - -// GetThreadsPerCoreOk returns a tuple with the ThreadsPerCore field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetThreadsPerCoreOk() (*string, bool) { - if o == nil || IsNil(o.ThreadsPerCore) { - return nil, false - } - return o.ThreadsPerCore, true -} - -// HasThreadsPerCore returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasThreadsPerCore() bool { - if o != nil && !IsNil(o.ThreadsPerCore) { - return true - } - - return false -} - -// SetThreadsPerCore gets a reference to the given string and assigns it to the ThreadsPerCore field. -func (o *V0037JobResponseProperties) SetThreadsPerCore(v string) { - o.ThreadsPerCore = &v -} - -// GetTresBind returns the TresBind field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetTresBind() string { - if o == nil || IsNil(o.TresBind) { - var ret string - return ret - } - return *o.TresBind -} - -// GetTresBindOk returns a tuple with the TresBind field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetTresBindOk() (*string, bool) { - if o == nil || IsNil(o.TresBind) { - return nil, false - } - return o.TresBind, true -} - -// HasTresBind returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasTresBind() bool { - if o != nil && !IsNil(o.TresBind) { - return true - } - - return false -} - -// SetTresBind gets a reference to the given string and assigns it to the TresBind field. -func (o *V0037JobResponseProperties) SetTresBind(v string) { - o.TresBind = &v -} - -// GetTresFreq returns the TresFreq field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetTresFreq() string { - if o == nil || IsNil(o.TresFreq) { - var ret string - return ret - } - return *o.TresFreq -} - -// GetTresFreqOk returns a tuple with the TresFreq field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetTresFreqOk() (*string, bool) { - if o == nil || IsNil(o.TresFreq) { - return nil, false - } - return o.TresFreq, true -} - -// HasTresFreq returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasTresFreq() bool { - if o != nil && !IsNil(o.TresFreq) { - return true - } - - return false -} - -// SetTresFreq gets a reference to the given string and assigns it to the TresFreq field. -func (o *V0037JobResponseProperties) SetTresFreq(v string) { - o.TresFreq = &v -} - -// GetTresPerJob returns the TresPerJob field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetTresPerJob() string { - if o == nil || IsNil(o.TresPerJob) { - var ret string - return ret - } - return *o.TresPerJob -} - -// GetTresPerJobOk returns a tuple with the TresPerJob field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetTresPerJobOk() (*string, bool) { - if o == nil || IsNil(o.TresPerJob) { - return nil, false - } - return o.TresPerJob, true -} - -// HasTresPerJob returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasTresPerJob() bool { - if o != nil && !IsNil(o.TresPerJob) { - return true - } - - return false -} - -// SetTresPerJob gets a reference to the given string and assigns it to the TresPerJob field. -func (o *V0037JobResponseProperties) SetTresPerJob(v string) { - o.TresPerJob = &v -} - -// GetTresPerNode returns the TresPerNode field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetTresPerNode() string { - if o == nil || IsNil(o.TresPerNode) { - var ret string - return ret - } - return *o.TresPerNode -} - -// GetTresPerNodeOk returns a tuple with the TresPerNode field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetTresPerNodeOk() (*string, bool) { - if o == nil || IsNil(o.TresPerNode) { - return nil, false - } - return o.TresPerNode, true -} - -// HasTresPerNode returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasTresPerNode() bool { - if o != nil && !IsNil(o.TresPerNode) { - return true - } - - return false -} - -// SetTresPerNode gets a reference to the given string and assigns it to the TresPerNode field. -func (o *V0037JobResponseProperties) SetTresPerNode(v string) { - o.TresPerNode = &v -} - -// GetTresPerSocket returns the TresPerSocket field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetTresPerSocket() string { - if o == nil || IsNil(o.TresPerSocket) { - var ret string - return ret - } - return *o.TresPerSocket -} - -// GetTresPerSocketOk returns a tuple with the TresPerSocket field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetTresPerSocketOk() (*string, bool) { - if o == nil || IsNil(o.TresPerSocket) { - return nil, false - } - return o.TresPerSocket, true -} - -// HasTresPerSocket returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasTresPerSocket() bool { - if o != nil && !IsNil(o.TresPerSocket) { - return true - } - - return false -} - -// SetTresPerSocket gets a reference to the given string and assigns it to the TresPerSocket field. -func (o *V0037JobResponseProperties) SetTresPerSocket(v string) { - o.TresPerSocket = &v -} - -// GetTresPerTask returns the TresPerTask field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetTresPerTask() string { - if o == nil || IsNil(o.TresPerTask) { - var ret string - return ret - } - return *o.TresPerTask -} - -// GetTresPerTaskOk returns a tuple with the TresPerTask field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetTresPerTaskOk() (*string, bool) { - if o == nil || IsNil(o.TresPerTask) { - return nil, false - } - return o.TresPerTask, true -} - -// HasTresPerTask returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasTresPerTask() bool { - if o != nil && !IsNil(o.TresPerTask) { - return true - } - - return false -} - -// SetTresPerTask gets a reference to the given string and assigns it to the TresPerTask field. -func (o *V0037JobResponseProperties) SetTresPerTask(v string) { - o.TresPerTask = &v -} - -// GetTresReqStr returns the TresReqStr field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetTresReqStr() string { - if o == nil || IsNil(o.TresReqStr) { - var ret string - return ret - } - return *o.TresReqStr -} - -// GetTresReqStrOk returns a tuple with the TresReqStr field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetTresReqStrOk() (*string, bool) { - if o == nil || IsNil(o.TresReqStr) { - return nil, false - } - return o.TresReqStr, true -} - -// HasTresReqStr returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasTresReqStr() bool { - if o != nil && !IsNil(o.TresReqStr) { - return true - } - - return false -} - -// SetTresReqStr gets a reference to the given string and assigns it to the TresReqStr field. -func (o *V0037JobResponseProperties) SetTresReqStr(v string) { - o.TresReqStr = &v -} - -// GetTresAllocStr returns the TresAllocStr field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetTresAllocStr() string { - if o == nil || IsNil(o.TresAllocStr) { - var ret string - return ret - } - return *o.TresAllocStr -} - -// GetTresAllocStrOk returns a tuple with the TresAllocStr field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetTresAllocStrOk() (*string, bool) { - if o == nil || IsNil(o.TresAllocStr) { - return nil, false - } - return o.TresAllocStr, true -} - -// HasTresAllocStr returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasTresAllocStr() bool { - if o != nil && !IsNil(o.TresAllocStr) { - return true - } - - return false -} - -// SetTresAllocStr gets a reference to the given string and assigns it to the TresAllocStr field. -func (o *V0037JobResponseProperties) SetTresAllocStr(v string) { - o.TresAllocStr = &v -} - -// GetUserId returns the UserId field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetUserId() string { - if o == nil || IsNil(o.UserId) { - var ret string - return ret - } - return *o.UserId -} - -// GetUserIdOk returns a tuple with the UserId field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetUserIdOk() (*string, bool) { - if o == nil || IsNil(o.UserId) { - return nil, false - } - return o.UserId, true -} - -// HasUserId returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasUserId() bool { - if o != nil && !IsNil(o.UserId) { - return true - } - - return false -} - -// SetUserId gets a reference to the given string and assigns it to the UserId field. -func (o *V0037JobResponseProperties) SetUserId(v string) { - o.UserId = &v -} - -// GetUserName returns the UserName field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetUserName() string { - if o == nil || IsNil(o.UserName) { - var ret string - return ret - } - return *o.UserName -} - -// GetUserNameOk returns a tuple with the UserName field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetUserNameOk() (*string, bool) { - if o == nil || IsNil(o.UserName) { - return nil, false - } - return o.UserName, true -} - -// HasUserName returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasUserName() bool { - if o != nil && !IsNil(o.UserName) { - return true - } - - return false -} - -// SetUserName gets a reference to the given string and assigns it to the UserName field. -func (o *V0037JobResponseProperties) SetUserName(v string) { - o.UserName = &v -} - -// GetWckey returns the Wckey field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetWckey() string { - if o == nil || IsNil(o.Wckey) { - var ret string - return ret - } - return *o.Wckey -} - -// GetWckeyOk returns a tuple with the Wckey field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetWckeyOk() (*string, bool) { - if o == nil || IsNil(o.Wckey) { - return nil, false - } - return o.Wckey, true -} - -// HasWckey returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasWckey() bool { - if o != nil && !IsNil(o.Wckey) { - return true - } - - return false -} - -// SetWckey gets a reference to the given string and assigns it to the Wckey field. -func (o *V0037JobResponseProperties) SetWckey(v string) { - o.Wckey = &v -} - -// GetCurrentWorkingDirectory returns the CurrentWorkingDirectory field value if set, zero value otherwise. -func (o *V0037JobResponseProperties) GetCurrentWorkingDirectory() string { - if o == nil || IsNil(o.CurrentWorkingDirectory) { - var ret string - return ret - } - return *o.CurrentWorkingDirectory -} - -// GetCurrentWorkingDirectoryOk returns a tuple with the CurrentWorkingDirectory field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobResponseProperties) GetCurrentWorkingDirectoryOk() (*string, bool) { - if o == nil || IsNil(o.CurrentWorkingDirectory) { - return nil, false - } - return o.CurrentWorkingDirectory, true -} - -// HasCurrentWorkingDirectory returns a boolean if a field has been set. -func (o *V0037JobResponseProperties) HasCurrentWorkingDirectory() bool { - if o != nil && !IsNil(o.CurrentWorkingDirectory) { - return true - } - - return false -} - -// SetCurrentWorkingDirectory gets a reference to the given string and assigns it to the CurrentWorkingDirectory field. -func (o *V0037JobResponseProperties) SetCurrentWorkingDirectory(v string) { - o.CurrentWorkingDirectory = &v -} - -func (o V0037JobResponseProperties) MarshalJSON() ([]byte, error) { - toSerialize,err := o.ToMap() - if err != nil { - return []byte{}, err - } - return json.Marshal(toSerialize) -} - -func (o V0037JobResponseProperties) ToMap() (map[string]interface{}, error) { - toSerialize := map[string]interface{}{} - if !IsNil(o.Account) { - toSerialize["account"] = o.Account - } - if !IsNil(o.AccrueTime) { - toSerialize["accrue_time"] = o.AccrueTime - } - if !IsNil(o.AdminComment) { - toSerialize["admin_comment"] = o.AdminComment - } - if !IsNil(o.ArrayJobId) { - toSerialize["array_job_id"] = o.ArrayJobId - } - if !IsNil(o.ArrayTaskId) { - toSerialize["array_task_id"] = o.ArrayTaskId - } - if !IsNil(o.ArrayMaxTasks) { - toSerialize["array_max_tasks"] = o.ArrayMaxTasks - } - if !IsNil(o.ArrayTaskString) { - toSerialize["array_task_string"] = o.ArrayTaskString - } - if !IsNil(o.AssociationId) { - toSerialize["association_id"] = o.AssociationId - } - if !IsNil(o.BatchFeatures) { - toSerialize["batch_features"] = o.BatchFeatures - } - if !IsNil(o.BatchFlag) { - toSerialize["batch_flag"] = o.BatchFlag - } - if !IsNil(o.BatchHost) { - toSerialize["batch_host"] = o.BatchHost - } - if !IsNil(o.Flags) { - toSerialize["flags"] = o.Flags - } - if !IsNil(o.BurstBuffer) { - toSerialize["burst_buffer"] = o.BurstBuffer - } - if !IsNil(o.BurstBufferState) { - toSerialize["burst_buffer_state"] = o.BurstBufferState - } - if !IsNil(o.Cluster) { - toSerialize["cluster"] = o.Cluster - } - if !IsNil(o.ClusterFeatures) { - toSerialize["cluster_features"] = o.ClusterFeatures - } - if !IsNil(o.Command) { - toSerialize["command"] = o.Command - } - if !IsNil(o.Comment) { - toSerialize["comment"] = o.Comment - } - if !IsNil(o.Contiguous) { - toSerialize["contiguous"] = o.Contiguous - } - if !IsNil(o.CoreSpec) { - toSerialize["core_spec"] = o.CoreSpec - } - if !IsNil(o.ThreadSpec) { - toSerialize["thread_spec"] = o.ThreadSpec - } - if !IsNil(o.CoresPerSocket) { - toSerialize["cores_per_socket"] = o.CoresPerSocket - } - if !IsNil(o.BillableTres) { - toSerialize["billable_tres"] = o.BillableTres - } - if !IsNil(o.CpusPerTask) { - toSerialize["cpus_per_task"] = o.CpusPerTask - } - if !IsNil(o.CpuFrequencyMinimum) { - toSerialize["cpu_frequency_minimum"] = o.CpuFrequencyMinimum - } - if !IsNil(o.CpuFrequencyMaximum) { - toSerialize["cpu_frequency_maximum"] = o.CpuFrequencyMaximum - } - if !IsNil(o.CpuFrequencyGovernor) { - toSerialize["cpu_frequency_governor"] = o.CpuFrequencyGovernor - } - if !IsNil(o.CpusPerTres) { - toSerialize["cpus_per_tres"] = o.CpusPerTres - } - if !IsNil(o.Deadline) { - toSerialize["deadline"] = o.Deadline - } - if !IsNil(o.DelayBoot) { - toSerialize["delay_boot"] = o.DelayBoot - } - if !IsNil(o.Dependency) { - toSerialize["dependency"] = o.Dependency - } - if !IsNil(o.DerivedExitCode) { - toSerialize["derived_exit_code"] = o.DerivedExitCode - } - if !IsNil(o.EligibleTime) { - toSerialize["eligible_time"] = o.EligibleTime - } - if !IsNil(o.EndTime) { - toSerialize["end_time"] = o.EndTime - } - if !IsNil(o.ExcludedNodes) { - toSerialize["excluded_nodes"] = o.ExcludedNodes - } - if !IsNil(o.ExitCode) { - toSerialize["exit_code"] = o.ExitCode - } - if !IsNil(o.Features) { - toSerialize["features"] = o.Features - } - if !IsNil(o.FederationOrigin) { - toSerialize["federation_origin"] = o.FederationOrigin - } - if !IsNil(o.FederationSiblingsActive) { - toSerialize["federation_siblings_active"] = o.FederationSiblingsActive - } - if !IsNil(o.FederationSiblingsViable) { - toSerialize["federation_siblings_viable"] = o.FederationSiblingsViable - } - if !IsNil(o.GresDetail) { - toSerialize["gres_detail"] = o.GresDetail - } - if !IsNil(o.GroupId) { - toSerialize["group_id"] = o.GroupId - } - if !IsNil(o.JobId) { - toSerialize["job_id"] = o.JobId - } - if !IsNil(o.JobResources) { - toSerialize["job_resources"] = o.JobResources - } - if !IsNil(o.JobState) { - toSerialize["job_state"] = o.JobState - } - if !IsNil(o.LastSchedEvaluation) { - toSerialize["last_sched_evaluation"] = o.LastSchedEvaluation - } - if !IsNil(o.Licenses) { - toSerialize["licenses"] = o.Licenses - } - if !IsNil(o.MaxCpus) { - toSerialize["max_cpus"] = o.MaxCpus - } - if !IsNil(o.MaxNodes) { - toSerialize["max_nodes"] = o.MaxNodes - } - if !IsNil(o.McsLabel) { - toSerialize["mcs_label"] = o.McsLabel - } - if !IsNil(o.MemoryPerTres) { - toSerialize["memory_per_tres"] = o.MemoryPerTres - } - if !IsNil(o.Name) { - toSerialize["name"] = o.Name - } - if !IsNil(o.Nodes) { - toSerialize["nodes"] = o.Nodes - } - if !IsNil(o.Nice) { - toSerialize["nice"] = o.Nice - } - if !IsNil(o.TasksPerCore) { - toSerialize["tasks_per_core"] = o.TasksPerCore - } - if !IsNil(o.TasksPerSocket) { - toSerialize["tasks_per_socket"] = o.TasksPerSocket - } - if !IsNil(o.TasksPerBoard) { - toSerialize["tasks_per_board"] = o.TasksPerBoard - } - if !IsNil(o.Cpus) { - toSerialize["cpus"] = o.Cpus - } - if !IsNil(o.NodeCount) { - toSerialize["node_count"] = o.NodeCount - } - if !IsNil(o.Tasks) { - toSerialize["tasks"] = o.Tasks - } - if !IsNil(o.HetJobId) { - toSerialize["het_job_id"] = o.HetJobId - } - if !IsNil(o.HetJobIdSet) { - toSerialize["het_job_id_set"] = o.HetJobIdSet - } - if !IsNil(o.HetJobOffset) { - toSerialize["het_job_offset"] = o.HetJobOffset - } - if !IsNil(o.Partition) { - toSerialize["partition"] = o.Partition - } - if !IsNil(o.MemoryPerNode) { - toSerialize["memory_per_node"] = o.MemoryPerNode - } - if !IsNil(o.MemoryPerCpu) { - toSerialize["memory_per_cpu"] = o.MemoryPerCpu - } - if !IsNil(o.MinimumCpusPerNode) { - toSerialize["minimum_cpus_per_node"] = o.MinimumCpusPerNode - } - if !IsNil(o.MinimumTmpDiskPerNode) { - toSerialize["minimum_tmp_disk_per_node"] = o.MinimumTmpDiskPerNode - } - if !IsNil(o.PreemptTime) { - toSerialize["preempt_time"] = o.PreemptTime - } - if !IsNil(o.PreSusTime) { - toSerialize["pre_sus_time"] = o.PreSusTime - } - if !IsNil(o.Priority) { - toSerialize["priority"] = o.Priority - } - if !IsNil(o.Profile) { - toSerialize["profile"] = o.Profile - } - if !IsNil(o.Qos) { - toSerialize["qos"] = o.Qos - } - if !IsNil(o.Reboot) { - toSerialize["reboot"] = o.Reboot - } - if !IsNil(o.RequiredNodes) { - toSerialize["required_nodes"] = o.RequiredNodes - } - if !IsNil(o.Requeue) { - toSerialize["requeue"] = o.Requeue - } - if !IsNil(o.ResizeTime) { - toSerialize["resize_time"] = o.ResizeTime - } - if !IsNil(o.RestartCnt) { - toSerialize["restart_cnt"] = o.RestartCnt - } - if !IsNil(o.ResvName) { - toSerialize["resv_name"] = o.ResvName - } - if !IsNil(o.Shared) { - toSerialize["shared"] = o.Shared - } - if !IsNil(o.ShowFlags) { - toSerialize["show_flags"] = o.ShowFlags - } - if !IsNil(o.SocketsPerBoard) { - toSerialize["sockets_per_board"] = o.SocketsPerBoard - } - if !IsNil(o.SocketsPerNode) { - toSerialize["sockets_per_node"] = o.SocketsPerNode - } - if !IsNil(o.StartTime) { - toSerialize["start_time"] = o.StartTime - } - if !IsNil(o.StateDescription) { - toSerialize["state_description"] = o.StateDescription - } - if !IsNil(o.StateReason) { - toSerialize["state_reason"] = o.StateReason - } - if !IsNil(o.StandardError) { - toSerialize["standard_error"] = o.StandardError - } - if !IsNil(o.StandardInput) { - toSerialize["standard_input"] = o.StandardInput - } - if !IsNil(o.StandardOutput) { - toSerialize["standard_output"] = o.StandardOutput - } - if !IsNil(o.SubmitTime) { - toSerialize["submit_time"] = o.SubmitTime - } - if !IsNil(o.SuspendTime) { - toSerialize["suspend_time"] = o.SuspendTime - } - if !IsNil(o.SystemComment) { - toSerialize["system_comment"] = o.SystemComment - } - if !IsNil(o.TimeLimit) { - toSerialize["time_limit"] = o.TimeLimit - } - if !IsNil(o.TimeMinimum) { - toSerialize["time_minimum"] = o.TimeMinimum - } - if !IsNil(o.ThreadsPerCore) { - toSerialize["threads_per_core"] = o.ThreadsPerCore - } - if !IsNil(o.TresBind) { - toSerialize["tres_bind"] = o.TresBind - } - if !IsNil(o.TresFreq) { - toSerialize["tres_freq"] = o.TresFreq - } - if !IsNil(o.TresPerJob) { - toSerialize["tres_per_job"] = o.TresPerJob - } - if !IsNil(o.TresPerNode) { - toSerialize["tres_per_node"] = o.TresPerNode - } - if !IsNil(o.TresPerSocket) { - toSerialize["tres_per_socket"] = o.TresPerSocket - } - if !IsNil(o.TresPerTask) { - toSerialize["tres_per_task"] = o.TresPerTask - } - if !IsNil(o.TresReqStr) { - toSerialize["tres_req_str"] = o.TresReqStr - } - if !IsNil(o.TresAllocStr) { - toSerialize["tres_alloc_str"] = o.TresAllocStr - } - if !IsNil(o.UserId) { - toSerialize["user_id"] = o.UserId - } - if !IsNil(o.UserName) { - toSerialize["user_name"] = o.UserName - } - if !IsNil(o.Wckey) { - toSerialize["wckey"] = o.Wckey - } - if !IsNil(o.CurrentWorkingDirectory) { - toSerialize["current_working_directory"] = o.CurrentWorkingDirectory - } - return toSerialize, nil -} - -type NullableV0037JobResponseProperties struct { - value *V0037JobResponseProperties - isSet bool -} - -func (v NullableV0037JobResponseProperties) Get() *V0037JobResponseProperties { - return v.value -} - -func (v *NullableV0037JobResponseProperties) Set(val *V0037JobResponseProperties) { - v.value = val - v.isSet = true -} - -func (v NullableV0037JobResponseProperties) IsSet() bool { - return v.isSet -} - -func (v *NullableV0037JobResponseProperties) Unset() { - v.value = nil - v.isSet = false -} - -func NewNullableV0037JobResponseProperties(val *V0037JobResponseProperties) *NullableV0037JobResponseProperties { - return &NullableV0037JobResponseProperties{value: val, isSet: true} -} - -func (v NullableV0037JobResponseProperties) MarshalJSON() ([]byte, error) { - return json.Marshal(v.value) -} - -func (v *NullableV0037JobResponseProperties) UnmarshalJSON(src []byte) error { - v.isSet = true - return json.Unmarshal(src, &v.value) -} - - diff --git a/internal/api/0.0.37/model_v0_0_37_job_submission.go b/internal/api/0.0.37/model_v0_0_37_job_submission.go deleted file mode 100644 index e89de8a..0000000 --- a/internal/api/0.0.37/model_v0_0_37_job_submission.go +++ /dev/null @@ -1,192 +0,0 @@ -/* -Slurm Rest API - -API to access and control Slurm. - -API version: 0.0.37 -Contact: sales@schedmd.com -*/ - -// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. - -package openapi - -import ( - "encoding/json" -) - -// checks if the V0037JobSubmission type satisfies the MappedNullable interface at compile time -var _ MappedNullable = &V0037JobSubmission{} - -// V0037JobSubmission struct for V0037JobSubmission -type V0037JobSubmission struct { - // Executable script (full contents) to run in batch step - Script string `json:"script"` - Job *V0037JobProperties `json:"job,omitempty"` - // Properties of an HetJob - Jobs []V0037JobProperties `json:"jobs,omitempty"` -} - -// NewV0037JobSubmission instantiates a new V0037JobSubmission object -// This constructor will assign default values to properties that have it defined, -// and makes sure properties required by API are set, but the set of arguments -// will change when the set of required properties is changed -func NewV0037JobSubmission(script string) *V0037JobSubmission { - this := V0037JobSubmission{} - this.Script = script - return &this -} - -// NewV0037JobSubmissionWithDefaults instantiates a new V0037JobSubmission object -// This constructor will only assign default values to properties that have it defined, -// but it doesn't guarantee that properties required by API are set -func NewV0037JobSubmissionWithDefaults() *V0037JobSubmission { - this := V0037JobSubmission{} - return &this -} - -// GetScript returns the Script field value -func (o *V0037JobSubmission) GetScript() string { - if o == nil { - var ret string - return ret - } - - return o.Script -} - -// GetScriptOk returns a tuple with the Script field value -// and a boolean to check if the value has been set. -func (o *V0037JobSubmission) GetScriptOk() (*string, bool) { - if o == nil { - return nil, false - } - return &o.Script, true -} - -// SetScript sets field value -func (o *V0037JobSubmission) SetScript(v string) { - o.Script = v -} - -// GetJob returns the Job field value if set, zero value otherwise. -func (o *V0037JobSubmission) GetJob() V0037JobProperties { - if o == nil || IsNil(o.Job) { - var ret V0037JobProperties - return ret - } - return *o.Job -} - -// GetJobOk returns a tuple with the Job field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobSubmission) GetJobOk() (*V0037JobProperties, bool) { - if o == nil || IsNil(o.Job) { - return nil, false - } - return o.Job, true -} - -// HasJob returns a boolean if a field has been set. -func (o *V0037JobSubmission) HasJob() bool { - if o != nil && !IsNil(o.Job) { - return true - } - - return false -} - -// SetJob gets a reference to the given V0037JobProperties and assigns it to the Job field. -func (o *V0037JobSubmission) SetJob(v V0037JobProperties) { - o.Job = &v -} - -// GetJobs returns the Jobs field value if set, zero value otherwise. -func (o *V0037JobSubmission) GetJobs() []V0037JobProperties { - if o == nil || IsNil(o.Jobs) { - var ret []V0037JobProperties - return ret - } - return o.Jobs -} - -// GetJobsOk returns a tuple with the Jobs field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobSubmission) GetJobsOk() ([]V0037JobProperties, bool) { - if o == nil || IsNil(o.Jobs) { - return nil, false - } - return o.Jobs, true -} - -// HasJobs returns a boolean if a field has been set. -func (o *V0037JobSubmission) HasJobs() bool { - if o != nil && !IsNil(o.Jobs) { - return true - } - - return false -} - -// SetJobs gets a reference to the given []V0037JobProperties and assigns it to the Jobs field. -func (o *V0037JobSubmission) SetJobs(v []V0037JobProperties) { - o.Jobs = v -} - -func (o V0037JobSubmission) MarshalJSON() ([]byte, error) { - toSerialize,err := o.ToMap() - if err != nil { - return []byte{}, err - } - return json.Marshal(toSerialize) -} - -func (o V0037JobSubmission) ToMap() (map[string]interface{}, error) { - toSerialize := map[string]interface{}{} - toSerialize["script"] = o.Script - if !IsNil(o.Job) { - toSerialize["job"] = o.Job - } - if !IsNil(o.Jobs) { - toSerialize["jobs"] = o.Jobs - } - return toSerialize, nil -} - -type NullableV0037JobSubmission struct { - value *V0037JobSubmission - isSet bool -} - -func (v NullableV0037JobSubmission) Get() *V0037JobSubmission { - return v.value -} - -func (v *NullableV0037JobSubmission) Set(val *V0037JobSubmission) { - v.value = val - v.isSet = true -} - -func (v NullableV0037JobSubmission) IsSet() bool { - return v.isSet -} - -func (v *NullableV0037JobSubmission) Unset() { - v.value = nil - v.isSet = false -} - -func NewNullableV0037JobSubmission(val *V0037JobSubmission) *NullableV0037JobSubmission { - return &NullableV0037JobSubmission{value: val, isSet: true} -} - -func (v NullableV0037JobSubmission) MarshalJSON() ([]byte, error) { - return json.Marshal(v.value) -} - -func (v *NullableV0037JobSubmission) UnmarshalJSON(src []byte) error { - v.isSet = true - return json.Unmarshal(src, &v.value) -} - - diff --git a/internal/api/0.0.37/model_v0_0_37_job_submission_response.go b/internal/api/0.0.37/model_v0_0_37_job_submission_response.go deleted file mode 100644 index 7181c3f..0000000 --- a/internal/api/0.0.37/model_v0_0_37_job_submission_response.go +++ /dev/null @@ -1,239 +0,0 @@ -/* -Slurm Rest API - -API to access and control Slurm. - -API version: 0.0.37 -Contact: sales@schedmd.com -*/ - -// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. - -package openapi - -import ( - "encoding/json" -) - -// checks if the V0037JobSubmissionResponse type satisfies the MappedNullable interface at compile time -var _ MappedNullable = &V0037JobSubmissionResponse{} - -// V0037JobSubmissionResponse struct for V0037JobSubmissionResponse -type V0037JobSubmissionResponse struct { - // slurm errors - Errors []V0037Error `json:"errors,omitempty"` - // new job ID - JobId *int32 `json:"job_id,omitempty"` - // new job step ID - StepId *string `json:"step_id,omitempty"` - // Message to user from job_submit plugin - JobSubmitUserMsg *string `json:"job_submit_user_msg,omitempty"` -} - -// NewV0037JobSubmissionResponse instantiates a new V0037JobSubmissionResponse object -// This constructor will assign default values to properties that have it defined, -// and makes sure properties required by API are set, but the set of arguments -// will change when the set of required properties is changed -func NewV0037JobSubmissionResponse() *V0037JobSubmissionResponse { - this := V0037JobSubmissionResponse{} - return &this -} - -// NewV0037JobSubmissionResponseWithDefaults instantiates a new V0037JobSubmissionResponse object -// This constructor will only assign default values to properties that have it defined, -// but it doesn't guarantee that properties required by API are set -func NewV0037JobSubmissionResponseWithDefaults() *V0037JobSubmissionResponse { - this := V0037JobSubmissionResponse{} - return &this -} - -// GetErrors returns the Errors field value if set, zero value otherwise. -func (o *V0037JobSubmissionResponse) GetErrors() []V0037Error { - if o == nil || IsNil(o.Errors) { - var ret []V0037Error - return ret - } - return o.Errors -} - -// GetErrorsOk returns a tuple with the Errors field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobSubmissionResponse) GetErrorsOk() ([]V0037Error, bool) { - if o == nil || IsNil(o.Errors) { - return nil, false - } - return o.Errors, true -} - -// HasErrors returns a boolean if a field has been set. -func (o *V0037JobSubmissionResponse) HasErrors() bool { - if o != nil && !IsNil(o.Errors) { - return true - } - - return false -} - -// SetErrors gets a reference to the given []V0037Error and assigns it to the Errors field. -func (o *V0037JobSubmissionResponse) SetErrors(v []V0037Error) { - o.Errors = v -} - -// GetJobId returns the JobId field value if set, zero value otherwise. -func (o *V0037JobSubmissionResponse) GetJobId() int32 { - if o == nil || IsNil(o.JobId) { - var ret int32 - return ret - } - return *o.JobId -} - -// GetJobIdOk returns a tuple with the JobId field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobSubmissionResponse) GetJobIdOk() (*int32, bool) { - if o == nil || IsNil(o.JobId) { - return nil, false - } - return o.JobId, true -} - -// HasJobId returns a boolean if a field has been set. -func (o *V0037JobSubmissionResponse) HasJobId() bool { - if o != nil && !IsNil(o.JobId) { - return true - } - - return false -} - -// SetJobId gets a reference to the given int32 and assigns it to the JobId field. -func (o *V0037JobSubmissionResponse) SetJobId(v int32) { - o.JobId = &v -} - -// GetStepId returns the StepId field value if set, zero value otherwise. -func (o *V0037JobSubmissionResponse) GetStepId() string { - if o == nil || IsNil(o.StepId) { - var ret string - return ret - } - return *o.StepId -} - -// GetStepIdOk returns a tuple with the StepId field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobSubmissionResponse) GetStepIdOk() (*string, bool) { - if o == nil || IsNil(o.StepId) { - return nil, false - } - return o.StepId, true -} - -// HasStepId returns a boolean if a field has been set. -func (o *V0037JobSubmissionResponse) HasStepId() bool { - if o != nil && !IsNil(o.StepId) { - return true - } - - return false -} - -// SetStepId gets a reference to the given string and assigns it to the StepId field. -func (o *V0037JobSubmissionResponse) SetStepId(v string) { - o.StepId = &v -} - -// GetJobSubmitUserMsg returns the JobSubmitUserMsg field value if set, zero value otherwise. -func (o *V0037JobSubmissionResponse) GetJobSubmitUserMsg() string { - if o == nil || IsNil(o.JobSubmitUserMsg) { - var ret string - return ret - } - return *o.JobSubmitUserMsg -} - -// GetJobSubmitUserMsgOk returns a tuple with the JobSubmitUserMsg field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobSubmissionResponse) GetJobSubmitUserMsgOk() (*string, bool) { - if o == nil || IsNil(o.JobSubmitUserMsg) { - return nil, false - } - return o.JobSubmitUserMsg, true -} - -// HasJobSubmitUserMsg returns a boolean if a field has been set. -func (o *V0037JobSubmissionResponse) HasJobSubmitUserMsg() bool { - if o != nil && !IsNil(o.JobSubmitUserMsg) { - return true - } - - return false -} - -// SetJobSubmitUserMsg gets a reference to the given string and assigns it to the JobSubmitUserMsg field. -func (o *V0037JobSubmissionResponse) SetJobSubmitUserMsg(v string) { - o.JobSubmitUserMsg = &v -} - -func (o V0037JobSubmissionResponse) MarshalJSON() ([]byte, error) { - toSerialize,err := o.ToMap() - if err != nil { - return []byte{}, err - } - return json.Marshal(toSerialize) -} - -func (o V0037JobSubmissionResponse) ToMap() (map[string]interface{}, error) { - toSerialize := map[string]interface{}{} - if !IsNil(o.Errors) { - toSerialize["errors"] = o.Errors - } - if !IsNil(o.JobId) { - toSerialize["job_id"] = o.JobId - } - if !IsNil(o.StepId) { - toSerialize["step_id"] = o.StepId - } - if !IsNil(o.JobSubmitUserMsg) { - toSerialize["job_submit_user_msg"] = o.JobSubmitUserMsg - } - return toSerialize, nil -} - -type NullableV0037JobSubmissionResponse struct { - value *V0037JobSubmissionResponse - isSet bool -} - -func (v NullableV0037JobSubmissionResponse) Get() *V0037JobSubmissionResponse { - return v.value -} - -func (v *NullableV0037JobSubmissionResponse) Set(val *V0037JobSubmissionResponse) { - v.value = val - v.isSet = true -} - -func (v NullableV0037JobSubmissionResponse) IsSet() bool { - return v.isSet -} - -func (v *NullableV0037JobSubmissionResponse) Unset() { - v.value = nil - v.isSet = false -} - -func NewNullableV0037JobSubmissionResponse(val *V0037JobSubmissionResponse) *NullableV0037JobSubmissionResponse { - return &NullableV0037JobSubmissionResponse{value: val, isSet: true} -} - -func (v NullableV0037JobSubmissionResponse) MarshalJSON() ([]byte, error) { - return json.Marshal(v.value) -} - -func (v *NullableV0037JobSubmissionResponse) UnmarshalJSON(src []byte) error { - v.isSet = true - return json.Unmarshal(src, &v.value) -} - - diff --git a/internal/api/0.0.37/model_v0_0_37_jobs_response.go b/internal/api/0.0.37/model_v0_0_37_jobs_response.go deleted file mode 100644 index 8efe81b..0000000 --- a/internal/api/0.0.37/model_v0_0_37_jobs_response.go +++ /dev/null @@ -1,165 +0,0 @@ -/* -Slurm Rest API - -API to access and control Slurm. - -API version: 0.0.37 -Contact: sales@schedmd.com -*/ - -// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. - -package openapi - -import ( - "encoding/json" -) - -// checks if the V0037JobsResponse type satisfies the MappedNullable interface at compile time -var _ MappedNullable = &V0037JobsResponse{} - -// V0037JobsResponse struct for V0037JobsResponse -type V0037JobsResponse struct { - // slurm errors - Errors []V0037Error `json:"errors,omitempty"` - // job descriptions - Jobs []V0037JobResponseProperties `json:"jobs,omitempty"` -} - -// NewV0037JobsResponse instantiates a new V0037JobsResponse object -// This constructor will assign default values to properties that have it defined, -// and makes sure properties required by API are set, but the set of arguments -// will change when the set of required properties is changed -func NewV0037JobsResponse() *V0037JobsResponse { - this := V0037JobsResponse{} - return &this -} - -// NewV0037JobsResponseWithDefaults instantiates a new V0037JobsResponse object -// This constructor will only assign default values to properties that have it defined, -// but it doesn't guarantee that properties required by API are set -func NewV0037JobsResponseWithDefaults() *V0037JobsResponse { - this := V0037JobsResponse{} - return &this -} - -// GetErrors returns the Errors field value if set, zero value otherwise. -func (o *V0037JobsResponse) GetErrors() []V0037Error { - if o == nil || IsNil(o.Errors) { - var ret []V0037Error - return ret - } - return o.Errors -} - -// GetErrorsOk returns a tuple with the Errors field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobsResponse) GetErrorsOk() ([]V0037Error, bool) { - if o == nil || IsNil(o.Errors) { - return nil, false - } - return o.Errors, true -} - -// HasErrors returns a boolean if a field has been set. -func (o *V0037JobsResponse) HasErrors() bool { - if o != nil && !IsNil(o.Errors) { - return true - } - - return false -} - -// SetErrors gets a reference to the given []V0037Error and assigns it to the Errors field. -func (o *V0037JobsResponse) SetErrors(v []V0037Error) { - o.Errors = v -} - -// GetJobs returns the Jobs field value if set, zero value otherwise. -func (o *V0037JobsResponse) GetJobs() []V0037JobResponseProperties { - if o == nil || IsNil(o.Jobs) { - var ret []V0037JobResponseProperties - return ret - } - return o.Jobs -} - -// GetJobsOk returns a tuple with the Jobs field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037JobsResponse) GetJobsOk() ([]V0037JobResponseProperties, bool) { - if o == nil || IsNil(o.Jobs) { - return nil, false - } - return o.Jobs, true -} - -// HasJobs returns a boolean if a field has been set. -func (o *V0037JobsResponse) HasJobs() bool { - if o != nil && !IsNil(o.Jobs) { - return true - } - - return false -} - -// SetJobs gets a reference to the given []V0037JobResponseProperties and assigns it to the Jobs field. -func (o *V0037JobsResponse) SetJobs(v []V0037JobResponseProperties) { - o.Jobs = v -} - -func (o V0037JobsResponse) MarshalJSON() ([]byte, error) { - toSerialize,err := o.ToMap() - if err != nil { - return []byte{}, err - } - return json.Marshal(toSerialize) -} - -func (o V0037JobsResponse) ToMap() (map[string]interface{}, error) { - toSerialize := map[string]interface{}{} - if !IsNil(o.Errors) { - toSerialize["errors"] = o.Errors - } - if !IsNil(o.Jobs) { - toSerialize["jobs"] = o.Jobs - } - return toSerialize, nil -} - -type NullableV0037JobsResponse struct { - value *V0037JobsResponse - isSet bool -} - -func (v NullableV0037JobsResponse) Get() *V0037JobsResponse { - return v.value -} - -func (v *NullableV0037JobsResponse) Set(val *V0037JobsResponse) { - v.value = val - v.isSet = true -} - -func (v NullableV0037JobsResponse) IsSet() bool { - return v.isSet -} - -func (v *NullableV0037JobsResponse) Unset() { - v.value = nil - v.isSet = false -} - -func NewNullableV0037JobsResponse(val *V0037JobsResponse) *NullableV0037JobsResponse { - return &NullableV0037JobsResponse{value: val, isSet: true} -} - -func (v NullableV0037JobsResponse) MarshalJSON() ([]byte, error) { - return json.Marshal(v.value) -} - -func (v *NullableV0037JobsResponse) UnmarshalJSON(src []byte) error { - v.isSet = true - return json.Unmarshal(src, &v.value) -} - - diff --git a/internal/api/0.0.37/model_v0_0_37_node.go b/internal/api/0.0.37/model_v0_0_37_node.go deleted file mode 100644 index 69f26a2..0000000 --- a/internal/api/0.0.37/model_v0_0_37_node.go +++ /dev/null @@ -1,1645 +0,0 @@ -/* -Slurm Rest API - -API to access and control Slurm. - -API version: 0.0.37 -Contact: sales@schedmd.com -*/ - -// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. - -package openapi - -import ( - "encoding/json" -) - -// checks if the V0037Node type satisfies the MappedNullable interface at compile time -var _ MappedNullable = &V0037Node{} - -// V0037Node struct for V0037Node -type V0037Node struct { - // computer architecture - Architecture *string `json:"architecture,omitempty"` - // BcastAddr - BurstbufferNetworkAddress *string `json:"burstbuffer_network_address,omitempty"` - // total number of boards per node - Boards *int32 `json:"boards,omitempty"` - // timestamp of node boot - BootTime *int64 `json:"boot_time,omitempty"` - // number of cores per socket - Cores *int32 `json:"cores,omitempty"` - // Default task binding - CpuBinding *int32 `json:"cpu_binding,omitempty"` - // CPU load * 100 - CpuLoad *int64 `json:"cpu_load,omitempty"` - // free memory in MiB - FreeMemory *int32 `json:"free_memory,omitempty"` - // configured count of cpus running on the node - Cpus *int32 `json:"cpus,omitempty"` - // - Features *string `json:"features,omitempty"` - // list of a node's available features - ActiveFeatures *string `json:"active_features,omitempty"` - // list of a node's generic resources - Gres *string `json:"gres,omitempty"` - // list of drained GRES - GresDrained *string `json:"gres_drained,omitempty"` - // list of GRES in current use - GresUsed *string `json:"gres_used,omitempty"` - // mcs label if mcs plugin in use - McsLabel *string `json:"mcs_label,omitempty"` - // node name to slurm - Name *string `json:"name,omitempty"` - // state after reboot - NextStateAfterReboot *string `json:"next_state_after_reboot,omitempty"` - // node state flags - NextStateAfterRebootFlags []string `json:"next_state_after_reboot_flags,omitempty"` - // state after reboot - Address *string `json:"address,omitempty"` - // node's hostname - Hostname *string `json:"hostname,omitempty"` - // current node state - State *string `json:"state,omitempty"` - // node state flags - StateFlags []string `json:"state_flags,omitempty"` - // operating system - OperatingSystem *string `json:"operating_system,omitempty"` - // User allowed to use this node - Owner *string `json:"owner,omitempty"` - // assigned partitions - Partitions []string `json:"partitions,omitempty"` - // TCP port number of the slurmd - Port *int32 `json:"port,omitempty"` - // configured MB of real memory on the node - RealMemory *int32 `json:"real_memory,omitempty"` - // reason for node being DOWN or DRAINING - Reason *string `json:"reason,omitempty"` - // Time stamp when reason was set - ReasonChangedAt *int32 `json:"reason_changed_at,omitempty"` - // User that set the reason - ReasonSetByUser *string `json:"reason_set_by_user,omitempty"` - // timestamp of slurmd startup - SlurmdStartTime *int64 `json:"slurmd_start_time,omitempty"` - // total number of sockets per node - Sockets *int32 `json:"sockets,omitempty"` - // number of threads per core - Threads *int32 `json:"threads,omitempty"` - // configured MB of total disk in TMP_FS - TemporaryDisk *int32 `json:"temporary_disk,omitempty"` - // arbitrary priority of node for scheduling - Weight *int32 `json:"weight,omitempty"` - // TRES on node - Tres *string `json:"tres,omitempty"` - // TRES used on node - TresUsed *string `json:"tres_used,omitempty"` - // TRES weight used on node - TresWeighted *float64 `json:"tres_weighted,omitempty"` - // Slurmd version - SlurmdVersion *string `json:"slurmd_version,omitempty"` - // Allocated CPUs - AllocCpus *int64 `json:"alloc_cpus,omitempty"` - // Idle CPUs - IdleCpus *int64 `json:"idle_cpus,omitempty"` - // Allocated memory (MB) - AllocMemory *int64 `json:"alloc_memory,omitempty"` -} - -// NewV0037Node instantiates a new V0037Node object -// This constructor will assign default values to properties that have it defined, -// and makes sure properties required by API are set, but the set of arguments -// will change when the set of required properties is changed -func NewV0037Node() *V0037Node { - this := V0037Node{} - return &this -} - -// NewV0037NodeWithDefaults instantiates a new V0037Node object -// This constructor will only assign default values to properties that have it defined, -// but it doesn't guarantee that properties required by API are set -func NewV0037NodeWithDefaults() *V0037Node { - this := V0037Node{} - return &this -} - -// GetArchitecture returns the Architecture field value if set, zero value otherwise. -func (o *V0037Node) GetArchitecture() string { - if o == nil || IsNil(o.Architecture) { - var ret string - return ret - } - return *o.Architecture -} - -// GetArchitectureOk returns a tuple with the Architecture field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetArchitectureOk() (*string, bool) { - if o == nil || IsNil(o.Architecture) { - return nil, false - } - return o.Architecture, true -} - -// HasArchitecture returns a boolean if a field has been set. -func (o *V0037Node) HasArchitecture() bool { - if o != nil && !IsNil(o.Architecture) { - return true - } - - return false -} - -// SetArchitecture gets a reference to the given string and assigns it to the Architecture field. -func (o *V0037Node) SetArchitecture(v string) { - o.Architecture = &v -} - -// GetBurstbufferNetworkAddress returns the BurstbufferNetworkAddress field value if set, zero value otherwise. -func (o *V0037Node) GetBurstbufferNetworkAddress() string { - if o == nil || IsNil(o.BurstbufferNetworkAddress) { - var ret string - return ret - } - return *o.BurstbufferNetworkAddress -} - -// GetBurstbufferNetworkAddressOk returns a tuple with the BurstbufferNetworkAddress field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetBurstbufferNetworkAddressOk() (*string, bool) { - if o == nil || IsNil(o.BurstbufferNetworkAddress) { - return nil, false - } - return o.BurstbufferNetworkAddress, true -} - -// HasBurstbufferNetworkAddress returns a boolean if a field has been set. -func (o *V0037Node) HasBurstbufferNetworkAddress() bool { - if o != nil && !IsNil(o.BurstbufferNetworkAddress) { - return true - } - - return false -} - -// SetBurstbufferNetworkAddress gets a reference to the given string and assigns it to the BurstbufferNetworkAddress field. -func (o *V0037Node) SetBurstbufferNetworkAddress(v string) { - o.BurstbufferNetworkAddress = &v -} - -// GetBoards returns the Boards field value if set, zero value otherwise. -func (o *V0037Node) GetBoards() int32 { - if o == nil || IsNil(o.Boards) { - var ret int32 - return ret - } - return *o.Boards -} - -// GetBoardsOk returns a tuple with the Boards field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetBoardsOk() (*int32, bool) { - if o == nil || IsNil(o.Boards) { - return nil, false - } - return o.Boards, true -} - -// HasBoards returns a boolean if a field has been set. -func (o *V0037Node) HasBoards() bool { - if o != nil && !IsNil(o.Boards) { - return true - } - - return false -} - -// SetBoards gets a reference to the given int32 and assigns it to the Boards field. -func (o *V0037Node) SetBoards(v int32) { - o.Boards = &v -} - -// GetBootTime returns the BootTime field value if set, zero value otherwise. -func (o *V0037Node) GetBootTime() int64 { - if o == nil || IsNil(o.BootTime) { - var ret int64 - return ret - } - return *o.BootTime -} - -// GetBootTimeOk returns a tuple with the BootTime field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetBootTimeOk() (*int64, bool) { - if o == nil || IsNil(o.BootTime) { - return nil, false - } - return o.BootTime, true -} - -// HasBootTime returns a boolean if a field has been set. -func (o *V0037Node) HasBootTime() bool { - if o != nil && !IsNil(o.BootTime) { - return true - } - - return false -} - -// SetBootTime gets a reference to the given int64 and assigns it to the BootTime field. -func (o *V0037Node) SetBootTime(v int64) { - o.BootTime = &v -} - -// GetCores returns the Cores field value if set, zero value otherwise. -func (o *V0037Node) GetCores() int32 { - if o == nil || IsNil(o.Cores) { - var ret int32 - return ret - } - return *o.Cores -} - -// GetCoresOk returns a tuple with the Cores field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetCoresOk() (*int32, bool) { - if o == nil || IsNil(o.Cores) { - return nil, false - } - return o.Cores, true -} - -// HasCores returns a boolean if a field has been set. -func (o *V0037Node) HasCores() bool { - if o != nil && !IsNil(o.Cores) { - return true - } - - return false -} - -// SetCores gets a reference to the given int32 and assigns it to the Cores field. -func (o *V0037Node) SetCores(v int32) { - o.Cores = &v -} - -// GetCpuBinding returns the CpuBinding field value if set, zero value otherwise. -func (o *V0037Node) GetCpuBinding() int32 { - if o == nil || IsNil(o.CpuBinding) { - var ret int32 - return ret - } - return *o.CpuBinding -} - -// GetCpuBindingOk returns a tuple with the CpuBinding field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetCpuBindingOk() (*int32, bool) { - if o == nil || IsNil(o.CpuBinding) { - return nil, false - } - return o.CpuBinding, true -} - -// HasCpuBinding returns a boolean if a field has been set. -func (o *V0037Node) HasCpuBinding() bool { - if o != nil && !IsNil(o.CpuBinding) { - return true - } - - return false -} - -// SetCpuBinding gets a reference to the given int32 and assigns it to the CpuBinding field. -func (o *V0037Node) SetCpuBinding(v int32) { - o.CpuBinding = &v -} - -// GetCpuLoad returns the CpuLoad field value if set, zero value otherwise. -func (o *V0037Node) GetCpuLoad() int64 { - if o == nil || IsNil(o.CpuLoad) { - var ret int64 - return ret - } - return *o.CpuLoad -} - -// GetCpuLoadOk returns a tuple with the CpuLoad field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetCpuLoadOk() (*int64, bool) { - if o == nil || IsNil(o.CpuLoad) { - return nil, false - } - return o.CpuLoad, true -} - -// HasCpuLoad returns a boolean if a field has been set. -func (o *V0037Node) HasCpuLoad() bool { - if o != nil && !IsNil(o.CpuLoad) { - return true - } - - return false -} - -// SetCpuLoad gets a reference to the given int64 and assigns it to the CpuLoad field. -func (o *V0037Node) SetCpuLoad(v int64) { - o.CpuLoad = &v -} - -// GetFreeMemory returns the FreeMemory field value if set, zero value otherwise. -func (o *V0037Node) GetFreeMemory() int32 { - if o == nil || IsNil(o.FreeMemory) { - var ret int32 - return ret - } - return *o.FreeMemory -} - -// GetFreeMemoryOk returns a tuple with the FreeMemory field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetFreeMemoryOk() (*int32, bool) { - if o == nil || IsNil(o.FreeMemory) { - return nil, false - } - return o.FreeMemory, true -} - -// HasFreeMemory returns a boolean if a field has been set. -func (o *V0037Node) HasFreeMemory() bool { - if o != nil && !IsNil(o.FreeMemory) { - return true - } - - return false -} - -// SetFreeMemory gets a reference to the given int32 and assigns it to the FreeMemory field. -func (o *V0037Node) SetFreeMemory(v int32) { - o.FreeMemory = &v -} - -// GetCpus returns the Cpus field value if set, zero value otherwise. -func (o *V0037Node) GetCpus() int32 { - if o == nil || IsNil(o.Cpus) { - var ret int32 - return ret - } - return *o.Cpus -} - -// GetCpusOk returns a tuple with the Cpus field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetCpusOk() (*int32, bool) { - if o == nil || IsNil(o.Cpus) { - return nil, false - } - return o.Cpus, true -} - -// HasCpus returns a boolean if a field has been set. -func (o *V0037Node) HasCpus() bool { - if o != nil && !IsNil(o.Cpus) { - return true - } - - return false -} - -// SetCpus gets a reference to the given int32 and assigns it to the Cpus field. -func (o *V0037Node) SetCpus(v int32) { - o.Cpus = &v -} - -// GetFeatures returns the Features field value if set, zero value otherwise. -func (o *V0037Node) GetFeatures() string { - if o == nil || IsNil(o.Features) { - var ret string - return ret - } - return *o.Features -} - -// GetFeaturesOk returns a tuple with the Features field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetFeaturesOk() (*string, bool) { - if o == nil || IsNil(o.Features) { - return nil, false - } - return o.Features, true -} - -// HasFeatures returns a boolean if a field has been set. -func (o *V0037Node) HasFeatures() bool { - if o != nil && !IsNil(o.Features) { - return true - } - - return false -} - -// SetFeatures gets a reference to the given string and assigns it to the Features field. -func (o *V0037Node) SetFeatures(v string) { - o.Features = &v -} - -// GetActiveFeatures returns the ActiveFeatures field value if set, zero value otherwise. -func (o *V0037Node) GetActiveFeatures() string { - if o == nil || IsNil(o.ActiveFeatures) { - var ret string - return ret - } - return *o.ActiveFeatures -} - -// GetActiveFeaturesOk returns a tuple with the ActiveFeatures field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetActiveFeaturesOk() (*string, bool) { - if o == nil || IsNil(o.ActiveFeatures) { - return nil, false - } - return o.ActiveFeatures, true -} - -// HasActiveFeatures returns a boolean if a field has been set. -func (o *V0037Node) HasActiveFeatures() bool { - if o != nil && !IsNil(o.ActiveFeatures) { - return true - } - - return false -} - -// SetActiveFeatures gets a reference to the given string and assigns it to the ActiveFeatures field. -func (o *V0037Node) SetActiveFeatures(v string) { - o.ActiveFeatures = &v -} - -// GetGres returns the Gres field value if set, zero value otherwise. -func (o *V0037Node) GetGres() string { - if o == nil || IsNil(o.Gres) { - var ret string - return ret - } - return *o.Gres -} - -// GetGresOk returns a tuple with the Gres field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetGresOk() (*string, bool) { - if o == nil || IsNil(o.Gres) { - return nil, false - } - return o.Gres, true -} - -// HasGres returns a boolean if a field has been set. -func (o *V0037Node) HasGres() bool { - if o != nil && !IsNil(o.Gres) { - return true - } - - return false -} - -// SetGres gets a reference to the given string and assigns it to the Gres field. -func (o *V0037Node) SetGres(v string) { - o.Gres = &v -} - -// GetGresDrained returns the GresDrained field value if set, zero value otherwise. -func (o *V0037Node) GetGresDrained() string { - if o == nil || IsNil(o.GresDrained) { - var ret string - return ret - } - return *o.GresDrained -} - -// GetGresDrainedOk returns a tuple with the GresDrained field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetGresDrainedOk() (*string, bool) { - if o == nil || IsNil(o.GresDrained) { - return nil, false - } - return o.GresDrained, true -} - -// HasGresDrained returns a boolean if a field has been set. -func (o *V0037Node) HasGresDrained() bool { - if o != nil && !IsNil(o.GresDrained) { - return true - } - - return false -} - -// SetGresDrained gets a reference to the given string and assigns it to the GresDrained field. -func (o *V0037Node) SetGresDrained(v string) { - o.GresDrained = &v -} - -// GetGresUsed returns the GresUsed field value if set, zero value otherwise. -func (o *V0037Node) GetGresUsed() string { - if o == nil || IsNil(o.GresUsed) { - var ret string - return ret - } - return *o.GresUsed -} - -// GetGresUsedOk returns a tuple with the GresUsed field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetGresUsedOk() (*string, bool) { - if o == nil || IsNil(o.GresUsed) { - return nil, false - } - return o.GresUsed, true -} - -// HasGresUsed returns a boolean if a field has been set. -func (o *V0037Node) HasGresUsed() bool { - if o != nil && !IsNil(o.GresUsed) { - return true - } - - return false -} - -// SetGresUsed gets a reference to the given string and assigns it to the GresUsed field. -func (o *V0037Node) SetGresUsed(v string) { - o.GresUsed = &v -} - -// GetMcsLabel returns the McsLabel field value if set, zero value otherwise. -func (o *V0037Node) GetMcsLabel() string { - if o == nil || IsNil(o.McsLabel) { - var ret string - return ret - } - return *o.McsLabel -} - -// GetMcsLabelOk returns a tuple with the McsLabel field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetMcsLabelOk() (*string, bool) { - if o == nil || IsNil(o.McsLabel) { - return nil, false - } - return o.McsLabel, true -} - -// HasMcsLabel returns a boolean if a field has been set. -func (o *V0037Node) HasMcsLabel() bool { - if o != nil && !IsNil(o.McsLabel) { - return true - } - - return false -} - -// SetMcsLabel gets a reference to the given string and assigns it to the McsLabel field. -func (o *V0037Node) SetMcsLabel(v string) { - o.McsLabel = &v -} - -// GetName returns the Name field value if set, zero value otherwise. -func (o *V0037Node) GetName() string { - if o == nil || IsNil(o.Name) { - var ret string - return ret - } - return *o.Name -} - -// GetNameOk returns a tuple with the Name field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetNameOk() (*string, bool) { - if o == nil || IsNil(o.Name) { - return nil, false - } - return o.Name, true -} - -// HasName returns a boolean if a field has been set. -func (o *V0037Node) HasName() bool { - if o != nil && !IsNil(o.Name) { - return true - } - - return false -} - -// SetName gets a reference to the given string and assigns it to the Name field. -func (o *V0037Node) SetName(v string) { - o.Name = &v -} - -// GetNextStateAfterReboot returns the NextStateAfterReboot field value if set, zero value otherwise. -func (o *V0037Node) GetNextStateAfterReboot() string { - if o == nil || IsNil(o.NextStateAfterReboot) { - var ret string - return ret - } - return *o.NextStateAfterReboot -} - -// GetNextStateAfterRebootOk returns a tuple with the NextStateAfterReboot field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetNextStateAfterRebootOk() (*string, bool) { - if o == nil || IsNil(o.NextStateAfterReboot) { - return nil, false - } - return o.NextStateAfterReboot, true -} - -// HasNextStateAfterReboot returns a boolean if a field has been set. -func (o *V0037Node) HasNextStateAfterReboot() bool { - if o != nil && !IsNil(o.NextStateAfterReboot) { - return true - } - - return false -} - -// SetNextStateAfterReboot gets a reference to the given string and assigns it to the NextStateAfterReboot field. -func (o *V0037Node) SetNextStateAfterReboot(v string) { - o.NextStateAfterReboot = &v -} - -// GetNextStateAfterRebootFlags returns the NextStateAfterRebootFlags field value if set, zero value otherwise. -func (o *V0037Node) GetNextStateAfterRebootFlags() []string { - if o == nil || IsNil(o.NextStateAfterRebootFlags) { - var ret []string - return ret - } - return o.NextStateAfterRebootFlags -} - -// GetNextStateAfterRebootFlagsOk returns a tuple with the NextStateAfterRebootFlags field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetNextStateAfterRebootFlagsOk() ([]string, bool) { - if o == nil || IsNil(o.NextStateAfterRebootFlags) { - return nil, false - } - return o.NextStateAfterRebootFlags, true -} - -// HasNextStateAfterRebootFlags returns a boolean if a field has been set. -func (o *V0037Node) HasNextStateAfterRebootFlags() bool { - if o != nil && !IsNil(o.NextStateAfterRebootFlags) { - return true - } - - return false -} - -// SetNextStateAfterRebootFlags gets a reference to the given []string and assigns it to the NextStateAfterRebootFlags field. -func (o *V0037Node) SetNextStateAfterRebootFlags(v []string) { - o.NextStateAfterRebootFlags = v -} - -// GetAddress returns the Address field value if set, zero value otherwise. -func (o *V0037Node) GetAddress() string { - if o == nil || IsNil(o.Address) { - var ret string - return ret - } - return *o.Address -} - -// GetAddressOk returns a tuple with the Address field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetAddressOk() (*string, bool) { - if o == nil || IsNil(o.Address) { - return nil, false - } - return o.Address, true -} - -// HasAddress returns a boolean if a field has been set. -func (o *V0037Node) HasAddress() bool { - if o != nil && !IsNil(o.Address) { - return true - } - - return false -} - -// SetAddress gets a reference to the given string and assigns it to the Address field. -func (o *V0037Node) SetAddress(v string) { - o.Address = &v -} - -// GetHostname returns the Hostname field value if set, zero value otherwise. -func (o *V0037Node) GetHostname() string { - if o == nil || IsNil(o.Hostname) { - var ret string - return ret - } - return *o.Hostname -} - -// GetHostnameOk returns a tuple with the Hostname field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetHostnameOk() (*string, bool) { - if o == nil || IsNil(o.Hostname) { - return nil, false - } - return o.Hostname, true -} - -// HasHostname returns a boolean if a field has been set. -func (o *V0037Node) HasHostname() bool { - if o != nil && !IsNil(o.Hostname) { - return true - } - - return false -} - -// SetHostname gets a reference to the given string and assigns it to the Hostname field. -func (o *V0037Node) SetHostname(v string) { - o.Hostname = &v -} - -// GetState returns the State field value if set, zero value otherwise. -func (o *V0037Node) GetState() string { - if o == nil || IsNil(o.State) { - var ret string - return ret - } - return *o.State -} - -// GetStateOk returns a tuple with the State field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetStateOk() (*string, bool) { - if o == nil || IsNil(o.State) { - return nil, false - } - return o.State, true -} - -// HasState returns a boolean if a field has been set. -func (o *V0037Node) HasState() bool { - if o != nil && !IsNil(o.State) { - return true - } - - return false -} - -// SetState gets a reference to the given string and assigns it to the State field. -func (o *V0037Node) SetState(v string) { - o.State = &v -} - -// GetStateFlags returns the StateFlags field value if set, zero value otherwise. -func (o *V0037Node) GetStateFlags() []string { - if o == nil || IsNil(o.StateFlags) { - var ret []string - return ret - } - return o.StateFlags -} - -// GetStateFlagsOk returns a tuple with the StateFlags field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetStateFlagsOk() ([]string, bool) { - if o == nil || IsNil(o.StateFlags) { - return nil, false - } - return o.StateFlags, true -} - -// HasStateFlags returns a boolean if a field has been set. -func (o *V0037Node) HasStateFlags() bool { - if o != nil && !IsNil(o.StateFlags) { - return true - } - - return false -} - -// SetStateFlags gets a reference to the given []string and assigns it to the StateFlags field. -func (o *V0037Node) SetStateFlags(v []string) { - o.StateFlags = v -} - -// GetOperatingSystem returns the OperatingSystem field value if set, zero value otherwise. -func (o *V0037Node) GetOperatingSystem() string { - if o == nil || IsNil(o.OperatingSystem) { - var ret string - return ret - } - return *o.OperatingSystem -} - -// GetOperatingSystemOk returns a tuple with the OperatingSystem field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetOperatingSystemOk() (*string, bool) { - if o == nil || IsNil(o.OperatingSystem) { - return nil, false - } - return o.OperatingSystem, true -} - -// HasOperatingSystem returns a boolean if a field has been set. -func (o *V0037Node) HasOperatingSystem() bool { - if o != nil && !IsNil(o.OperatingSystem) { - return true - } - - return false -} - -// SetOperatingSystem gets a reference to the given string and assigns it to the OperatingSystem field. -func (o *V0037Node) SetOperatingSystem(v string) { - o.OperatingSystem = &v -} - -// GetOwner returns the Owner field value if set, zero value otherwise. -func (o *V0037Node) GetOwner() string { - if o == nil || IsNil(o.Owner) { - var ret string - return ret - } - return *o.Owner -} - -// GetOwnerOk returns a tuple with the Owner field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetOwnerOk() (*string, bool) { - if o == nil || IsNil(o.Owner) { - return nil, false - } - return o.Owner, true -} - -// HasOwner returns a boolean if a field has been set. -func (o *V0037Node) HasOwner() bool { - if o != nil && !IsNil(o.Owner) { - return true - } - - return false -} - -// SetOwner gets a reference to the given string and assigns it to the Owner field. -func (o *V0037Node) SetOwner(v string) { - o.Owner = &v -} - -// GetPartitions returns the Partitions field value if set, zero value otherwise. -func (o *V0037Node) GetPartitions() []string { - if o == nil || IsNil(o.Partitions) { - var ret []string - return ret - } - return o.Partitions -} - -// GetPartitionsOk returns a tuple with the Partitions field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetPartitionsOk() ([]string, bool) { - if o == nil || IsNil(o.Partitions) { - return nil, false - } - return o.Partitions, true -} - -// HasPartitions returns a boolean if a field has been set. -func (o *V0037Node) HasPartitions() bool { - if o != nil && !IsNil(o.Partitions) { - return true - } - - return false -} - -// SetPartitions gets a reference to the given []string and assigns it to the Partitions field. -func (o *V0037Node) SetPartitions(v []string) { - o.Partitions = v -} - -// GetPort returns the Port field value if set, zero value otherwise. -func (o *V0037Node) GetPort() int32 { - if o == nil || IsNil(o.Port) { - var ret int32 - return ret - } - return *o.Port -} - -// GetPortOk returns a tuple with the Port field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetPortOk() (*int32, bool) { - if o == nil || IsNil(o.Port) { - return nil, false - } - return o.Port, true -} - -// HasPort returns a boolean if a field has been set. -func (o *V0037Node) HasPort() bool { - if o != nil && !IsNil(o.Port) { - return true - } - - return false -} - -// SetPort gets a reference to the given int32 and assigns it to the Port field. -func (o *V0037Node) SetPort(v int32) { - o.Port = &v -} - -// GetRealMemory returns the RealMemory field value if set, zero value otherwise. -func (o *V0037Node) GetRealMemory() int32 { - if o == nil || IsNil(o.RealMemory) { - var ret int32 - return ret - } - return *o.RealMemory -} - -// GetRealMemoryOk returns a tuple with the RealMemory field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetRealMemoryOk() (*int32, bool) { - if o == nil || IsNil(o.RealMemory) { - return nil, false - } - return o.RealMemory, true -} - -// HasRealMemory returns a boolean if a field has been set. -func (o *V0037Node) HasRealMemory() bool { - if o != nil && !IsNil(o.RealMemory) { - return true - } - - return false -} - -// SetRealMemory gets a reference to the given int32 and assigns it to the RealMemory field. -func (o *V0037Node) SetRealMemory(v int32) { - o.RealMemory = &v -} - -// GetReason returns the Reason field value if set, zero value otherwise. -func (o *V0037Node) GetReason() string { - if o == nil || IsNil(o.Reason) { - var ret string - return ret - } - return *o.Reason -} - -// GetReasonOk returns a tuple with the Reason field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetReasonOk() (*string, bool) { - if o == nil || IsNil(o.Reason) { - return nil, false - } - return o.Reason, true -} - -// HasReason returns a boolean if a field has been set. -func (o *V0037Node) HasReason() bool { - if o != nil && !IsNil(o.Reason) { - return true - } - - return false -} - -// SetReason gets a reference to the given string and assigns it to the Reason field. -func (o *V0037Node) SetReason(v string) { - o.Reason = &v -} - -// GetReasonChangedAt returns the ReasonChangedAt field value if set, zero value otherwise. -func (o *V0037Node) GetReasonChangedAt() int32 { - if o == nil || IsNil(o.ReasonChangedAt) { - var ret int32 - return ret - } - return *o.ReasonChangedAt -} - -// GetReasonChangedAtOk returns a tuple with the ReasonChangedAt field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetReasonChangedAtOk() (*int32, bool) { - if o == nil || IsNil(o.ReasonChangedAt) { - return nil, false - } - return o.ReasonChangedAt, true -} - -// HasReasonChangedAt returns a boolean if a field has been set. -func (o *V0037Node) HasReasonChangedAt() bool { - if o != nil && !IsNil(o.ReasonChangedAt) { - return true - } - - return false -} - -// SetReasonChangedAt gets a reference to the given int32 and assigns it to the ReasonChangedAt field. -func (o *V0037Node) SetReasonChangedAt(v int32) { - o.ReasonChangedAt = &v -} - -// GetReasonSetByUser returns the ReasonSetByUser field value if set, zero value otherwise. -func (o *V0037Node) GetReasonSetByUser() string { - if o == nil || IsNil(o.ReasonSetByUser) { - var ret string - return ret - } - return *o.ReasonSetByUser -} - -// GetReasonSetByUserOk returns a tuple with the ReasonSetByUser field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetReasonSetByUserOk() (*string, bool) { - if o == nil || IsNil(o.ReasonSetByUser) { - return nil, false - } - return o.ReasonSetByUser, true -} - -// HasReasonSetByUser returns a boolean if a field has been set. -func (o *V0037Node) HasReasonSetByUser() bool { - if o != nil && !IsNil(o.ReasonSetByUser) { - return true - } - - return false -} - -// SetReasonSetByUser gets a reference to the given string and assigns it to the ReasonSetByUser field. -func (o *V0037Node) SetReasonSetByUser(v string) { - o.ReasonSetByUser = &v -} - -// GetSlurmdStartTime returns the SlurmdStartTime field value if set, zero value otherwise. -func (o *V0037Node) GetSlurmdStartTime() int64 { - if o == nil || IsNil(o.SlurmdStartTime) { - var ret int64 - return ret - } - return *o.SlurmdStartTime -} - -// GetSlurmdStartTimeOk returns a tuple with the SlurmdStartTime field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetSlurmdStartTimeOk() (*int64, bool) { - if o == nil || IsNil(o.SlurmdStartTime) { - return nil, false - } - return o.SlurmdStartTime, true -} - -// HasSlurmdStartTime returns a boolean if a field has been set. -func (o *V0037Node) HasSlurmdStartTime() bool { - if o != nil && !IsNil(o.SlurmdStartTime) { - return true - } - - return false -} - -// SetSlurmdStartTime gets a reference to the given int64 and assigns it to the SlurmdStartTime field. -func (o *V0037Node) SetSlurmdStartTime(v int64) { - o.SlurmdStartTime = &v -} - -// GetSockets returns the Sockets field value if set, zero value otherwise. -func (o *V0037Node) GetSockets() int32 { - if o == nil || IsNil(o.Sockets) { - var ret int32 - return ret - } - return *o.Sockets -} - -// GetSocketsOk returns a tuple with the Sockets field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetSocketsOk() (*int32, bool) { - if o == nil || IsNil(o.Sockets) { - return nil, false - } - return o.Sockets, true -} - -// HasSockets returns a boolean if a field has been set. -func (o *V0037Node) HasSockets() bool { - if o != nil && !IsNil(o.Sockets) { - return true - } - - return false -} - -// SetSockets gets a reference to the given int32 and assigns it to the Sockets field. -func (o *V0037Node) SetSockets(v int32) { - o.Sockets = &v -} - -// GetThreads returns the Threads field value if set, zero value otherwise. -func (o *V0037Node) GetThreads() int32 { - if o == nil || IsNil(o.Threads) { - var ret int32 - return ret - } - return *o.Threads -} - -// GetThreadsOk returns a tuple with the Threads field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetThreadsOk() (*int32, bool) { - if o == nil || IsNil(o.Threads) { - return nil, false - } - return o.Threads, true -} - -// HasThreads returns a boolean if a field has been set. -func (o *V0037Node) HasThreads() bool { - if o != nil && !IsNil(o.Threads) { - return true - } - - return false -} - -// SetThreads gets a reference to the given int32 and assigns it to the Threads field. -func (o *V0037Node) SetThreads(v int32) { - o.Threads = &v -} - -// GetTemporaryDisk returns the TemporaryDisk field value if set, zero value otherwise. -func (o *V0037Node) GetTemporaryDisk() int32 { - if o == nil || IsNil(o.TemporaryDisk) { - var ret int32 - return ret - } - return *o.TemporaryDisk -} - -// GetTemporaryDiskOk returns a tuple with the TemporaryDisk field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetTemporaryDiskOk() (*int32, bool) { - if o == nil || IsNil(o.TemporaryDisk) { - return nil, false - } - return o.TemporaryDisk, true -} - -// HasTemporaryDisk returns a boolean if a field has been set. -func (o *V0037Node) HasTemporaryDisk() bool { - if o != nil && !IsNil(o.TemporaryDisk) { - return true - } - - return false -} - -// SetTemporaryDisk gets a reference to the given int32 and assigns it to the TemporaryDisk field. -func (o *V0037Node) SetTemporaryDisk(v int32) { - o.TemporaryDisk = &v -} - -// GetWeight returns the Weight field value if set, zero value otherwise. -func (o *V0037Node) GetWeight() int32 { - if o == nil || IsNil(o.Weight) { - var ret int32 - return ret - } - return *o.Weight -} - -// GetWeightOk returns a tuple with the Weight field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetWeightOk() (*int32, bool) { - if o == nil || IsNil(o.Weight) { - return nil, false - } - return o.Weight, true -} - -// HasWeight returns a boolean if a field has been set. -func (o *V0037Node) HasWeight() bool { - if o != nil && !IsNil(o.Weight) { - return true - } - - return false -} - -// SetWeight gets a reference to the given int32 and assigns it to the Weight field. -func (o *V0037Node) SetWeight(v int32) { - o.Weight = &v -} - -// GetTres returns the Tres field value if set, zero value otherwise. -func (o *V0037Node) GetTres() string { - if o == nil || IsNil(o.Tres) { - var ret string - return ret - } - return *o.Tres -} - -// GetTresOk returns a tuple with the Tres field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetTresOk() (*string, bool) { - if o == nil || IsNil(o.Tres) { - return nil, false - } - return o.Tres, true -} - -// HasTres returns a boolean if a field has been set. -func (o *V0037Node) HasTres() bool { - if o != nil && !IsNil(o.Tres) { - return true - } - - return false -} - -// SetTres gets a reference to the given string and assigns it to the Tres field. -func (o *V0037Node) SetTres(v string) { - o.Tres = &v -} - -// GetTresUsed returns the TresUsed field value if set, zero value otherwise. -func (o *V0037Node) GetTresUsed() string { - if o == nil || IsNil(o.TresUsed) { - var ret string - return ret - } - return *o.TresUsed -} - -// GetTresUsedOk returns a tuple with the TresUsed field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetTresUsedOk() (*string, bool) { - if o == nil || IsNil(o.TresUsed) { - return nil, false - } - return o.TresUsed, true -} - -// HasTresUsed returns a boolean if a field has been set. -func (o *V0037Node) HasTresUsed() bool { - if o != nil && !IsNil(o.TresUsed) { - return true - } - - return false -} - -// SetTresUsed gets a reference to the given string and assigns it to the TresUsed field. -func (o *V0037Node) SetTresUsed(v string) { - o.TresUsed = &v -} - -// GetTresWeighted returns the TresWeighted field value if set, zero value otherwise. -func (o *V0037Node) GetTresWeighted() float64 { - if o == nil || IsNil(o.TresWeighted) { - var ret float64 - return ret - } - return *o.TresWeighted -} - -// GetTresWeightedOk returns a tuple with the TresWeighted field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetTresWeightedOk() (*float64, bool) { - if o == nil || IsNil(o.TresWeighted) { - return nil, false - } - return o.TresWeighted, true -} - -// HasTresWeighted returns a boolean if a field has been set. -func (o *V0037Node) HasTresWeighted() bool { - if o != nil && !IsNil(o.TresWeighted) { - return true - } - - return false -} - -// SetTresWeighted gets a reference to the given float64 and assigns it to the TresWeighted field. -func (o *V0037Node) SetTresWeighted(v float64) { - o.TresWeighted = &v -} - -// GetSlurmdVersion returns the SlurmdVersion field value if set, zero value otherwise. -func (o *V0037Node) GetSlurmdVersion() string { - if o == nil || IsNil(o.SlurmdVersion) { - var ret string - return ret - } - return *o.SlurmdVersion -} - -// GetSlurmdVersionOk returns a tuple with the SlurmdVersion field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetSlurmdVersionOk() (*string, bool) { - if o == nil || IsNil(o.SlurmdVersion) { - return nil, false - } - return o.SlurmdVersion, true -} - -// HasSlurmdVersion returns a boolean if a field has been set. -func (o *V0037Node) HasSlurmdVersion() bool { - if o != nil && !IsNil(o.SlurmdVersion) { - return true - } - - return false -} - -// SetSlurmdVersion gets a reference to the given string and assigns it to the SlurmdVersion field. -func (o *V0037Node) SetSlurmdVersion(v string) { - o.SlurmdVersion = &v -} - -// GetAllocCpus returns the AllocCpus field value if set, zero value otherwise. -func (o *V0037Node) GetAllocCpus() int64 { - if o == nil || IsNil(o.AllocCpus) { - var ret int64 - return ret - } - return *o.AllocCpus -} - -// GetAllocCpusOk returns a tuple with the AllocCpus field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetAllocCpusOk() (*int64, bool) { - if o == nil || IsNil(o.AllocCpus) { - return nil, false - } - return o.AllocCpus, true -} - -// HasAllocCpus returns a boolean if a field has been set. -func (o *V0037Node) HasAllocCpus() bool { - if o != nil && !IsNil(o.AllocCpus) { - return true - } - - return false -} - -// SetAllocCpus gets a reference to the given int64 and assigns it to the AllocCpus field. -func (o *V0037Node) SetAllocCpus(v int64) { - o.AllocCpus = &v -} - -// GetIdleCpus returns the IdleCpus field value if set, zero value otherwise. -func (o *V0037Node) GetIdleCpus() int64 { - if o == nil || IsNil(o.IdleCpus) { - var ret int64 - return ret - } - return *o.IdleCpus -} - -// GetIdleCpusOk returns a tuple with the IdleCpus field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetIdleCpusOk() (*int64, bool) { - if o == nil || IsNil(o.IdleCpus) { - return nil, false - } - return o.IdleCpus, true -} - -// HasIdleCpus returns a boolean if a field has been set. -func (o *V0037Node) HasIdleCpus() bool { - if o != nil && !IsNil(o.IdleCpus) { - return true - } - - return false -} - -// SetIdleCpus gets a reference to the given int64 and assigns it to the IdleCpus field. -func (o *V0037Node) SetIdleCpus(v int64) { - o.IdleCpus = &v -} - -// GetAllocMemory returns the AllocMemory field value if set, zero value otherwise. -func (o *V0037Node) GetAllocMemory() int64 { - if o == nil || IsNil(o.AllocMemory) { - var ret int64 - return ret - } - return *o.AllocMemory -} - -// GetAllocMemoryOk returns a tuple with the AllocMemory field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Node) GetAllocMemoryOk() (*int64, bool) { - if o == nil || IsNil(o.AllocMemory) { - return nil, false - } - return o.AllocMemory, true -} - -// HasAllocMemory returns a boolean if a field has been set. -func (o *V0037Node) HasAllocMemory() bool { - if o != nil && !IsNil(o.AllocMemory) { - return true - } - - return false -} - -// SetAllocMemory gets a reference to the given int64 and assigns it to the AllocMemory field. -func (o *V0037Node) SetAllocMemory(v int64) { - o.AllocMemory = &v -} - -func (o V0037Node) MarshalJSON() ([]byte, error) { - toSerialize,err := o.ToMap() - if err != nil { - return []byte{}, err - } - return json.Marshal(toSerialize) -} - -func (o V0037Node) ToMap() (map[string]interface{}, error) { - toSerialize := map[string]interface{}{} - if !IsNil(o.Architecture) { - toSerialize["architecture"] = o.Architecture - } - if !IsNil(o.BurstbufferNetworkAddress) { - toSerialize["burstbuffer_network_address"] = o.BurstbufferNetworkAddress - } - if !IsNil(o.Boards) { - toSerialize["boards"] = o.Boards - } - if !IsNil(o.BootTime) { - toSerialize["boot_time"] = o.BootTime - } - if !IsNil(o.Cores) { - toSerialize["cores"] = o.Cores - } - if !IsNil(o.CpuBinding) { - toSerialize["cpu_binding"] = o.CpuBinding - } - if !IsNil(o.CpuLoad) { - toSerialize["cpu_load"] = o.CpuLoad - } - if !IsNil(o.FreeMemory) { - toSerialize["free_memory"] = o.FreeMemory - } - if !IsNil(o.Cpus) { - toSerialize["cpus"] = o.Cpus - } - if !IsNil(o.Features) { - toSerialize["features"] = o.Features - } - if !IsNil(o.ActiveFeatures) { - toSerialize["active_features"] = o.ActiveFeatures - } - if !IsNil(o.Gres) { - toSerialize["gres"] = o.Gres - } - if !IsNil(o.GresDrained) { - toSerialize["gres_drained"] = o.GresDrained - } - if !IsNil(o.GresUsed) { - toSerialize["gres_used"] = o.GresUsed - } - if !IsNil(o.McsLabel) { - toSerialize["mcs_label"] = o.McsLabel - } - if !IsNil(o.Name) { - toSerialize["name"] = o.Name - } - if !IsNil(o.NextStateAfterReboot) { - toSerialize["next_state_after_reboot"] = o.NextStateAfterReboot - } - if !IsNil(o.NextStateAfterRebootFlags) { - toSerialize["next_state_after_reboot_flags"] = o.NextStateAfterRebootFlags - } - if !IsNil(o.Address) { - toSerialize["address"] = o.Address - } - if !IsNil(o.Hostname) { - toSerialize["hostname"] = o.Hostname - } - if !IsNil(o.State) { - toSerialize["state"] = o.State - } - if !IsNil(o.StateFlags) { - toSerialize["state_flags"] = o.StateFlags - } - if !IsNil(o.OperatingSystem) { - toSerialize["operating_system"] = o.OperatingSystem - } - if !IsNil(o.Owner) { - toSerialize["owner"] = o.Owner - } - if !IsNil(o.Partitions) { - toSerialize["partitions"] = o.Partitions - } - if !IsNil(o.Port) { - toSerialize["port"] = o.Port - } - if !IsNil(o.RealMemory) { - toSerialize["real_memory"] = o.RealMemory - } - if !IsNil(o.Reason) { - toSerialize["reason"] = o.Reason - } - if !IsNil(o.ReasonChangedAt) { - toSerialize["reason_changed_at"] = o.ReasonChangedAt - } - if !IsNil(o.ReasonSetByUser) { - toSerialize["reason_set_by_user"] = o.ReasonSetByUser - } - if !IsNil(o.SlurmdStartTime) { - toSerialize["slurmd_start_time"] = o.SlurmdStartTime - } - if !IsNil(o.Sockets) { - toSerialize["sockets"] = o.Sockets - } - if !IsNil(o.Threads) { - toSerialize["threads"] = o.Threads - } - if !IsNil(o.TemporaryDisk) { - toSerialize["temporary_disk"] = o.TemporaryDisk - } - if !IsNil(o.Weight) { - toSerialize["weight"] = o.Weight - } - if !IsNil(o.Tres) { - toSerialize["tres"] = o.Tres - } - if !IsNil(o.TresUsed) { - toSerialize["tres_used"] = o.TresUsed - } - if !IsNil(o.TresWeighted) { - toSerialize["tres_weighted"] = o.TresWeighted - } - if !IsNil(o.SlurmdVersion) { - toSerialize["slurmd_version"] = o.SlurmdVersion - } - if !IsNil(o.AllocCpus) { - toSerialize["alloc_cpus"] = o.AllocCpus - } - if !IsNil(o.IdleCpus) { - toSerialize["idle_cpus"] = o.IdleCpus - } - if !IsNil(o.AllocMemory) { - toSerialize["alloc_memory"] = o.AllocMemory - } - return toSerialize, nil -} - -type NullableV0037Node struct { - value *V0037Node - isSet bool -} - -func (v NullableV0037Node) Get() *V0037Node { - return v.value -} - -func (v *NullableV0037Node) Set(val *V0037Node) { - v.value = val - v.isSet = true -} - -func (v NullableV0037Node) IsSet() bool { - return v.isSet -} - -func (v *NullableV0037Node) Unset() { - v.value = nil - v.isSet = false -} - -func NewNullableV0037Node(val *V0037Node) *NullableV0037Node { - return &NullableV0037Node{value: val, isSet: true} -} - -func (v NullableV0037Node) MarshalJSON() ([]byte, error) { - return json.Marshal(v.value) -} - -func (v *NullableV0037Node) UnmarshalJSON(src []byte) error { - v.isSet = true - return json.Unmarshal(src, &v.value) -} - - diff --git a/internal/api/0.0.37/model_v0_0_37_node_allocation.go b/internal/api/0.0.37/model_v0_0_37_node_allocation.go deleted file mode 100644 index 4d0a151..0000000 --- a/internal/api/0.0.37/model_v0_0_37_node_allocation.go +++ /dev/null @@ -1,239 +0,0 @@ -/* -Slurm Rest API - -API to access and control Slurm. - -API version: 0.0.37 -Contact: sales@schedmd.com -*/ - -// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. - -package openapi - -import ( - "encoding/json" -) - -// checks if the V0037NodeAllocation type satisfies the MappedNullable interface at compile time -var _ MappedNullable = &V0037NodeAllocation{} - -// V0037NodeAllocation struct for V0037NodeAllocation -type V0037NodeAllocation struct { - // amount of assigned job memory - Memory *int32 `json:"memory,omitempty"` - // amount of assigned job CPUs - Cpus map[string]interface{} `json:"cpus,omitempty"` - // assignment status of each socket by socket id - Sockets map[string]interface{} `json:"sockets,omitempty"` - // assignment status of each core by core id - Cores map[string]interface{} `json:"cores,omitempty"` -} - -// NewV0037NodeAllocation instantiates a new V0037NodeAllocation object -// This constructor will assign default values to properties that have it defined, -// and makes sure properties required by API are set, but the set of arguments -// will change when the set of required properties is changed -func NewV0037NodeAllocation() *V0037NodeAllocation { - this := V0037NodeAllocation{} - return &this -} - -// NewV0037NodeAllocationWithDefaults instantiates a new V0037NodeAllocation object -// This constructor will only assign default values to properties that have it defined, -// but it doesn't guarantee that properties required by API are set -func NewV0037NodeAllocationWithDefaults() *V0037NodeAllocation { - this := V0037NodeAllocation{} - return &this -} - -// GetMemory returns the Memory field value if set, zero value otherwise. -func (o *V0037NodeAllocation) GetMemory() int32 { - if o == nil || IsNil(o.Memory) { - var ret int32 - return ret - } - return *o.Memory -} - -// GetMemoryOk returns a tuple with the Memory field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037NodeAllocation) GetMemoryOk() (*int32, bool) { - if o == nil || IsNil(o.Memory) { - return nil, false - } - return o.Memory, true -} - -// HasMemory returns a boolean if a field has been set. -func (o *V0037NodeAllocation) HasMemory() bool { - if o != nil && !IsNil(o.Memory) { - return true - } - - return false -} - -// SetMemory gets a reference to the given int32 and assigns it to the Memory field. -func (o *V0037NodeAllocation) SetMemory(v int32) { - o.Memory = &v -} - -// GetCpus returns the Cpus field value if set, zero value otherwise. -func (o *V0037NodeAllocation) GetCpus() map[string]interface{} { - if o == nil || IsNil(o.Cpus) { - var ret map[string]interface{} - return ret - } - return o.Cpus -} - -// GetCpusOk returns a tuple with the Cpus field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037NodeAllocation) GetCpusOk() (map[string]interface{}, bool) { - if o == nil || IsNil(o.Cpus) { - return map[string]interface{}{}, false - } - return o.Cpus, true -} - -// HasCpus returns a boolean if a field has been set. -func (o *V0037NodeAllocation) HasCpus() bool { - if o != nil && !IsNil(o.Cpus) { - return true - } - - return false -} - -// SetCpus gets a reference to the given map[string]interface{} and assigns it to the Cpus field. -func (o *V0037NodeAllocation) SetCpus(v map[string]interface{}) { - o.Cpus = v -} - -// GetSockets returns the Sockets field value if set, zero value otherwise. -func (o *V0037NodeAllocation) GetSockets() map[string]interface{} { - if o == nil || IsNil(o.Sockets) { - var ret map[string]interface{} - return ret - } - return o.Sockets -} - -// GetSocketsOk returns a tuple with the Sockets field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037NodeAllocation) GetSocketsOk() (map[string]interface{}, bool) { - if o == nil || IsNil(o.Sockets) { - return map[string]interface{}{}, false - } - return o.Sockets, true -} - -// HasSockets returns a boolean if a field has been set. -func (o *V0037NodeAllocation) HasSockets() bool { - if o != nil && !IsNil(o.Sockets) { - return true - } - - return false -} - -// SetSockets gets a reference to the given map[string]interface{} and assigns it to the Sockets field. -func (o *V0037NodeAllocation) SetSockets(v map[string]interface{}) { - o.Sockets = v -} - -// GetCores returns the Cores field value if set, zero value otherwise. -func (o *V0037NodeAllocation) GetCores() map[string]interface{} { - if o == nil || IsNil(o.Cores) { - var ret map[string]interface{} - return ret - } - return o.Cores -} - -// GetCoresOk returns a tuple with the Cores field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037NodeAllocation) GetCoresOk() (map[string]interface{}, bool) { - if o == nil || IsNil(o.Cores) { - return map[string]interface{}{}, false - } - return o.Cores, true -} - -// HasCores returns a boolean if a field has been set. -func (o *V0037NodeAllocation) HasCores() bool { - if o != nil && !IsNil(o.Cores) { - return true - } - - return false -} - -// SetCores gets a reference to the given map[string]interface{} and assigns it to the Cores field. -func (o *V0037NodeAllocation) SetCores(v map[string]interface{}) { - o.Cores = v -} - -func (o V0037NodeAllocation) MarshalJSON() ([]byte, error) { - toSerialize,err := o.ToMap() - if err != nil { - return []byte{}, err - } - return json.Marshal(toSerialize) -} - -func (o V0037NodeAllocation) ToMap() (map[string]interface{}, error) { - toSerialize := map[string]interface{}{} - if !IsNil(o.Memory) { - toSerialize["memory"] = o.Memory - } - if !IsNil(o.Cpus) { - toSerialize["cpus"] = o.Cpus - } - if !IsNil(o.Sockets) { - toSerialize["sockets"] = o.Sockets - } - if !IsNil(o.Cores) { - toSerialize["cores"] = o.Cores - } - return toSerialize, nil -} - -type NullableV0037NodeAllocation struct { - value *V0037NodeAllocation - isSet bool -} - -func (v NullableV0037NodeAllocation) Get() *V0037NodeAllocation { - return v.value -} - -func (v *NullableV0037NodeAllocation) Set(val *V0037NodeAllocation) { - v.value = val - v.isSet = true -} - -func (v NullableV0037NodeAllocation) IsSet() bool { - return v.isSet -} - -func (v *NullableV0037NodeAllocation) Unset() { - v.value = nil - v.isSet = false -} - -func NewNullableV0037NodeAllocation(val *V0037NodeAllocation) *NullableV0037NodeAllocation { - return &NullableV0037NodeAllocation{value: val, isSet: true} -} - -func (v NullableV0037NodeAllocation) MarshalJSON() ([]byte, error) { - return json.Marshal(v.value) -} - -func (v *NullableV0037NodeAllocation) UnmarshalJSON(src []byte) error { - v.isSet = true - return json.Unmarshal(src, &v.value) -} - - diff --git a/internal/api/0.0.37/model_v0_0_37_nodes_response.go b/internal/api/0.0.37/model_v0_0_37_nodes_response.go deleted file mode 100644 index f149bc1..0000000 --- a/internal/api/0.0.37/model_v0_0_37_nodes_response.go +++ /dev/null @@ -1,165 +0,0 @@ -/* -Slurm Rest API - -API to access and control Slurm. - -API version: 0.0.37 -Contact: sales@schedmd.com -*/ - -// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. - -package openapi - -import ( - "encoding/json" -) - -// checks if the V0037NodesResponse type satisfies the MappedNullable interface at compile time -var _ MappedNullable = &V0037NodesResponse{} - -// V0037NodesResponse struct for V0037NodesResponse -type V0037NodesResponse struct { - // slurm errors - Errors []V0037Error `json:"errors,omitempty"` - // nodes info - Nodes []V0037Node `json:"nodes,omitempty"` -} - -// NewV0037NodesResponse instantiates a new V0037NodesResponse object -// This constructor will assign default values to properties that have it defined, -// and makes sure properties required by API are set, but the set of arguments -// will change when the set of required properties is changed -func NewV0037NodesResponse() *V0037NodesResponse { - this := V0037NodesResponse{} - return &this -} - -// NewV0037NodesResponseWithDefaults instantiates a new V0037NodesResponse object -// This constructor will only assign default values to properties that have it defined, -// but it doesn't guarantee that properties required by API are set -func NewV0037NodesResponseWithDefaults() *V0037NodesResponse { - this := V0037NodesResponse{} - return &this -} - -// GetErrors returns the Errors field value if set, zero value otherwise. -func (o *V0037NodesResponse) GetErrors() []V0037Error { - if o == nil || IsNil(o.Errors) { - var ret []V0037Error - return ret - } - return o.Errors -} - -// GetErrorsOk returns a tuple with the Errors field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037NodesResponse) GetErrorsOk() ([]V0037Error, bool) { - if o == nil || IsNil(o.Errors) { - return nil, false - } - return o.Errors, true -} - -// HasErrors returns a boolean if a field has been set. -func (o *V0037NodesResponse) HasErrors() bool { - if o != nil && !IsNil(o.Errors) { - return true - } - - return false -} - -// SetErrors gets a reference to the given []V0037Error and assigns it to the Errors field. -func (o *V0037NodesResponse) SetErrors(v []V0037Error) { - o.Errors = v -} - -// GetNodes returns the Nodes field value if set, zero value otherwise. -func (o *V0037NodesResponse) GetNodes() []V0037Node { - if o == nil || IsNil(o.Nodes) { - var ret []V0037Node - return ret - } - return o.Nodes -} - -// GetNodesOk returns a tuple with the Nodes field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037NodesResponse) GetNodesOk() ([]V0037Node, bool) { - if o == nil || IsNil(o.Nodes) { - return nil, false - } - return o.Nodes, true -} - -// HasNodes returns a boolean if a field has been set. -func (o *V0037NodesResponse) HasNodes() bool { - if o != nil && !IsNil(o.Nodes) { - return true - } - - return false -} - -// SetNodes gets a reference to the given []V0037Node and assigns it to the Nodes field. -func (o *V0037NodesResponse) SetNodes(v []V0037Node) { - o.Nodes = v -} - -func (o V0037NodesResponse) MarshalJSON() ([]byte, error) { - toSerialize,err := o.ToMap() - if err != nil { - return []byte{}, err - } - return json.Marshal(toSerialize) -} - -func (o V0037NodesResponse) ToMap() (map[string]interface{}, error) { - toSerialize := map[string]interface{}{} - if !IsNil(o.Errors) { - toSerialize["errors"] = o.Errors - } - if !IsNil(o.Nodes) { - toSerialize["nodes"] = o.Nodes - } - return toSerialize, nil -} - -type NullableV0037NodesResponse struct { - value *V0037NodesResponse - isSet bool -} - -func (v NullableV0037NodesResponse) Get() *V0037NodesResponse { - return v.value -} - -func (v *NullableV0037NodesResponse) Set(val *V0037NodesResponse) { - v.value = val - v.isSet = true -} - -func (v NullableV0037NodesResponse) IsSet() bool { - return v.isSet -} - -func (v *NullableV0037NodesResponse) Unset() { - v.value = nil - v.isSet = false -} - -func NewNullableV0037NodesResponse(val *V0037NodesResponse) *NullableV0037NodesResponse { - return &NullableV0037NodesResponse{value: val, isSet: true} -} - -func (v NullableV0037NodesResponse) MarshalJSON() ([]byte, error) { - return json.Marshal(v.value) -} - -func (v *NullableV0037NodesResponse) UnmarshalJSON(src []byte) error { - v.isSet = true - return json.Unmarshal(src, &v.value) -} - - diff --git a/internal/api/0.0.37/model_v0_0_37_partition.go b/internal/api/0.0.37/model_v0_0_37_partition.go deleted file mode 100644 index 425fd2d..0000000 --- a/internal/api/0.0.37/model_v0_0_37_partition.go +++ /dev/null @@ -1,1127 +0,0 @@ -/* -Slurm Rest API - -API to access and control Slurm. - -API version: 0.0.37 -Contact: sales@schedmd.com -*/ - -// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. - -package openapi - -import ( - "encoding/json" -) - -// checks if the V0037Partition type satisfies the MappedNullable interface at compile time -var _ MappedNullable = &V0037Partition{} - -// V0037Partition struct for V0037Partition -type V0037Partition struct { - // partition options - Flags []string `json:"flags,omitempty"` - // preemption type - PreemptionMode []string `json:"preemption_mode,omitempty"` - // list names of allowed allocating nodes - AllowedAllocationNodes *string `json:"allowed_allocation_nodes,omitempty"` - // comma delimited list of accounts - AllowedAccounts *string `json:"allowed_accounts,omitempty"` - // comma delimited list of groups - AllowedGroups *string `json:"allowed_groups,omitempty"` - // comma delimited list of qos - AllowedQos *string `json:"allowed_qos,omitempty"` - // name of alternate partition - Alternative *string `json:"alternative,omitempty"` - // TRES billing weights - BillingWeights *string `json:"billing_weights,omitempty"` - // default MB memory per allocated CPU - DefaultMemoryPerCpu *int64 `json:"default_memory_per_cpu,omitempty"` - // default time limit (minutes) - DefaultTimeLimit *int64 `json:"default_time_limit,omitempty"` - // comma delimited list of denied accounts - DeniedAccounts *string `json:"denied_accounts,omitempty"` - // comma delimited list of denied qos - DeniedQos *string `json:"denied_qos,omitempty"` - // preemption grace time (seconds) - PreemptionGraceTime *int64 `json:"preemption_grace_time,omitempty"` - // maximum allocated CPUs per node - MaximumCpusPerNode *int32 `json:"maximum_cpus_per_node,omitempty"` - // maximum memory per allocated CPU (MiB) - MaximumMemoryPerNode *int64 `json:"maximum_memory_per_node,omitempty"` - // Max nodes per job - MaximumNodesPerJob *int32 `json:"maximum_nodes_per_job,omitempty"` - // Max time limit per job - MaxTimeLimit *int64 `json:"max_time_limit,omitempty"` - // Min number of nodes per job - MinNodesPerJob *int32 `json:"min_nodes_per_job,omitempty"` - // Partition name - Name *string `json:"name,omitempty"` - // list names of nodes in partition - Nodes *string `json:"nodes,omitempty"` - // job's time limit can be exceeded by this number of minutes before cancellation - OverTimeLimit *int32 `json:"over_time_limit,omitempty"` - // job priority weight factor - PriorityJobFactor *int32 `json:"priority_job_factor,omitempty"` - // tier for scheduling and preemption - PriorityTier *int32 `json:"priority_tier,omitempty"` - // partition QOS name - Qos *string `json:"qos,omitempty"` - // Partition state - State *string `json:"state,omitempty"` - // Total cpus in partition - TotalCpus *int32 `json:"total_cpus,omitempty"` - // Total number of nodes in partition - TotalNodes *int32 `json:"total_nodes,omitempty"` - // configured TRES in partition - Tres *string `json:"tres,omitempty"` -} - -// NewV0037Partition instantiates a new V0037Partition object -// This constructor will assign default values to properties that have it defined, -// and makes sure properties required by API are set, but the set of arguments -// will change when the set of required properties is changed -func NewV0037Partition() *V0037Partition { - this := V0037Partition{} - return &this -} - -// NewV0037PartitionWithDefaults instantiates a new V0037Partition object -// This constructor will only assign default values to properties that have it defined, -// but it doesn't guarantee that properties required by API are set -func NewV0037PartitionWithDefaults() *V0037Partition { - this := V0037Partition{} - return &this -} - -// GetFlags returns the Flags field value if set, zero value otherwise. -func (o *V0037Partition) GetFlags() []string { - if o == nil || IsNil(o.Flags) { - var ret []string - return ret - } - return o.Flags -} - -// GetFlagsOk returns a tuple with the Flags field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Partition) GetFlagsOk() ([]string, bool) { - if o == nil || IsNil(o.Flags) { - return nil, false - } - return o.Flags, true -} - -// HasFlags returns a boolean if a field has been set. -func (o *V0037Partition) HasFlags() bool { - if o != nil && !IsNil(o.Flags) { - return true - } - - return false -} - -// SetFlags gets a reference to the given []string and assigns it to the Flags field. -func (o *V0037Partition) SetFlags(v []string) { - o.Flags = v -} - -// GetPreemptionMode returns the PreemptionMode field value if set, zero value otherwise. -func (o *V0037Partition) GetPreemptionMode() []string { - if o == nil || IsNil(o.PreemptionMode) { - var ret []string - return ret - } - return o.PreemptionMode -} - -// GetPreemptionModeOk returns a tuple with the PreemptionMode field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Partition) GetPreemptionModeOk() ([]string, bool) { - if o == nil || IsNil(o.PreemptionMode) { - return nil, false - } - return o.PreemptionMode, true -} - -// HasPreemptionMode returns a boolean if a field has been set. -func (o *V0037Partition) HasPreemptionMode() bool { - if o != nil && !IsNil(o.PreemptionMode) { - return true - } - - return false -} - -// SetPreemptionMode gets a reference to the given []string and assigns it to the PreemptionMode field. -func (o *V0037Partition) SetPreemptionMode(v []string) { - o.PreemptionMode = v -} - -// GetAllowedAllocationNodes returns the AllowedAllocationNodes field value if set, zero value otherwise. -func (o *V0037Partition) GetAllowedAllocationNodes() string { - if o == nil || IsNil(o.AllowedAllocationNodes) { - var ret string - return ret - } - return *o.AllowedAllocationNodes -} - -// GetAllowedAllocationNodesOk returns a tuple with the AllowedAllocationNodes field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Partition) GetAllowedAllocationNodesOk() (*string, bool) { - if o == nil || IsNil(o.AllowedAllocationNodes) { - return nil, false - } - return o.AllowedAllocationNodes, true -} - -// HasAllowedAllocationNodes returns a boolean if a field has been set. -func (o *V0037Partition) HasAllowedAllocationNodes() bool { - if o != nil && !IsNil(o.AllowedAllocationNodes) { - return true - } - - return false -} - -// SetAllowedAllocationNodes gets a reference to the given string and assigns it to the AllowedAllocationNodes field. -func (o *V0037Partition) SetAllowedAllocationNodes(v string) { - o.AllowedAllocationNodes = &v -} - -// GetAllowedAccounts returns the AllowedAccounts field value if set, zero value otherwise. -func (o *V0037Partition) GetAllowedAccounts() string { - if o == nil || IsNil(o.AllowedAccounts) { - var ret string - return ret - } - return *o.AllowedAccounts -} - -// GetAllowedAccountsOk returns a tuple with the AllowedAccounts field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Partition) GetAllowedAccountsOk() (*string, bool) { - if o == nil || IsNil(o.AllowedAccounts) { - return nil, false - } - return o.AllowedAccounts, true -} - -// HasAllowedAccounts returns a boolean if a field has been set. -func (o *V0037Partition) HasAllowedAccounts() bool { - if o != nil && !IsNil(o.AllowedAccounts) { - return true - } - - return false -} - -// SetAllowedAccounts gets a reference to the given string and assigns it to the AllowedAccounts field. -func (o *V0037Partition) SetAllowedAccounts(v string) { - o.AllowedAccounts = &v -} - -// GetAllowedGroups returns the AllowedGroups field value if set, zero value otherwise. -func (o *V0037Partition) GetAllowedGroups() string { - if o == nil || IsNil(o.AllowedGroups) { - var ret string - return ret - } - return *o.AllowedGroups -} - -// GetAllowedGroupsOk returns a tuple with the AllowedGroups field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Partition) GetAllowedGroupsOk() (*string, bool) { - if o == nil || IsNil(o.AllowedGroups) { - return nil, false - } - return o.AllowedGroups, true -} - -// HasAllowedGroups returns a boolean if a field has been set. -func (o *V0037Partition) HasAllowedGroups() bool { - if o != nil && !IsNil(o.AllowedGroups) { - return true - } - - return false -} - -// SetAllowedGroups gets a reference to the given string and assigns it to the AllowedGroups field. -func (o *V0037Partition) SetAllowedGroups(v string) { - o.AllowedGroups = &v -} - -// GetAllowedQos returns the AllowedQos field value if set, zero value otherwise. -func (o *V0037Partition) GetAllowedQos() string { - if o == nil || IsNil(o.AllowedQos) { - var ret string - return ret - } - return *o.AllowedQos -} - -// GetAllowedQosOk returns a tuple with the AllowedQos field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Partition) GetAllowedQosOk() (*string, bool) { - if o == nil || IsNil(o.AllowedQos) { - return nil, false - } - return o.AllowedQos, true -} - -// HasAllowedQos returns a boolean if a field has been set. -func (o *V0037Partition) HasAllowedQos() bool { - if o != nil && !IsNil(o.AllowedQos) { - return true - } - - return false -} - -// SetAllowedQos gets a reference to the given string and assigns it to the AllowedQos field. -func (o *V0037Partition) SetAllowedQos(v string) { - o.AllowedQos = &v -} - -// GetAlternative returns the Alternative field value if set, zero value otherwise. -func (o *V0037Partition) GetAlternative() string { - if o == nil || IsNil(o.Alternative) { - var ret string - return ret - } - return *o.Alternative -} - -// GetAlternativeOk returns a tuple with the Alternative field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Partition) GetAlternativeOk() (*string, bool) { - if o == nil || IsNil(o.Alternative) { - return nil, false - } - return o.Alternative, true -} - -// HasAlternative returns a boolean if a field has been set. -func (o *V0037Partition) HasAlternative() bool { - if o != nil && !IsNil(o.Alternative) { - return true - } - - return false -} - -// SetAlternative gets a reference to the given string and assigns it to the Alternative field. -func (o *V0037Partition) SetAlternative(v string) { - o.Alternative = &v -} - -// GetBillingWeights returns the BillingWeights field value if set, zero value otherwise. -func (o *V0037Partition) GetBillingWeights() string { - if o == nil || IsNil(o.BillingWeights) { - var ret string - return ret - } - return *o.BillingWeights -} - -// GetBillingWeightsOk returns a tuple with the BillingWeights field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Partition) GetBillingWeightsOk() (*string, bool) { - if o == nil || IsNil(o.BillingWeights) { - return nil, false - } - return o.BillingWeights, true -} - -// HasBillingWeights returns a boolean if a field has been set. -func (o *V0037Partition) HasBillingWeights() bool { - if o != nil && !IsNil(o.BillingWeights) { - return true - } - - return false -} - -// SetBillingWeights gets a reference to the given string and assigns it to the BillingWeights field. -func (o *V0037Partition) SetBillingWeights(v string) { - o.BillingWeights = &v -} - -// GetDefaultMemoryPerCpu returns the DefaultMemoryPerCpu field value if set, zero value otherwise. -func (o *V0037Partition) GetDefaultMemoryPerCpu() int64 { - if o == nil || IsNil(o.DefaultMemoryPerCpu) { - var ret int64 - return ret - } - return *o.DefaultMemoryPerCpu -} - -// GetDefaultMemoryPerCpuOk returns a tuple with the DefaultMemoryPerCpu field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Partition) GetDefaultMemoryPerCpuOk() (*int64, bool) { - if o == nil || IsNil(o.DefaultMemoryPerCpu) { - return nil, false - } - return o.DefaultMemoryPerCpu, true -} - -// HasDefaultMemoryPerCpu returns a boolean if a field has been set. -func (o *V0037Partition) HasDefaultMemoryPerCpu() bool { - if o != nil && !IsNil(o.DefaultMemoryPerCpu) { - return true - } - - return false -} - -// SetDefaultMemoryPerCpu gets a reference to the given int64 and assigns it to the DefaultMemoryPerCpu field. -func (o *V0037Partition) SetDefaultMemoryPerCpu(v int64) { - o.DefaultMemoryPerCpu = &v -} - -// GetDefaultTimeLimit returns the DefaultTimeLimit field value if set, zero value otherwise. -func (o *V0037Partition) GetDefaultTimeLimit() int64 { - if o == nil || IsNil(o.DefaultTimeLimit) { - var ret int64 - return ret - } - return *o.DefaultTimeLimit -} - -// GetDefaultTimeLimitOk returns a tuple with the DefaultTimeLimit field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Partition) GetDefaultTimeLimitOk() (*int64, bool) { - if o == nil || IsNil(o.DefaultTimeLimit) { - return nil, false - } - return o.DefaultTimeLimit, true -} - -// HasDefaultTimeLimit returns a boolean if a field has been set. -func (o *V0037Partition) HasDefaultTimeLimit() bool { - if o != nil && !IsNil(o.DefaultTimeLimit) { - return true - } - - return false -} - -// SetDefaultTimeLimit gets a reference to the given int64 and assigns it to the DefaultTimeLimit field. -func (o *V0037Partition) SetDefaultTimeLimit(v int64) { - o.DefaultTimeLimit = &v -} - -// GetDeniedAccounts returns the DeniedAccounts field value if set, zero value otherwise. -func (o *V0037Partition) GetDeniedAccounts() string { - if o == nil || IsNil(o.DeniedAccounts) { - var ret string - return ret - } - return *o.DeniedAccounts -} - -// GetDeniedAccountsOk returns a tuple with the DeniedAccounts field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Partition) GetDeniedAccountsOk() (*string, bool) { - if o == nil || IsNil(o.DeniedAccounts) { - return nil, false - } - return o.DeniedAccounts, true -} - -// HasDeniedAccounts returns a boolean if a field has been set. -func (o *V0037Partition) HasDeniedAccounts() bool { - if o != nil && !IsNil(o.DeniedAccounts) { - return true - } - - return false -} - -// SetDeniedAccounts gets a reference to the given string and assigns it to the DeniedAccounts field. -func (o *V0037Partition) SetDeniedAccounts(v string) { - o.DeniedAccounts = &v -} - -// GetDeniedQos returns the DeniedQos field value if set, zero value otherwise. -func (o *V0037Partition) GetDeniedQos() string { - if o == nil || IsNil(o.DeniedQos) { - var ret string - return ret - } - return *o.DeniedQos -} - -// GetDeniedQosOk returns a tuple with the DeniedQos field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Partition) GetDeniedQosOk() (*string, bool) { - if o == nil || IsNil(o.DeniedQos) { - return nil, false - } - return o.DeniedQos, true -} - -// HasDeniedQos returns a boolean if a field has been set. -func (o *V0037Partition) HasDeniedQos() bool { - if o != nil && !IsNil(o.DeniedQos) { - return true - } - - return false -} - -// SetDeniedQos gets a reference to the given string and assigns it to the DeniedQos field. -func (o *V0037Partition) SetDeniedQos(v string) { - o.DeniedQos = &v -} - -// GetPreemptionGraceTime returns the PreemptionGraceTime field value if set, zero value otherwise. -func (o *V0037Partition) GetPreemptionGraceTime() int64 { - if o == nil || IsNil(o.PreemptionGraceTime) { - var ret int64 - return ret - } - return *o.PreemptionGraceTime -} - -// GetPreemptionGraceTimeOk returns a tuple with the PreemptionGraceTime field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Partition) GetPreemptionGraceTimeOk() (*int64, bool) { - if o == nil || IsNil(o.PreemptionGraceTime) { - return nil, false - } - return o.PreemptionGraceTime, true -} - -// HasPreemptionGraceTime returns a boolean if a field has been set. -func (o *V0037Partition) HasPreemptionGraceTime() bool { - if o != nil && !IsNil(o.PreemptionGraceTime) { - return true - } - - return false -} - -// SetPreemptionGraceTime gets a reference to the given int64 and assigns it to the PreemptionGraceTime field. -func (o *V0037Partition) SetPreemptionGraceTime(v int64) { - o.PreemptionGraceTime = &v -} - -// GetMaximumCpusPerNode returns the MaximumCpusPerNode field value if set, zero value otherwise. -func (o *V0037Partition) GetMaximumCpusPerNode() int32 { - if o == nil || IsNil(o.MaximumCpusPerNode) { - var ret int32 - return ret - } - return *o.MaximumCpusPerNode -} - -// GetMaximumCpusPerNodeOk returns a tuple with the MaximumCpusPerNode field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Partition) GetMaximumCpusPerNodeOk() (*int32, bool) { - if o == nil || IsNil(o.MaximumCpusPerNode) { - return nil, false - } - return o.MaximumCpusPerNode, true -} - -// HasMaximumCpusPerNode returns a boolean if a field has been set. -func (o *V0037Partition) HasMaximumCpusPerNode() bool { - if o != nil && !IsNil(o.MaximumCpusPerNode) { - return true - } - - return false -} - -// SetMaximumCpusPerNode gets a reference to the given int32 and assigns it to the MaximumCpusPerNode field. -func (o *V0037Partition) SetMaximumCpusPerNode(v int32) { - o.MaximumCpusPerNode = &v -} - -// GetMaximumMemoryPerNode returns the MaximumMemoryPerNode field value if set, zero value otherwise. -func (o *V0037Partition) GetMaximumMemoryPerNode() int64 { - if o == nil || IsNil(o.MaximumMemoryPerNode) { - var ret int64 - return ret - } - return *o.MaximumMemoryPerNode -} - -// GetMaximumMemoryPerNodeOk returns a tuple with the MaximumMemoryPerNode field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Partition) GetMaximumMemoryPerNodeOk() (*int64, bool) { - if o == nil || IsNil(o.MaximumMemoryPerNode) { - return nil, false - } - return o.MaximumMemoryPerNode, true -} - -// HasMaximumMemoryPerNode returns a boolean if a field has been set. -func (o *V0037Partition) HasMaximumMemoryPerNode() bool { - if o != nil && !IsNil(o.MaximumMemoryPerNode) { - return true - } - - return false -} - -// SetMaximumMemoryPerNode gets a reference to the given int64 and assigns it to the MaximumMemoryPerNode field. -func (o *V0037Partition) SetMaximumMemoryPerNode(v int64) { - o.MaximumMemoryPerNode = &v -} - -// GetMaximumNodesPerJob returns the MaximumNodesPerJob field value if set, zero value otherwise. -func (o *V0037Partition) GetMaximumNodesPerJob() int32 { - if o == nil || IsNil(o.MaximumNodesPerJob) { - var ret int32 - return ret - } - return *o.MaximumNodesPerJob -} - -// GetMaximumNodesPerJobOk returns a tuple with the MaximumNodesPerJob field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Partition) GetMaximumNodesPerJobOk() (*int32, bool) { - if o == nil || IsNil(o.MaximumNodesPerJob) { - return nil, false - } - return o.MaximumNodesPerJob, true -} - -// HasMaximumNodesPerJob returns a boolean if a field has been set. -func (o *V0037Partition) HasMaximumNodesPerJob() bool { - if o != nil && !IsNil(o.MaximumNodesPerJob) { - return true - } - - return false -} - -// SetMaximumNodesPerJob gets a reference to the given int32 and assigns it to the MaximumNodesPerJob field. -func (o *V0037Partition) SetMaximumNodesPerJob(v int32) { - o.MaximumNodesPerJob = &v -} - -// GetMaxTimeLimit returns the MaxTimeLimit field value if set, zero value otherwise. -func (o *V0037Partition) GetMaxTimeLimit() int64 { - if o == nil || IsNil(o.MaxTimeLimit) { - var ret int64 - return ret - } - return *o.MaxTimeLimit -} - -// GetMaxTimeLimitOk returns a tuple with the MaxTimeLimit field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Partition) GetMaxTimeLimitOk() (*int64, bool) { - if o == nil || IsNil(o.MaxTimeLimit) { - return nil, false - } - return o.MaxTimeLimit, true -} - -// HasMaxTimeLimit returns a boolean if a field has been set. -func (o *V0037Partition) HasMaxTimeLimit() bool { - if o != nil && !IsNil(o.MaxTimeLimit) { - return true - } - - return false -} - -// SetMaxTimeLimit gets a reference to the given int64 and assigns it to the MaxTimeLimit field. -func (o *V0037Partition) SetMaxTimeLimit(v int64) { - o.MaxTimeLimit = &v -} - -// GetMinNodesPerJob returns the MinNodesPerJob field value if set, zero value otherwise. -func (o *V0037Partition) GetMinNodesPerJob() int32 { - if o == nil || IsNil(o.MinNodesPerJob) { - var ret int32 - return ret - } - return *o.MinNodesPerJob -} - -// GetMinNodesPerJobOk returns a tuple with the MinNodesPerJob field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Partition) GetMinNodesPerJobOk() (*int32, bool) { - if o == nil || IsNil(o.MinNodesPerJob) { - return nil, false - } - return o.MinNodesPerJob, true -} - -// HasMinNodesPerJob returns a boolean if a field has been set. -func (o *V0037Partition) HasMinNodesPerJob() bool { - if o != nil && !IsNil(o.MinNodesPerJob) { - return true - } - - return false -} - -// SetMinNodesPerJob gets a reference to the given int32 and assigns it to the MinNodesPerJob field. -func (o *V0037Partition) SetMinNodesPerJob(v int32) { - o.MinNodesPerJob = &v -} - -// GetName returns the Name field value if set, zero value otherwise. -func (o *V0037Partition) GetName() string { - if o == nil || IsNil(o.Name) { - var ret string - return ret - } - return *o.Name -} - -// GetNameOk returns a tuple with the Name field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Partition) GetNameOk() (*string, bool) { - if o == nil || IsNil(o.Name) { - return nil, false - } - return o.Name, true -} - -// HasName returns a boolean if a field has been set. -func (o *V0037Partition) HasName() bool { - if o != nil && !IsNil(o.Name) { - return true - } - - return false -} - -// SetName gets a reference to the given string and assigns it to the Name field. -func (o *V0037Partition) SetName(v string) { - o.Name = &v -} - -// GetNodes returns the Nodes field value if set, zero value otherwise. -func (o *V0037Partition) GetNodes() string { - if o == nil || IsNil(o.Nodes) { - var ret string - return ret - } - return *o.Nodes -} - -// GetNodesOk returns a tuple with the Nodes field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Partition) GetNodesOk() (*string, bool) { - if o == nil || IsNil(o.Nodes) { - return nil, false - } - return o.Nodes, true -} - -// HasNodes returns a boolean if a field has been set. -func (o *V0037Partition) HasNodes() bool { - if o != nil && !IsNil(o.Nodes) { - return true - } - - return false -} - -// SetNodes gets a reference to the given string and assigns it to the Nodes field. -func (o *V0037Partition) SetNodes(v string) { - o.Nodes = &v -} - -// GetOverTimeLimit returns the OverTimeLimit field value if set, zero value otherwise. -func (o *V0037Partition) GetOverTimeLimit() int32 { - if o == nil || IsNil(o.OverTimeLimit) { - var ret int32 - return ret - } - return *o.OverTimeLimit -} - -// GetOverTimeLimitOk returns a tuple with the OverTimeLimit field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Partition) GetOverTimeLimitOk() (*int32, bool) { - if o == nil || IsNil(o.OverTimeLimit) { - return nil, false - } - return o.OverTimeLimit, true -} - -// HasOverTimeLimit returns a boolean if a field has been set. -func (o *V0037Partition) HasOverTimeLimit() bool { - if o != nil && !IsNil(o.OverTimeLimit) { - return true - } - - return false -} - -// SetOverTimeLimit gets a reference to the given int32 and assigns it to the OverTimeLimit field. -func (o *V0037Partition) SetOverTimeLimit(v int32) { - o.OverTimeLimit = &v -} - -// GetPriorityJobFactor returns the PriorityJobFactor field value if set, zero value otherwise. -func (o *V0037Partition) GetPriorityJobFactor() int32 { - if o == nil || IsNil(o.PriorityJobFactor) { - var ret int32 - return ret - } - return *o.PriorityJobFactor -} - -// GetPriorityJobFactorOk returns a tuple with the PriorityJobFactor field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Partition) GetPriorityJobFactorOk() (*int32, bool) { - if o == nil || IsNil(o.PriorityJobFactor) { - return nil, false - } - return o.PriorityJobFactor, true -} - -// HasPriorityJobFactor returns a boolean if a field has been set. -func (o *V0037Partition) HasPriorityJobFactor() bool { - if o != nil && !IsNil(o.PriorityJobFactor) { - return true - } - - return false -} - -// SetPriorityJobFactor gets a reference to the given int32 and assigns it to the PriorityJobFactor field. -func (o *V0037Partition) SetPriorityJobFactor(v int32) { - o.PriorityJobFactor = &v -} - -// GetPriorityTier returns the PriorityTier field value if set, zero value otherwise. -func (o *V0037Partition) GetPriorityTier() int32 { - if o == nil || IsNil(o.PriorityTier) { - var ret int32 - return ret - } - return *o.PriorityTier -} - -// GetPriorityTierOk returns a tuple with the PriorityTier field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Partition) GetPriorityTierOk() (*int32, bool) { - if o == nil || IsNil(o.PriorityTier) { - return nil, false - } - return o.PriorityTier, true -} - -// HasPriorityTier returns a boolean if a field has been set. -func (o *V0037Partition) HasPriorityTier() bool { - if o != nil && !IsNil(o.PriorityTier) { - return true - } - - return false -} - -// SetPriorityTier gets a reference to the given int32 and assigns it to the PriorityTier field. -func (o *V0037Partition) SetPriorityTier(v int32) { - o.PriorityTier = &v -} - -// GetQos returns the Qos field value if set, zero value otherwise. -func (o *V0037Partition) GetQos() string { - if o == nil || IsNil(o.Qos) { - var ret string - return ret - } - return *o.Qos -} - -// GetQosOk returns a tuple with the Qos field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Partition) GetQosOk() (*string, bool) { - if o == nil || IsNil(o.Qos) { - return nil, false - } - return o.Qos, true -} - -// HasQos returns a boolean if a field has been set. -func (o *V0037Partition) HasQos() bool { - if o != nil && !IsNil(o.Qos) { - return true - } - - return false -} - -// SetQos gets a reference to the given string and assigns it to the Qos field. -func (o *V0037Partition) SetQos(v string) { - o.Qos = &v -} - -// GetState returns the State field value if set, zero value otherwise. -func (o *V0037Partition) GetState() string { - if o == nil || IsNil(o.State) { - var ret string - return ret - } - return *o.State -} - -// GetStateOk returns a tuple with the State field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Partition) GetStateOk() (*string, bool) { - if o == nil || IsNil(o.State) { - return nil, false - } - return o.State, true -} - -// HasState returns a boolean if a field has been set. -func (o *V0037Partition) HasState() bool { - if o != nil && !IsNil(o.State) { - return true - } - - return false -} - -// SetState gets a reference to the given string and assigns it to the State field. -func (o *V0037Partition) SetState(v string) { - o.State = &v -} - -// GetTotalCpus returns the TotalCpus field value if set, zero value otherwise. -func (o *V0037Partition) GetTotalCpus() int32 { - if o == nil || IsNil(o.TotalCpus) { - var ret int32 - return ret - } - return *o.TotalCpus -} - -// GetTotalCpusOk returns a tuple with the TotalCpus field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Partition) GetTotalCpusOk() (*int32, bool) { - if o == nil || IsNil(o.TotalCpus) { - return nil, false - } - return o.TotalCpus, true -} - -// HasTotalCpus returns a boolean if a field has been set. -func (o *V0037Partition) HasTotalCpus() bool { - if o != nil && !IsNil(o.TotalCpus) { - return true - } - - return false -} - -// SetTotalCpus gets a reference to the given int32 and assigns it to the TotalCpus field. -func (o *V0037Partition) SetTotalCpus(v int32) { - o.TotalCpus = &v -} - -// GetTotalNodes returns the TotalNodes field value if set, zero value otherwise. -func (o *V0037Partition) GetTotalNodes() int32 { - if o == nil || IsNil(o.TotalNodes) { - var ret int32 - return ret - } - return *o.TotalNodes -} - -// GetTotalNodesOk returns a tuple with the TotalNodes field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Partition) GetTotalNodesOk() (*int32, bool) { - if o == nil || IsNil(o.TotalNodes) { - return nil, false - } - return o.TotalNodes, true -} - -// HasTotalNodes returns a boolean if a field has been set. -func (o *V0037Partition) HasTotalNodes() bool { - if o != nil && !IsNil(o.TotalNodes) { - return true - } - - return false -} - -// SetTotalNodes gets a reference to the given int32 and assigns it to the TotalNodes field. -func (o *V0037Partition) SetTotalNodes(v int32) { - o.TotalNodes = &v -} - -// GetTres returns the Tres field value if set, zero value otherwise. -func (o *V0037Partition) GetTres() string { - if o == nil || IsNil(o.Tres) { - var ret string - return ret - } - return *o.Tres -} - -// GetTresOk returns a tuple with the Tres field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Partition) GetTresOk() (*string, bool) { - if o == nil || IsNil(o.Tres) { - return nil, false - } - return o.Tres, true -} - -// HasTres returns a boolean if a field has been set. -func (o *V0037Partition) HasTres() bool { - if o != nil && !IsNil(o.Tres) { - return true - } - - return false -} - -// SetTres gets a reference to the given string and assigns it to the Tres field. -func (o *V0037Partition) SetTres(v string) { - o.Tres = &v -} - -func (o V0037Partition) MarshalJSON() ([]byte, error) { - toSerialize,err := o.ToMap() - if err != nil { - return []byte{}, err - } - return json.Marshal(toSerialize) -} - -func (o V0037Partition) ToMap() (map[string]interface{}, error) { - toSerialize := map[string]interface{}{} - if !IsNil(o.Flags) { - toSerialize["flags"] = o.Flags - } - if !IsNil(o.PreemptionMode) { - toSerialize["preemption_mode"] = o.PreemptionMode - } - if !IsNil(o.AllowedAllocationNodes) { - toSerialize["allowed_allocation_nodes"] = o.AllowedAllocationNodes - } - if !IsNil(o.AllowedAccounts) { - toSerialize["allowed_accounts"] = o.AllowedAccounts - } - if !IsNil(o.AllowedGroups) { - toSerialize["allowed_groups"] = o.AllowedGroups - } - if !IsNil(o.AllowedQos) { - toSerialize["allowed_qos"] = o.AllowedQos - } - if !IsNil(o.Alternative) { - toSerialize["alternative"] = o.Alternative - } - if !IsNil(o.BillingWeights) { - toSerialize["billing_weights"] = o.BillingWeights - } - if !IsNil(o.DefaultMemoryPerCpu) { - toSerialize["default_memory_per_cpu"] = o.DefaultMemoryPerCpu - } - if !IsNil(o.DefaultTimeLimit) { - toSerialize["default_time_limit"] = o.DefaultTimeLimit - } - if !IsNil(o.DeniedAccounts) { - toSerialize["denied_accounts"] = o.DeniedAccounts - } - if !IsNil(o.DeniedQos) { - toSerialize["denied_qos"] = o.DeniedQos - } - if !IsNil(o.PreemptionGraceTime) { - toSerialize["preemption_grace_time"] = o.PreemptionGraceTime - } - if !IsNil(o.MaximumCpusPerNode) { - toSerialize["maximum_cpus_per_node"] = o.MaximumCpusPerNode - } - if !IsNil(o.MaximumMemoryPerNode) { - toSerialize["maximum_memory_per_node"] = o.MaximumMemoryPerNode - } - if !IsNil(o.MaximumNodesPerJob) { - toSerialize["maximum_nodes_per_job"] = o.MaximumNodesPerJob - } - if !IsNil(o.MaxTimeLimit) { - toSerialize["max_time_limit"] = o.MaxTimeLimit - } - if !IsNil(o.MinNodesPerJob) { - toSerialize["min_nodes_per_job"] = o.MinNodesPerJob - } - if !IsNil(o.Name) { - toSerialize["name"] = o.Name - } - if !IsNil(o.Nodes) { - toSerialize["nodes"] = o.Nodes - } - if !IsNil(o.OverTimeLimit) { - toSerialize["over_time_limit"] = o.OverTimeLimit - } - if !IsNil(o.PriorityJobFactor) { - toSerialize["priority_job_factor"] = o.PriorityJobFactor - } - if !IsNil(o.PriorityTier) { - toSerialize["priority_tier"] = o.PriorityTier - } - if !IsNil(o.Qos) { - toSerialize["qos"] = o.Qos - } - if !IsNil(o.State) { - toSerialize["state"] = o.State - } - if !IsNil(o.TotalCpus) { - toSerialize["total_cpus"] = o.TotalCpus - } - if !IsNil(o.TotalNodes) { - toSerialize["total_nodes"] = o.TotalNodes - } - if !IsNil(o.Tres) { - toSerialize["tres"] = o.Tres - } - return toSerialize, nil -} - -type NullableV0037Partition struct { - value *V0037Partition - isSet bool -} - -func (v NullableV0037Partition) Get() *V0037Partition { - return v.value -} - -func (v *NullableV0037Partition) Set(val *V0037Partition) { - v.value = val - v.isSet = true -} - -func (v NullableV0037Partition) IsSet() bool { - return v.isSet -} - -func (v *NullableV0037Partition) Unset() { - v.value = nil - v.isSet = false -} - -func NewNullableV0037Partition(val *V0037Partition) *NullableV0037Partition { - return &NullableV0037Partition{value: val, isSet: true} -} - -func (v NullableV0037Partition) MarshalJSON() ([]byte, error) { - return json.Marshal(v.value) -} - -func (v *NullableV0037Partition) UnmarshalJSON(src []byte) error { - v.isSet = true - return json.Unmarshal(src, &v.value) -} - - diff --git a/internal/api/0.0.37/model_v0_0_37_partitions_response.go b/internal/api/0.0.37/model_v0_0_37_partitions_response.go deleted file mode 100644 index a197632..0000000 --- a/internal/api/0.0.37/model_v0_0_37_partitions_response.go +++ /dev/null @@ -1,165 +0,0 @@ -/* -Slurm Rest API - -API to access and control Slurm. - -API version: 0.0.37 -Contact: sales@schedmd.com -*/ - -// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. - -package openapi - -import ( - "encoding/json" -) - -// checks if the V0037PartitionsResponse type satisfies the MappedNullable interface at compile time -var _ MappedNullable = &V0037PartitionsResponse{} - -// V0037PartitionsResponse struct for V0037PartitionsResponse -type V0037PartitionsResponse struct { - // slurm errors - Errors []V0037Error `json:"errors,omitempty"` - // partition info - Partitions []V0037Partition `json:"partitions,omitempty"` -} - -// NewV0037PartitionsResponse instantiates a new V0037PartitionsResponse object -// This constructor will assign default values to properties that have it defined, -// and makes sure properties required by API are set, but the set of arguments -// will change when the set of required properties is changed -func NewV0037PartitionsResponse() *V0037PartitionsResponse { - this := V0037PartitionsResponse{} - return &this -} - -// NewV0037PartitionsResponseWithDefaults instantiates a new V0037PartitionsResponse object -// This constructor will only assign default values to properties that have it defined, -// but it doesn't guarantee that properties required by API are set -func NewV0037PartitionsResponseWithDefaults() *V0037PartitionsResponse { - this := V0037PartitionsResponse{} - return &this -} - -// GetErrors returns the Errors field value if set, zero value otherwise. -func (o *V0037PartitionsResponse) GetErrors() []V0037Error { - if o == nil || IsNil(o.Errors) { - var ret []V0037Error - return ret - } - return o.Errors -} - -// GetErrorsOk returns a tuple with the Errors field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037PartitionsResponse) GetErrorsOk() ([]V0037Error, bool) { - if o == nil || IsNil(o.Errors) { - return nil, false - } - return o.Errors, true -} - -// HasErrors returns a boolean if a field has been set. -func (o *V0037PartitionsResponse) HasErrors() bool { - if o != nil && !IsNil(o.Errors) { - return true - } - - return false -} - -// SetErrors gets a reference to the given []V0037Error and assigns it to the Errors field. -func (o *V0037PartitionsResponse) SetErrors(v []V0037Error) { - o.Errors = v -} - -// GetPartitions returns the Partitions field value if set, zero value otherwise. -func (o *V0037PartitionsResponse) GetPartitions() []V0037Partition { - if o == nil || IsNil(o.Partitions) { - var ret []V0037Partition - return ret - } - return o.Partitions -} - -// GetPartitionsOk returns a tuple with the Partitions field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037PartitionsResponse) GetPartitionsOk() ([]V0037Partition, bool) { - if o == nil || IsNil(o.Partitions) { - return nil, false - } - return o.Partitions, true -} - -// HasPartitions returns a boolean if a field has been set. -func (o *V0037PartitionsResponse) HasPartitions() bool { - if o != nil && !IsNil(o.Partitions) { - return true - } - - return false -} - -// SetPartitions gets a reference to the given []V0037Partition and assigns it to the Partitions field. -func (o *V0037PartitionsResponse) SetPartitions(v []V0037Partition) { - o.Partitions = v -} - -func (o V0037PartitionsResponse) MarshalJSON() ([]byte, error) { - toSerialize,err := o.ToMap() - if err != nil { - return []byte{}, err - } - return json.Marshal(toSerialize) -} - -func (o V0037PartitionsResponse) ToMap() (map[string]interface{}, error) { - toSerialize := map[string]interface{}{} - if !IsNil(o.Errors) { - toSerialize["errors"] = o.Errors - } - if !IsNil(o.Partitions) { - toSerialize["partitions"] = o.Partitions - } - return toSerialize, nil -} - -type NullableV0037PartitionsResponse struct { - value *V0037PartitionsResponse - isSet bool -} - -func (v NullableV0037PartitionsResponse) Get() *V0037PartitionsResponse { - return v.value -} - -func (v *NullableV0037PartitionsResponse) Set(val *V0037PartitionsResponse) { - v.value = val - v.isSet = true -} - -func (v NullableV0037PartitionsResponse) IsSet() bool { - return v.isSet -} - -func (v *NullableV0037PartitionsResponse) Unset() { - v.value = nil - v.isSet = false -} - -func NewNullableV0037PartitionsResponse(val *V0037PartitionsResponse) *NullableV0037PartitionsResponse { - return &NullableV0037PartitionsResponse{value: val, isSet: true} -} - -func (v NullableV0037PartitionsResponse) MarshalJSON() ([]byte, error) { - return json.Marshal(v.value) -} - -func (v *NullableV0037PartitionsResponse) UnmarshalJSON(src []byte) error { - v.isSet = true - return json.Unmarshal(src, &v.value) -} - - diff --git a/internal/api/0.0.37/model_v0_0_37_ping.go b/internal/api/0.0.37/model_v0_0_37_ping.go deleted file mode 100644 index d34bcd6..0000000 --- a/internal/api/0.0.37/model_v0_0_37_ping.go +++ /dev/null @@ -1,239 +0,0 @@ -/* -Slurm Rest API - -API to access and control Slurm. - -API version: 0.0.37 -Contact: sales@schedmd.com -*/ - -// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. - -package openapi - -import ( - "encoding/json" -) - -// checks if the V0037Ping type satisfies the MappedNullable interface at compile time -var _ MappedNullable = &V0037Ping{} - -// V0037Ping struct for V0037Ping -type V0037Ping struct { - // slurm controller hostname - Hostname *string `json:"hostname,omitempty"` - // slurm controller host up - Ping *string `json:"ping,omitempty"` - // slurm controller mode - Mode *string `json:"mode,omitempty"` - // slurm controller status - Status *int32 `json:"status,omitempty"` -} - -// NewV0037Ping instantiates a new V0037Ping object -// This constructor will assign default values to properties that have it defined, -// and makes sure properties required by API are set, but the set of arguments -// will change when the set of required properties is changed -func NewV0037Ping() *V0037Ping { - this := V0037Ping{} - return &this -} - -// NewV0037PingWithDefaults instantiates a new V0037Ping object -// This constructor will only assign default values to properties that have it defined, -// but it doesn't guarantee that properties required by API are set -func NewV0037PingWithDefaults() *V0037Ping { - this := V0037Ping{} - return &this -} - -// GetHostname returns the Hostname field value if set, zero value otherwise. -func (o *V0037Ping) GetHostname() string { - if o == nil || IsNil(o.Hostname) { - var ret string - return ret - } - return *o.Hostname -} - -// GetHostnameOk returns a tuple with the Hostname field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Ping) GetHostnameOk() (*string, bool) { - if o == nil || IsNil(o.Hostname) { - return nil, false - } - return o.Hostname, true -} - -// HasHostname returns a boolean if a field has been set. -func (o *V0037Ping) HasHostname() bool { - if o != nil && !IsNil(o.Hostname) { - return true - } - - return false -} - -// SetHostname gets a reference to the given string and assigns it to the Hostname field. -func (o *V0037Ping) SetHostname(v string) { - o.Hostname = &v -} - -// GetPing returns the Ping field value if set, zero value otherwise. -func (o *V0037Ping) GetPing() string { - if o == nil || IsNil(o.Ping) { - var ret string - return ret - } - return *o.Ping -} - -// GetPingOk returns a tuple with the Ping field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Ping) GetPingOk() (*string, bool) { - if o == nil || IsNil(o.Ping) { - return nil, false - } - return o.Ping, true -} - -// HasPing returns a boolean if a field has been set. -func (o *V0037Ping) HasPing() bool { - if o != nil && !IsNil(o.Ping) { - return true - } - - return false -} - -// SetPing gets a reference to the given string and assigns it to the Ping field. -func (o *V0037Ping) SetPing(v string) { - o.Ping = &v -} - -// GetMode returns the Mode field value if set, zero value otherwise. -func (o *V0037Ping) GetMode() string { - if o == nil || IsNil(o.Mode) { - var ret string - return ret - } - return *o.Mode -} - -// GetModeOk returns a tuple with the Mode field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Ping) GetModeOk() (*string, bool) { - if o == nil || IsNil(o.Mode) { - return nil, false - } - return o.Mode, true -} - -// HasMode returns a boolean if a field has been set. -func (o *V0037Ping) HasMode() bool { - if o != nil && !IsNil(o.Mode) { - return true - } - - return false -} - -// SetMode gets a reference to the given string and assigns it to the Mode field. -func (o *V0037Ping) SetMode(v string) { - o.Mode = &v -} - -// GetStatus returns the Status field value if set, zero value otherwise. -func (o *V0037Ping) GetStatus() int32 { - if o == nil || IsNil(o.Status) { - var ret int32 - return ret - } - return *o.Status -} - -// GetStatusOk returns a tuple with the Status field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Ping) GetStatusOk() (*int32, bool) { - if o == nil || IsNil(o.Status) { - return nil, false - } - return o.Status, true -} - -// HasStatus returns a boolean if a field has been set. -func (o *V0037Ping) HasStatus() bool { - if o != nil && !IsNil(o.Status) { - return true - } - - return false -} - -// SetStatus gets a reference to the given int32 and assigns it to the Status field. -func (o *V0037Ping) SetStatus(v int32) { - o.Status = &v -} - -func (o V0037Ping) MarshalJSON() ([]byte, error) { - toSerialize,err := o.ToMap() - if err != nil { - return []byte{}, err - } - return json.Marshal(toSerialize) -} - -func (o V0037Ping) ToMap() (map[string]interface{}, error) { - toSerialize := map[string]interface{}{} - if !IsNil(o.Hostname) { - toSerialize["hostname"] = o.Hostname - } - if !IsNil(o.Ping) { - toSerialize["ping"] = o.Ping - } - if !IsNil(o.Mode) { - toSerialize["mode"] = o.Mode - } - if !IsNil(o.Status) { - toSerialize["status"] = o.Status - } - return toSerialize, nil -} - -type NullableV0037Ping struct { - value *V0037Ping - isSet bool -} - -func (v NullableV0037Ping) Get() *V0037Ping { - return v.value -} - -func (v *NullableV0037Ping) Set(val *V0037Ping) { - v.value = val - v.isSet = true -} - -func (v NullableV0037Ping) IsSet() bool { - return v.isSet -} - -func (v *NullableV0037Ping) Unset() { - v.value = nil - v.isSet = false -} - -func NewNullableV0037Ping(val *V0037Ping) *NullableV0037Ping { - return &NullableV0037Ping{value: val, isSet: true} -} - -func (v NullableV0037Ping) MarshalJSON() ([]byte, error) { - return json.Marshal(v.value) -} - -func (v *NullableV0037Ping) UnmarshalJSON(src []byte) error { - v.isSet = true - return json.Unmarshal(src, &v.value) -} - - diff --git a/internal/api/0.0.37/model_v0_0_37_pings.go b/internal/api/0.0.37/model_v0_0_37_pings.go deleted file mode 100644 index 60cad5f..0000000 --- a/internal/api/0.0.37/model_v0_0_37_pings.go +++ /dev/null @@ -1,165 +0,0 @@ -/* -Slurm Rest API - -API to access and control Slurm. - -API version: 0.0.37 -Contact: sales@schedmd.com -*/ - -// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. - -package openapi - -import ( - "encoding/json" -) - -// checks if the V0037Pings type satisfies the MappedNullable interface at compile time -var _ MappedNullable = &V0037Pings{} - -// V0037Pings struct for V0037Pings -type V0037Pings struct { - // slurm errors - Errors []V0037Error `json:"errors,omitempty"` - // slurm controller pings - Pings []V0037Ping `json:"pings,omitempty"` -} - -// NewV0037Pings instantiates a new V0037Pings object -// This constructor will assign default values to properties that have it defined, -// and makes sure properties required by API are set, but the set of arguments -// will change when the set of required properties is changed -func NewV0037Pings() *V0037Pings { - this := V0037Pings{} - return &this -} - -// NewV0037PingsWithDefaults instantiates a new V0037Pings object -// This constructor will only assign default values to properties that have it defined, -// but it doesn't guarantee that properties required by API are set -func NewV0037PingsWithDefaults() *V0037Pings { - this := V0037Pings{} - return &this -} - -// GetErrors returns the Errors field value if set, zero value otherwise. -func (o *V0037Pings) GetErrors() []V0037Error { - if o == nil || IsNil(o.Errors) { - var ret []V0037Error - return ret - } - return o.Errors -} - -// GetErrorsOk returns a tuple with the Errors field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Pings) GetErrorsOk() ([]V0037Error, bool) { - if o == nil || IsNil(o.Errors) { - return nil, false - } - return o.Errors, true -} - -// HasErrors returns a boolean if a field has been set. -func (o *V0037Pings) HasErrors() bool { - if o != nil && !IsNil(o.Errors) { - return true - } - - return false -} - -// SetErrors gets a reference to the given []V0037Error and assigns it to the Errors field. -func (o *V0037Pings) SetErrors(v []V0037Error) { - o.Errors = v -} - -// GetPings returns the Pings field value if set, zero value otherwise. -func (o *V0037Pings) GetPings() []V0037Ping { - if o == nil || IsNil(o.Pings) { - var ret []V0037Ping - return ret - } - return o.Pings -} - -// GetPingsOk returns a tuple with the Pings field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Pings) GetPingsOk() ([]V0037Ping, bool) { - if o == nil || IsNil(o.Pings) { - return nil, false - } - return o.Pings, true -} - -// HasPings returns a boolean if a field has been set. -func (o *V0037Pings) HasPings() bool { - if o != nil && !IsNil(o.Pings) { - return true - } - - return false -} - -// SetPings gets a reference to the given []V0037Ping and assigns it to the Pings field. -func (o *V0037Pings) SetPings(v []V0037Ping) { - o.Pings = v -} - -func (o V0037Pings) MarshalJSON() ([]byte, error) { - toSerialize,err := o.ToMap() - if err != nil { - return []byte{}, err - } - return json.Marshal(toSerialize) -} - -func (o V0037Pings) ToMap() (map[string]interface{}, error) { - toSerialize := map[string]interface{}{} - if !IsNil(o.Errors) { - toSerialize["errors"] = o.Errors - } - if !IsNil(o.Pings) { - toSerialize["pings"] = o.Pings - } - return toSerialize, nil -} - -type NullableV0037Pings struct { - value *V0037Pings - isSet bool -} - -func (v NullableV0037Pings) Get() *V0037Pings { - return v.value -} - -func (v *NullableV0037Pings) Set(val *V0037Pings) { - v.value = val - v.isSet = true -} - -func (v NullableV0037Pings) IsSet() bool { - return v.isSet -} - -func (v *NullableV0037Pings) Unset() { - v.value = nil - v.isSet = false -} - -func NewNullableV0037Pings(val *V0037Pings) *NullableV0037Pings { - return &NullableV0037Pings{value: val, isSet: true} -} - -func (v NullableV0037Pings) MarshalJSON() ([]byte, error) { - return json.Marshal(v.value) -} - -func (v *NullableV0037Pings) UnmarshalJSON(src []byte) error { - v.isSet = true - return json.Unmarshal(src, &v.value) -} - - diff --git a/internal/api/0.0.37/model_v0_0_37_reservation.go b/internal/api/0.0.37/model_v0_0_37_reservation.go deleted file mode 100644 index ff7c4f8..0000000 --- a/internal/api/0.0.37/model_v0_0_37_reservation.go +++ /dev/null @@ -1,793 +0,0 @@ -/* -Slurm Rest API - -API to access and control Slurm. - -API version: 0.0.37 -Contact: sales@schedmd.com -*/ - -// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. - -package openapi - -import ( - "encoding/json" -) - -// checks if the V0037Reservation type satisfies the MappedNullable interface at compile time -var _ MappedNullable = &V0037Reservation{} - -// V0037Reservation struct for V0037Reservation -type V0037Reservation struct { - // Allowed accounts - Accounts *string `json:"accounts,omitempty"` - // Reserved burst buffer - BurstBuffer *string `json:"burst_buffer,omitempty"` - // Number of reserved cores - CoreCount *int32 `json:"core_count,omitempty"` - // Number of reserved specialized cores - CoreSpecCnt *int32 `json:"core_spec_cnt,omitempty"` - // End time of the reservation - EndTime *int32 `json:"end_time,omitempty"` - // List of features - Features *string `json:"features,omitempty"` - // Reservation options - Flags []string `json:"flags,omitempty"` - // List of groups permitted to use the reserved nodes - Groups *string `json:"groups,omitempty"` - // List of licenses - Licenses *string `json:"licenses,omitempty"` - // Maximum delay in which jobs outside of the reservation will be permitted to overlap once any jobs are queued for the reservation - MaxStartDelay *int32 `json:"max_start_delay,omitempty"` - // Reservationn name - Name *string `json:"name,omitempty"` - // Count of nodes reserved - NodeCount *int32 `json:"node_count,omitempty"` - // List of reserved nodes - NodeList *string `json:"node_list,omitempty"` - // Partition - Partition *string `json:"partition,omitempty"` - PurgeCompleted *V0037ReservationPurgeCompleted `json:"purge_completed,omitempty"` - // Start time of reservation - StartTime *int32 `json:"start_time,omitempty"` - // amount of power to reserve in watts - Watts *int32 `json:"watts,omitempty"` - // List of TRES - Tres *string `json:"tres,omitempty"` - // List of users - Users *string `json:"users,omitempty"` -} - -// NewV0037Reservation instantiates a new V0037Reservation object -// This constructor will assign default values to properties that have it defined, -// and makes sure properties required by API are set, but the set of arguments -// will change when the set of required properties is changed -func NewV0037Reservation() *V0037Reservation { - this := V0037Reservation{} - return &this -} - -// NewV0037ReservationWithDefaults instantiates a new V0037Reservation object -// This constructor will only assign default values to properties that have it defined, -// but it doesn't guarantee that properties required by API are set -func NewV0037ReservationWithDefaults() *V0037Reservation { - this := V0037Reservation{} - return &this -} - -// GetAccounts returns the Accounts field value if set, zero value otherwise. -func (o *V0037Reservation) GetAccounts() string { - if o == nil || IsNil(o.Accounts) { - var ret string - return ret - } - return *o.Accounts -} - -// GetAccountsOk returns a tuple with the Accounts field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Reservation) GetAccountsOk() (*string, bool) { - if o == nil || IsNil(o.Accounts) { - return nil, false - } - return o.Accounts, true -} - -// HasAccounts returns a boolean if a field has been set. -func (o *V0037Reservation) HasAccounts() bool { - if o != nil && !IsNil(o.Accounts) { - return true - } - - return false -} - -// SetAccounts gets a reference to the given string and assigns it to the Accounts field. -func (o *V0037Reservation) SetAccounts(v string) { - o.Accounts = &v -} - -// GetBurstBuffer returns the BurstBuffer field value if set, zero value otherwise. -func (o *V0037Reservation) GetBurstBuffer() string { - if o == nil || IsNil(o.BurstBuffer) { - var ret string - return ret - } - return *o.BurstBuffer -} - -// GetBurstBufferOk returns a tuple with the BurstBuffer field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Reservation) GetBurstBufferOk() (*string, bool) { - if o == nil || IsNil(o.BurstBuffer) { - return nil, false - } - return o.BurstBuffer, true -} - -// HasBurstBuffer returns a boolean if a field has been set. -func (o *V0037Reservation) HasBurstBuffer() bool { - if o != nil && !IsNil(o.BurstBuffer) { - return true - } - - return false -} - -// SetBurstBuffer gets a reference to the given string and assigns it to the BurstBuffer field. -func (o *V0037Reservation) SetBurstBuffer(v string) { - o.BurstBuffer = &v -} - -// GetCoreCount returns the CoreCount field value if set, zero value otherwise. -func (o *V0037Reservation) GetCoreCount() int32 { - if o == nil || IsNil(o.CoreCount) { - var ret int32 - return ret - } - return *o.CoreCount -} - -// GetCoreCountOk returns a tuple with the CoreCount field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Reservation) GetCoreCountOk() (*int32, bool) { - if o == nil || IsNil(o.CoreCount) { - return nil, false - } - return o.CoreCount, true -} - -// HasCoreCount returns a boolean if a field has been set. -func (o *V0037Reservation) HasCoreCount() bool { - if o != nil && !IsNil(o.CoreCount) { - return true - } - - return false -} - -// SetCoreCount gets a reference to the given int32 and assigns it to the CoreCount field. -func (o *V0037Reservation) SetCoreCount(v int32) { - o.CoreCount = &v -} - -// GetCoreSpecCnt returns the CoreSpecCnt field value if set, zero value otherwise. -func (o *V0037Reservation) GetCoreSpecCnt() int32 { - if o == nil || IsNil(o.CoreSpecCnt) { - var ret int32 - return ret - } - return *o.CoreSpecCnt -} - -// GetCoreSpecCntOk returns a tuple with the CoreSpecCnt field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Reservation) GetCoreSpecCntOk() (*int32, bool) { - if o == nil || IsNil(o.CoreSpecCnt) { - return nil, false - } - return o.CoreSpecCnt, true -} - -// HasCoreSpecCnt returns a boolean if a field has been set. -func (o *V0037Reservation) HasCoreSpecCnt() bool { - if o != nil && !IsNil(o.CoreSpecCnt) { - return true - } - - return false -} - -// SetCoreSpecCnt gets a reference to the given int32 and assigns it to the CoreSpecCnt field. -func (o *V0037Reservation) SetCoreSpecCnt(v int32) { - o.CoreSpecCnt = &v -} - -// GetEndTime returns the EndTime field value if set, zero value otherwise. -func (o *V0037Reservation) GetEndTime() int32 { - if o == nil || IsNil(o.EndTime) { - var ret int32 - return ret - } - return *o.EndTime -} - -// GetEndTimeOk returns a tuple with the EndTime field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Reservation) GetEndTimeOk() (*int32, bool) { - if o == nil || IsNil(o.EndTime) { - return nil, false - } - return o.EndTime, true -} - -// HasEndTime returns a boolean if a field has been set. -func (o *V0037Reservation) HasEndTime() bool { - if o != nil && !IsNil(o.EndTime) { - return true - } - - return false -} - -// SetEndTime gets a reference to the given int32 and assigns it to the EndTime field. -func (o *V0037Reservation) SetEndTime(v int32) { - o.EndTime = &v -} - -// GetFeatures returns the Features field value if set, zero value otherwise. -func (o *V0037Reservation) GetFeatures() string { - if o == nil || IsNil(o.Features) { - var ret string - return ret - } - return *o.Features -} - -// GetFeaturesOk returns a tuple with the Features field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Reservation) GetFeaturesOk() (*string, bool) { - if o == nil || IsNil(o.Features) { - return nil, false - } - return o.Features, true -} - -// HasFeatures returns a boolean if a field has been set. -func (o *V0037Reservation) HasFeatures() bool { - if o != nil && !IsNil(o.Features) { - return true - } - - return false -} - -// SetFeatures gets a reference to the given string and assigns it to the Features field. -func (o *V0037Reservation) SetFeatures(v string) { - o.Features = &v -} - -// GetFlags returns the Flags field value if set, zero value otherwise. -func (o *V0037Reservation) GetFlags() []string { - if o == nil || IsNil(o.Flags) { - var ret []string - return ret - } - return o.Flags -} - -// GetFlagsOk returns a tuple with the Flags field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Reservation) GetFlagsOk() ([]string, bool) { - if o == nil || IsNil(o.Flags) { - return nil, false - } - return o.Flags, true -} - -// HasFlags returns a boolean if a field has been set. -func (o *V0037Reservation) HasFlags() bool { - if o != nil && !IsNil(o.Flags) { - return true - } - - return false -} - -// SetFlags gets a reference to the given []string and assigns it to the Flags field. -func (o *V0037Reservation) SetFlags(v []string) { - o.Flags = v -} - -// GetGroups returns the Groups field value if set, zero value otherwise. -func (o *V0037Reservation) GetGroups() string { - if o == nil || IsNil(o.Groups) { - var ret string - return ret - } - return *o.Groups -} - -// GetGroupsOk returns a tuple with the Groups field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Reservation) GetGroupsOk() (*string, bool) { - if o == nil || IsNil(o.Groups) { - return nil, false - } - return o.Groups, true -} - -// HasGroups returns a boolean if a field has been set. -func (o *V0037Reservation) HasGroups() bool { - if o != nil && !IsNil(o.Groups) { - return true - } - - return false -} - -// SetGroups gets a reference to the given string and assigns it to the Groups field. -func (o *V0037Reservation) SetGroups(v string) { - o.Groups = &v -} - -// GetLicenses returns the Licenses field value if set, zero value otherwise. -func (o *V0037Reservation) GetLicenses() string { - if o == nil || IsNil(o.Licenses) { - var ret string - return ret - } - return *o.Licenses -} - -// GetLicensesOk returns a tuple with the Licenses field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Reservation) GetLicensesOk() (*string, bool) { - if o == nil || IsNil(o.Licenses) { - return nil, false - } - return o.Licenses, true -} - -// HasLicenses returns a boolean if a field has been set. -func (o *V0037Reservation) HasLicenses() bool { - if o != nil && !IsNil(o.Licenses) { - return true - } - - return false -} - -// SetLicenses gets a reference to the given string and assigns it to the Licenses field. -func (o *V0037Reservation) SetLicenses(v string) { - o.Licenses = &v -} - -// GetMaxStartDelay returns the MaxStartDelay field value if set, zero value otherwise. -func (o *V0037Reservation) GetMaxStartDelay() int32 { - if o == nil || IsNil(o.MaxStartDelay) { - var ret int32 - return ret - } - return *o.MaxStartDelay -} - -// GetMaxStartDelayOk returns a tuple with the MaxStartDelay field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Reservation) GetMaxStartDelayOk() (*int32, bool) { - if o == nil || IsNil(o.MaxStartDelay) { - return nil, false - } - return o.MaxStartDelay, true -} - -// HasMaxStartDelay returns a boolean if a field has been set. -func (o *V0037Reservation) HasMaxStartDelay() bool { - if o != nil && !IsNil(o.MaxStartDelay) { - return true - } - - return false -} - -// SetMaxStartDelay gets a reference to the given int32 and assigns it to the MaxStartDelay field. -func (o *V0037Reservation) SetMaxStartDelay(v int32) { - o.MaxStartDelay = &v -} - -// GetName returns the Name field value if set, zero value otherwise. -func (o *V0037Reservation) GetName() string { - if o == nil || IsNil(o.Name) { - var ret string - return ret - } - return *o.Name -} - -// GetNameOk returns a tuple with the Name field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Reservation) GetNameOk() (*string, bool) { - if o == nil || IsNil(o.Name) { - return nil, false - } - return o.Name, true -} - -// HasName returns a boolean if a field has been set. -func (o *V0037Reservation) HasName() bool { - if o != nil && !IsNil(o.Name) { - return true - } - - return false -} - -// SetName gets a reference to the given string and assigns it to the Name field. -func (o *V0037Reservation) SetName(v string) { - o.Name = &v -} - -// GetNodeCount returns the NodeCount field value if set, zero value otherwise. -func (o *V0037Reservation) GetNodeCount() int32 { - if o == nil || IsNil(o.NodeCount) { - var ret int32 - return ret - } - return *o.NodeCount -} - -// GetNodeCountOk returns a tuple with the NodeCount field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Reservation) GetNodeCountOk() (*int32, bool) { - if o == nil || IsNil(o.NodeCount) { - return nil, false - } - return o.NodeCount, true -} - -// HasNodeCount returns a boolean if a field has been set. -func (o *V0037Reservation) HasNodeCount() bool { - if o != nil && !IsNil(o.NodeCount) { - return true - } - - return false -} - -// SetNodeCount gets a reference to the given int32 and assigns it to the NodeCount field. -func (o *V0037Reservation) SetNodeCount(v int32) { - o.NodeCount = &v -} - -// GetNodeList returns the NodeList field value if set, zero value otherwise. -func (o *V0037Reservation) GetNodeList() string { - if o == nil || IsNil(o.NodeList) { - var ret string - return ret - } - return *o.NodeList -} - -// GetNodeListOk returns a tuple with the NodeList field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Reservation) GetNodeListOk() (*string, bool) { - if o == nil || IsNil(o.NodeList) { - return nil, false - } - return o.NodeList, true -} - -// HasNodeList returns a boolean if a field has been set. -func (o *V0037Reservation) HasNodeList() bool { - if o != nil && !IsNil(o.NodeList) { - return true - } - - return false -} - -// SetNodeList gets a reference to the given string and assigns it to the NodeList field. -func (o *V0037Reservation) SetNodeList(v string) { - o.NodeList = &v -} - -// GetPartition returns the Partition field value if set, zero value otherwise. -func (o *V0037Reservation) GetPartition() string { - if o == nil || IsNil(o.Partition) { - var ret string - return ret - } - return *o.Partition -} - -// GetPartitionOk returns a tuple with the Partition field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Reservation) GetPartitionOk() (*string, bool) { - if o == nil || IsNil(o.Partition) { - return nil, false - } - return o.Partition, true -} - -// HasPartition returns a boolean if a field has been set. -func (o *V0037Reservation) HasPartition() bool { - if o != nil && !IsNil(o.Partition) { - return true - } - - return false -} - -// SetPartition gets a reference to the given string and assigns it to the Partition field. -func (o *V0037Reservation) SetPartition(v string) { - o.Partition = &v -} - -// GetPurgeCompleted returns the PurgeCompleted field value if set, zero value otherwise. -func (o *V0037Reservation) GetPurgeCompleted() V0037ReservationPurgeCompleted { - if o == nil || IsNil(o.PurgeCompleted) { - var ret V0037ReservationPurgeCompleted - return ret - } - return *o.PurgeCompleted -} - -// GetPurgeCompletedOk returns a tuple with the PurgeCompleted field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Reservation) GetPurgeCompletedOk() (*V0037ReservationPurgeCompleted, bool) { - if o == nil || IsNil(o.PurgeCompleted) { - return nil, false - } - return o.PurgeCompleted, true -} - -// HasPurgeCompleted returns a boolean if a field has been set. -func (o *V0037Reservation) HasPurgeCompleted() bool { - if o != nil && !IsNil(o.PurgeCompleted) { - return true - } - - return false -} - -// SetPurgeCompleted gets a reference to the given V0037ReservationPurgeCompleted and assigns it to the PurgeCompleted field. -func (o *V0037Reservation) SetPurgeCompleted(v V0037ReservationPurgeCompleted) { - o.PurgeCompleted = &v -} - -// GetStartTime returns the StartTime field value if set, zero value otherwise. -func (o *V0037Reservation) GetStartTime() int32 { - if o == nil || IsNil(o.StartTime) { - var ret int32 - return ret - } - return *o.StartTime -} - -// GetStartTimeOk returns a tuple with the StartTime field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Reservation) GetStartTimeOk() (*int32, bool) { - if o == nil || IsNil(o.StartTime) { - return nil, false - } - return o.StartTime, true -} - -// HasStartTime returns a boolean if a field has been set. -func (o *V0037Reservation) HasStartTime() bool { - if o != nil && !IsNil(o.StartTime) { - return true - } - - return false -} - -// SetStartTime gets a reference to the given int32 and assigns it to the StartTime field. -func (o *V0037Reservation) SetStartTime(v int32) { - o.StartTime = &v -} - -// GetWatts returns the Watts field value if set, zero value otherwise. -func (o *V0037Reservation) GetWatts() int32 { - if o == nil || IsNil(o.Watts) { - var ret int32 - return ret - } - return *o.Watts -} - -// GetWattsOk returns a tuple with the Watts field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Reservation) GetWattsOk() (*int32, bool) { - if o == nil || IsNil(o.Watts) { - return nil, false - } - return o.Watts, true -} - -// HasWatts returns a boolean if a field has been set. -func (o *V0037Reservation) HasWatts() bool { - if o != nil && !IsNil(o.Watts) { - return true - } - - return false -} - -// SetWatts gets a reference to the given int32 and assigns it to the Watts field. -func (o *V0037Reservation) SetWatts(v int32) { - o.Watts = &v -} - -// GetTres returns the Tres field value if set, zero value otherwise. -func (o *V0037Reservation) GetTres() string { - if o == nil || IsNil(o.Tres) { - var ret string - return ret - } - return *o.Tres -} - -// GetTresOk returns a tuple with the Tres field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Reservation) GetTresOk() (*string, bool) { - if o == nil || IsNil(o.Tres) { - return nil, false - } - return o.Tres, true -} - -// HasTres returns a boolean if a field has been set. -func (o *V0037Reservation) HasTres() bool { - if o != nil && !IsNil(o.Tres) { - return true - } - - return false -} - -// SetTres gets a reference to the given string and assigns it to the Tres field. -func (o *V0037Reservation) SetTres(v string) { - o.Tres = &v -} - -// GetUsers returns the Users field value if set, zero value otherwise. -func (o *V0037Reservation) GetUsers() string { - if o == nil || IsNil(o.Users) { - var ret string - return ret - } - return *o.Users -} - -// GetUsersOk returns a tuple with the Users field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037Reservation) GetUsersOk() (*string, bool) { - if o == nil || IsNil(o.Users) { - return nil, false - } - return o.Users, true -} - -// HasUsers returns a boolean if a field has been set. -func (o *V0037Reservation) HasUsers() bool { - if o != nil && !IsNil(o.Users) { - return true - } - - return false -} - -// SetUsers gets a reference to the given string and assigns it to the Users field. -func (o *V0037Reservation) SetUsers(v string) { - o.Users = &v -} - -func (o V0037Reservation) MarshalJSON() ([]byte, error) { - toSerialize,err := o.ToMap() - if err != nil { - return []byte{}, err - } - return json.Marshal(toSerialize) -} - -func (o V0037Reservation) ToMap() (map[string]interface{}, error) { - toSerialize := map[string]interface{}{} - if !IsNil(o.Accounts) { - toSerialize["accounts"] = o.Accounts - } - if !IsNil(o.BurstBuffer) { - toSerialize["burst_buffer"] = o.BurstBuffer - } - if !IsNil(o.CoreCount) { - toSerialize["core_count"] = o.CoreCount - } - if !IsNil(o.CoreSpecCnt) { - toSerialize["core_spec_cnt"] = o.CoreSpecCnt - } - if !IsNil(o.EndTime) { - toSerialize["end_time"] = o.EndTime - } - if !IsNil(o.Features) { - toSerialize["features"] = o.Features - } - if !IsNil(o.Flags) { - toSerialize["flags"] = o.Flags - } - if !IsNil(o.Groups) { - toSerialize["groups"] = o.Groups - } - if !IsNil(o.Licenses) { - toSerialize["licenses"] = o.Licenses - } - if !IsNil(o.MaxStartDelay) { - toSerialize["max_start_delay"] = o.MaxStartDelay - } - if !IsNil(o.Name) { - toSerialize["name"] = o.Name - } - if !IsNil(o.NodeCount) { - toSerialize["node_count"] = o.NodeCount - } - if !IsNil(o.NodeList) { - toSerialize["node_list"] = o.NodeList - } - if !IsNil(o.Partition) { - toSerialize["partition"] = o.Partition - } - if !IsNil(o.PurgeCompleted) { - toSerialize["purge_completed"] = o.PurgeCompleted - } - if !IsNil(o.StartTime) { - toSerialize["start_time"] = o.StartTime - } - if !IsNil(o.Watts) { - toSerialize["watts"] = o.Watts - } - if !IsNil(o.Tres) { - toSerialize["tres"] = o.Tres - } - if !IsNil(o.Users) { - toSerialize["users"] = o.Users - } - return toSerialize, nil -} - -type NullableV0037Reservation struct { - value *V0037Reservation - isSet bool -} - -func (v NullableV0037Reservation) Get() *V0037Reservation { - return v.value -} - -func (v *NullableV0037Reservation) Set(val *V0037Reservation) { - v.value = val - v.isSet = true -} - -func (v NullableV0037Reservation) IsSet() bool { - return v.isSet -} - -func (v *NullableV0037Reservation) Unset() { - v.value = nil - v.isSet = false -} - -func NewNullableV0037Reservation(val *V0037Reservation) *NullableV0037Reservation { - return &NullableV0037Reservation{value: val, isSet: true} -} - -func (v NullableV0037Reservation) MarshalJSON() ([]byte, error) { - return json.Marshal(v.value) -} - -func (v *NullableV0037Reservation) UnmarshalJSON(src []byte) error { - v.isSet = true - return json.Unmarshal(src, &v.value) -} - - diff --git a/internal/api/0.0.37/model_v0_0_37_reservation_purge_completed.go b/internal/api/0.0.37/model_v0_0_37_reservation_purge_completed.go deleted file mode 100644 index f46e495..0000000 --- a/internal/api/0.0.37/model_v0_0_37_reservation_purge_completed.go +++ /dev/null @@ -1,128 +0,0 @@ -/* -Slurm Rest API - -API to access and control Slurm. - -API version: 0.0.37 -Contact: sales@schedmd.com -*/ - -// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. - -package openapi - -import ( - "encoding/json" -) - -// checks if the V0037ReservationPurgeCompleted type satisfies the MappedNullable interface at compile time -var _ MappedNullable = &V0037ReservationPurgeCompleted{} - -// V0037ReservationPurgeCompleted If PURGE_COMP flag is set the amount of seconds this reservation will sit idle until it is revoked -type V0037ReservationPurgeCompleted struct { - // amount of seconds this reservation will sit idle until it is revoked - Time *int32 `json:"time,omitempty"` -} - -// NewV0037ReservationPurgeCompleted instantiates a new V0037ReservationPurgeCompleted object -// This constructor will assign default values to properties that have it defined, -// and makes sure properties required by API are set, but the set of arguments -// will change when the set of required properties is changed -func NewV0037ReservationPurgeCompleted() *V0037ReservationPurgeCompleted { - this := V0037ReservationPurgeCompleted{} - return &this -} - -// NewV0037ReservationPurgeCompletedWithDefaults instantiates a new V0037ReservationPurgeCompleted object -// This constructor will only assign default values to properties that have it defined, -// but it doesn't guarantee that properties required by API are set -func NewV0037ReservationPurgeCompletedWithDefaults() *V0037ReservationPurgeCompleted { - this := V0037ReservationPurgeCompleted{} - return &this -} - -// GetTime returns the Time field value if set, zero value otherwise. -func (o *V0037ReservationPurgeCompleted) GetTime() int32 { - if o == nil || IsNil(o.Time) { - var ret int32 - return ret - } - return *o.Time -} - -// GetTimeOk returns a tuple with the Time field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037ReservationPurgeCompleted) GetTimeOk() (*int32, bool) { - if o == nil || IsNil(o.Time) { - return nil, false - } - return o.Time, true -} - -// HasTime returns a boolean if a field has been set. -func (o *V0037ReservationPurgeCompleted) HasTime() bool { - if o != nil && !IsNil(o.Time) { - return true - } - - return false -} - -// SetTime gets a reference to the given int32 and assigns it to the Time field. -func (o *V0037ReservationPurgeCompleted) SetTime(v int32) { - o.Time = &v -} - -func (o V0037ReservationPurgeCompleted) MarshalJSON() ([]byte, error) { - toSerialize,err := o.ToMap() - if err != nil { - return []byte{}, err - } - return json.Marshal(toSerialize) -} - -func (o V0037ReservationPurgeCompleted) ToMap() (map[string]interface{}, error) { - toSerialize := map[string]interface{}{} - if !IsNil(o.Time) { - toSerialize["time"] = o.Time - } - return toSerialize, nil -} - -type NullableV0037ReservationPurgeCompleted struct { - value *V0037ReservationPurgeCompleted - isSet bool -} - -func (v NullableV0037ReservationPurgeCompleted) Get() *V0037ReservationPurgeCompleted { - return v.value -} - -func (v *NullableV0037ReservationPurgeCompleted) Set(val *V0037ReservationPurgeCompleted) { - v.value = val - v.isSet = true -} - -func (v NullableV0037ReservationPurgeCompleted) IsSet() bool { - return v.isSet -} - -func (v *NullableV0037ReservationPurgeCompleted) Unset() { - v.value = nil - v.isSet = false -} - -func NewNullableV0037ReservationPurgeCompleted(val *V0037ReservationPurgeCompleted) *NullableV0037ReservationPurgeCompleted { - return &NullableV0037ReservationPurgeCompleted{value: val, isSet: true} -} - -func (v NullableV0037ReservationPurgeCompleted) MarshalJSON() ([]byte, error) { - return json.Marshal(v.value) -} - -func (v *NullableV0037ReservationPurgeCompleted) UnmarshalJSON(src []byte) error { - v.isSet = true - return json.Unmarshal(src, &v.value) -} - - diff --git a/internal/api/0.0.37/model_v0_0_37_reservations_response.go b/internal/api/0.0.37/model_v0_0_37_reservations_response.go deleted file mode 100644 index 1726bd6..0000000 --- a/internal/api/0.0.37/model_v0_0_37_reservations_response.go +++ /dev/null @@ -1,165 +0,0 @@ -/* -Slurm Rest API - -API to access and control Slurm. - -API version: 0.0.37 -Contact: sales@schedmd.com -*/ - -// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. - -package openapi - -import ( - "encoding/json" -) - -// checks if the V0037ReservationsResponse type satisfies the MappedNullable interface at compile time -var _ MappedNullable = &V0037ReservationsResponse{} - -// V0037ReservationsResponse struct for V0037ReservationsResponse -type V0037ReservationsResponse struct { - // slurm errors - Errors []V0037Error `json:"errors,omitempty"` - // reservation info - Reservations []V0037Reservation `json:"reservations,omitempty"` -} - -// NewV0037ReservationsResponse instantiates a new V0037ReservationsResponse object -// This constructor will assign default values to properties that have it defined, -// and makes sure properties required by API are set, but the set of arguments -// will change when the set of required properties is changed -func NewV0037ReservationsResponse() *V0037ReservationsResponse { - this := V0037ReservationsResponse{} - return &this -} - -// NewV0037ReservationsResponseWithDefaults instantiates a new V0037ReservationsResponse object -// This constructor will only assign default values to properties that have it defined, -// but it doesn't guarantee that properties required by API are set -func NewV0037ReservationsResponseWithDefaults() *V0037ReservationsResponse { - this := V0037ReservationsResponse{} - return &this -} - -// GetErrors returns the Errors field value if set, zero value otherwise. -func (o *V0037ReservationsResponse) GetErrors() []V0037Error { - if o == nil || IsNil(o.Errors) { - var ret []V0037Error - return ret - } - return o.Errors -} - -// GetErrorsOk returns a tuple with the Errors field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037ReservationsResponse) GetErrorsOk() ([]V0037Error, bool) { - if o == nil || IsNil(o.Errors) { - return nil, false - } - return o.Errors, true -} - -// HasErrors returns a boolean if a field has been set. -func (o *V0037ReservationsResponse) HasErrors() bool { - if o != nil && !IsNil(o.Errors) { - return true - } - - return false -} - -// SetErrors gets a reference to the given []V0037Error and assigns it to the Errors field. -func (o *V0037ReservationsResponse) SetErrors(v []V0037Error) { - o.Errors = v -} - -// GetReservations returns the Reservations field value if set, zero value otherwise. -func (o *V0037ReservationsResponse) GetReservations() []V0037Reservation { - if o == nil || IsNil(o.Reservations) { - var ret []V0037Reservation - return ret - } - return o.Reservations -} - -// GetReservationsOk returns a tuple with the Reservations field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *V0037ReservationsResponse) GetReservationsOk() ([]V0037Reservation, bool) { - if o == nil || IsNil(o.Reservations) { - return nil, false - } - return o.Reservations, true -} - -// HasReservations returns a boolean if a field has been set. -func (o *V0037ReservationsResponse) HasReservations() bool { - if o != nil && !IsNil(o.Reservations) { - return true - } - - return false -} - -// SetReservations gets a reference to the given []V0037Reservation and assigns it to the Reservations field. -func (o *V0037ReservationsResponse) SetReservations(v []V0037Reservation) { - o.Reservations = v -} - -func (o V0037ReservationsResponse) MarshalJSON() ([]byte, error) { - toSerialize,err := o.ToMap() - if err != nil { - return []byte{}, err - } - return json.Marshal(toSerialize) -} - -func (o V0037ReservationsResponse) ToMap() (map[string]interface{}, error) { - toSerialize := map[string]interface{}{} - if !IsNil(o.Errors) { - toSerialize["errors"] = o.Errors - } - if !IsNil(o.Reservations) { - toSerialize["reservations"] = o.Reservations - } - return toSerialize, nil -} - -type NullableV0037ReservationsResponse struct { - value *V0037ReservationsResponse - isSet bool -} - -func (v NullableV0037ReservationsResponse) Get() *V0037ReservationsResponse { - return v.value -} - -func (v *NullableV0037ReservationsResponse) Set(val *V0037ReservationsResponse) { - v.value = val - v.isSet = true -} - -func (v NullableV0037ReservationsResponse) IsSet() bool { - return v.isSet -} - -func (v *NullableV0037ReservationsResponse) Unset() { - v.value = nil - v.isSet = false -} - -func NewNullableV0037ReservationsResponse(val *V0037ReservationsResponse) *NullableV0037ReservationsResponse { - return &NullableV0037ReservationsResponse{value: val, isSet: true} -} - -func (v NullableV0037ReservationsResponse) MarshalJSON() ([]byte, error) { - return json.Marshal(v.value) -} - -func (v *NullableV0037ReservationsResponse) UnmarshalJSON(src []byte) error { - v.isSet = true - return json.Unmarshal(src, &v.value) -} - - diff --git a/internal/api/0.0.37/model_v0_0_37_signal.go b/internal/api/0.0.37/model_v0_0_37_signal.go deleted file mode 100644 index b5ccee9..0000000 --- a/internal/api/0.0.37/model_v0_0_37_signal.go +++ /dev/null @@ -1,138 +0,0 @@ -/* -Slurm Rest API - -API to access and control Slurm. - -API version: 0.0.37 -Contact: sales@schedmd.com -*/ - -// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. - -package openapi - -import ( - "encoding/json" - "fmt" -) - -// V0037Signal POSIX signal name -type V0037Signal int32 - -// List of v0.0.37_signal -const ( - HUP V0037Signal = "HUP" - INT V0037Signal = "INT" - QUIT V0037Signal = "QUIT" - ABRT V0037Signal = "ABRT" - KILL V0037Signal = "KILL" - ALRM V0037Signal = "ALRM" - TERM V0037Signal = "TERM" - USR1 V0037Signal = "USR1" - USR2 V0037Signal = "USR2" - URG V0037Signal = "URG" - CONT V0037Signal = "CONT" - STOP V0037Signal = "STOP" - TSTP V0037Signal = "TSTP" - TTIN V0037Signal = "TTIN" - TTOU V0037Signal = "TTOU" -) - -// All allowed values of V0037Signal enum -var AllowedV0037SignalEnumValues = []V0037Signal{ - "HUP", - "INT", - "QUIT", - "ABRT", - "KILL", - "ALRM", - "TERM", - "USR1", - "USR2", - "URG", - "CONT", - "STOP", - "TSTP", - "TTIN", - "TTOU", -} - -func (v *V0037Signal) UnmarshalJSON(src []byte) error { - var value int32 - err := json.Unmarshal(src, &value) - if err != nil { - return err - } - enumTypeValue := V0037Signal(value) - for _, existing := range AllowedV0037SignalEnumValues { - if existing == enumTypeValue { - *v = enumTypeValue - return nil - } - } - - return fmt.Errorf("%+v is not a valid V0037Signal", value) -} - -// NewV0037SignalFromValue returns a pointer to a valid V0037Signal -// for the value passed as argument, or an error if the value passed is not allowed by the enum -func NewV0037SignalFromValue(v int32) (*V0037Signal, error) { - ev := V0037Signal(v) - if ev.IsValid() { - return &ev, nil - } else { - return nil, fmt.Errorf("invalid value '%v' for V0037Signal: valid values are %v", v, AllowedV0037SignalEnumValues) - } -} - -// IsValid return true if the value is valid for the enum, false otherwise -func (v V0037Signal) IsValid() bool { - for _, existing := range AllowedV0037SignalEnumValues { - if existing == v { - return true - } - } - return false -} - -// Ptr returns reference to v0.0.37_signal value -func (v V0037Signal) Ptr() *V0037Signal { - return &v -} - -type NullableV0037Signal struct { - value *V0037Signal - isSet bool -} - -func (v NullableV0037Signal) Get() *V0037Signal { - return v.value -} - -func (v *NullableV0037Signal) Set(val *V0037Signal) { - v.value = val - v.isSet = true -} - -func (v NullableV0037Signal) IsSet() bool { - return v.isSet -} - -func (v *NullableV0037Signal) Unset() { - v.value = nil - v.isSet = false -} - -func NewNullableV0037Signal(val *V0037Signal) *NullableV0037Signal { - return &NullableV0037Signal{value: val, isSet: true} -} - -func (v NullableV0037Signal) MarshalJSON() ([]byte, error) { - return json.Marshal(v.value) -} - -func (v *NullableV0037Signal) UnmarshalJSON(src []byte) error { - v.isSet = true - return json.Unmarshal(src, &v.value) -} - diff --git a/internal/api/0.0.37/response.go b/internal/api/0.0.37/response.go deleted file mode 100644 index 620fa36..0000000 --- a/internal/api/0.0.37/response.go +++ /dev/null @@ -1,48 +0,0 @@ -/* -Slurm Rest API - -API to access and control Slurm. - -API version: 0.0.37 -Contact: sales@schedmd.com -*/ - -// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. - -package openapi - -import ( - "net/http" -) - -// APIResponse stores the API response returned by the server. -type APIResponse struct { - *http.Response `json:"-"` - Message string `json:"message,omitempty"` - // Operation is the name of the OpenAPI operation. - Operation string `json:"operation,omitempty"` - // RequestURL is the request URL. This value is always available, even if the - // embedded *http.Response is nil. - RequestURL string `json:"url,omitempty"` - // Method is the HTTP method used for the request. This value is always - // available, even if the embedded *http.Response is nil. - Method string `json:"method,omitempty"` - // Payload holds the contents of the response body (which may be nil or empty). - // This is provided here as the raw response.Body() reader will have already - // been drained. - Payload []byte `json:"-"` -} - -// NewAPIResponse returns a new APIResponse object. -func NewAPIResponse(r *http.Response) *APIResponse { - - response := &APIResponse{Response: r} - return response -} - -// NewAPIResponseWithError returns a new APIResponse object with the provided error message. -func NewAPIResponseWithError(errorMessage string) *APIResponse { - - response := &APIResponse{Message: errorMessage} - return response -} diff --git a/internal/api/0.0.37/test/api_openapi_test.go b/internal/api/0.0.37/test/api_openapi_test.go deleted file mode 100644 index 927d56d..0000000 --- a/internal/api/0.0.37/test/api_openapi_test.go +++ /dev/null @@ -1,69 +0,0 @@ -/* -Slurm Rest API - -Testing OpenapiAPIService - -*/ - -// Code generated by OpenAPI Generator (https://openapi-generator.tech); - -package openapi - -import ( - "context" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "testing" - openapiclient "github.com/GIT_USER_ID/GIT_REPO_ID" -) - -func Test_openapi_OpenapiAPIService(t *testing.T) { - - configuration := openapiclient.NewConfiguration() - apiClient := openapiclient.NewAPIClient(configuration) - - t.Run("Test OpenapiAPIService OpenapiGet", func(t *testing.T) { - - t.Skip("skip test") // remove to run test - - httpRes, err := apiClient.OpenapiAPI.OpenapiGet(context.Background()).Execute() - - require.Nil(t, err) - assert.Equal(t, 200, httpRes.StatusCode) - - }) - - t.Run("Test OpenapiAPIService OpenapiJsonGet", func(t *testing.T) { - - t.Skip("skip test") // remove to run test - - httpRes, err := apiClient.OpenapiAPI.OpenapiJsonGet(context.Background()).Execute() - - require.Nil(t, err) - assert.Equal(t, 200, httpRes.StatusCode) - - }) - - t.Run("Test OpenapiAPIService OpenapiV3Get", func(t *testing.T) { - - t.Skip("skip test") // remove to run test - - httpRes, err := apiClient.OpenapiAPI.OpenapiV3Get(context.Background()).Execute() - - require.Nil(t, err) - assert.Equal(t, 200, httpRes.StatusCode) - - }) - - t.Run("Test OpenapiAPIService OpenapiYamlGet", func(t *testing.T) { - - t.Skip("skip test") // remove to run test - - httpRes, err := apiClient.OpenapiAPI.OpenapiYamlGet(context.Background()).Execute() - - require.Nil(t, err) - assert.Equal(t, 200, httpRes.StatusCode) - - }) - -} diff --git a/internal/api/0.0.37/test/api_slurm_test.go b/internal/api/0.0.37/test/api_slurm_test.go deleted file mode 100644 index e0c4c0f..0000000 --- a/internal/api/0.0.37/test/api_slurm_test.go +++ /dev/null @@ -1,191 +0,0 @@ -/* -Slurm Rest API - -Testing SlurmAPIService - -*/ - -// Code generated by OpenAPI Generator (https://openapi-generator.tech); - -package openapi - -import ( - "context" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "testing" - openapiclient "github.com/GIT_USER_ID/GIT_REPO_ID" -) - -func Test_openapi_SlurmAPIService(t *testing.T) { - - configuration := openapiclient.NewConfiguration() - apiClient := openapiclient.NewAPIClient(configuration) - - t.Run("Test SlurmAPIService SlurmctldCancelJob", func(t *testing.T) { - - t.Skip("skip test") // remove to run test - - var jobId string - - httpRes, err := apiClient.SlurmAPI.SlurmctldCancelJob(context.Background(), jobId).Execute() - - require.Nil(t, err) - assert.Equal(t, 200, httpRes.StatusCode) - - }) - - t.Run("Test SlurmAPIService SlurmctldDiag", func(t *testing.T) { - - t.Skip("skip test") // remove to run test - - resp, httpRes, err := apiClient.SlurmAPI.SlurmctldDiag(context.Background()).Execute() - - require.Nil(t, err) - require.NotNil(t, resp) - assert.Equal(t, 200, httpRes.StatusCode) - - }) - - t.Run("Test SlurmAPIService SlurmctldGetJob", func(t *testing.T) { - - t.Skip("skip test") // remove to run test - - var jobId string - - resp, httpRes, err := apiClient.SlurmAPI.SlurmctldGetJob(context.Background(), jobId).Execute() - - require.Nil(t, err) - require.NotNil(t, resp) - assert.Equal(t, 200, httpRes.StatusCode) - - }) - - t.Run("Test SlurmAPIService SlurmctldGetJobs", func(t *testing.T) { - - t.Skip("skip test") // remove to run test - - resp, httpRes, err := apiClient.SlurmAPI.SlurmctldGetJobs(context.Background()).Execute() - - require.Nil(t, err) - require.NotNil(t, resp) - assert.Equal(t, 200, httpRes.StatusCode) - - }) - - t.Run("Test SlurmAPIService SlurmctldGetNode", func(t *testing.T) { - - t.Skip("skip test") // remove to run test - - var nodeName string - - resp, httpRes, err := apiClient.SlurmAPI.SlurmctldGetNode(context.Background(), nodeName).Execute() - - require.Nil(t, err) - require.NotNil(t, resp) - assert.Equal(t, 200, httpRes.StatusCode) - - }) - - t.Run("Test SlurmAPIService SlurmctldGetNodes", func(t *testing.T) { - - t.Skip("skip test") // remove to run test - - resp, httpRes, err := apiClient.SlurmAPI.SlurmctldGetNodes(context.Background()).Execute() - - require.Nil(t, err) - require.NotNil(t, resp) - assert.Equal(t, 200, httpRes.StatusCode) - - }) - - t.Run("Test SlurmAPIService SlurmctldGetPartition", func(t *testing.T) { - - t.Skip("skip test") // remove to run test - - var partitionName string - - resp, httpRes, err := apiClient.SlurmAPI.SlurmctldGetPartition(context.Background(), partitionName).Execute() - - require.Nil(t, err) - require.NotNil(t, resp) - assert.Equal(t, 200, httpRes.StatusCode) - - }) - - t.Run("Test SlurmAPIService SlurmctldGetPartitions", func(t *testing.T) { - - t.Skip("skip test") // remove to run test - - resp, httpRes, err := apiClient.SlurmAPI.SlurmctldGetPartitions(context.Background()).Execute() - - require.Nil(t, err) - require.NotNil(t, resp) - assert.Equal(t, 200, httpRes.StatusCode) - - }) - - t.Run("Test SlurmAPIService SlurmctldGetReservation", func(t *testing.T) { - - t.Skip("skip test") // remove to run test - - var reservationName string - - resp, httpRes, err := apiClient.SlurmAPI.SlurmctldGetReservation(context.Background(), reservationName).Execute() - - require.Nil(t, err) - require.NotNil(t, resp) - assert.Equal(t, 200, httpRes.StatusCode) - - }) - - t.Run("Test SlurmAPIService SlurmctldGetReservations", func(t *testing.T) { - - t.Skip("skip test") // remove to run test - - resp, httpRes, err := apiClient.SlurmAPI.SlurmctldGetReservations(context.Background()).Execute() - - require.Nil(t, err) - require.NotNil(t, resp) - assert.Equal(t, 200, httpRes.StatusCode) - - }) - - t.Run("Test SlurmAPIService SlurmctldPing", func(t *testing.T) { - - t.Skip("skip test") // remove to run test - - resp, httpRes, err := apiClient.SlurmAPI.SlurmctldPing(context.Background()).Execute() - - require.Nil(t, err) - require.NotNil(t, resp) - assert.Equal(t, 200, httpRes.StatusCode) - - }) - - t.Run("Test SlurmAPIService SlurmctldSubmitJob", func(t *testing.T) { - - t.Skip("skip test") // remove to run test - - resp, httpRes, err := apiClient.SlurmAPI.SlurmctldSubmitJob(context.Background()).Execute() - - require.Nil(t, err) - require.NotNil(t, resp) - assert.Equal(t, 200, httpRes.StatusCode) - - }) - - t.Run("Test SlurmAPIService SlurmctldUpdateJob", func(t *testing.T) { - - t.Skip("skip test") // remove to run test - - var jobId string - - httpRes, err := apiClient.SlurmAPI.SlurmctldUpdateJob(context.Background(), jobId).Execute() - - require.Nil(t, err) - assert.Equal(t, 200, httpRes.StatusCode) - - }) - -} diff --git a/internal/api/0.0.37/utils.go b/internal/api/0.0.37/utils.go deleted file mode 100644 index 3600ee1..0000000 --- a/internal/api/0.0.37/utils.go +++ /dev/null @@ -1,348 +0,0 @@ -/* -Slurm Rest API - -API to access and control Slurm. - -API version: 0.0.37 -Contact: sales@schedmd.com -*/ - -// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. - -package openapi - -import ( - "encoding/json" - "reflect" - "time" -) - -// PtrBool is a helper routine that returns a pointer to given boolean value. -func PtrBool(v bool) *bool { return &v } - -// PtrInt is a helper routine that returns a pointer to given integer value. -func PtrInt(v int) *int { return &v } - -// PtrInt32 is a helper routine that returns a pointer to given integer value. -func PtrInt32(v int32) *int32 { return &v } - -// PtrInt64 is a helper routine that returns a pointer to given integer value. -func PtrInt64(v int64) *int64 { return &v } - -// PtrFloat32 is a helper routine that returns a pointer to given float value. -func PtrFloat32(v float32) *float32 { return &v } - -// PtrFloat64 is a helper routine that returns a pointer to given float value. -func PtrFloat64(v float64) *float64 { return &v } - -// PtrString is a helper routine that returns a pointer to given string value. -func PtrString(v string) *string { return &v } - -// PtrTime is helper routine that returns a pointer to given Time value. -func PtrTime(v time.Time) *time.Time { return &v } - -type NullableBool struct { - value *bool - isSet bool -} - -func (v NullableBool) Get() *bool { - return v.value -} - -func (v *NullableBool) Set(val *bool) { - v.value = val - v.isSet = true -} - -func (v NullableBool) IsSet() bool { - return v.isSet -} - -func (v *NullableBool) Unset() { - v.value = nil - v.isSet = false -} - -func NewNullableBool(val *bool) *NullableBool { - return &NullableBool{value: val, isSet: true} -} - -func (v NullableBool) MarshalJSON() ([]byte, error) { - return json.Marshal(v.value) -} - -func (v *NullableBool) UnmarshalJSON(src []byte) error { - v.isSet = true - return json.Unmarshal(src, &v.value) -} - -type NullableInt struct { - value *int - isSet bool -} - -func (v NullableInt) Get() *int { - return v.value -} - -func (v *NullableInt) Set(val *int) { - v.value = val - v.isSet = true -} - -func (v NullableInt) IsSet() bool { - return v.isSet -} - -func (v *NullableInt) Unset() { - v.value = nil - v.isSet = false -} - -func NewNullableInt(val *int) *NullableInt { - return &NullableInt{value: val, isSet: true} -} - -func (v NullableInt) MarshalJSON() ([]byte, error) { - return json.Marshal(v.value) -} - -func (v *NullableInt) UnmarshalJSON(src []byte) error { - v.isSet = true - return json.Unmarshal(src, &v.value) -} - -type NullableInt32 struct { - value *int32 - isSet bool -} - -func (v NullableInt32) Get() *int32 { - return v.value -} - -func (v *NullableInt32) Set(val *int32) { - v.value = val - v.isSet = true -} - -func (v NullableInt32) IsSet() bool { - return v.isSet -} - -func (v *NullableInt32) Unset() { - v.value = nil - v.isSet = false -} - -func NewNullableInt32(val *int32) *NullableInt32 { - return &NullableInt32{value: val, isSet: true} -} - -func (v NullableInt32) MarshalJSON() ([]byte, error) { - return json.Marshal(v.value) -} - -func (v *NullableInt32) UnmarshalJSON(src []byte) error { - v.isSet = true - return json.Unmarshal(src, &v.value) -} - -type NullableInt64 struct { - value *int64 - isSet bool -} - -func (v NullableInt64) Get() *int64 { - return v.value -} - -func (v *NullableInt64) Set(val *int64) { - v.value = val - v.isSet = true -} - -func (v NullableInt64) IsSet() bool { - return v.isSet -} - -func (v *NullableInt64) Unset() { - v.value = nil - v.isSet = false -} - -func NewNullableInt64(val *int64) *NullableInt64 { - return &NullableInt64{value: val, isSet: true} -} - -func (v NullableInt64) MarshalJSON() ([]byte, error) { - return json.Marshal(v.value) -} - -func (v *NullableInt64) UnmarshalJSON(src []byte) error { - v.isSet = true - return json.Unmarshal(src, &v.value) -} - -type NullableFloat32 struct { - value *float32 - isSet bool -} - -func (v NullableFloat32) Get() *float32 { - return v.value -} - -func (v *NullableFloat32) Set(val *float32) { - v.value = val - v.isSet = true -} - -func (v NullableFloat32) IsSet() bool { - return v.isSet -} - -func (v *NullableFloat32) Unset() { - v.value = nil - v.isSet = false -} - -func NewNullableFloat32(val *float32) *NullableFloat32 { - return &NullableFloat32{value: val, isSet: true} -} - -func (v NullableFloat32) MarshalJSON() ([]byte, error) { - return json.Marshal(v.value) -} - -func (v *NullableFloat32) UnmarshalJSON(src []byte) error { - v.isSet = true - return json.Unmarshal(src, &v.value) -} - -type NullableFloat64 struct { - value *float64 - isSet bool -} - -func (v NullableFloat64) Get() *float64 { - return v.value -} - -func (v *NullableFloat64) Set(val *float64) { - v.value = val - v.isSet = true -} - -func (v NullableFloat64) IsSet() bool { - return v.isSet -} - -func (v *NullableFloat64) Unset() { - v.value = nil - v.isSet = false -} - -func NewNullableFloat64(val *float64) *NullableFloat64 { - return &NullableFloat64{value: val, isSet: true} -} - -func (v NullableFloat64) MarshalJSON() ([]byte, error) { - return json.Marshal(v.value) -} - -func (v *NullableFloat64) UnmarshalJSON(src []byte) error { - v.isSet = true - return json.Unmarshal(src, &v.value) -} - -type NullableString struct { - value *string - isSet bool -} - -func (v NullableString) Get() *string { - return v.value -} - -func (v *NullableString) Set(val *string) { - v.value = val - v.isSet = true -} - -func (v NullableString) IsSet() bool { - return v.isSet -} - -func (v *NullableString) Unset() { - v.value = nil - v.isSet = false -} - -func NewNullableString(val *string) *NullableString { - return &NullableString{value: val, isSet: true} -} - -func (v NullableString) MarshalJSON() ([]byte, error) { - return json.Marshal(v.value) -} - -func (v *NullableString) UnmarshalJSON(src []byte) error { - v.isSet = true - return json.Unmarshal(src, &v.value) -} - -type NullableTime struct { - value *time.Time - isSet bool -} - -func (v NullableTime) Get() *time.Time { - return v.value -} - -func (v *NullableTime) Set(val *time.Time) { - v.value = val - v.isSet = true -} - -func (v NullableTime) IsSet() bool { - return v.isSet -} - -func (v *NullableTime) Unset() { - v.value = nil - v.isSet = false -} - -func NewNullableTime(val *time.Time) *NullableTime { - return &NullableTime{value: val, isSet: true} -} - -func (v NullableTime) MarshalJSON() ([]byte, error) { - return v.value.MarshalJSON() -} - -func (v *NullableTime) UnmarshalJSON(src []byte) error { - v.isSet = true - return json.Unmarshal(src, &v.value) -} - -// IsNil checks if an input is nil -func IsNil(i interface{}) bool { - if i == nil { - return true - } - switch reflect.TypeOf(i).Kind() { - case reflect.Chan, reflect.Func, reflect.Map, reflect.Ptr, reflect.UnsafePointer, reflect.Interface, reflect.Slice: - return reflect.ValueOf(i).IsNil() - case reflect.Array: - return reflect.ValueOf(i).IsZero() - } - return false -} - -type MappedNullable interface { - ToMap() (map[string]interface{}, error) -} diff --git a/internal/scheduler/slurmRestClient.go b/internal/scheduler/slurmRestClient.go new file mode 100644 index 0000000..e69de29
Legend Project CodeNumber of - Number of +
{tp.id}{tp.id} {tp[topProjectSelection.key]}