@versatiledatakit/data-pipelines
Version:
Data Pipelines help Data Engineers develop, deploy, run, and manage data processing workloads (called 'Data Job')
108 lines • 19.5 kB
JavaScript
/*
* Copyright 2023-2025 Broadcom
* SPDX-License-Identifier: Apache-2.0
*/
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "@versatiledatakit/shared";
import * as i2 from "@clr/angular";
import * as i3 from "../../data-job/pages/executions/data-job-execution-status-filter/data-job-execution-status-filter.component";
import * as i4 from "../../data-job/pages/executions/data-job-execution-status/data-job-execution-status.component";
function DataJobsExecutionsWidgetComponent_clr_dg_row_12_Template(rf, ctx) { if (rf & 1) {
const _r4 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "clr-dg-row", 7)(1, "clr-dg-cell", 8)(2, "a", 9);
i0.ɵɵlistener("click", function DataJobsExecutionsWidgetComponent_clr_dg_row_12_Template_a_click_2_listener() { const restoredCtx = i0.ɵɵrestoreView(_r4); const jobExecution_r2 = restoredCtx.$implicit; const ctx_r3 = i0.ɵɵnextContext(); return ctx_r3.navigateToJobExecutions(jobExecution_r2); });
i0.ɵɵtext(3);
i0.ɵɵelementEnd()();
i0.ɵɵelementStart(4, "clr-dg-cell", 10);
i0.ɵɵelement(5, "lib-data-job-execution-status", 11);
i0.ɵɵelementEnd();
i0.ɵɵelementStart(6, "clr-dg-cell", 12);
i0.ɵɵtext(7);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const jobExecution_r2 = ctx.$implicit;
i0.ɵɵproperty("clrDgItem", jobExecution_r2);
i0.ɵɵadvance(3);
i0.ɵɵtextInterpolate1(" ", jobExecution_r2.id, " ");
i0.ɵɵadvance(2);
i0.ɵɵproperty("jobStatus", jobExecution_r2.status);
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate(jobExecution_r2.endTimeFormatted);
} }
export class DataJobsExecutionsWidgetComponent {
constructor(navigationService) {
this.navigationService = navigationService;
this.jobExecutions = [];
this.uuid = 'DataJobsExecutionsWidgetComponent';
this.loading = true;
}
/**
* ** NgFor elements tracking function.
*/
trackByFn(index, execution) {
return `${index}|${execution?.id}`;
}
/**
* @inheritDoc
*/
ngOnChanges(changes) {
if (changes['jobExecutions'] !== undefined && changes['jobExecutions'].currentValue !== undefined) {
this.loading = false;
}
}
navigateToJobExecutions(job) {
const dataJob = this.allJobs.find((el) => el.jobName === job.jobName);
let link = this.manageLink;
link = link.replace('{team}', dataJob.config?.team);
link = link.replace('{data-job}', dataJob.jobName);
link = link + '/executions';
if (dataJob) {
// eslint-disable-next-line @typescript-eslint/no-floating-promises
this.navigationService.navigate(link);
}
}
}
DataJobsExecutionsWidgetComponent.ɵfac = function DataJobsExecutionsWidgetComponent_Factory(t) { return new (t || DataJobsExecutionsWidgetComponent)(i0.ɵɵdirectiveInject(i1.NavigationService)); };
DataJobsExecutionsWidgetComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DataJobsExecutionsWidgetComponent, selectors: [["lib-data-jobs-executions-widget"]], inputs: { manageLink: "manageLink", allJobs: "allJobs", jobExecutions: "jobExecutions" }, features: [i0.ɵɵNgOnChangesFeature], decls: 13, vars: 7, consts: [["data-cy", "data-pipelines-job-executions-datagrid-widget", 1, "datagrid-executions-widget-table", 3, "clrDgLoading"], ["data-cy", "data-pipelines-job-executions-widget-job-name", 1, "header-title", 3, "clrDgSortBy"], ["data-cy", "data-pipelines-job-executions-widget-status-header", 1, "hide", 3, "clrDgField"], [3, "clrDgFilter"], ["statusFilter", ""], ["data-cy", "data-pipelines-job-executions-widget-end-header", 1, "hide", 3, "clrDgSortBy"], [3, "clrDgItem", 4, "clrDgItems", "clrDgItemsOf", "clrDgItemsTrackBy"], [3, "clrDgItem"], [1, "no-padding", "job-name-column"], ["alt", "Navigate to Manage Data jobs", "data-cy", "dp-failed-data-jobs-executions-widget-job-name-link", 1, "btn", "btn-link", "job-name-column-a", 3, "click"], [1, "status-column"], [3, "jobStatus"], ["data-cy", "data-pipelines-job-executions-widget-end-cell", 1, "time-column"]], template: function DataJobsExecutionsWidgetComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "clr-datagrid", 0)(1, "clr-dg-placeholder");
i0.ɵɵtext(2, "We couldn't find any failed executions!");
i0.ɵɵelementEnd();
i0.ɵɵelementStart(3, "clr-dg-column", 1);
i0.ɵɵtext(4, "Most recent failed executions - Last 24h (UTC time) ");
i0.ɵɵelementEnd();
i0.ɵɵelementStart(5, "clr-dg-column", 2);
i0.ɵɵtext(6, "Status ");
i0.ɵɵelementStart(7, "clr-dg-filter", 3);
i0.ɵɵelement(8, "lib-data-job-execution-status-filter", null, 4);
i0.ɵɵelementEnd()();
i0.ɵɵelementStart(10, "clr-dg-column", 5);
i0.ɵɵtext(11, "End (UTC) ");
i0.ɵɵelementEnd();
i0.ɵɵtemplate(12, DataJobsExecutionsWidgetComponent_clr_dg_row_12_Template, 8, 4, "clr-dg-row", 6);
i0.ɵɵelementEnd();
} if (rf & 2) {
const _r0 = i0.ɵɵreference(9);
i0.ɵɵproperty("clrDgLoading", ctx.loading);
i0.ɵɵadvance(3);
i0.ɵɵproperty("clrDgSortBy", "endTime");
i0.ɵɵadvance(2);
i0.ɵɵproperty("clrDgField", "status");
i0.ɵɵadvance(2);
i0.ɵɵproperty("clrDgFilter", _r0);
i0.ɵɵadvance(3);
i0.ɵɵproperty("clrDgSortBy", "endTime");
i0.ɵɵadvance(2);
i0.ɵɵproperty("clrDgItemsOf", ctx.jobExecutions)("clrDgItemsTrackBy", ctx.trackByFn);
} }, directives: [i2.ClrDatagrid, i2.ÇlrDatagridMainRenderer, i2.ÇlrDatagridWillyWonka, i2.ÇlrActionableOompaLoompa, i2.ÇlrExpandableOompaLoompa, i2.ClrDatagridPlaceholder, i2.ClrDatagridColumn, i2.ÇlrDatagridHeaderRenderer, i2.ClrDatagridFilter, i3.DataJobExecutionStatusFilterComponent, i2.ClrDatagridItems, i2.ClrDatagridRow, i2.ÇlrDatagridRowRenderer, i2.ClrDatagridCell, i2.ÇlrDatagridCellRenderer, i4.DataJobExecutionStatusComponent], styles: [".datagrid-executions-widget-table[_ngcontent-%COMP%]{height:300px}.datagrid-executions-widget-table[_ngcontent-%COMP%] .datagrid-table{width:100%}.datagrid-executions-widget-table[_ngcontent-%COMP%] .datagrid-table .header-title .datagrid-column-separator{display:none}.datagrid-executions-widget-table[_ngcontent-%COMP%] .datagrid-table .datagrid-row-scrollable{width:100%}.datagrid-executions-widget-table[_ngcontent-%COMP%] .datagrid-table .job-name-column{width:60%!important}.datagrid-executions-widget-table[_ngcontent-%COMP%] .datagrid-table .status-column{width:20%!important;padding-left:0!important;white-space:nowrap}.datagrid-executions-widget-table[_ngcontent-%COMP%] .datagrid-table .time-column{width:20%!important;min-width:120px}.datagrid-executions-widget-table[_ngcontent-%COMP%] .datagrid-table clr-dg-cell .btn{width:100%!important;text-align:left}clr-dg-cell[_ngcontent-%COMP%] .btn[_ngcontent-%COMP%]{margin:0!important;text-transform:none!important;padding:.3rem}.no-padding[_ngcontent-%COMP%]{padding-bottom:0;padding-top:0}.hide[_ngcontent-%COMP%]{display:none}"], changeDetection: 0 });
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DataJobsExecutionsWidgetComponent, [{
type: Component,
args: [{ selector: 'lib-data-jobs-executions-widget', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n ~ Copyright 2023-2025 Broadcom\n ~ SPDX-License-Identifier: Apache-2.0\n -->\n\n<clr-datagrid\n class=\"datagrid-executions-widget-table\"\n data-cy=\"data-pipelines-job-executions-datagrid-widget\"\n [clrDgLoading]=\"loading\"\n>\n <clr-dg-placeholder\n >We couldn't find any failed executions!</clr-dg-placeholder\n >\n\n <clr-dg-column\n class=\"header-title\"\n data-cy=\"data-pipelines-job-executions-widget-job-name\"\n [clrDgSortBy]=\"'endTime'\"\n >Most recent failed executions - Last 24h (UTC time)\n </clr-dg-column>\n\n <clr-dg-column\n data-cy=\"data-pipelines-job-executions-widget-status-header\"\n class=\"hide\"\n [clrDgField]=\"'status'\"\n >Status\n <clr-dg-filter [clrDgFilter]=\"statusFilter\">\n <lib-data-job-execution-status-filter\n #statusFilter\n ></lib-data-job-execution-status-filter>\n </clr-dg-filter>\n </clr-dg-column>\n\n <clr-dg-column\n data-cy=\"data-pipelines-job-executions-widget-end-header\"\n class=\"hide\"\n [clrDgSortBy]=\"'endTime'\"\n >End (UTC)\n </clr-dg-column>\n\n <clr-dg-row\n *clrDgItems=\"let jobExecution of jobExecutions; trackBy: trackByFn\"\n [clrDgItem]=\"jobExecution\"\n >\n <clr-dg-cell class=\"no-padding job-name-column\">\n <a\n class=\"btn btn-link job-name-column-a\"\n alt=\"Navigate to Manage Data jobs\"\n data-cy=\"dp-failed-data-jobs-executions-widget-job-name-link\"\n (click)=\"navigateToJobExecutions(jobExecution)\"\n >\n {{ jobExecution.id }}\n </a>\n </clr-dg-cell>\n <clr-dg-cell class=\"status-column\">\n <lib-data-job-execution-status\n [jobStatus]=\"jobExecution.status\"\n ></lib-data-job-execution-status>\n </clr-dg-cell>\n <clr-dg-cell\n class=\"time-column\"\n data-cy=\"data-pipelines-job-executions-widget-end-cell\"\n >{{ jobExecution.endTimeFormatted }}</clr-dg-cell\n >\n </clr-dg-row>\n</clr-datagrid>\n", styles: ["/*!\n * Copyright 2023-2025 Broadcom\n * SPDX-License-Identifier: Apache-2.0\n */.datagrid-executions-widget-table{height:300px}.datagrid-executions-widget-table ::ng-deep .datagrid-table{width:100%}.datagrid-executions-widget-table ::ng-deep .datagrid-table .header-title .datagrid-column-separator{display:none}.datagrid-executions-widget-table ::ng-deep .datagrid-table .datagrid-row-scrollable{width:100%}.datagrid-executions-widget-table ::ng-deep .datagrid-table .job-name-column{width:60%!important}.datagrid-executions-widget-table ::ng-deep .datagrid-table .status-column{width:20%!important;padding-left:0!important;white-space:nowrap}.datagrid-executions-widget-table ::ng-deep .datagrid-table .time-column{width:20%!important;min-width:120px}.datagrid-executions-widget-table ::ng-deep .datagrid-table clr-dg-cell .btn{width:100%!important;text-align:left}clr-dg-cell .btn{margin:0!important;text-transform:none!important;padding:.3rem}.no-padding{padding-bottom:0;padding-top:0}.hide{display:none}\n"] }]
}], function () { return [{ type: i1.NavigationService }]; }, { manageLink: [{
type: Input
}], allJobs: [{
type: Input
}], jobExecutions: [{
type: Input
}] }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1qb2JzLWV4ZWN1dGlvbnMtd2lkZ2V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RhdGEtcGlwZWxpbmVzL3NyYy9saWIvY29tcG9uZW50cy93aWRnZXRzL2RhdGEtam9icy1leGVjdXRpb25zLXdpZGdldC9kYXRhLWpvYnMtZXhlY3V0aW9ucy13aWRnZXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGF0YS1waXBlbGluZXMvc3JjL2xpYi9jb21wb25lbnRzL3dpZGdldHMvZGF0YS1qb2JzLWV4ZWN1dGlvbnMtd2lkZ2V0L2RhdGEtam9icy1leGVjdXRpb25zLXdpZGdldC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBNEIsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7O0lDbUNoRyxxQ0FHQyxxQkFBQSxXQUFBO0lBTVcsb1BBQVMsK0NBQXFDLElBQUM7SUFFL0MsWUFDSjtJQUFBLGlCQUFJLEVBQUE7SUFFUix1Q0FBbUM7SUFDL0Isb0RBRWlDO0lBQ3JDLGlCQUFjO0lBQ2QsdUNBR0s7SUFBQSxZQUFtQztJQUFBLGlCQUN2QyxFQUFBOzs7SUFyQkQsMkNBQTBCO0lBU2xCLGVBQ0o7SUFESSxtREFDSjtJQUlJLGVBQWlDO0lBQWpDLGtEQUFpQztJQU1wQyxlQUFtQztJQUFuQyxzREFBbUM7O0FEM0NoRCxNQUFNLE9BQU8saUNBQWlDO0lBUzFDLFlBQTZCLGlCQUFvQztRQUFwQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBTnhELGtCQUFhLEdBQTJCLEVBQUUsQ0FBQztRQUUzQyxTQUFJLEdBQUcsbUNBQW1DLENBQUM7UUFFcEQsWUFBTyxHQUFHLElBQUksQ0FBQztJQUVxRCxDQUFDO0lBRXJFOztPQUVHO0lBQ0gsU0FBUyxDQUFDLEtBQWEsRUFBRSxTQUEyQjtRQUNoRCxPQUFPLEdBQUcsS0FBSyxJQUFJLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXLENBQUMsT0FBc0I7UUFDOUIsSUFBSSxPQUFPLENBQUMsZUFBZSxDQUFDLEtBQUssU0FBUyxJQUFJLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxZQUFZLEtBQUssU0FBUyxFQUFFO1lBQy9GLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1NBQ3hCO0lBQ0wsQ0FBQztJQUVELHVCQUF1QixDQUFDLEdBQXNCO1FBQzFDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxLQUFLLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0RSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQzNCLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BELElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkQsSUFBSSxHQUFHLElBQUksR0FBRyxhQUFhLENBQUM7UUFFNUIsSUFBSSxPQUFPLEVBQUU7WUFDVCxtRUFBbUU7WUFDbkUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN6QztJQUNMLENBQUM7O2tIQXRDUSxpQ0FBaUM7b0ZBQWpDLGlDQUFpQztRQ2Q5Qyx1Q0FJQyx5QkFBQTtRQUVRLHVEQUF1QztRQUFBLGlCQUMzQztRQUVELHdDQUlLO1FBQUEsb0VBQ0w7UUFBQSxpQkFBZ0I7UUFFaEIsd0NBSUs7UUFBQSx1QkFDRDtRQUFBLHdDQUE0QztRQUN4QyxnRUFFd0M7UUFDNUMsaUJBQWdCLEVBQUE7UUFHcEIseUNBSUs7UUFBQSwyQkFDTDtRQUFBLGlCQUFnQjtRQUVoQixrR0F3QmE7UUFDakIsaUJBQWU7OztRQXpEWCwwQ0FBd0I7UUFTcEIsZUFBeUI7UUFBekIsdUNBQXlCO1FBT3pCLGVBQXVCO1FBQXZCLHFDQUF1QjtRQUVSLGVBQTRCO1FBQTVCLGlDQUE0QjtRQVUzQyxlQUF5QjtRQUF6Qix1Q0FBeUI7UUFLSyxlQUFrQjtRQUFsQixnREFBa0Isb0NBQUE7O3VGRHRCM0MsaUNBQWlDO2NBTjdDLFNBQVM7MkJBQ0ksaUNBQWlDLG1CQUcxQix1QkFBdUIsQ0FBQyxNQUFNO29FQUd0QyxVQUFVO2tCQUFsQixLQUFLO1lBQ0csT0FBTztrQkFBZixLQUFLO1lBQ0csYUFBYTtrQkFBckIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAyMy0yMDI1IEJyb2FkY29tXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5cbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIElucHV0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgTmF2aWdhdGlvblNlcnZpY2UgfSBmcm9tICdAdmVyc2F0aWxlZGF0YWtpdC9zaGFyZWQnO1xuXG5pbXBvcnQgeyBEYXRhSm9iLCBEYXRhSm9iRXhlY3V0aW9uIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWwnO1xuXG5pbXBvcnQgeyBHcmlkRGF0YUpvYkV4ZWN1dGlvbiB9IGZyb20gJy4uLy4uL2RhdGEtam9iL3BhZ2VzL2V4ZWN1dGlvbnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2xpYi1kYXRhLWpvYnMtZXhlY3V0aW9ucy13aWRnZXQnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9kYXRhLWpvYnMtZXhlY3V0aW9ucy13aWRnZXQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2RhdGEtam9icy1leGVjdXRpb25zLXdpZGdldC5jb21wb25lbnQuc2NzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIERhdGFKb2JzRXhlY3V0aW9uc1dpZGdldENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gICAgQElucHV0KCkgbWFuYWdlTGluazogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGFsbEpvYnM6IERhdGFKb2JbXTtcbiAgICBASW5wdXQoKSBqb2JFeGVjdXRpb25zOiBHcmlkRGF0YUpvYkV4ZWN1dGlvbltdID0gW107XG5cbiAgICByZWFkb25seSB1dWlkID0gJ0RhdGFKb2JzRXhlY3V0aW9uc1dpZGdldENvbXBvbmVudCc7XG5cbiAgICBsb2FkaW5nID0gdHJ1ZTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgbmF2aWdhdGlvblNlcnZpY2U6IE5hdmlnYXRpb25TZXJ2aWNlKSB7fVxuXG4gICAgLyoqXG4gICAgICogKiogTmdGb3IgZWxlbWVudHMgdHJhY2tpbmcgZnVuY3Rpb24uXG4gICAgICovXG4gICAgdHJhY2tCeUZuKGluZGV4OiBudW1iZXIsIGV4ZWN1dGlvbjogRGF0YUpvYkV4ZWN1dGlvbik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgJHtpbmRleH18JHtleGVjdXRpb24/LmlkfWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgICAgIGlmIChjaGFuZ2VzWydqb2JFeGVjdXRpb25zJ10gIT09IHVuZGVmaW5lZCAmJiBjaGFuZ2VzWydqb2JFeGVjdXRpb25zJ10uY3VycmVudFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmF2aWdhdGVUb0pvYkV4ZWN1dGlvbnMoam9iPzogRGF0YUpvYkV4ZWN1dGlvbik6IHZvaWQge1xuICAgICAgICBjb25zdCBkYXRhSm9iID0gdGhpcy5hbGxKb2JzLmZpbmQoKGVsKSA9PiBlbC5qb2JOYW1lID09PSBqb2Iuam9iTmFtZSk7XG4gICAgICAgIGxldCBsaW5rID0gdGhpcy5tYW5hZ2VMaW5rO1xuICAgICAgICBsaW5rID0gbGluay5yZXBsYWNlKCd7dGVhbX0nLCBkYXRhSm9iLmNvbmZpZz8udGVhbSk7XG4gICAgICAgIGxpbmsgPSBsaW5rLnJlcGxhY2UoJ3tkYXRhLWpvYn0nLCBkYXRhSm9iLmpvYk5hbWUpO1xuICAgICAgICBsaW5rID0gbGluayArICcvZXhlY3V0aW9ucyc7XG5cbiAgICAgICAgaWYgKGRhdGFKb2IpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UubmF2aWdhdGUobGluayk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8IS0tXG4gICB+IENvcHlyaWdodCAyMDIzLTIwMjUgQnJvYWRjb21cbiAgIH4gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAgLS0+XG5cbjxjbHItZGF0YWdyaWRcbiAgICBjbGFzcz1cImRhdGFncmlkLWV4ZWN1dGlvbnMtd2lkZ2V0LXRhYmxlXCJcbiAgICBkYXRhLWN5PVwiZGF0YS1waXBlbGluZXMtam9iLWV4ZWN1dGlvbnMtZGF0YWdyaWQtd2lkZ2V0XCJcbiAgICBbY2xyRGdMb2FkaW5nXT1cImxvYWRpbmdcIlxuPlxuICAgIDxjbHItZGctcGxhY2Vob2xkZXJcbiAgICAgICAgPldlIGNvdWxkbid0IGZpbmQgYW55IGZhaWxlZCBleGVjdXRpb25zITwvY2xyLWRnLXBsYWNlaG9sZGVyXG4gICAgPlxuXG4gICAgPGNsci1kZy1jb2x1bW5cbiAgICAgICAgY2xhc3M9XCJoZWFkZXItdGl0bGVcIlxuICAgICAgICBkYXRhLWN5PVwiZGF0YS1waXBlbGluZXMtam9iLWV4ZWN1dGlvbnMtd2lkZ2V0LWpvYi1uYW1lXCJcbiAgICAgICAgW2NsckRnU29ydEJ5XT1cIidlbmRUaW1lJ1wiXG4gICAgICAgID5Nb3N0IHJlY2VudCBmYWlsZWQgZXhlY3V0aW9ucyAtIExhc3QgMjRoIChVVEMgdGltZSlcbiAgICA8L2Nsci1kZy1jb2x1bW4+XG5cbiAgICA8Y2xyLWRnLWNvbHVtblxuICAgICAgICBkYXRhLWN5PVwiZGF0YS1waXBlbGluZXMtam9iLWV4ZWN1dGlvbnMtd2lkZ2V0LXN0YXR1cy1oZWFkZXJcIlxuICAgICAgICBjbGFzcz1cImhpZGVcIlxuICAgICAgICBbY2xyRGdGaWVsZF09XCInc3RhdHVzJ1wiXG4gICAgICAgID5TdGF0dXNcbiAgICAgICAgPGNsci1kZy1maWx0ZXIgW2NsckRnRmlsdGVyXT1cInN0YXR1c0ZpbHRlclwiPlxuICAgICAgICAgICAgPGxpYi1kYXRhLWpvYi1leGVjdXRpb24tc3RhdHVzLWZpbHRlclxuICAgICAgICAgICAgICAgICNzdGF0dXNGaWx0ZXJcbiAgICAgICAgICAgID48L2xpYi1kYXRhLWpvYi1leGVjdXRpb24tc3RhdHVzLWZpbHRlcj5cbiAgICAgICAgPC9jbHItZGctZmlsdGVyPlxuICAgIDwvY2xyLWRnLWNvbHVtbj5cblxuICAgIDxjbHItZGctY29sdW1uXG4gICAgICAgIGRhdGEtY3k9XCJkYXRhLXBpcGVsaW5lcy1qb2ItZXhlY3V0aW9ucy13aWRnZXQtZW5kLWhlYWRlclwiXG4gICAgICAgIGNsYXNzPVwiaGlkZVwiXG4gICAgICAgIFtjbHJEZ1NvcnRCeV09XCInZW5kVGltZSdcIlxuICAgICAgICA+RW5kIChVVEMpXG4gICAgPC9jbHItZGctY29sdW1uPlxuXG4gICAgPGNsci1kZy1yb3dcbiAgICAgICAgKmNsckRnSXRlbXM9XCJsZXQgam9iRXhlY3V0aW9uIG9mIGpvYkV4ZWN1dGlvbnM7IHRyYWNrQnk6IHRyYWNrQnlGblwiXG4gICAgICAgIFtjbHJEZ0l0ZW1dPVwiam9iRXhlY3V0aW9uXCJcbiAgICA+XG4gICAgICAgIDxjbHItZGctY2VsbCBjbGFzcz1cIm5vLXBhZGRpbmcgam9iLW5hbWUtY29sdW1uXCI+XG4gICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1saW5rIGpvYi1uYW1lLWNvbHVtbi1hXCJcbiAgICAgICAgICAgICAgICBhbHQ9XCJOYXZpZ2F0ZSB0byBNYW5hZ2UgRGF0YSBqb2JzXCJcbiAgICAgICAgICAgICAgICBkYXRhLWN5PVwiZHAtZmFpbGVkLWRhdGEtam9icy1leGVjdXRpb25zLXdpZGdldC1qb2ItbmFtZS1saW5rXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwibmF2aWdhdGVUb0pvYkV4ZWN1dGlvbnMoam9iRXhlY3V0aW9uKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgam9iRXhlY3V0aW9uLmlkIH19XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgIDwvY2xyLWRnLWNlbGw+XG4gICAgICAgIDxjbHItZGctY2VsbCBjbGFzcz1cInN0YXR1cy1jb2x1bW5cIj5cbiAgICAgICAgICAgIDxsaWItZGF0YS1qb2ItZXhlY3V0aW9uLXN0YXR1c1xuICAgICAgICAgICAgICAgIFtqb2JTdGF0dXNdPVwiam9iRXhlY3V0aW9uLnN0YXR1c1wiXG4gICAgICAgICAgICA+PC9saWItZGF0YS1qb2ItZXhlY3V0aW9uLXN0YXR1cz5cbiAgICAgICAgPC9jbHItZGctY2VsbD5cbiAgICAgICAgPGNsci1kZy1jZWxsXG4gICAgICAgICAgICBjbGFzcz1cInRpbWUtY29sdW1uXCJcbiAgICAgICAgICAgIGRhdGEtY3k9XCJkYXRhLXBpcGVsaW5lcy1qb2ItZXhlY3V0aW9ucy13aWRnZXQtZW5kLWNlbGxcIlxuICAgICAgICAgICAgPnt7IGpvYkV4ZWN1dGlvbi5lbmRUaW1lRm9ybWF0dGVkIH19PC9jbHItZGctY2VsbFxuICAgICAgICA+XG4gICAgPC9jbHItZGctcm93PlxuPC9jbHItZGF0YWdyaWQ+XG4iXX0=