UNPKG

stimulsoft-forms

Version:
291 lines 33.5 kB
import { Component, Input, ViewChild } from "@angular/core"; import { StiDateTimeBoxValueChoise, StiDateTimeBoxType, StiHorizontalAlignment } from "../../system/enums"; import { StiInputTextItem } from "../../helper/StiInputTextItem"; import * as i0 from "@angular/core"; import * as i1 from "../../services/model.service"; import * as i2 from "../../services/sti-editable-content.service"; import * as i3 from "@angular/common"; import * as i4 from "../sti-component"; import * as i5 from "../sti-editable-content.component"; import * as i6 from "../svg.components/svg.checkbox.component"; import * as i7 from "../sti-tooltip/sti-tooltip.directive"; export class StiDateTimeBoxComponent { get isCurrent() { return this.element.initialState == StiDateTimeBoxValueChoise.Current; } get isReadOnly() { return this.element.readOnly; } get needToFill() { return (this.element.required && (this.element.allowNull ? !this.element.dateTimeValueIsNotNull : !this.element.value) && this.model.hasEmptyReuiredFields); } get align() { return "start"; } get isMozila() { return this.model.getBrowserType() == "firefox" ? true : false; } get horizontalAlignment() { if (this.element.contentAlignment == StiHorizontalAlignment.Left) { return "start"; } else if (this.element.contentAlignment == StiHorizontalAlignment.Right) { return "flex-end"; } else { return "center"; } } get format() { return this.element.valueType == StiDateTimeBoxType.Date ? this.element.dateFormat : this.element.valueType == StiDateTimeBoxType.Time ? this.element.timeFormat : this.element.dateTimeFormat; } getValue() { return this.element.dateValueString; } parseDate(value) { if (value.length > 0) { this.element.dateValue = new Date(value); this.model.formEvents.next({ name: "ValueChanged" }); } } formattingDate(dateFormat) { let result = dateFormat .replace(/M/g, "k") .replace(/m/g, "r") .replace(/tt/g, "a") .replace(/k/g, "m") .replace(/r/g, "M"); return result; } changeState() { this.element.dateTimeValueIsNotNull = !this.element.dateTimeValueIsNotNull; } borderWidth() { return `${this.element.borderWeight}px`; } inFocus() { event.stopPropagation(); setTimeout(() => { let editableContent = new StiInputTextItem("", this.element.font, this.element.textColor, this.element.backgroundColor, this.element.contentAlignment); editableContent.element = this.element; this.editableService.editableContent = editableContent; this.editableService.usedElement = this.element; }, 0); } constructor(model, editableService) { this.model = model; this.editableService = editableService; this.isClone = false; } ngOnInit() { } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StiDateTimeBoxComponent, deps: [{ token: i1.StiModelService }, { token: i2.StiEditableContentService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: StiDateTimeBoxComponent, selector: "sti-datetimebox-component", inputs: { element: "element", isClone: "isClone" }, viewQueries: [{ propertyName: "inputDate", first: true, predicate: ["inputDate"], descendants: true }], ngImport: i0, template: ` <sti-component [element]="element" [isClone]="isClone" class="sti-date-time-box"> <sti-editable-content-component *ngIf="element?.label.value?.length > 0 && element?.isLabelTopAlignment()" [editableContent]="element.label" [style.align-self]="align" [style.text-align]="element?.getContentAlign()" [required]="element.required" [hideEmpty]="element.showLabelPlaceholder(model?.selectedComponent?.element == element)" [style.width]="element?.getLabelWidth()" ></sti-editable-content-component> <table [style.width]="'100%'" [style.height]="'max-content'" [style.margin-top.px]="element?.getTopMargin()"> <tr> <td *ngIf="element?.label.value?.length > 0 && !element?.isLabelTopAlignment()" [style.display]="'flex'" [style.height]="'100%'" [style.width]="element?.getLabelWidth()" [style.align-items]="element?.getVerticalAlignment()" > <sti-editable-content-component *ngIf="element?.label.value?.length > 0" [editableContent]="element?.label" [required]="element.required" [style.text-align]="element?.getContentAlign()" [style.width]="element?.getLabelWidth()" [hideEmpty]="element?.showLabelPlaceholder(model?.selectedComponent?.element == element)" ></sti-editable-content-component> </td> <td [style.width]="'100%'" [style.position]="'relative'"> <div class="date-time-box-container" [style.align-self]="align" [stiTooltip]="element?.tooltip" tooltipPosition="bottom" showDelay="500" [style]="element?.htmlStyle()" [style.justify-content]="horizontalAlignment" [style.border-color]="needToFill ? 'red' : element?.borderColor.toHtmlColor()" [style.background-color]="this.element.backgroundColor.toHtmlColor()" [style.border-width]="borderWidth()" (click)="inFocus(); inputDate.click()" > <sti-svg-checkbox-component *ngIf="element.allowNull && !model.previewMode" [style.margin-top.px]="margin" [style.align-self]="align" [style.margin-block]="'auto'" [element]="element" [id]="element?.name" [text]="" [state]="element?.dateTimeValueIsNotNull" [disablePlaceHolder]="true" (buttonClick)="changeState()" ></sti-svg-checkbox-component> <span [style.width]="'100%'" [style.opacity]="!element.dateTimeValueIsNotNull && element.allowNull ? 0 : 1" [style.pointer-events]="!element.dateTimeValueIsNotNull && element.allowNull ? 'none' : ''" [style.color]="this.element.textColor.toHtmlColor()" (click)="inputDate.click()" >{{getValue()}}</span > <div class="date-picker" [style.pointer-events]="!element.dateTimeValueIsNotNull && element.allowNull ? 'none' : ''" [style.opacity]="!element.dateTimeValueIsNotNull && element.allowNull ? 0 : 1" *ngIf="!isReadOnly" > <label [style.display]="'flex'" [style.align-items]="'center'" [style.justify-content]="'center'" ><i class="pi pi-chevron-down"></i ></label> </div> <input #inputDate [style.left.px]="element.allowNull ? 20 : 0" [type]="isMozila ? 'date' : 'datetime-local'" (input)="parseDate($event.target.value)" [tabIndex]="element['tabIndex']" [disabled]="element.readOnly && model.previewMode" (select)="inputDate.click()" /> </div> </td> </tr> <tr *ngIf="element?.description.value?.length > 0"> <td *ngIf="element?.label.value?.length > 0 && !element?.isLabelTopAlignment()"></td> <td [style.maxWidth.px]="element.maxWidth + 1"> <sti-editable-content-component *ngIf="element?.description.value?.length > 0" [editableContent]="element.description" > </sti-editable-content-component> </td> </tr> </table> </sti-component>`, isInline: true, styles: [".date-time-box-container{align-items:center;padding:3px 4px;display:flex;width:100%;border:1px solid transparent}.date-time-box-container:hover{border-color:#a3bde3!important}input{opacity:0;position:absolute;left:0;top:0;width:100%;height:100%}input::-webkit-datetime-edit{display:none}input::-webkit-calendar-picker-indicator{cursor:pointer;width:100%}.date-picker{background-color:transparent;width:16px;position:relative;height:16px;display:flex;align-items:center;justify-content:center;margin-left:4px;padding-right:1px}i{color:#d3d3d3}.pi-chevron-down{font-size:.575rem;font-weight:700;color:#c5c5c5;padding-top:1px}img{vertical-align:middle;margin-left:0;height:16px;width:16px}table{border-spacing:0}tr{height:max-content;padding:0;margin:0}td{height:100%;padding:0;margin:0}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.StiComponent, selector: "sti-component", inputs: ["element", "class", "isClone", "borderArea"] }, { kind: "component", type: i5.StiEditableContentComponent, selector: "sti-editable-content-component", inputs: ["editableContent", "displayContent", "required", "eParent", "hideEmpty", "active", "alignment", "isTableTotalHeader", "disablePadding", "fromButton", "parentCursor", "isTableHeader"] }, { kind: "component", type: i6.StiSvgCheckBoxComponent, selector: "sti-svg-checkbox-component", inputs: ["element", "id", "text", "state", "useCustomOption", "disablePlaceHolder", "tabIndex"], outputs: ["buttonClick"] }, { kind: "directive", type: i7.StiTooltipDirective, selector: "[stiTooltip]", inputs: ["tooltipPosition", "stiTooltip", "showDelay"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StiDateTimeBoxComponent, decorators: [{ type: Component, args: [{ selector: "sti-datetimebox-component", template: ` <sti-component [element]="element" [isClone]="isClone" class="sti-date-time-box"> <sti-editable-content-component *ngIf="element?.label.value?.length > 0 && element?.isLabelTopAlignment()" [editableContent]="element.label" [style.align-self]="align" [style.text-align]="element?.getContentAlign()" [required]="element.required" [hideEmpty]="element.showLabelPlaceholder(model?.selectedComponent?.element == element)" [style.width]="element?.getLabelWidth()" ></sti-editable-content-component> <table [style.width]="'100%'" [style.height]="'max-content'" [style.margin-top.px]="element?.getTopMargin()"> <tr> <td *ngIf="element?.label.value?.length > 0 && !element?.isLabelTopAlignment()" [style.display]="'flex'" [style.height]="'100%'" [style.width]="element?.getLabelWidth()" [style.align-items]="element?.getVerticalAlignment()" > <sti-editable-content-component *ngIf="element?.label.value?.length > 0" [editableContent]="element?.label" [required]="element.required" [style.text-align]="element?.getContentAlign()" [style.width]="element?.getLabelWidth()" [hideEmpty]="element?.showLabelPlaceholder(model?.selectedComponent?.element == element)" ></sti-editable-content-component> </td> <td [style.width]="'100%'" [style.position]="'relative'"> <div class="date-time-box-container" [style.align-self]="align" [stiTooltip]="element?.tooltip" tooltipPosition="bottom" showDelay="500" [style]="element?.htmlStyle()" [style.justify-content]="horizontalAlignment" [style.border-color]="needToFill ? 'red' : element?.borderColor.toHtmlColor()" [style.background-color]="this.element.backgroundColor.toHtmlColor()" [style.border-width]="borderWidth()" (click)="inFocus(); inputDate.click()" > <sti-svg-checkbox-component *ngIf="element.allowNull && !model.previewMode" [style.margin-top.px]="margin" [style.align-self]="align" [style.margin-block]="'auto'" [element]="element" [id]="element?.name" [text]="" [state]="element?.dateTimeValueIsNotNull" [disablePlaceHolder]="true" (buttonClick)="changeState()" ></sti-svg-checkbox-component> <span [style.width]="'100%'" [style.opacity]="!element.dateTimeValueIsNotNull && element.allowNull ? 0 : 1" [style.pointer-events]="!element.dateTimeValueIsNotNull && element.allowNull ? 'none' : ''" [style.color]="this.element.textColor.toHtmlColor()" (click)="inputDate.click()" >{{getValue()}}</span > <div class="date-picker" [style.pointer-events]="!element.dateTimeValueIsNotNull && element.allowNull ? 'none' : ''" [style.opacity]="!element.dateTimeValueIsNotNull && element.allowNull ? 0 : 1" *ngIf="!isReadOnly" > <label [style.display]="'flex'" [style.align-items]="'center'" [style.justify-content]="'center'" ><i class="pi pi-chevron-down"></i ></label> </div> <input #inputDate [style.left.px]="element.allowNull ? 20 : 0" [type]="isMozila ? 'date' : 'datetime-local'" (input)="parseDate($event.target.value)" [tabIndex]="element['tabIndex']" [disabled]="element.readOnly && model.previewMode" (select)="inputDate.click()" /> </div> </td> </tr> <tr *ngIf="element?.description.value?.length > 0"> <td *ngIf="element?.label.value?.length > 0 && !element?.isLabelTopAlignment()"></td> <td [style.maxWidth.px]="element.maxWidth + 1"> <sti-editable-content-component *ngIf="element?.description.value?.length > 0" [editableContent]="element.description" > </sti-editable-content-component> </td> </tr> </table> </sti-component>`, styles: [".date-time-box-container{align-items:center;padding:3px 4px;display:flex;width:100%;border:1px solid transparent}.date-time-box-container:hover{border-color:#a3bde3!important}input{opacity:0;position:absolute;left:0;top:0;width:100%;height:100%}input::-webkit-datetime-edit{display:none}input::-webkit-calendar-picker-indicator{cursor:pointer;width:100%}.date-picker{background-color:transparent;width:16px;position:relative;height:16px;display:flex;align-items:center;justify-content:center;margin-left:4px;padding-right:1px}i{color:#d3d3d3}.pi-chevron-down{font-size:.575rem;font-weight:700;color:#c5c5c5;padding-top:1px}img{vertical-align:middle;margin-left:0;height:16px;width:16px}table{border-spacing:0}tr{height:max-content;padding:0;margin:0}td{height:100%;padding:0;margin:0}\n"] }] }], ctorParameters: () => [{ type: i1.StiModelService }, { type: i2.StiEditableContentService }], propDecorators: { inputDate: [{ type: ViewChild, args: ["inputDate"] }], element: [{ type: Input }], isClone: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RpLWRhdGUtdGltZS1ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RpbXVsc29mdC1mb3Jtcy9zcmMvbGliL2NvbXBvbmVudHMvc3RpLWRhdGUtdGltZS1ib3gvc3RpLWRhdGUtdGltZS1ib3guY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsS0FBSyxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUloRixPQUFPLEVBQUUseUJBQXlCLEVBQUUsa0JBQWtCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUUzRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQzs7Ozs7Ozs7O0FBNEtqRSxNQUFNLE9BQU8sdUJBQXVCO0lBSWxDLElBQVcsU0FBUztRQUNsQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxJQUFJLHlCQUF5QixDQUFDLE9BQU8sQ0FBQztJQUN4RSxDQUFDO0lBQ0QsSUFBVyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7SUFDL0IsQ0FBQztJQUNELElBQVcsVUFBVTtRQUNuQixPQUFPLENBQ0wsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRO1lBQ3JCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUNyRixJQUFJLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUNqQyxDQUFDO0lBQ0osQ0FBQztJQUNELElBQVcsS0FBSztRQUNkLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFDRCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJ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LFlBQ1MsS0FBc0IsRUFDdEIsZUFBMEM7UUFEMUMsVUFBSyxHQUFMLEtBQUssQ0FBaUI7UUFDdEIsb0JBQWUsR0FBZixlQUFlLENBQTJCO1FBaEYxQyxZQUFPLEdBQVksS0FBSyxDQUFDO0lBaUY5QixDQUFDO0lBRUwsUUFBUSxLQUFXLENBQUM7K0dBdEZULHVCQUF1QjttR0FBdkIsdUJBQXVCLDZOQXhLeEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O21CQStGTzs7NEZBeUVOLHVCQUF1QjtrQkExS25DLFNBQVM7K0JBQ0UsMkJBQTJCLFlBQzNCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzttQkErRk87NEhBMEVPLFNBQVM7c0JBQWhDLFNBQVM7dUJBQUMsV0FBVztnQkFDYixPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbnB1dCwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBTdGlNb2RlbFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvbW9kZWwuc2VydmljZVwiO1xyXG5cclxuaW1wb3J0IHsgU3RpRGF0ZVRpbWVCb3hFbGVtZW50IH0gZnJvbSBcIi4uLy4uL2VsZW1lbnRzL1N0aURhdGVUaW1lQm94RWxlbWVudFwiO1xyXG5pbXBvcnQgeyBTdGlEYXRlVGltZUJveFZhbHVlQ2hvaXNlLCBTdGlEYXRlVGltZUJveFR5cGUsIFN0aUhvcml6b250YWxBbGlnbm1lbnQgfSBmcm9tIFwiLi4vLi4vc3lzdGVtL2VudW1zXCI7XHJcbmltcG9ydCB7IFN0aUVkaXRhYmxlQ29udGVudFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvc3RpLWVkaXRhYmxlLWNvbnRlbnQuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBTdGlJbnB1dFRleHRJdGVtIH0gZnJvbSBcIi4uLy4uL2hlbHBlci9TdGlJbnB1dFRleHRJdGVtXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJzdGktZGF0ZXRpbWVib3gtY29tcG9uZW50XCIsXHJcbiAgdGVtcGxhdGU6IGAgPHN0aS1jb21wb25lbnQgW2VsZW1lbnRdPVwiZWxlbWVudFwiIFtpc0Nsb25lXT1cImlzQ2xvbmVcIiBjbGFzcz1cInN0aS1kYXRlLXRpbWUtYm94XCI+XHJcbiAgICA8c3RpLWVkaXRhYmxlLWNvbnRlbnQtY29tcG9uZW50XHJcbiAgICAgICpuZ0lmPVwiZWxlbWVudD8ubGFiZWwudmFsdWU/Lmxlbmd0aCA+IDAgJiYgZWxlbWVudD8uaXNMYWJlbFRvcEFsaWdubWVudCgpXCJcclxuICAgICAgW2VkaXRhYmxlQ29udGVudF09XCJlbGVtZW50LmxhYmVsXCJcclxuICAgICAgW3N0eWxlLmFsaWduLXNlbGZdPVwiYWxpZ25cIlxyXG4gICAgICBbc3R5bGUudGV4dC1hbGlnbl09XCJlbGVtZW50Py5nZXRDb250ZW50QWxpZ24oKVwiXHJcbiAgICAgIFtyZXF1aXJlZF09XCJlbGVtZW50LnJlcXVpcmVkXCJcclxuICAgICAgW2hpZGVFbXB0eV09XCJlbGVtZW50LnNob3dMYWJlbFBsYWNlaG9sZGVyKG1vZGVsPy5zZWxlY3RlZENvbXBvbmVudD8uZWxlbWVudCA9PSBlbGVtZW50KVwiXHJcbiAgICAgIFtzdHlsZS53aWR0aF09XCJlbGVtZW50Py5nZXRMYWJlbFdpZHRoKClcIlxyXG4gICAgPjwvc3RpLWVkaXRhYmxlLWNvbnRlbnQtY29tcG9uZW50PlxyXG4gICAgPHRhYmxlIFtzdHlsZS53aWR0aF09XCInMTAwJSdcIiBbc3R5bGUuaGVpZ2h0XT1cIidtYXgtY29udGVudCdcIiBbc3R5bGUubWFyZ2luLXRvcC5weF09XCJlbGVtZW50Py5nZXRUb3BNYXJnaW4oKVwiPlxyXG4gICAgICA8dHI+XHJcbiAgICAgICAgPHRkXHJcbiAgICAgICAgICAqbmdJZj1cImVsZW1lbnQ/LmxhYmVsLnZhbHVlPy5sZW5ndGggPiAwICYmICFlbGVtZW50Py5pc0xhYmVsVG9wQWxpZ25tZW50KClcIlxyXG4gICAgICAgICAgW3N0eWxlLmRpc3BsYXldPVwiJ2ZsZXgnXCJcclxuICAgICAgICAgIFtzdHlsZS5oZWlnaHRdPVwiJzEwMCUnXCJcclxuICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJlbGVtZW50Py5nZXRMYWJlbFdpZHRoKClcIlxyXG4gICAgICAgICAgW3N0eWxlLmFsaWduLWl0ZW1zXT1cImVsZW1lbnQ/LmdldFZlcnRpY2FsQWxpZ25tZW50KClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxzdGktZWRpdGFibGUtY29udGVudC1jb21wb25lbnRcclxuICAgICAgICAgICAgKm5nSWY9XCJlbGVtZW50Py5sYWJlbC52YWx1ZT8ubGVuZ3RoID4gMFwiXHJcbiAgICAgICAgICAgIFtlZGl0YWJsZUNvbnRlbnRdPVwiZWxlbWVudD8ubGFiZWxcIlxyXG4gICAgICAgICAgICBbcmVxdWlyZWRdPVwiZWxlbWVudC5yZXF1aXJlZFwiXHJcbiAgICAgICAgICAgIFtzdHlsZS50ZXh0LWFsaWduXT1cImVsZW1lbnQ/LmdldENvbnRlbnRBbGlnbigpXCJcclxuICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImVsZW1lbnQ/LmdldExhYmVsV2lkdGgoKVwiXHJcbiAgICAgICAgICAgIFtoaWRlRW1wdHldPVwiZWxlbWVudD8uc2hvd0xhYmVsUGxhY2Vob2xkZXIobW9kZWw/LnNlbGVjdGVkQ29tcG9uZW50Py5lbGVtZW50ID09IGVsZW1lbnQpXCJcclxuICAgICAgICAgID48L3N0aS1lZGl0YWJsZS1jb250ZW50LWNvbXBvbmVudD5cclxuICAgICAgICA8L3RkPlxyXG4gICAgICAgIDx0ZCBbc3R5bGUud2lkdGhdPVwiJzEwMCUnXCIgW3N0eWxlLnBvc2l0aW9uXT1cIidyZWxhdGl2ZSdcIj5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgY2xhc3M9XCJkYXRlLXRpbWUtYm94LWNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgIFtzdHlsZS5hbGlnbi1zZWxmXT1cImFsaWduXCJcclxuICAgICAgICAgICAgW3N0aVRvb2x0aXBdPVwiZWxlbWVudD8udG9vbHRpcFwiXHJcbiAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXHJcbiAgICAgICAgICAgIHNob3dEZWxheT1cIjUwMFwiXHJcbiAgICAgICAgICAgIFtzdHlsZV09XCJlbGVtZW50Py5odG1sU3R5bGUoKVwiXHJcbiAgICAgICAgICAgIFtzdHlsZS5qdXN0aWZ5LWNvbnRlbnRdPVwiaG9yaXpvbnRhbEFsaWdubWVudFwiXHJcbiAgICAgICAgICAgIFtzdHlsZS5ib3JkZXItY29sb3JdPVwibmVlZFRvRmlsbCA/ICdyZWQnIDogZWxlbWVudD8uYm9yZGVyQ29sb3IudG9IdG1sQ29sb3IoKVwiXHJcbiAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cInRoaXMuZWxlbWVudC5iYWNrZ3JvdW5kQ29sb3IudG9IdG1sQ29sb3IoKVwiXHJcbiAgICAgICAgICAgIFtzdHlsZS5ib3JkZXItd2lkdGhdPVwiYm9yZGVyV2lkdGgoKVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJpbkZvY3VzKCk7IGlucHV0RGF0ZS5jbGljaygpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPHN0aS1zdmctY2hlY2tib3gtY29tcG9uZW50XHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJlbGVtZW50LmFsbG93TnVsbCAmJiAhbW9kZWwucHJldmlld01vZGVcIlxyXG4gICAgICAgICAgICAgIFtzdHlsZS5tYXJnaW4tdG9wLnB4XT1cIm1hcmdpblwiXHJcbiAgICAgICAgICAgICAgW3N0eWxlLmFsaWduLXNlbGZdPVwiYWxpZ25cIlxyXG4gICAgICAgICAgICAgIFtzdHlsZS5tYXJnaW4tYmxvY2tdPVwiJ2F1dG8nXCJcclxuICAgICAgICAgICAgICBbZWxlbWVudF09XCJlbGVtZW50XCJcclxuICAgICAgICAgICAgICBbaWRdPVwiZWxlbWVudD8ubmFtZVwiXHJcbiAgICAgICAgICAgICAgW3RleHRdPVwiXCJcclxuICAgICAgICAgICAgICBbc3RhdGVdPVwiZWxlbWVudD8uZGF0ZVRpbWVWYWx1ZUlzTm90TnVsbFwiXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVQbGFjZUhvbGRlcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAoYnV0dG9uQ2xpY2spPVwiY2hhbmdlU3RhdGUoKVwiXHJcbiAgICAgICAgICAgID48L3N0aS1zdmctY2hlY2tib3gtY29tcG9uZW50PlxyXG4gICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCInMTAwJSdcIlxyXG4gICAgICAgICAgICAgIFtzdHlsZS5vcGFjaXR5XT1cIiFlbGVtZW50LmRhdGVUaW1lVmFsdWVJc05vdE51bGwgJiYgZWxlbWVudC5hbGxvd051bGwgPyAwIDogMVwiXHJcbiAgICAgICAgICAgICAgW3N0eWxlLnBvaW50ZXItZXZlbnRzXT1cIiFlbGVtZW50LmRhdGVUaW1lVmFsdWVJc05vdE51bGwgJiYgZWxlbWVudC5hbGxvd051bGwgPyAnbm9uZScgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cInRoaXMuZWxlbWVudC50ZXh0Q29sb3IudG9IdG1sQ29sb3IoKVwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImlucHV0RGF0ZS5jbGljaygpXCJcclxuICAgICAgICAgICAgICA+e3tnZXRWYWx1ZSgpfX08L3NwYW5cclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJkYXRlLXBpY2tlclwiXHJcbiAgICAgICAgICAgICAgW3N0eWxlLnBvaW50ZXItZXZlbnRzXT1cIiFlbGVtZW50LmRhdGVUaW1lVmFsdWVJc05vdE51bGwgJiYgZWxlbWVudC5hbGxvd051bGwgPyAnbm9uZScgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgW3N0eWxlLm9wYWNpdHldPVwiIWVsZW1lbnQuZGF0ZVRpbWVWYWx1ZUlzTm90TnVsbCAmJiBlbGVtZW50LmFsbG93TnVsbCA/IDAgOiAxXCJcclxuICAgICAgICAgICAgICAqbmdJZj1cIiFpc1JlYWRPbmx5XCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxsYWJlbCBbc3R5bGUuZGlzcGxheV09XCInZmxleCdcIiBbc3R5bGUuYWxpZ24taXRlbXNdPVwiJ2NlbnRlcidcIiBbc3R5bGUuanVzdGlmeS1jb250ZW50XT1cIidjZW50ZXInXCJcclxuICAgICAgICAgICAgICAgID48aSBjbGFzcz1cInBpIHBpLWNoZXZyb24tZG93blwiPjwvaVxyXG4gICAgICAgICAgICAgID48L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgI2lucHV0RGF0ZVxyXG4gICAgICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImVsZW1lbnQuYWxsb3dOdWxsID8gMjAgOiAwXCJcclxuICAgICAgICAgICAgICBbdHlwZV09XCJpc01vemlsYSA/ICdkYXRlJyA6ICdkYXRldGltZS1sb2NhbCdcIlxyXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJwYXJzZURhdGUoJGV2ZW50LnRhcmdldC52YWx1ZSlcIlxyXG4gICAgICAgICAgICAgIFt0YWJJbmRleF09XCJlbGVtZW50Wyd0YWJJbmRleCddXCJcclxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZWxlbWVudC5yZWFkT25seSAmJiBtb2RlbC5wcmV2aWV3TW9kZVwiXHJcbiAgICAgICAgICAgICAgKHNlbGVjdCk9XCJpbnB1dERhdGUuY2xpY2soKVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L3RkPlxyXG4gICAgICA8L3RyPlxyXG4gICAgICA8dHIgKm5nSWY9XCJlbGVtZW50Py5kZXNjcmlwdGlvbi52YWx1ZT8ubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgIDx0ZCAqbmdJZj1cImVsZW1lbnQ/LmxhYmVsLnZhbHVlPy5sZW5ndGggPiAwICYmICFlbGVtZW50Py5pc0xhYmVsVG9wQWxpZ25tZW50KClcIj48L3RkPlxyXG4gICAgICAgIDx0ZCBbc3R5bGUubWF4V2lkdGgucHhdPVwiZWxlbWVudC5tYXhXaWR0aCArIDFcIj5cclxuICAgICAgICAgIDxzdGktZWRpdGFibGUtY29udGVudC1jb21wb25lbnRcclxuICAgICAgICAgICAgKm5nSWY9XCJlbGVtZW50Py5kZXNjcmlwdGlvbi52YWx1ZT8ubGVuZ3RoID4gMFwiXHJcbiAgICAgICAgICAgIFtlZGl0YWJsZUNvbnRlbnRdPVwiZWxlbWVudC5kZXNjcmlwdGlvblwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICA8L3N0aS1lZGl0YWJsZS1jb250ZW50LWNvbXBvbmVudD5cclxuICAgICAgICA8L3RkPlxyXG4gICAgICA8L3RyPlxyXG4gICAgPC90YWJsZT5cclxuICA8L3N0aS1jb21wb25lbnQ+YCxcclxuICBzdHlsZXM6IFtcclxuICAgIGBcclxuICAgICAgLmRhdGUtdGltZS1ib3gtY29udGFpbmVyIHtcclxuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICAgIHBhZGRpbmc6IDNweCA0cHg7XHJcbiAgICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcclxuICAgICAgfVxyXG4gICAgICAuZGF0ZS10aW1lLWJveC1jb250YWluZXI6aG92ZXIge1xyXG4gICAgICAgIGJvcmRlci1jb2xvcjogcmdiKDE2MywgMTg5LCAyMjcpICFpbXBvcnRhbnQ7XHJcbiAgICAgIH1cclxuICAgICAgaW5wdXQge1xyXG4gICAgICAgIG9wYWNpdHk6IDA7XHJcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgICAgIGxlZnQ6IDA7XHJcbiAgICAgICAgdG9wOiAwO1xyXG4gICAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICAgIGhlaWdodDogMTAwJTtcclxuICAgICAgfVxyXG4gICAgICBpbnB1dDo6LXdlYmtpdC1kYXRldGltZS1lZGl0IHtcclxuICAgICAgICBkaXNwbGF5OiBub25lO1xyXG4gICAgICB9XHJcbiAgICAgIGlucHV0Ojotd2Via2l0LWNhbGVuZGFyLXBpY2tlci1pbmRpY2F0b3Ige1xyXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgfVxyXG4gICAgICAuZGF0ZS1waWNrZXIge1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xyXG4gICAgICAgIHdpZHRoOiAxNnB4O1xyXG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgICAgICBoZWlnaHQ6IDE2cHg7XHJcbiAgICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgICAgIG1hcmdpbi1sZWZ0OiA0cHg7XHJcbiAgICAgICAgcGFkZGluZy1yaWdodDogMXB4O1xyXG4gICAgICB9XHJcbiAgICAgIC8qIC5kYXRlLXBpY2tlcjpob3ZlciB7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDE5MCwgMjMwLCAyNTMpO1xyXG4gICAgICB9ICovXHJcbiAgICAgIGkge1xyXG4gICAgICAgIGNvbG9yOiBsaWdodGdyZXk7XHJcbiAgICAgIH1cclxuICAgICAgLnBpLWNoZXZyb24tZG93biB7XHJcbiAgICAgICAgZm9udC1zaXplOiAwLjU3NXJlbTtcclxuICAgICAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgICAgICBjb2xvcjogcmdiKDE5NywgMTk3LCAxOTcpO1xyXG4gICAgICAgIHBhZGRpbmctdG9wOiAxcHg7XHJcbiAgICAgIH1cclxuICAgICAgaW1nIHtcclxuICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xyXG4gICAgICAgIG1hcmdpbi1sZWZ0OiAwcHg7XHJcbiAgICAgICAgaGVpZ2h0OiAxNnB4O1xyXG4gICAgICAgIHdpZHRoOiAxNnB4O1xyXG4gICAgICB9XHJcbiAgICAgIHRhYmxlIHtcclxuICAgICAgICBib3JkZXItc3BhY2luZzogMDtcclxuICAgICAgfVxyXG4gICAgICB0ciB7XHJcbiAgICAgICAgaGVpZ2h0OiBtYXgtY29udGVudDtcclxuICAgICAgICBwYWRkaW5nOiAwO1xyXG4gICAgICAgIG1hcmdpbjogMDtcclxuICAgICAgfVxyXG4gICAgICB0ZCB7XHJcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgICAgIHBhZGRpbmc6IDA7XHJcbiAgICAgICAgbWFyZ2luOiAwO1xyXG4gICAgICB9XHJcbiAgICBgLFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTdGlEYXRlVGltZUJveENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQFZpZXdDaGlsZChcImlucHV0RGF0ZVwiKSBpbnB1dERhdGU6IEVsZW1lbnRSZWY7XHJcbiAgQElucHV0KCkgZWxlbWVudDogU3RpRGF0ZVRpbWVCb3hFbGVtZW50O1xyXG4gIEBJbnB1dCgpIGlzQ2xvbmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgZ2V0IGlzQ3VycmVudCgpIHtcclxuICAgIHJldHVybiB0aGlzLmVsZW1lbnQuaW5pdGlhbFN0YXRlID09IFN0aURhdGVUaW1lQm94VmFsdWVDaG9pc2UuQ3VycmVudDtcclxuICB9XHJcbiAgcHVibGljIGdldCBpc1JlYWRPbmx5KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudC5yZWFkT25seTtcclxuICB9XHJcbiAgcHVibGljIGdldCBuZWVkVG9GaWxsKCkge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5lbGVtZW50LnJlcXVpcmVkICYmXHJcbiAgICAgICh0aGlzLmVsZW1lbnQuYWxsb3dOdWxsID8gIXRoaXMuZWxlbWVudC5kYXRlVGltZVZhbHVlSXNOb3ROdWxsIDogIXRoaXMuZWxlbWVudC52YWx1ZSkgJiZcclxuICAgICAgdGhpcy5tb2RlbC5oYXNFbXB0eVJldWlyZWRGaWVsZHNcclxuICAgICk7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgYWxpZ24oKSB7XHJcbiAgICByZXR1cm4gXCJzdGFydFwiO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IGlzTW96aWxhKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubW9kZWwuZ2V0QnJvd3NlclR5cGUoKSA9PSBcImZpcmVmb3hcIiA/IHRydWUgOiBmYWxzZTtcclxuICB9XHJcbiAgcHVibGljIGdldCBob3Jpem9udGFsQWxpZ25tZW50KCkge1xyXG4gICAgaWYgKHRoaXMuZWxlbWVudC5jb250ZW50QWxpZ25tZW50ID09IFN0aUhvcml6b250YWxBbGlnbm1lbnQuTGVmdCkge1xyXG4gICAgICByZXR1cm4gXCJzdGFydFwiO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmVsZW1lbnQuY29udGVudEFsaWdubWVudCA9PSBTdGlIb3Jpem9udGFsQWxpZ25tZW50LlJpZ2h0KSB7XHJcbiAgICAgIHJldHVybiBcImZsZXgtZW5kXCI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gXCJjZW50ZXJcIjtcclxuICAgIH1cclxuICB9XHJcbiAgcHVibGljIGdldCBmb3JtYXQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50LnZhbHVlVHlwZSA9PSBTdGlEYXRlVGltZUJveFR5cGUuRGF0ZVxyXG4gICAgICA/IHRoaXMuZWxlbWVudC5kYXRlRm9ybWF0XHJcbiAgICAgIDogdGhpcy5lbGVtZW50LnZhbHVlVHlwZSA9PSBTdGlEYXRlVGltZUJveFR5cGUuVGltZVxyXG4gICAgICAgID8gdGhpcy5lbGVtZW50LnRpbWVGb3JtYXRcclxuICAgICAgICA6IHRoaXMuZWxlbWVudC5kYXRlVGltZUZvcm1hdDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRWYWx1ZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudC5kYXRlVmFsdWVTdHJpbmc7XHJcbiAgfVxyXG5cclxuICBwYXJzZURhdGUodmFsdWUpIHtcclxuICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuZWxlbWVudC5kYXRlVmFsdWUgPSBuZXcgRGF0ZSh2YWx1ZSk7XHJcbiAgICAgIHRoaXMubW9kZWwuZm9ybUV2ZW50cy5uZXh0KHsgbmFtZTogXCJWYWx1ZUNoYW5nZWRcIiB9KTtcclxuICAgIH1cclxuICB9XHJcbiAgcHVibGljIGZvcm1hdHRpbmdEYXRlKGRhdGVGb3JtYXQpIHtcclxuICAgIGxldCByZXN1bHQgPSBkYXRlRm9ybWF0XHJcbiAgICAgIC5yZXBsYWNlKC9NL2csIFwia1wiKVxyXG4gICAgICAucmVwbGFjZSgvbS9nLCBcInJcIilcclxuICAgICAgLnJlcGxhY2UoL3R0L2csIFwiYVwiKVxyXG4gICAgICAucmVwbGFjZSgvay9nLCBcIm1cIilcclxuICAgICAgLnJlcGxhY2UoL3IvZywgXCJNXCIpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcbiAgY2hhbmdlU3RhdGUoKSB7XHJcbiAgICB0aGlzLmVsZW1lbnQuZGF0ZVRpbWVWYWx1ZUlzTm90TnVsbCA9ICF0aGlzLmVsZW1lbnQuZGF0ZVRpbWVWYWx1ZUlzTm90TnVsbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBib3JkZXJXaWR0aCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGAke3RoaXMuZWxlbWVudC5ib3JkZXJXZWlnaHR9cHhgO1xyXG4gIH1cclxuICBpbkZvY3VzKCkge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgbGV0IGVkaXRhYmxlQ29udGVudCA9IG5ldyBTdGlJbnB1dFRleHRJdGVtKFxyXG4gICAgICAgIFwiXCIsXHJcbiAgICAgICAgdGhpcy5lbGVtZW50LmZvbnQsXHJcbiAgICAgICAgdGhpcy5lbGVtZW50LnRleHRDb2xvcixcclxuICAgICAgICB0aGlzLmVsZW1lbnQuYmFja2dyb3VuZENvbG9yLFxyXG4gICAgICAgIHRoaXMuZWxlbWVudC5jb250ZW50QWxpZ25tZW50XHJcbiAgICAgICk7XHJcbiAgICAgIGVkaXRhYmxlQ29udGVudC5lbGVtZW50ID0gdGhpcy5lbGVtZW50O1xyXG4gICAgICB0aGlzLmVkaXRhYmxlU2VydmljZS5lZGl0YWJsZUNvbnRlbnQgPSBlZGl0YWJsZUNvbnRlbnQ7XHJcbiAgICAgIHRoaXMuZWRpdGFibGVTZXJ2aWNlLnVzZWRFbGVtZW50ID0gdGhpcy5lbGVtZW50O1xyXG4gICAgfSwgMCk7XHJcbiAgfVxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIG1vZGVsOiBTdGlNb2RlbFNlcnZpY2UsXHJcbiAgICBwdWJsaWMgZWRpdGFibGVTZXJ2aWNlOiBTdGlFZGl0YWJsZUNvbnRlbnRTZXJ2aWNlXHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7IH1cclxufVxyXG4iXX0=