UNPKG

@versatiledatakit/data-pipelines

Version:

Data Pipelines help Data Engineers develop, deploy, run, and manage data processing workloads (called 'Data Job')

266 lines 55.8 kB
/*
 * Copyright 2023-2025 Broadcom
 * SPDX-License-Identifier: Apache-2.0
 */
import { Component, EventEmitter, Inject, Input, Output } from '@angular/core';
import { DatePipe } from '@angular/common';
import { CollectionsUtil, DESC, TaurusBaseComponent } from '@versatiledatakit/shared';
import { ErrorUtil } from '../../../shared/utils';
import { DATA_PIPELINES_CONFIGS, DataJobExecutionStatus, FILTER_REQ_PARAM, JOB_EXECUTIONS_DATA_KEY, JOB_NAME_REQ_PARAM, JOBS_DATA_KEY, ORDER_REQ_PARAM, TEAM_NAME_REQ_PARAM } from '../../../model';
import { TASK_LOAD_JOB_EXECUTIONS, TASK_LOAD_JOBS_STATE } from '../../../state/tasks';
import { LOAD_JOB_ERROR_CODES, LOAD_JOBS_ERROR_CODES } from '../../../state/error-codes';
import { DataJobExecutionToGridDataJobExecution } from '../../data-job/pages/executions';
import * as i0 from "@angular/core";
import * as i1 from "@versatiledatakit/shared";
import * as i2 from "@angular/router";
import * as i3 from "../../../services";
import * as i4 from "@angular/common";
import * as i5 from "@clr/angular";
import * as i6 from "../widget-execution-status-gauge/widget-execution-status-gauge.component";
import * as i7 from "../data-jobs-failed-widget/data-jobs-failed-widget.component";
import * as i8 from "../data-jobs-executions-widget/data-jobs-executions-widget.component";
import * as i9 from "../../../shared/components/empty-state/empty-state.component";
function DataJobsHealthPanelComponent_div_2_button_5_Template(rf, ctx) { if (rf & 1) {
    const _r6 = i0.ɵɵgetCurrentView();
    i0.ɵɵelementStart(0, "button", 11);
    i0.ɵɵlistener("click", function DataJobsHealthPanelComponent_div_2_button_5_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r5 = i0.ɵɵnextContext(2); return ctx_r5.fetchDataJobExecutions(); });
    i0.ɵɵelement(1, "clr-icon", 12);
    i0.ɵɵelementEnd();
} }
const _c0 = function (a2) { return ["/manage", "teams", a2, "data-jobs"]; };
function DataJobsHealthPanelComponent_div_2_Template(rf, ctx) { if (rf & 1) {
    i0.ɵɵelementStart(0, "div", 6)(1, "div", 7)(2, "h3", 8)(3, "a", 9);
    i0.ɵɵtext(4, " Data Jobs ");
    i0.ɵɵelementEnd()();
    i0.ɵɵtemplate(5, DataJobsHealthPanelComponent_div_2_button_5_Template, 2, 0, "button", 10);
    i0.ɵɵelementEnd();
    i0.ɵɵelementStart(6, "p");
    i0.ɵɵtext(7, " Data Jobs help Data Engineers develop, deploy, run, and manage data processing workloads ");
    i0.ɵɵelementEnd()();
} if (rf & 2) {
    const ctx_r0 = i0.ɵɵnextContext();
    i0.ɵɵadvance(3);
    i0.ɵɵproperty("routerLink", i0.ɵɵpureFunction1(2, _c0, ctx_r0.teamName));
    i0.ɵɵadvance(2);
    i0.ɵɵproperty("ngIf", !ctx_r0.loading);
} }
function DataJobsHealthPanelComponent_div_4_Template(rf, ctx) { if (rf & 1) {
    i0.ɵɵelementStart(0, "div", 13)(1, "div", 14);
    i0.ɵɵelement(2, "lib-widget-execution-status-gauge", 15);
    i0.ɵɵelementEnd();
    i0.ɵɵelementStart(3, "div", 16);
    i0.ɵɵelement(4, "lib-data-jobs-failed-widget", 17);
    i0.ɵɵelementEnd();
    i0.ɵɵelementStart(5, "div", 18);
    i0.ɵɵelement(6, "lib-data-jobs-executions-widget", 19);
    i0.ɵɵelementEnd()();
} if (rf & 2) {
    const ctx_r1 = i0.ɵɵnextContext();
    i0.ɵɵadvance(2);
    i0.ɵɵproperty("allJobs", ctx_r1.dataJobs);
    i0.ɵɵadvance(2);
    i0.ɵɵproperty("allJobs", ctx_r1.dataJobs)("manageLink", ctx_r1.manageLink)("jobExecutions", ctx_r1.jobExecutions);
    i0.ɵɵadvance(2);
    i0.ɵɵproperty("allJobs", ctx_r1.dataJobs)("manageLink", ctx_r1.manageLink)("jobExecutions", ctx_r1.jobExecutions);
} }
function DataJobsHealthPanelComponent_ng_template_5_Template(rf, ctx) { if (rf & 1) {
    i0.ɵɵelementStart(0, "div", 20);
    i0.ɵɵelement(1, "lib-empty-state", 21);
    i0.ɵɵelementEnd();
} }
var State;
(function (State) {
    State["loading"] = "loading";
    State["ready"] = "ready";
    State["empty"] = "empty";
    State["error"] = "error";
})(State || (State = {}));
export class DataJobsHealthPanelComponent extends TaurusBaseComponent {
    constructor(componentService, navigationService, activatedRoute, routerService, dataJobsService, datePipe, dataPipelinesModuleConfig) {
        super(componentService, navigationService, activatedRoute);
        this.routerService = routerService;
        this.dataJobsService = dataJobsService;
        this.datePipe = datePipe;
        this.dataPipelinesModuleConfig = dataPipelinesModuleConfig;
        this.componentStateEvent = new EventEmitter();
        this.uuid = 'DataJobsHealthPanelComponent';
        this.loadingJobs = true;
        this.loadingExecutions = true;
        this.loading = true;
        this.jobExecutions = [];
        /**
         * ** Flag that indicates there is jobs executions load error.
         */
        this.isComponentInErrorState = false;
        /**
         * ** Array of error code patterns that component should listen for in errors store.
         */
        this.listenForErrorPatterns = [
            LOAD_JOB_ERROR_CODES[TASK_LOAD_JOB_EXECUTIONS].All,
            LOAD_JOBS_ERROR_CODES[TASK_LOAD_JOBS_STATE].All
        ];
    }
    fetchDataJobs() {
        this.loadingJobs = true;
        const filters = [];
        if (this.teamName) {
            filters.push({
                property: 'config.team',
                pattern: this.teamName,
                sort: null
            });
        }
        this.dataJobsService.loadJobs(this.model
            .withRequestParam(TEAM_NAME_REQ_PARAM, 'no-team-specified')
            .withRequestParam(JOB_NAME_REQ_PARAM, '')
            .withFilter(filters)
            .withRequestParam(ORDER_REQ_PARAM, {
            property: 'startTime',
            direction: DESC
        })
            .withPage(1, 1000));
    }
    fetchDataJobExecutions() {
        this.loadingExecutions = true;
        const d = new Date();
        d.setDate(d.getDate() - 1);
        this.dataJobsService.loadJobExecutions(this.model
            .withRequestParam(TEAM_NAME_REQ_PARAM, 'no-team-specified')
            .withRequestParam(JOB_NAME_REQ_PARAM, '')
            .withRequestParam(FILTER_REQ_PARAM, {
            statusIn: [DataJobExecutionStatus.USER_ERROR, DataJobExecutionStatus.PLATFORM_ERROR],
            startTimeGte: d,
            teamNameIn: this.teamName ? [this.teamName] : []
        })
            .withRequestParam(ORDER_REQ_PARAM, {
            property: 'startTime',
            direction: DESC
        }));
    }
    /**
     * @inheritDoc
     */
    onModelInit() {
        this._subscribeForTeamChange();
        this._emitNewState();
    }
    /**
     * @inheritDoc
     */
    onModelLoad() {
        this.loading = false;
    }
    /**
     * @inheritDoc
     */
    onModelChange(model, task) {
        if (task === TASK_LOAD_JOB_EXECUTIONS) {
            const executions = model.getComponentState().data.get(JOB_EXECUTIONS_DATA_KEY);
            if (executions) {
                const remappedExecutions = DataJobExecutionToGridDataJobExecution.convertToDataJobExecution(this.datePipe)([...executions]);
                this.jobExecutions = remappedExecutions.filter((ex) => ex.status !== DataJobExecutionStatus.SUCCEEDED);
                this.loadingExecutions = false;
            }
        }
        else if (task === TASK_LOAD_JOBS_STATE) {
            const componentState = model.getComponentState();
            const dataJobsData = componentState.data.get(JOBS_DATA_KEY);
            this.dataJobs = CollectionsUtil.isArray(dataJobsData?.content) ? [...dataJobsData?.content] : [];
            this.loadingJobs = false;
        }
        this._emitNewState();
    }
    /**
     * @inheritDoc
     */
    onModelError(model, task, newErrorRecords) {
        newErrorRecords.forEach((errorRecord) => {
            const error = ErrorUtil.extractError(errorRecord.error);
            if (task === TASK_LOAD_JOB_EXECUTIONS) {
                this.jobExecutions = [];
                this.loadingExecutions = false;
            }
            else if (task === TASK_LOAD_JOBS_STATE) {
                this.loadingJobs = false;
            }
            // don't show toast message, only log to console, logic for component is to stay hidden when there is no data are there is error
            console.error(error);
        });
    }
    /**
     * @inheritDoc
     */
    ngOnInit() {
        // attach listener to ErrorStore and listen for Errors change
        this.errors.onChange((store) => {
            // if there is record for listened error code patterns set component in error state
            this.isComponentInErrorState = store.hasCodePattern(...this.listenForErrorPatterns);
        });
        super.ngOnInit();
    }
    _emitNewState() {
        if (this.loadingJobs || this.loadingExecutions) {
            this.componentStateEvent.emit(State.loading);
        }
        else if (this.jobExecutions.length === 0 && this.dataJobs.length === 0) {
            this.componentStateEvent.emit(State.empty);
        }
        else if (this.isComponentInErrorState) {
            this.componentStateEvent.emit(State.error);
        }
        else {
            this.componentStateEvent.emit(State.ready);
        }
    }
    _subscribeForTeamChange() {
        if (this.dataPipelinesModuleConfig.manageConfig?.selectedTeamNameObservable) {
            this.subscriptions.push(this.dataPipelinesModuleConfig.manageConfig?.selectedTeamNameObservable.subscribe({
                next: (newTeamName) => {
                    if (newTeamName !== this.teamName) {
                        if (newTeamName && newTeamName !== '') {
                            this.teamName = newTeamName;
                            this.fetchDataJobExecutions();
                            this.fetchDataJobs();
                        }
                    }
                },
                error: (error) => {
                    this.jobExecutions = [];
                    this.dataJobs = [];
                    console.error('Error loading selected team', error);
                }
            }));
        }
        else {
            this.fetchDataJobExecutions();
            this.fetchDataJobs();
        }
    }
}
DataJobsHealthPanelComponent.ɵfac = function DataJobsHealthPanelComponent_Factory(t) { return new (t || DataJobsHealthPanelComponent)(i0.ɵɵdirectiveInject(i1.ComponentService), i0.ɵɵdirectiveInject(i1.NavigationService), i0.ɵɵdirectiveInject(i2.ActivatedRoute), i0.ɵɵdirectiveInject(i1.RouterService), i0.ɵɵdirectiveInject(i3.DataJobsService), i0.ɵɵdirectiveInject(i4.DatePipe), i0.ɵɵdirectiveInject(DATA_PIPELINES_CONFIGS)); };
DataJobsHealthPanelComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DataJobsHealthPanelComponent, selectors: [["lib-data-jobs-health-panel"]], inputs: { manageLink: "manageLink" }, outputs: { componentStateEvent: "componentStateEvent" }, features: [i0.ɵɵProvidersFeature([DatePipe]), i0.ɵɵInheritDefinitionFeature], decls: 7, vars: 3, consts: [[1, "get-started-jobs", "widget"], [1, "widget-section-container", "widget-card"], ["class", "widget-header", 4, "ngIf"], [1, "widget-container"], ["class", "clr-row", 4, "ngIf", "ngIfElse"], ["loadingTemplate", ""], [1, "widget-header"], [1, "widget-header-title-refresh-button"], [1, "header-title"], [3, "routerLink"], ["class", "btn btn-icon btn-link refresh", "aria-label", "refresh", 3, "click", 4, "ngIf"], ["aria-label", "refresh", 1, "btn", "btn-icon", "btn-link", "refresh", 3, "click"], ["shape", "refresh", "size", "14"], [1, "clr-row"], [1, "clr-col-lg-3", "clr-col-12"], ["data-cy", "dp-data-jobs-status-gauge-widget", 3, "allJobs"], [1, "clr-col-lg-4", "clr-col-12"], ["data-cy", "dp-failed-data-jobs-widget", 3, "allJobs", "manageLink", "jobExecutions"], [1, "clr-col-lg-5", "clr-col-12"], ["data-cy", "dp-failed-data-jobs-executions-widget", 3, "allJobs", "manageLink", "jobExecutions"], [1, "content-center"], ["title", "Fetching Data...", "animSrc", "assets/animations/chart-loading-animation.json", "description", "Wait a second... the data will appear here soon."]], template: function DataJobsHealthPanelComponent_Template(rf, ctx) { if (rf & 1) {
        i0.ɵɵelementStart(0, "div", 0)(1, "section", 1);
        i0.ɵɵtemplate(2, DataJobsHealthPanelComponent_div_2_Template, 8, 4, "div", 2);
        i0.ɵɵelementStart(3, "div", 3);
        i0.ɵɵtemplate(4, DataJobsHealthPanelComponent_div_4_Template, 7, 7, "div", 4);
        i0.ɵɵtemplate(5, DataJobsHealthPanelComponent_ng_template_5_Template, 2, 0, "ng-template", null, 5, i0.ɵɵtemplateRefExtractor);
        i0.ɵɵelementEnd()()();
    } if (rf & 2) {
        const _r2 = i0.ɵɵreference(6);
        i0.ɵɵadvance(2);
        i0.ɵɵproperty("ngIf", !ctx.loadingExecutions && !ctx.loadingJobs);
        i0.ɵɵadvance(2);
        i0.ɵɵproperty("ngIf", !ctx.loadingExecutions && !ctx.loadingJobs)("ngIfElse", _r2);
    } }, directives: [i4.NgIf, i2.RouterLinkWithHref, i5.ClrIconCustomTag, i6.WidgetExecutionStatusGaugeComponent, i7.DataJobsFailedWidgetComponent, i8.DataJobsExecutionsWidgetComponent, i9.EmptyStateComponent], styles: [".widget[_ngcontent-%COMP%]{position:relative;height:100%}.widget[_ngcontent-%COMP%]   .widget-section-container[_ngcontent-%COMP%]{padding:1.2rem;height:100%;border-radius:.2rem;border:none;box-shadow:0 3px 10px #0000001a,0 3px 5px #00000017;position:relative;overflow:hidden}.widget[_ngcontent-%COMP%]   .widget-section-container[_ngcontent-%COMP%]     .datagrid-table-wrapper{max-width:98.6%!important}  .fade-to-dark.dark .widget-card{--label-color-error: #f27963;--label-color-success: #5eb715;--header-background: #28404d;--widget-border: 1px solid #28404d;--widget-clickable-background: #324f62;--widget-details-background: #21333b;--widget-details-hover-background: #1b2a32;--widget-details-color: #b3b3b3;--widget-details-border: 2px solid #28404d;--widget-icon-backgound-color: #194b70}.widget-card[_ngcontent-%COMP%]{--label-color-error: #f35e44;--label-color-success: #5aa220;--header-background: #ffffff;--widget-border: 1px solid #e3f5fc;--widget-clickable-background: #e8e8e8;--widget-details-background: #ffffff;--widget-details-hover-background: #d8e3e9;--widget-details-color: #8c8c8c;--widget-details-border: 2px solid #e3f5fc;--widget-icon-backgound-color: #0072a3}.widget-card[_ngcontent-%COMP%]   .label-error[_ngcontent-%COMP%]{color:var(--label-color-error)}.widget-card[_ngcontent-%COMP%]   .label-success[_ngcontent-%COMP%]{color:var(--label-color-success)}.widget-card[_ngcontent-%COMP%]   .widget-footer[_ngcontent-%COMP%]{position:relative;min-height:25px;margin:1.3rem -1.2rem -1.2rem;border-top:var(--widget-border)}.widget-card[_ngcontent-%COMP%]   .widget-footer[_ngcontent-%COMP%]   a[_ngcontent-%COMP%]{margin:0 0 0 .5rem;padding:0}.widget-card[_ngcontent-%COMP%]   .widget-header[_ngcontent-%COMP%]{background:var(--header-background);margin:-1.2rem -1.2rem 0;padding:.8rem;border-radius:.1rem .1rem 0 0;position:relative}.widget-card[_ngcontent-%COMP%]   .widget-header[_ngcontent-%COMP%]   .widget-header-title-refresh-button[_ngcontent-%COMP%]{display:flex;align-items:center}.widget-card[_ngcontent-%COMP%]   .widget-header[_ngcontent-%COMP%]   .widget-header-title-refresh-button[_ngcontent-%COMP%]   .header-title[_ngcontent-%COMP%]{margin-top:0;font-weight:200}.widget-card[_ngcontent-%COMP%]   .widget-header[_ngcontent-%COMP%]   .widget-header-title-refresh-button[_ngcontent-%COMP%]   .header-title[_ngcontent-%COMP%]   clr-icon[_ngcontent-%COMP%]{margin-top:-2px}.widget-card[_ngcontent-%COMP%]   .widget-header[_ngcontent-%COMP%]   p[_ngcontent-%COMP%]{margin-top:.4rem;line-height:.8rem;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.widget-card[_ngcontent-%COMP%]   .widget-container[_ngcontent-%COMP%]{z-index:100}.widget-card[_ngcontent-%COMP%]   .widget-container[_ngcontent-%COMP%]   .widget-values[_ngcontent-%COMP%]{line-height:.8rem;display:grid;grid-template:\". . .\" 1fr/1fr 1fr 1fr;margin-left:-1.2rem;margin-right:-1.2rem;margin-bottom:-1.2rem;grid-row-gap:1.2rem;row-gap:1.2rem;border-top:var(--widget-border)}.widget-card[_ngcontent-%COMP%]   .widget-container[_ngcontent-%COMP%]   .widget-values[_ngcontent-%COMP%]   .widget-value[_ngcontent-%COMP%]{display:block;text-align:center;background:var(--widget-details-background);padding:.6rem}.widget-card[_ngcontent-%COMP%]   .widget-container[_ngcontent-%COMP%]   .widget-values[_ngcontent-%COMP%]   .widget-value[_ngcontent-%COMP%]:not(:first-child){border-left:var(--widget-border)}.widget-card[_ngcontent-%COMP%]   .widget-container[_ngcontent-%COMP%]   .widget-values[_ngcontent-%COMP%]   .widget-value[_ngcontent-%COMP%]:not(:last-child){border-right:var(--widget-border)}.widget-card[_ngcontent-%COMP%]   .widget-container[_ngcontent-%COMP%]   .widget-values[_ngcontent-%COMP%]   .widget-value[_ngcontent-%COMP%]   .widget-title[_ngcontent-%COMP%]{margin-bottom:.2rem;margin-top:.2rem;font-size:1.2rem;font-weight:500;display:block}.widget-card[_ngcontent-%COMP%]   .widget-container[_ngcontent-%COMP%]   .widget-values[_ngcontent-%COMP%]   .widget-value[_ngcontent-%COMP%]   .widget-text[_ngcontent-%COMP%]{font-size:.55rem;display:block;line-height:.6rem}.widget-card[_ngcontent-%COMP%]   .widget-container[_ngcontent-%COMP%]   .widget-values[_ngcontent-%COMP%]   .widget-value.widget-clickable[_ngcontent-%COMP%]{cursor:pointer}.widget-card[_ngcontent-%COMP%]   .widget-container[_ngcontent-%COMP%]   .widget-values[_ngcontent-%COMP%]   .widget-value.widget-clickable[_ngcontent-%COMP%]:hover{background:var(--widget-clickable-background)}.widget-card[_ngcontent-%COMP%]   .widget-container[_ngcontent-%COMP%]   .widget-values[_ngcontent-%COMP%]   .widget-value.show-details[_ngcontent-%COMP%]{background:var(--widget-clickable-background);position:relative}.widget-card[_ngcontent-%COMP%]   .widget-container[_ngcontent-%COMP%]   .widget-values[_ngcontent-%COMP%]   .widget-value.show-details[_ngcontent-%COMP%]   .widget-text[_ngcontent-%COMP%]{font-weight:700}.widget-card[_ngcontent-%COMP%]   .widget-details[_ngcontent-%COMP%]{z-index:1;height:0;margin:1.2rem -1.2rem -1.2rem;transition:height .3s;overflow:hidden;background:var(--widget-details-background)}.widget-card[_ngcontent-%COMP%]   .widget-details.show-details[_ngcontent-%COMP%]{height:240px;border-top:var(--widget-details-border)}.widget-card[_ngcontent-%COMP%]   .widget-details[_ngcontent-%COMP%]   .no-issues[_ngcontent-%COMP%]{height:100%;width:100%;text-align:center;margin-top:1.2rem}.widget-card[_ngcontent-%COMP%]   .widget-details[_ngcontent-%COMP%]   .no-issues[_ngcontent-%COMP%]   .no-issues-img[_ngcontent-%COMP%]{display:block;height:120px;margin:0 auto}.widget-card[_ngcontent-%COMP%]   .widget-details[_ngcontent-%COMP%]   .no-issues[_ngcontent-%COMP%]   .no-issues-text[_ngcontent-%COMP%]{color:var(--widget-details-color)}.widget-card[_ngcontent-%COMP%]   .widget-details[_ngcontent-%COMP%]   .data-details[_ngcontent-%COMP%]{height:240px;position:relative}.widget-card   .widget-details   .data-details   [_nghost-%COMP%]     clr-datagrid{height:100%}.widget-card   .widget-details   .data-details   [_nghost-%COMP%]     clr-datagrid .datagrid{margin-top:0;flex-basis:0;border:0}.widget-card   .widget-details   .data-details   [_nghost-%COMP%]     clr-datagrid .datagrid .datagrid-row{border-top:none;border-bottom:none}.widget-card   .widget-details   .data-details   [_nghost-%COMP%]     clr-datagrid .datagrid .datagrid-placeholder-container{border-top:none}.widget-card   .widget-details   .data-details   [_nghost-%COMP%]     clr-datagrid .datagrid-footer{padding:.1rem .5rem;border-right:none;border-left:none;border-bottom:none}.widget-card[_ngcontent-%COMP%]   .widget-details[_ngcontent-%COMP%]   .data-details[_ngcontent-%COMP%]   .data-row[_ngcontent-%COMP%]{display:block;margin-top:0;position:relative;padding-left:.2rem}.widget-card[_ngcontent-%COMP%]   .widget-details[_ngcontent-%COMP%]   .data-details[_ngcontent-%COMP%]   .data-row.clickable[_ngcontent-%COMP%]{cursor:pointer}.widget-card[_ngcontent-%COMP%]   .widget-details[_ngcontent-%COMP%]   .data-details[_ngcontent-%COMP%]   .data-row[_ngcontent-%COMP%]   .data-title[_ngcontent-%COMP%]{line-height:.6rem;font-weight:500;display:block;margin-top:0;position:relative}.widget-card[_ngcontent-%COMP%]   .widget-details[_ngcontent-%COMP%]   .data-details[_ngcontent-%COMP%]   .data-row[_ngcontent-%COMP%]   .data-title[_ngcontent-%COMP%]   .btn[_ngcontent-%COMP%]{margin:0}.widget-card[_ngcontent-%COMP%]   .widget-details[_ngcontent-%COMP%]   .data-details[_ngcontent-%COMP%]   .data-row[_ngcontent-%COMP%]   .data-title[_ngcontent-%COMP%]   .title-icon[_ngcontent-%COMP%]{float:left;width:32px;display:flex;justify-content:center}.widget-card[_ngcontent-%COMP%]   .widget-details[_ngcontent-%COMP%]   .data-details[_ngcontent-%COMP%]   .data-row[_ngcontent-%COMP%]   .data-title[_ngcontent-%COMP%]   .title-icon[_ngcontent-%COMP%]   lib-status-cell[_ngcontent-%COMP%]{width:15px;display:flex;justify-content:center}.widget-card[_ngcontent-%COMP%]   .widget-details[_ngcontent-%COMP%]   .data-details[_ngcontent-%COMP%]   .data-row[_ngcontent-%COMP%]   .data-description[_ngcontent-%COMP%]{display:block;margin-top:0;color:var(--widget-details-color);line-height:1rem}.widget-card[_ngcontent-%COMP%]   .widget-details[_ngcontent-%COMP%]   .data-details[_ngcontent-%COMP%]   .data-row[_ngcontent-%COMP%]   .data-description[_ngcontent-%COMP%]   clr-icon[_ngcontent-%COMP%]{margin-top:-2px}"] });
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DataJobsHealthPanelComponent, [{
        type: Component,
        args: [{ selector: 'lib-data-jobs-health-panel', providers: [DatePipe], template: "<!--\n   ~ Copyright 2023-2025 Broadcom\n   ~ SPDX-License-Identifier: Apache-2.0\n  -->\n\n<div class=\"get-started-jobs widget\">\n    <section class=\"widget-section-container widget-card\">\n        <div class=\"widget-header\" *ngIf=\"!loadingExecutions && !loadingJobs\">\n            <div class=\"widget-header-title-refresh-button\">\n                <h3 class=\"header-title\">\n                    <a\n                        [routerLink]=\"[\n                            '/manage',\n                            'teams',\n                            teamName,\n                            'data-jobs'\n                        ]\"\n                    >\n                        Data Jobs\n                    </a>\n                </h3>\n                <button\n                    *ngIf=\"!loading\"\n                    class=\"btn btn-icon btn-link refresh\"\n                    aria-label=\"refresh\"\n                    (click)=\"fetchDataJobExecutions()\"\n                >\n                    <clr-icon shape=\"refresh\" size=\"14\"></clr-icon>\n                </button>\n            </div>\n            <p>\n                Data Jobs help Data Engineers develop, deploy, run, and manage\n                data processing workloads\n            </p>\n        </div>\n\n        <div class=\"widget-container\">\n            <div\n                class=\"clr-row\"\n                *ngIf=\"!loadingExecutions && !loadingJobs; else loadingTemplate\"\n            >\n                <div class=\"clr-col-lg-3 clr-col-12\">\n                    <lib-widget-execution-status-gauge\n                        data-cy=\"dp-data-jobs-status-gauge-widget\"\n                        [allJobs]=\"dataJobs\"\n                    ></lib-widget-execution-status-gauge>\n                </div>\n                <div class=\"clr-col-lg-4 clr-col-12\">\n                    <lib-data-jobs-failed-widget\n                        data-cy=\"dp-failed-data-jobs-widget\"\n                        [allJobs]=\"dataJobs\"\n                        [manageLink]=\"manageLink\"\n                        [jobExecutions]=\"jobExecutions\"\n                    ></lib-data-jobs-failed-widget>\n                </div>\n                <div class=\"clr-col-lg-5 clr-col-12\">\n                    <lib-data-jobs-executions-widget\n                        data-cy=\"dp-failed-data-jobs-executions-widget\"\n                        [allJobs]=\"dataJobs\"\n                        [manageLink]=\"manageLink\"\n                        [jobExecutions]=\"jobExecutions\"\n                    ></lib-data-jobs-executions-widget>\n                </div>\n            </div>\n            <ng-template #loadingTemplate>\n                <div class=\"content-center\">\n                    <lib-empty-state\n                        title=\"Fetching Data...\"\n                        animSrc=\"assets/animations/chart-loading-animation.json\"\n                        description=\"Wait a second... the data will appear here soon.\"\n                    >\n                    </lib-empty-state>\n                </div>\n            </ng-template>\n        </div>\n    </section>\n</div>\n", styles: ["/*!\n * Copyright 2023-2025 Broadcom\n * SPDX-License-Identifier: Apache-2.0\n */.widget{position:relative;height:100%}.widget .widget-section-container{padding:1.2rem;height:100%;border-radius:.2rem;border:none;box-shadow:0 3px 10px #0000001a,0 3px 5px #00000017;position:relative;overflow:hidden}.widget .widget-section-container ::ng-deep .datagrid-table-wrapper{max-width:98.6%!important}::ng-deep .fade-to-dark.dark .widget-card{--label-color-error: #f27963;--label-color-success: #5eb715;--header-background: #28404d;--widget-border: 1px solid #28404d;--widget-clickable-background: #324f62;--widget-details-background: #21333b;--widget-details-hover-background: #1b2a32;--widget-details-color: #b3b3b3;--widget-details-border: 2px solid #28404d;--widget-icon-backgound-color: #194b70}.widget-card{--label-color-error: #f35e44;--label-color-success: #5aa220;--header-background: #ffffff;--widget-border: 1px solid #e3f5fc;--widget-clickable-background: #e8e8e8;--widget-details-background: #ffffff;--widget-details-hover-background: #d8e3e9;--widget-details-color: #8c8c8c;--widget-details-border: 2px solid #e3f5fc;--widget-icon-backgound-color: #0072a3}.widget-card .label-error{color:var(--label-color-error)}.widget-card .label-success{color:var(--label-color-success)}.widget-card .widget-footer{position:relative;min-height:25px;margin:1.3rem -1.2rem -1.2rem;border-top:var(--widget-border)}.widget-card .widget-footer a{margin:0 0 0 .5rem;padding:0}.widget-card .widget-header{background:var(--header-background);margin:-1.2rem -1.2rem 0;padding:.8rem;border-radius:.1rem .1rem 0 0;position:relative}.widget-card .widget-header .widget-header-title-refresh-button{display:flex;align-items:center}.widget-card .widget-header .widget-header-title-refresh-button .header-title{margin-top:0;font-weight:200}.widget-card .widget-header .widget-header-title-refresh-button .header-title clr-icon{margin-top:-2px}.widget-card .widget-header p{margin-top:.4rem;line-height:.8rem;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.widget-card .widget-container{z-index:100}.widget-card .widget-container .widget-values{line-height:.8rem;display:grid;grid-template:\". . .\" 1fr/1fr 1fr 1fr;margin-left:-1.2rem;margin-right:-1.2rem;margin-bottom:-1.2rem;grid-row-gap:1.2rem;row-gap:1.2rem;border-top:var(--widget-border)}.widget-card .widget-container .widget-values .widget-value{display:block;text-align:center;background:var(--widget-details-background);padding:.6rem}.widget-card .widget-container .widget-values .widget-value:not(:first-child){border-left:var(--widget-border)}.widget-card .widget-container .widget-values .widget-value:not(:last-child){border-right:var(--widget-border)}.widget-card .widget-container .widget-values .widget-value .widget-title{margin-bottom:.2rem;margin-top:.2rem;font-size:1.2rem;font-weight:500;display:block}.widget-card .widget-container .widget-values .widget-value .widget-text{font-size:.55rem;display:block;line-height:.6rem}.widget-card .widget-container .widget-values .widget-value.widget-clickable{cursor:pointer}.widget-card .widget-container .widget-values .widget-value.widget-clickable:hover{background:var(--widget-clickable-background)}.widget-card .widget-container .widget-values .widget-value.show-details{background:var(--widget-clickable-background);position:relative}.widget-card .widget-container .widget-values .widget-value.show-details .widget-text{font-weight:700}.widget-card .widget-details{z-index:1;height:0;margin:1.2rem -1.2rem -1.2rem;transition:height .3s;overflow:hidden;background:var(--widget-details-background)}.widget-card .widget-details.show-details{height:240px;border-top:var(--widget-details-border)}.widget-card .widget-details .no-issues{height:100%;width:100%;text-align:center;margin-top:1.2rem}.widget-card .widget-details .no-issues .no-issues-img{display:block;height:120px;margin:0 auto}.widget-card .widget-details .no-issues .no-issues-text{color:var(--widget-details-color)}.widget-card .widget-details .data-details{height:240px;position:relative}.widget-card .widget-details .data-details :host ::ng-deep clr-datagrid{height:100%}.widget-card .widget-details .data-details :host ::ng-deep clr-datagrid .datagrid{margin-top:0;flex-basis:0;border:0}.widget-card .widget-details .data-details :host ::ng-deep clr-datagrid .datagrid .datagrid-row{border-top:none;border-bottom:none}.widget-card .widget-details .data-details :host ::ng-deep clr-datagrid .datagrid .datagrid-placeholder-container{border-top:none}.widget-card .widget-details .data-details :host ::ng-deep clr-datagrid .datagrid-footer{padding:.1rem .5rem;border-right:none;border-left:none;border-bottom:none}.widget-card .widget-details .data-details .data-row{display:block;margin-top:0;position:relative;padding-left:.2rem}.widget-card .widget-details .data-details .data-row.clickable{cursor:pointer}.widget-card .widget-details .data-details .data-row .data-title{line-height:.6rem;font-weight:500;display:block;margin-top:0;position:relative}.widget-card .widget-details .data-details .data-row .data-title .btn{margin:0}.widget-card .widget-details .data-details .data-row .data-title .title-icon{float:left;width:32px;display:flex;justify-content:center}.widget-card .widget-details .data-details .data-row .data-title .title-icon lib-status-cell{width:15px;display:flex;justify-content:center}.widget-card .widget-details .data-details .data-row .data-description{display:block;margin-top:0;color:var(--widget-details-color);line-height:1rem}.widget-card .widget-details .data-details .data-row .data-description clr-icon{margin-top:-2px}\n"] }]
    }], function () { return [{ type: i1.ComponentService }, { type: i1.NavigationService }, { type: i2.ActivatedRoute }, { type: i1.RouterService }, { type: i3.DataJobsService }, { type: i4.DatePipe }, { type: undefined, decorators: [{
                type: Inject,
                args: [DATA_PIPELINES_CONFIGS]
            }] }]; }, { manageLink: [{
            type: Input
        }], componentStateEvent: [{
            type: Output
        }] }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1qb2JzLWhlYWx0aC1wYW5lbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXRhLXBpcGVsaW5lcy9zcmMvbGliL2NvbXBvbmVudHMvd2lkZ2V0cy9kYXRhLWpvYnMtaGVhbHRoLXBhbmVsL2RhdGEtam9icy1oZWFsdGgtcGFuZWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGF0YS1waXBlbGluZXMvc3JjL2xpYi9jb21wb25lbnRzL3dpZGdldHMvZGF0YS1qb2JzLWhlYWx0aC1wYW5lbC9kYXRhLWpvYnMtaGVhbHRoLXBhbmVsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUczQyxPQUFPLEVBRUgsZUFBZSxFQUdmLElBQUksRUFRSixtQkFBbUIsRUFDdEIsTUFBTSwwQkFBMEIsQ0FBQztBQUVsQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHbEQsT0FBTyxFQUNILHNCQUFzQixFQUt0QixzQkFBc0IsRUFHdEIsZ0JBQWdCLEVBQ2hCLHVCQUF1QixFQUN2QixrQkFBa0IsRUFDbEIsYUFBYSxFQUNiLGVBQWUsRUFDZixtQkFBbUIsRUFDdEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUV6RixPQUFPLEVBQUUsc0NBQXNDLEVBQXdCLE1BQU0s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RUFBQSxFQUFBOzs7UUFuRXNCLGVBQXdDO1FBQXhDLGlFQUF3QztRQWdDM0QsZUFBMEM7UUFBMUMsaUVBQTBDLGlCQUFBOzt1RkR3QjlDLDRCQUE0QjtjQU54QyxTQUFTOzJCQUNJLDRCQUE0QixhQUczQixDQUFDLFFBQVEsQ0FBQzs7c0JBdUNoQixNQUFNO3VCQUFDLHNCQUFzQjt3QkFqQ3pCLFVBQVU7a0JBQWxCLEtBQUs7WUFDSSxtQkFBbUI7a0JBQTVCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMjMtMjAyNSBCcm9hZGNvbVxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuXG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5qZWN0LCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERhdGVQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHtcbiAgICBBcGlQcmVkaWNhdGUsXG4gICAgQ29sbGVjdGlvbnNVdGlsLFxuICAgIENvbXBvbmVudE1vZGVsLFxuICAgIENvbXBvbmVudFNlcnZpY2UsXG4gICAgREVTQyxcbiAgICBFcnJvclJlY29yZCxcbiAgICBOYXZpZ2F0aW9uU2VydmljZSxcbiAgICBPblRhdXJ1c01vZGVsQ2hhbmdlLFxuICAgIE9uVGF1cnVzTW9kZWxFcnJvcixcbiAgICBPblRhdXJ1c01vZGVsSW5pdCxcbiAgICBPblRhdXJ1c01vZGVsTG9hZCxcbiAgICBSb3V0ZXJTZXJ2aWNlLFxuICAgIFRhdXJ1c0Jhc2VDb21wb25lbnRcbn0gZnJvbSAnQHZlcnNhdGlsZWRhdGFraXQvc2hhcmVkJztcblxuaW1wb3J0IHsgRXJyb3JVdGlsIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3V0aWxzJztcblxuaW1wb3J0IHsgRGF0YUpvYnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHtcbiAgICBEQVRBX1BJUEVMSU5FU19DT05GSUdTLFxuICAgIERhdGFKb2IsXG4gICAgRGF0YUpvYkV4ZWN1dGlvbkZpbHRlcixcbiAgICBEYXRhSm9iRXhlY3V0aW9uT3JkZXIsXG4gICAgRGF0YUpvYkV4ZWN1dGlvbnMsXG4gICAgRGF0YUpvYkV4ZWN1dGlvblN0YXR1cyxcbiAgICBEYXRhSm9iUGFnZSxcbiAgICBEYXRhUGlwZWxpbmVzQ29uZmlnLFxuICAgIEZJTFRFUl9SRVFfUEFSQU0sXG4gICAgSk9CX0VYRUNVVElPTlNfREFUQV9LRVksXG4gICAgSk9CX05BTUVfUkVRX1BBUkFNLFxuICAgIEpPQlNfREFUQV9LRVksXG4gICAgT1JERVJfUkVRX1BBUkFNLFxuICAgIFRFQU1fTkFNRV9SRVFfUEFSQU1cbn0gZnJvbSAnLi4vLi4vLi4vbW9kZWwnO1xuXG5pbXBvcnQgeyBUQVNLX0xPQURfSk9CX0VYRUNVVElPTlMsIFRBU0tfTE9BRF9KT0JTX1NUQVRFIH0gZnJvbSAnLi4vLi4vLi4vc3RhdGUvdGFza3MnO1xuaW1wb3J0IHsgTE9BRF9KT0JfRVJST1JfQ09ERVMsIExPQURfSk9CU19FUlJPUl9DT0RFUyB9IGZyb20gJy4uLy4uLy4uL3N0YXRlL2Vycm9yLWNvZGVzJztcblxuaW1wb3J0IHsgRGF0YUpvYkV4ZWN1dGlvblRvR3JpZERhdGFKb2JFeGVjdXRpb24sIEdyaWREYXRhSm9iRXhlY3V0aW9uIH0gZnJvbSAnLi4vLi4vZGF0YS1qb2IvcGFnZXMvZXhlY3V0aW9ucyc7XG5cbmVudW0gU3RhdGUge1xuICAgIGxvYWRpbmcgPSAnbG9hZGluZycsXG4gICAgcmVhZHkgPSAncmVhZHknLFxuICAgIGVtcHR5ID0gJ2VtcHR5JyxcbiAgICBlcnJvciA9ICdlcnJvcidcbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdsaWItZGF0YS1qb2JzLWhlYWx0aC1wYW5lbCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtam9icy1oZWFsdGgtcGFuZWwuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2RhdGEtam9icy1oZWFsdGgtcGFuZWwuY29tcG9uZW50LnNjc3MnXSxcbiAgICBwcm92aWRlcnM6IFtEYXRlUGlwZV1cbn0pXG5leHBvcnQgY2xhc3MgRGF0YUpvYnNIZWFsdGhQYW5lbENvbXBvbmVudFxuICAgIGV4dGVuZHMgVGF1cnVzQmFzZUNvbXBvbmVudFxuICAgIGltcGxlbWVudHMgT25Jbml0LCBPblRhdXJ1c01vZGVsSW5pdCwgT25UYXVydXNNb2RlbExvYWQsIE9uVGF1cnVzTW9kZWxDaGFuZ2UsIE9uVGF1cnVzTW9kZWxFcnJvclxue1xuICAgIEBJbnB1dCgpIG1hbmFnZUxpbms6IHN0cmluZztcbiAgICBAT3V0cHV0KCkgY29tcG9uZW50U3RhdGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gICAgcmVhZG9ubHkgdXVpZCA9ICdEYXRhSm9ic0hlYWx0aFBhbmVsQ29tcG9uZW50JztcblxuICAgIGxvYWRpbmdKb2JzID0gdHJ1ZTtcbiAgICBsb2FkaW5nRXhlY3V0aW9ucyA9IHRydWU7XG5cbiAgICB0ZWFtTmFtZTogc3RyaW5nO1xuICAgIGxvYWRpbmcgPSB0cnVlO1xuICAgIGRhdGFKb2JzOiBEYXRhSm9iW107XG4gICAgam9iRXhlY3V0aW9uczogR3JpZERhdGFKb2JFeGVjdXRpb25bXSA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogKiogRmxhZyB0aGF0IGluZGljYXRlcyB0aGVyZSBpcyBqb2JzIGV4ZWN1dGlvbnMgbG9hZCBlcnJvci5cbiAgICAgKi9cbiAgICBpc0NvbXBvbmVudEluRXJyb3JTdGF0ZSA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogKiogQXJyYXkgb2YgZXJyb3IgY29kZSBwYXR0ZXJucyB0aGF0IGNvbXBvbmVudCBzaG91bGQgbGlzdGVuIGZvciBpbiBlcnJvcnMgc3RvcmUuXG4gICAgICovXG4gICAgbGlzdGVuRm9yRXJyb3JQYXR0ZXJuczogc3RyaW5nW10gPSBbXG4gICAgICAgIExPQURfSk9CX0VSUk9SX0NPREVTW1RBU0tfTE9BRF9KT0JfRVhFQ1VUSU9OU10uQWxsLFxuICAgICAgICBMT0FEX0pPQlNfRVJST1JfQ09ERVNbVEFTS19MT0FEX0pPQlNfU1RBVEVdLkFsbFxuICAgIF07XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgY29tcG9uZW50U2VydmljZTogQ29tcG9uZW50U2VydmljZSxcbiAgICAgICAgbmF2aWdhdGlvblNlcnZpY2U6IE5hdmlnYXRpb25TZXJ2aWNlLFxuICAgICAgICBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyU2VydmljZTogUm91dGVyU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBkYXRhSm9ic1NlcnZpY2U6IERhdGFKb2JzU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBkYXRlUGlwZTogRGF0ZVBpcGUsXG4gICAgICAgIEBJbmplY3QoREFUQV9QSVBFTElORVNfQ09ORklHUylcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGRhdGFQaXBlbGluZXNNb2R1bGVDb25maWc6IERhdGFQaXBlbGluZXNDb25maWdcbiAgICApIHtcbiAgICAgICAgc3VwZXIoY29tcG9uZW50U2VydmljZSwgbmF2aWdhdGlvblNlcnZpY2UsIGFjdGl2YXRlZFJvdXRlKTtcbiAgICB9XG5cbiAgICBmZXRjaERhdGFKb2JzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxvYWRpbmdKb2JzID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgZmlsdGVyczogQXBpUHJlZGljYXRlW10gPSBbXTtcblxuICAgICAgICBpZiAodGhpcy50ZWFtTmFtZSkge1xuICAgICAgICAgICAgZmlsdGVycy5wdXNoKHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eTogJ2NvbmZpZy50ZWFtJyxcbiAgICAgICAgICAgICAgICBwYXR0ZXJuOiB0aGlzLnRlYW1OYW1lLFxuICAgICAgICAgICAgICAgIHNvcnQ6IG51bGxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kYXRhSm9ic1NlcnZpY2UubG9hZEpvYnMoXG4gICAgICAgICAgICB0aGlzLm1vZGVsXG4gICAgICAgICAgICAgICAgLndpdGhSZXF1ZXN0UGFyYW0oVEVBTV9OQU1FX1JFUV9QQVJBTSwgJ25vLXRlYW0tc3BlY2lmaWVkJylcbiAgICAgICAgICAgICAgICAud2l0aFJlcXVlc3RQYXJhbShKT0JfTkFNRV9SRVFfUEFSQU0sICcnKVxuICAgICAgICAgICAgICAgIC53aXRoRmlsdGVyKGZpbHRlcnMpXG4gICAgICAgICAgICAgICAgLndpdGhSZXF1ZXN0UGFyYW0oT1JERVJfUkVRX1BBUkFNLCB7XG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiAnc3RhcnRUaW1lJyxcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBERVNDXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAud2l0aFBhZ2UoMSwgMTAwMClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmZXRjaERhdGFKb2JFeGVjdXRpb25zKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxvYWRpbmdFeGVjdXRpb25zID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgZCA9IG5ldyBEYXRlKCk7XG4gICAgICAgIGQuc2V0RGF0ZShkLmdldERhdGUoKSAtIDEpO1xuICAgICAgICB0aGlzLmRhdGFKb2JzU2VydmljZS5sb2FkSm9iRXhlY3V0aW9ucyhcbiAgICAgICAgICAgIHRoaXMubW9kZWxcbiAgICAgICAgICAgICAgICAud2l0aFJlcXVlc3RQYXJhbShURUFNX05BTUVfUkVRX1BBUkFNLCAnbm8tdGVhbS1zcGVjaWZpZWQnKVxuICAgICAgICAgICAgICAgIC53aXRoUmVxdWVzdFBhcmFtKEpPQl9OQU1FX1JFUV9QQVJBTSwgJycpXG4gICAgICAgICAgICAgICAgLndpdGhSZXF1ZXN0UGFyYW0oRklMVEVSX1JFUV9QQVJBTSwge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXNJbjogW0RhdGFKb2JFeGVjdXRpb25TdGF0dXMuVVNFUl9FUlJPUiwgRGF0YUpvYkV4ZWN1dGlvblN0YXR1cy5QTEFURk9STV9FUlJPUl0sXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZUd0ZTogZCxcbiAgICAgICAgICAgICAgICAgICAgdGVhbU5hbWVJbjogdGhpcy50ZWFtTmFtZSA/IFt0aGlzLnRlYW1OYW1lXSA6IFtdXG4gICAgICAgICAgICAgICAgfSBhcyBEYXRhSm9iRXhlY3V0aW9uRmlsdGVyKVxuICAgICAgICAgICAgICAgIC53aXRoUmVxdWVzdFBhcmFtKE9SREVSX1JFUV9QQVJBTSwge1xuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogJ3N0YXJ0VGltZScsXG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogREVTQ1xuICAgICAgICAgICAgICAgIH0gYXMgRGF0YUpvYkV4ZWN1dGlvbk9yZGVyKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgb25Nb2RlbEluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3N1YnNjcmliZUZvclRlYW1DaGFuZ2UoKTtcbiAgICAgICAgdGhpcy5fZW1pdE5ld1N0YXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBvbk1vZGVsTG9hZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBvbk1vZGVsQ2hhbmdlKG1vZGVsOiBDb21wb25lbnRNb2RlbCwgdGFzazogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICh0YXNrID09PSBUQVNLX0xPQURfSk9CX0VYRUNVVElPTlMpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGlvbnM6IERhdGFKb2JFeGVjdXRpb25zID0gbW9kZWwuZ2V0Q29tcG9uZW50U3RhdGUoKS5kYXRhLmdldChKT0JfRVhFQ1VUSU9OU19EQVRBX0tFWSk7XG4gICAgICAgICAgICBpZiAoZXhlY3V0aW9ucykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlbWFwcGVkRXhlY3V0aW9ucyA9IERhdGFKb2JFeGVjdXRpb25Ub0dyaWREYXRhSm9iRXhlY3V0aW9uLmNvbnZlcnRUb0RhdGFKb2JFeGVjdXRpb24odGhpcy5kYXRlUGlwZSkoWy4uLmV4ZWN1dGlvbnNdKTtcbiAgICAgICAgICAgICAgICB0aGlzLmpvYkV4ZWN1dGlvbnMgPSByZW1hcHBlZEV4ZWN1dGlvbnMuZmlsdGVyKChleCkgPT4gZXguc3RhdHVzICE9PSBEYXRhSm9iRXhlY3V0aW9uU3RhdHVzLlNVQ0NFRURFRCk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nRXhlY3V0aW9ucyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRhc2sgPT09IFRBU0tfTE9BRF9KT0JTX1NUQVRFKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnRTdGF0ZSA9IG1vZGVsLmdldENvbXBvbmVudFN0YXRlKCk7XG4gICAgICAgICAgICBjb25zdCBkYXRhSm9ic0RhdGE6IERhdGFKb2JQYWdlID0gY29tcG9uZW50U3RhdGUuZGF0YS5nZXQoSk9CU19EQVRBX0tFWSk7XG5cbiAgICAgICAgICAgIHRoaXMuZGF0YUpvYnMgPSBDb2xsZWN0aW9uc1V0aWwuaXNBcnJheShkYXRhSm9ic0RhdGE/LmNvbnRlbnQpID8gWy4uLmRhdGFKb2JzRGF0YT8uY29udGVudF0gOiBbXTtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ0pvYnMgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2VtaXROZXdTdGF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgb25Nb2RlbEVycm9yKG1vZGVsOiBDb21wb25lbnRNb2RlbCwgdGFzazogc3RyaW5nLCBuZXdFcnJvclJlY29yZHM6IEVycm9yUmVjb3JkW10pOiB2b2lkIHtcbiAgICAgICAgbmV3RXJyb3JSZWNvcmRzLmZvckVhY2goKGVycm9yUmVjb3JkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IEVycm9yVXRpbC5leHRyYWN0RXJyb3IoZXJyb3JSZWNvcmQuZXJyb3IpO1xuXG4gICAgICAgICAgICBpZiAodGFzayA9PT0gVEFTS19MT0FEX0pPQl9FWEVDVVRJT05TKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5qb2JFeGVjdXRpb25zID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nRXhlY3V0aW9ucyA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0YXNrID09PSBUQVNLX0xPQURfSk9CU19TVEFURSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZ0pvYnMgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZG9uJ3Qgc2hvdyB0b2FzdCBtZXNzYWdlLCBvbmx5IGxvZyB0byBjb25zb2xlLCBsb2dpYyBmb3IgY29tcG9uZW50IGlzIHRvIHN0YXkgaGlkZGVuIHdoZW4gdGhlcmUgaXMgbm8gZGF0YSBhcmUgdGhlcmUgaXMgZXJyb3JcblxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgb3ZlcnJpZGUgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIC8vIGF0dGFjaCBsaXN0ZW5lciB0byBFcnJvclN0b3JlIGFuZCBsaXN0ZW4gZm9yIEVycm9ycyBjaGFuZ2VcbiAgICAgICAgdGhpcy5lcnJvcnMub25DaGFuZ2UoKHN0b3JlKSA9PiB7XG4gICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyByZWNvcmQgZm9yIGxpc3RlbmVkIGVycm9yIGNvZGUgcGF0dGVybnMgc2V0IGNvbXBvbmVudCBpbiBlcnJvciBzdGF0ZVxuICAgICAgICAgICAgdGhpcy5pc0NvbXBvbmVudEluRXJyb3JTdGF0ZSA9IHN0b3JlLmhhc0NvZGVQYXR0ZXJuKC4uLnRoaXMubGlzdGVuRm9yRXJyb3JQYXR0ZXJucyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZW1pdE5ld1N0YXRlKCkge1xuICAgICAgICBpZiAodGhpcy5sb2FkaW5nSm9icyB8fCB0aGlzLmxvYWRpbmdFeGVjdXRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudFN0YXRlRXZlbnQuZW1pdChTdGF0ZS5sb2FkaW5nKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmpvYkV4ZWN1dGlvbnMubGVuZ3RoID09PSAwICYmIHRoaXMuZGF0YUpvYnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudFN0YXRlRXZlbnQuZW1pdChTdGF0ZS5lbXB0eSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0NvbXBvbmVudEluRXJyb3JTdGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRTdGF0ZUV2ZW50LmVtaXQoU3RhdGUuZXJyb3IpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRTdGF0ZUV2ZW50LmVtaXQoU3RhdGUucmVhZHkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc3Vic2NyaWJlRm9yVGVhbUNoYW5nZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVBpcGVsaW5lc01vZHVsZUNvbmZpZy5tYW5hZ2VDb25maWc/LnNlbGVjdGVkVGVhbU5hbWVPYnNlcnZhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFQaXBlbGluZXNNb2R1bGVDb25maWcubWFuYWdlQ29uZmlnPy5zZWxlY3RlZFRlYW1OYW1lT2JzZXJ2YWJsZS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgICAgICBuZXh0OiAobmV3VGVhbU5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1RlYW1OYW1lICE9PSB0aGlzLnRlYW1OYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1RlYW1OYW1lICYmIG5ld1RlYW1OYW1lICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRlYW1OYW1lID0gbmV3VGVhbU5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2hEYXRhSm9iRXhlY3V0aW9ucygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZldGNoRGF0YUpvYnMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuam9iRXhlY3V0aW9ucyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhSm9icyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBzZWxlY3RlZCB0ZWFtJywgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZldGNoRGF0YUpvYkV4ZWN1dGlvbnMoKTtcbiAgICAgICAgICAgIHRoaXMuZmV0Y2hEYXRhSm9icygpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiPCEtLVxuICAgfiBDb3B5cmlnaHQgMjAyMy0yMDI1IEJyb2FkY29tXG4gICB+IFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gIC0tPlxuXG48ZGl2IGNsYXNzPVwiZ2V0LXN0YXJ0ZWQtam9icyB3aWRnZXRcIj5cbiAgICA8c2VjdGlvbiBjbGFzcz1cIndpZGdldC1zZWN0aW9uLWNvbnRhaW5lciB3aWRnZXQtY2FyZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0LWhlYWRlclwiICpuZ0lmPVwiIWxvYWRpbmdFeGVjdXRpb25zICYmICFsb2FkaW5nSm9ic1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldC1oZWFkZXItdGl0bGUtcmVmcmVzaC1idXR0b25cIj5cbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJoZWFkZXItdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIltcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL21hbmFnZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RlYW1zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGF0YS1qb2JzJ1xuICAgICAgICAgICAgICAgICAgICAgICAgXVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgSm9ic1xuICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWxvYWRpbmdcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4taWNvbiBidG4tbGluayByZWZyZXNoXCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cInJlZnJlc2hcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZmV0Y2hEYXRhSm9iRXhlY3V0aW9ucygpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxjbHItaWNvbiBzaGFwZT1cInJlZnJlc2hcIiBzaXplPVwiMTRcIj48L2Nsci1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICBEYXRhIEpvYnMgaGVscCBEYXRhIEVuZ2luZWVycyBkZXZlbG9wLCBkZXBsb3ksIHJ1biwgYW5kIG1hbmFnZVxuICAgICAgICAgICAgICAgIGRhdGEgcHJvY2Vzc2luZyB3b3JrbG9hZHNcbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNsci1yb3dcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiIWxvYWRpbmdFeGVjdXRpb25zICYmICFsb2FkaW5nSm9iczsgZWxzZSBsb2FkaW5nVGVtcGxhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbHItY29sLWxnLTMgY2xyLWNvbC0xMlwiPlxuICAgICAgICAgICAgICAgICAgICA8bGliLXdpZGdldC1leGVjdXRpb24tc3RhdHVzLWdhdWdlXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWN5PVwiZHAtZGF0YS1qb2JzLXN0YXR1cy1nYXVnZS13aWRnZXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FsbEpvYnNdPVwiZGF0YUpvYnNcIlxuICAgICAgICAgICAgICAgICAgICA+PC9saWItd2lkZ2V0LWV4ZWN1dGlvbi1zdGF0dXMtZ2F1Z2U+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNsci1jb2wtbGctNCBjbHItY29sLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItZGF0YS1qb2JzLWZhaWxlZC13aWRnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJkcC1mYWlsZWQtZGF0YS1qb2JzLXdpZGdldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWxsSm9ic109XCJkYXRhSm9ic1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbWFuYWdlTGlua109XCJtYW5hZ2VMaW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtqb2JFeGVjdXRpb25zXT1cImpvYkV4ZWN1dGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICA+PC9saWItZGF0YS1qb2JzLWZhaWxlZC13aWRnZXQ+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNsci1jb2wtbGctNSBjbHItY29sLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItZGF0YS1qb2JzLWV4ZWN1dGlvbnMtd2lkZ2V0XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWN5PVwiZHAtZmFpbGVkLWRhdGEtam9icy1leGVjdXRpb25zLXdpZGdldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWxsSm9ic109XCJkYXRhSm9ic1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbWFuYWdlTGlua109XCJtYW5hZ2VMaW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtqb2JFeGVjdXRpb25zXT1cImpvYkV4ZWN1dGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICA+PC9saWItZGF0YS1qb2JzLWV4ZWN1dGlvbnMtd2lkZ2V0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2xvYWRpbmdUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGVudC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxpYi1lbXB0eS1zdGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJGZXRjaGluZyBEYXRhLi4uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1TcmM9XCJhc3NldHMvYW5pbWF0aW9ucy9jaGFydC1sb2FkaW5nLWFuaW1hdGlvbi5qc29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPVwiV2FpdCBhIHNlY29uZC4uLiB0aGUgZGF0YSB3aWxsIGFwcGVhciBoZXJlIHNvb24uXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8L2xpYi1lbXB0eS1zdGF0ZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvc2VjdGlvbj5cbjwvZGl2PlxuIl19