UNPKG

ontimize-web-ngx

Version:
437 lines 65.1 kB
import { __decorate, __metadata } from "tslib"; import { ChangeDetectionStrategy, Component, EventEmitter, forwardRef, Inject, Injector, ViewChild, ViewContainerRef } from '@angular/core'; import { Subscription } from 'rxjs'; import { BooleanInputConverter, NumberInputConverter } from '../../../decorators/input-converter'; import { Codes } from '../../../util/codes'; import { SQLTypes } from '../../../util/sqltypes'; import { Util } from '../../../util/util'; import { OTableComponent } from '../o-table.component'; import { editorsMapping, O_TABLE_CELL_EDITORS_INPUTS, O_TABLE_CELL_EDITORS_OUTPUTS } from './cell-editor/cell-editor'; import { O_TABLE_CELL_RENDERERS_INPUTS, O_TABLE_CELL_RENDERERS_OUTPUTS, renderersMapping } from './cell-renderer/cell-renderer'; import * as i0 from "@angular/core"; import * as i1 from "../o-table.component"; export const DEFAULT_INPUTS_O_TABLE_COLUMN = [ 'attr', 'title', 'titleAlign: title-align', 'contentAlign: content-align', 'orderable', 'searchable', 'groupable', 'type', 'editable', 'width', 'minWidth: min-width', 'maxWidth: max-width', 'asyncLoad : async-load', 'sqlType: sql-type', 'tooltip', 'tooltipValue: tooltip-value', 'tooltipFunction: tooltip-function', 'multiline', 'resizable', 'filterExpressionFunction: filter-expression-function', 'class', 'angularValidatorsFn: validators', 'angularValidatorsFnErrors: validators-errors', 'angularAsyncValidatorsFn: async-validators', ...O_TABLE_CELL_RENDERERS_INPUTS, ...O_TABLE_CELL_EDITORS_INPUTS ]; export const DEFAULT_OUTPUTS_O_TABLE_COLUMN = [ ...O_TABLE_CELL_RENDERERS_OUTPUTS, ...O_TABLE_CELL_EDITORS_OUTPUTS ]; export class OTableColumnComponent { set multiline(val) { val = Util.parseBoolean(String(val)); this._multiline = val; } get multiline() { return this._multiline; } constructor(table, injector) { this.table = table; this.injector = injector; this.editable = false; this.tooltip = false; this._multiline = false; this.angularValidatorsFn = []; this.angularValidatorsFnErrors = []; this.angularAsyncValidatorsFn = []; this._filterSource = 'render'; this.grouping = true; this.thousandSeparator = ','; this.decimalSeparator = '.'; this.renderType = 'string'; this.booleanType = 'boolean'; this.queryMethod = Codes.QUERY_METHOD; this.translate = false; this.oDateFormat = 'L'; this.oHourFormat = 24; this.valueBase = 1; this.orequired = false; this.showPlaceHolder = false; this.updateRecordOnEdit = true; this.showNotificationOnEdit = false; this.oStartView = 'month'; this.oTouchUi = false; this.dateValueType = 'timestamp'; this.minDecimalDigits = 2; this.maxDecimalDigits = 2; this.indeterminateOnNull = false; this.onClick = new EventEmitter(); this.editionStarted = new EventEmitter(); this.editionCancelled = new EventEmitter(); this.editionCommitted = new EventEmitter(); this.onPostUpdateRecord = new EventEmitter(); this.asyncLoad = false; this.subscriptions = new Subscription(); } static addEditor(type, editorClassReference) { if (!editorsMapping.hasOwnProperty(type) && Util.isDefined(editorClassReference)) { editorsMapping[type] = editorClassReference; } } ngOnInit() { this.grouping = Util.parseBoolean(this.grouping, true); this.titleAlign = this.parseTitleAlign(); this.table.registerColumn(this); this.subscriptions.add(this.table.onReinitialize.subscribe(() => this.table.registerColumn(this))); } ngAfterViewInit() { this.createRenderer(); this.createEditor(); } ngOnDestroy() { this.subscriptions.unsubscribe(); } parseTitleAlign() { const align = (this.titleAlign || '').toLowerCase(); return Codes.AVAILABLE_COLUMN_TITLE_ALIGNS.indexOf(align) !== -1 ? align : undefined; } get originalWidth() { let originalWidth = this.width; const pxVal = Util.extractPixelsValue(originalWidth); if (Util.isDefined(pxVal)) { originalWidth = pxVal + ''; } return originalWidth; } createRenderer() { if (!Util.isDefined(this.renderer) && Util.isDefined(this.type)) { const componentRef = renderersMapping[this.type]; if (componentRef !== undefined) { let newRenderer; const ref = this.container.createComponent(componentRef); newRenderer = ref.instance; newRenderer.filterSource = this.filterSource; newRenderer.filterFunction = this.filterFunction; switch (this.type) { case 'currency': newRenderer.currencySymbol = this.currencySymbol; newRenderer.currencySymbolPosition = this.currencySymbolPosition; newRenderer.decimalSeparator = this.decimalSeparator; newRenderer.minDecimalDigits = this.minDecimalDigits; newRenderer.maxDecimalDigits = this.maxDecimalDigits; newRenderer.grouping = this.grouping; newRenderer.thousandSeparator = this.thousandSeparator; break; case 'date': newRenderer.format = this.format; break; case 'time': newRenderer.format = this.format; break; case 'integer': newRenderer.grouping = this.grouping; newRenderer.thousandSeparator = this.thousandSeparator; break; case 'boolean': newRenderer.trueValue = this.trueValue; newRenderer.falseValue = this.falseValue; newRenderer.renderTrueValue = this.renderTrueValue; newRenderer.renderFalseValue = this.renderFalseValue; newRenderer.renderType = this.renderType; newRenderer.booleanType = this.booleanType; break; case 'percentage': newRenderer.valueBase = this.valueBase; case 'real': newRenderer.decimalSeparator = this.decimalSeparator; newRenderer.minDecimalDigits = this.minDecimalDigits; newRenderer.maxDecimalDigits = this.maxDecimalDigits; newRenderer.grouping = this.grouping; newRenderer.thousandSeparator = this.thousandSeparator; break; case 'image': newRenderer.imageType = this.imageType; newRenderer.avatar = this.avatar; newRenderer.emptyImage = this.emptyImage; break; case 'action': newRenderer.icon = this.icon; newRenderer.action = this.action; newRenderer.text = this.text; newRenderer.iconPosition = this.iconPosition; newRenderer.onClick = this.onClick; break; case 'service': newRenderer.entity = this.entity; newRenderer.service = this.service; newRenderer.columns = this.columns; newRenderer.valueColumn = this.valueColumn; newRenderer.parentKeys = this.parentKeys; newRenderer.queryMethod = this.queryMethod; newRenderer.serviceType = this.serviceType; newRenderer.translate = this.translate; break; case 'translate': newRenderer.translateArgsFn = this.translateArgsFn; break; } this.registerRenderer(newRenderer); } } } buildCellEditor(type, container, propsOrigin, registerInColumn = true) { let editor; const componentRef = editorsMapping[type] || editorsMapping.text; if (componentRef === undefined) { return editor; } const ref = container.createComponent(componentRef); editor = ref.instance; if (propsOrigin !== undefined) { switch (type) { case 'date': editor.format = propsOrigin.format; editor.locale = propsOrigin.locale; editor.oStartView = propsOrigin.oStartView; editor.oMinDate = propsOrigin.oMinDate; editor.oMaxDate = propsOrigin.oMaxDate; editor.oTouchUi = propsOrigin.oTouchUi; editor.oStartAt = propsOrigin.oStartAt; editor.filterDate = propsOrigin.filterDate; editor.dateValueType = propsOrigin.dateValueType; break; case 'time': editor.oDateFormat = propsOrigin.oDateFormat; editor.oHourFormat = propsOrigin.oHourFormat; editor.oDateLocale = propsOrigin.oDateLocale; editor.oMinDate = propsOrigin.oMinDate; editor.oMaxDate = propsOrigin.oMaxDate; editor.oTouchUi = propsOrigin.oTouchUi; editor.oDateStartAt = propsOrigin.oDateStartAt; editor.oDateTextInputEnabled = propsOrigin.oDateTextInputEnabled; editor.oHourMin = propsOrigin.oHourMin; editor.oHourMax = propsOrigin.oHourMax; editor.oHourTextInputEnabled = propsOrigin.oHourTextInputEnabled; editor.oHourPlaceholder = propsOrigin.oHourPlaceholder; editor.oDatePlaceholder = propsOrigin.oDatePlaceholder; break; case 'boolean': editor.booleanType = propsOrigin.booleanType; editor.indeterminateOnNull = propsOrigin.indeterminateOnNull; editor.autoCommit = propsOrigin.autoCommit; editor.trueValue = propsOrigin.trueValue; editor.falseValue = propsOrigin.falseValue; break; case 'integer': case 'percentage': case 'currency': case 'real': editor.min = propsOrigin.min; editor.max = propsOrigin.max; editor.step = Util.isDefined(propsOrigin.step) ? propsOrigin.step : editor.step; break; case 'image': break; default: break; } editor.olabel = propsOrigin.olabel; editor.type = propsOrigin.type; } editor.registerInColumn = registerInColumn; return editor; } createEditor() { if (!Util.isDefined(this.editor) && this.editable) { const newEditor = this.buildCellEditor(this.type, this.container, this); if (newEditor) { newEditor.orequired = this.orequired; newEditor.showPlaceHolder = this.showPlaceHolder; newEditor.updateRecordOnEdit = this.updateRecordOnEdit; newEditor.showNotificationOnEdit = this.showNotificationOnEdit; newEditor.editionStarted = this.editionStarted; newEditor.editionCancelled = this.editionCancelled; newEditor.editionCommitted = this.editionCommitted; newEditor.onPostUpdateRecord = this.onPostUpdateRecord; this.registerEditor(newEditor); } } } registerRenderer(renderer) { this.renderer = renderer; const oCol = this.table.getOColumn(this.attr); if (oCol !== undefined) { oCol.renderer = this.renderer; } this.renderer.initialize(); } registerEditor(editor) { this.editor = editor; const oCol = this.table.getOColumn(this.attr); if (oCol !== undefined) { oCol.editor = this.editor; } this.editor.initialize(); } set orderable(val) { this._orderable = typeof val === 'boolean' ? val : Util.parseBoolean(val, true); const oCol = this.table.getOColumn(this.attr); if (oCol) { oCol.orderable = this._orderable; } } get orderable() { return this._orderable; } set resizable(val) { this._resizable = typeof val === 'boolean' ? val : Util.parseBoolean(val, true); const oCol = this.table.getOColumn(this.attr); if (oCol) { oCol.resizable = this._resizable; } } get resizable() { return this._resizable; } set searchable(val) { this._searchable = typeof val === 'boolean' ? val : Util.parseBoolean(val, true); const oCol = this.table.getOColumn(this.attr); if (oCol) { oCol.searchable = this._searchable; } } get searchable() { return this._searchable; } set groupable(val) { this._groupable = typeof val === 'boolean' ? val : Util.parseBoolean(val, true); const oCol = this.table.getOColumn(this.attr); if (oCol) { oCol.groupable = this._groupable; } } get groupable() { return this._groupable; } getSQLType() { if (!(this.sqlType && this.sqlType.length > 0)) { switch (this.type) { case 'date': this.sqlType = 'TIMESTAMP'; break; case 'integer': this.sqlType = 'INTEGER'; break; case 'boolean': this.sqlType = 'BOOLEAN'; break; case 'real': case 'percentage': case 'currency': this.sqlType = 'DOUBLE'; break; } } this._SQLType = SQLTypes.getSQLTypeValue(this.sqlType); return this._SQLType; } set filterSource(val) { const lowerVal = (val || '').toLowerCase(); this._filterSource = (lowerVal === 'render' || lowerVal === 'data' || lowerVal === 'both') ? lowerVal : 'render'; } get filterSource() { return this._filterSource; } } OTableColumnComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTableColumnComponent, deps: [{ token: forwardRef(() => OTableComponent) }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component }); OTableColumnComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: OTableColumnComponent, selector: "o-table-column", inputs: { attr: "attr", title: "title", titleAlign: ["title-align", "titleAlign"], contentAlign: ["content-align", "contentAlign"], orderable: "orderable", searchable: "searchable", groupable: "groupable", type: "type", editable: "editable", width: "width", minWidth: ["min-width", "minWidth"], maxWidth: ["max-width", "maxWidth"], asyncLoad: ["async-load", "asyncLoad"], sqlType: ["sql-type", "sqlType"], tooltip: "tooltip", tooltipValue: ["tooltip-value", "tooltipValue"], tooltipFunction: ["tooltip-function", "tooltipFunction"], multiline: "multiline", resizable: "resizable", filterExpressionFunction: ["filter-expression-function", "filterExpressionFunction"], class: "class", angularValidatorsFn: ["validators", "angularValidatorsFn"], angularValidatorsFnErrors: ["validators-errors", "angularValidatorsFnErrors"], angularAsyncValidatorsFn: ["async-validators", "angularAsyncValidatorsFn"], trueValue: ["true-value", "trueValue"], falseValue: ["false-value", "falseValue"], booleanType: ["boolean-type", "booleanType"], renderTrueValue: ["render-true-value", "renderTrueValue"], renderFalseValue: ["render-false-value", "renderFalseValue"], renderType: ["render-type", "renderType"], grouping: "grouping", thousandSeparator: ["thousand-separator", "thousandSeparator"], decimalSeparator: ["decimal-separator", "decimalSeparator"], minDecimalDigits: ["min-decimal-digits", "minDecimalDigits"], maxDecimalDigits: ["max-decimal-digits", "maxDecimalDigits"], currencySymbol: ["currency-symbol", "currencySymbol"], currencySymbolPosition: ["currency-symbol-position", "currencySymbolPosition"], format: "format", imageType: ["image-type", "imageType"], emptyImage: ["empty-image", "emptyImage"], avatar: "avatar", icon: "icon", svgIcon: ["svg-icon", "svgIcon"], action: "action", text: "text", iconPosition: ["icon-position", "iconPosition"], entity: "entity", service: "service", columns: "columns", translate: "translate", valueColumn: ["value-column", "valueColumn"], valueColumnType: ["value-column-type", "valueColumnType"], parentKeys: ["parent-keys", "parentKeys"], queryMethod: ["query-method", "queryMethod"], serviceType: ["service-type", "serviceType"], translateArgsFn: ["translate-params", "translateArgsFn"], orequired: ["required", "orequired"], showPlaceHolder: ["show-placeholder", "showPlaceHolder"], olabel: ["label", "olabel"], updateRecordOnEdit: ["update-record-on-edit", "updateRecordOnEdit"], showNotificationOnEdit: ["show-notification-on-edit", "showNotificationOnEdit"], enabled: "enabled", min: "min", max: "max", step: "step", locale: "locale", oStartView: ["start-view", "oStartView"], oTouchUi: ["touch-ui", "oTouchUi"], startAt: ["start-at", "startAt"], filterDate: ["filter-date", "filterDate"], dateValueType: ["date-value-type", "dateValueType"], oDateFormat: ["date-format", "oDateFormat"], oDateLocale: ["date-locale", "oDateLocale"], oDateStartView: ["date-start-view", "oDateStartView"], oMinDate: ["date-min", "oMinDate"], oMaxDate: ["date-max", "oMaxDate"], oDateTouchUi: ["date-touch-ui", "oDateTouchUi"], oDateStartAt: ["date-start-at", "oDateStartAt"], oHourFormat: ["hour-format", "oHourFormat"], oHourMin: ["hour-min", "oHourMin"], oHourMax: ["hour-max", "oHourMax"], oHourPlaceholder: ["hour-placeholder", "oHourPlaceholder"], oDatePlaceholder: ["date-placeholder", "oDatePlaceholder"] }, outputs: { onClick: "onClick", onDataLoaded: "onDataLoaded", editionStarted: "editionStarted", editionCancelled: "editionCancelled", editionCommitted: "editionCommitted", onPostUpdateRecord: "onPostUpdateRecord" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: "<span #container>\n</span>", styles: [""], changeDetection: i0.ChangeDetectionStrategy.OnPush }); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OTableColumnComponent.prototype, "editable", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OTableColumnComponent.prototype, "tooltip", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OTableColumnComponent.prototype, "translate", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OTableColumnComponent.prototype, "orequired", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OTableColumnComponent.prototype, "showPlaceHolder", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OTableColumnComponent.prototype, "updateRecordOnEdit", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OTableColumnComponent.prototype, "showNotificationOnEdit", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OTableColumnComponent.prototype, "oTouchUi", void 0); __decorate([ NumberInputConverter(), __metadata("design:type", Number) ], OTableColumnComponent.prototype, "min", void 0); __decorate([ NumberInputConverter(), __metadata("design:type", Number) ], OTableColumnComponent.prototype, "max", void 0); __decorate([ NumberInputConverter(), __metadata("design:type", Number) ], OTableColumnComponent.prototype, "step", void 0); __decorate([ NumberInputConverter(), __metadata("design:type", Number) ], OTableColumnComponent.prototype, "minDecimalDigits", void 0); __decorate([ NumberInputConverter(), __metadata("design:type", Number) ], OTableColumnComponent.prototype, "maxDecimalDigits", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OTableColumnComponent.prototype, "indeterminateOnNull", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OTableColumnComponent.prototype, "autoCommit", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OTableColumnComponent.prototype, "asyncLoad", void 0); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTableColumnComponent, decorators: [{ type: Component, args: [{ selector: 'o-table-column', changeDetection: ChangeDetectionStrategy.OnPush, inputs: DEFAULT_INPUTS_O_TABLE_COLUMN, outputs: DEFAULT_OUTPUTS_O_TABLE_COLUMN, template: "<span #container>\n</span>" }] }], ctorParameters: function () { return [{ type: i1.OTableComponent, decorators: [{ type: Inject, args: [forwardRef(() => OTableComponent)] }] }, { type: i0.Injector }]; }, propDecorators: { editable: [], tooltip: [], translate: [], orequired: [], showPlaceHolder: [], updateRecordOnEdit: [], showNotificationOnEdit: [], oTouchUi: [], min: [], max: [], step: [], minDecimalDigits: [], maxDecimalDigits: [], indeterminateOnNull: [], autoCommit: [], asyncLoad: [], container: [{ type: ViewChild, args: ['container', { read: ViewContainerRef, static: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby10YWJsZS1jb2x1bW4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb250aW1pemUtd2ViLW5neC9zcmMvbGliL2NvbXBvbmVudHMvdGFibGUvY29sdW1uL28tdGFibGUtY29sdW1uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlL2NvbHVtbi9vLXRhYmxlLWNvbHVtbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixNQUFNLEVBQ04sUUFBUSxFQUdSLFNBQVMsRUFDVCxnQkFBZ0IsRUFDakIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVwQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQU9sRyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDNUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2xELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSwyQkFBMkIsRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3RILE9BQU8sRUFBRSw2QkFBNkIsRUFBRSw4QkFBOEIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtCQUErQixDQUFDOzs7QUFFaEksTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUc7SUFHM0MsTUFBTTtJQUdOLE9BQU87SUFHUCx5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REFDWDtBQUNaO0lBQUMsb0JBQW9CLEVBQUU7O21EQUNWO0FBQ2I7SUFBQyxvQkFBb0IsRUFBRTs7K0RBQ007QUFDN0I7SUFBQyxvQkFBb0IsRUFBRTs7K0RBQ007QUFHN0I7SUFBQyxxQkFBcUIsRUFBRTs7a0VBQ2E7QUFDckM7SUFBQyxxQkFBcUIsRUFBRTs7eURBQ0o7QUFXcEI7SUFBQyxxQkFBcUIsRUFBRTs7d0RBQ0c7NEZBbEpoQixxQkFBcUI7a0JBUmpDLFNBQVM7K0JBQ0UsZ0JBQWdCLG1CQUdULHVCQUF1QixDQUFDLE1BQU0sVUFDdkMsNkJBQTZCLFdBQzVCLDhCQUE4Qjs7MEJBNEpwQyxNQUFNOzJCQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxlQUFlLENBQUM7bUVBeklwQyxRQUFRLE1BS1IsT0FBTyxNQWdFSixTQUFTLE1BWVQsU0FBUyxNQUVuQixlQUFlLE1BR2Ysa0JBQWtCLE1BRWxCLHNCQUFzQixNQVFaLFFBQVEsTUFPbEIsR0FBRyxNQUVILEdBQUcsTUFFSCxJQUFJLE1BRUosZ0JBQWdCLE1BRWhCLGdCQUFnQixNQUloQixtQkFBbUIsTUFFbkIsVUFBVSxNQVlWLFNBQVMsTUFHVCxTQUFTO3NCQURSLFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIEluamVjdCxcbiAgSW5qZWN0b3IsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBc3luY1ZhbGlkYXRvckZuLCBWYWxpZGF0b3JGbiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBCb29sZWFuSW5wdXRDb252ZXJ0ZXIsIE51bWJlcklucHV0Q29udmVydGVyIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9ycy9pbnB1dC1jb252ZXJ0ZXInO1xuaW1wb3J0IHsgT1RhYmxlQ29sdW1uIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcy9vLXRhYmxlLWNvbHVtbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgT1BlcmNlbnRhZ2VWYWx1ZUJhc2VUeXBlIH0gZnJvbSAnLi4vLi4vLi4vcGlwZXMvby1wZXJjZW50YWdlLnBpcGUnO1xuaW1wb3J0IHsgRGF0ZUZpbHRlckZ1bmN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvZGF0ZS1maWx0ZXItZnVuY3Rpb24udHlwZSc7XG5pbXBvcnQgeyBFcnJvckRhdGEgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9lcnJvci1kYXRhLnR5cGUnO1xuaW1wb3J0IHsgRXhwcmVzc2lvbiB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL2V4cHJlc3Npb24udHlwZSc7XG5pbXBvcnQgeyBPRGF0ZVZhbHVlVHlwZSB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL28tZGF0ZS12YWx1ZS50eXBlJztcbmltcG9ydCB7IENvZGVzIH0gZnJvbSAnLi4vLi4vLi4vdXRpbC9jb2Rlcyc7XG5pbXBvcnQgeyBTUUxUeXBlcyB9IGZyb20gJy4uLy4uLy4uL3V0aWwvc3FsdHlwZXMnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uLy4uLy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgeyBPVGFibGVDb21wb25lbnQgfSBmcm9tICcuLi9vLXRhYmxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBlZGl0b3JzTWFwcGluZywgT19UQUJMRV9DRUxMX0VESVRPUlNfSU5QVVRTLCBPX1RBQkxFX0NFTExfRURJVE9SU19PVVRQVVRTIH0gZnJvbSAnLi9jZWxsLWVkaXRvci9jZWxsLWVkaXRvcic7XG5pbXBvcnQgeyBPX1RBQkxFX0NFTExfUkVOREVSRVJTX0lOUFVUUywgT19UQUJMRV9DRUxMX1JFTkRFUkVSU19PVVRQVVRTLCByZW5kZXJlcnNNYXBwaW5nIH0gZnJvbSAnLi9jZWxsLXJlbmRlcmVyL2NlbGwtcmVuZGVyZXInO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9JTlBVVFNfT19UQUJMRV9DT0xVTU4gPSBbXG5cbiAgLy8gYXR0ciBbc3RyaW5nXTogY29sdW1uIG5hbWUuXG4gICdhdHRyJyxcblxuICAvLyB0aXRsZSBbc3RyaW5nXTogY29sdW1uIHRpdGxlLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgJ3RpdGxlJyxcblxuICAvLyB0aXRsZS1hbGlnbiBbc3RhcnQgfCBjZW50ZXIgfCBlbmRdOiBjb2x1bW4gdGl0bGUgYWxpZ25tZW50LiBEZWZhdWx0OiBjZW50ZXIuXG4gICd0aXRsZUFsaWduOiB0aXRsZS1hbGlnbicsXG5cbiAgLy8gY29udGVudC1hbGlnbiBbc3RhcnQgfCBjZW50ZXIgfCBlbmRdOiBjb2x1bW4gY29udGVudCBhbGlnbm1lbnQuXG4gICdjb250ZW50QWxpZ246IGNvbnRlbnQtYWxpZ24nLFxuXG4gIC8vIG9yZGVyYWJsZSBbbm98eWVzXTogY29sdW1uIGNhbiBiZSBzb3J0ZWQuIERlZmF1bHQ6IHllcy5cbiAgJ29yZGVyYWJsZScsXG5cbiAgLy8gc2VhcmNoYWJsZSBbbm98eWVzXTogc2VhcmNoaW5ncyBhcmUgcGVyZm9ybWVkIGludG8gY29sdW1uIGNvbnRlbnQuIERlZmF1bHQ6IHllcy5cbiAgJ3NlYXJjaGFibGUnLFxuXG4gIC8vIGdyb3VwYWJsZSBbbm98eWVzfHRydWV8ZmFsc2VdOiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIGNvbHVtbiBjYW4gYmUgZ3JvdXBhYmxlXG4gICdncm91cGFibGUnLFxuXG4gIC8vIHR5cGUgW2Jvb2xlYW58aW50ZWdlcnxyZWFsfGN1cnJlbmN5fGRhdGV8aW1hZ2VdOiBjb2x1bW4gdHlwZS4gRGVmYXVsdDogbm8gdmFsdWUgKHN0cmluZykuXG4gICd0eXBlJyxcblxuICAvLyBlZGl0YWJsZSBbbm98eWVzXTogY29sdW1uIGNhbiBiZSBlZGl0ZWQgZGlyZWN0bHkgb3ZlciB0aGUgdGFibGUuIERlZmF1bHQ6IG5vLlxuICAnZWRpdGFibGUnLFxuXG4gICd3aWR0aCcsXG5cbiAgLy8gb25seSBpbiBwaXhlbHNcbiAgJ21pbldpZHRoOiBtaW4td2lkdGgnLFxuXG4gIC8vIG9ubHkgaW4gcGl4ZWxzXG4gICdtYXhXaWR0aDogbWF4LXdpZHRoJyxcblxuICAvLyBhc3luYy1sb2FkIFtub3x5ZXN8dHJ1ZXxmYWxzZV06IGFzeW5jaHJvbm91cyBxdWVyeS4gRGVmYXVsdDogbm9cbiAgJ2FzeW5jTG9hZCA6IGFzeW5jLWxvYWQnLFxuXG4gIC8vIHNxbHR5cGVbc3RyaW5nXTogRGF0YSB0eXBlIGFjY29yZGluZyB0byBKYXZhIHN0YW5kYXJkLiBTZWUgU1FMVHlwZSBjbGFzcy4gRGVmYXVsdDogJ09USEVSJ1xuICAnc3FsVHlwZTogc3FsLXR5cGUnLFxuXG4gICd0b29sdGlwJyxcblxuICAndG9vbHRpcFZhbHVlOiB0b29sdGlwLXZhbHVlJyxcblxuICAndG9vbHRpcEZ1bmN0aW9uOiB0b29sdGlwLWZ1bmN0aW9uJyxcblxuICAnbXVsdGlsaW5lJyxcblxuICAncmVzaXphYmxlJyxcblxuICAnZmlsdGVyRXhwcmVzc2lvbkZ1bmN0aW9uOiBmaWx0ZXItZXhwcmVzc2lvbi1mdW5jdGlvbicsXG5cbiAgJ2NsYXNzJyxcblxuICAnYW5ndWxhclZhbGlkYXRvcnNGbjogdmFsaWRhdG9ycycsXG5cbiAgJ2FuZ3VsYXJWYWxpZGF0b3JzRm5FcnJvcnM6IHZhbGlkYXRvcnMtZXJyb3JzJyxcblxuICAnYW5ndWxhckFzeW5jVmFsaWRhdG9yc0ZuOiBhc3luYy12YWxpZGF0b3JzJyxcblxuICAuLi5PX1RBQkxFX0NFTExfUkVOREVSRVJTX0lOUFVUUyxcbiAgLi4uT19UQUJMRV9DRUxMX0VESVRPUlNfSU5QVVRTXG5dO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9PVVRQVVRTX09fVEFCTEVfQ09MVU1OID0gW1xuICAuLi5PX1RBQkxFX0NFTExfUkVOREVSRVJTX09VVFBVVFMsXG4gIC4uLk9fVEFCTEVfQ0VMTF9FRElUT1JTX09VVFBVVFNcbl07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ28tdGFibGUtY29sdW1uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL28tdGFibGUtY29sdW1uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vby10YWJsZS1jb2x1bW4uY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGlucHV0czogREVGQVVMVF9JTlBVVFNfT19UQUJMRV9DT0xVTU4sXG4gIG91dHB1dHM6IERFRkFVTFRfT1VUUFVUU19PX1RBQkxFX0NPTFVNTlxufSlcbmV4cG9ydCBjbGFzcyBPVGFibGVDb2x1bW5Db21wb25lbnQgaW1wbGVtZW50cyBPVGFibGVDb2x1bW4sIE9uRGVzdHJveSwgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcblxuICBwdWJsaWMgcmVuZGVyZXI6IGFueTtcbiAgcHVibGljIGVkaXRvcjogYW55O1xuXG4gIHB1YmxpYyB0eXBlOiBzdHJpbmc7XG4gIHB1YmxpYyBhdHRyOiBzdHJpbmc7XG4gIHB1YmxpYyB0aXRsZTogc3RyaW5nO1xuICBwdWJsaWMgdGl0bGVBbGlnbjogc3RyaW5nO1xuICBwdWJsaWMgY29udGVudEFsaWduOiAnc3RhcnQnIHwgJ2NlbnRlcicgfCAnZW5kJztcbiAgcHVibGljIHNxbFR5cGU6IHN0cmluZztcbiAgcHJvdGVjdGVkIF9TUUxUeXBlOiBudW1iZXI7XG4gIHByb3RlY3RlZCBfb3JkZXJhYmxlOiBib29sZWFuO1xuICBwcm90ZWN0ZWQgX3Jlc2l6YWJsZTogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIF9zZWFyY2hhYmxlOiBib29sZWFuO1xuICBwcm90ZWN0ZWQgX2dyb3VwYWJsZTogYm9vbGVhbjtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHB1YmxpYyBlZGl0YWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgd2lkdGg6IHN0cmluZztcbiAgcHVibGljIG1pbldpZHRoOiBzdHJpbmc7XG4gIHB1YmxpYyBtYXhXaWR0aDogc3RyaW5nO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgcHVibGljIHRvb2x0aXA6IGJvb2xlYW4gPSBmYWxzZTtcbiAgdG9vbHRpcFZhbHVlOiBzdHJpbmc7XG4gIHRvb2x0aXBGdW5jdGlvbjogKHJvd0RhdGE6IGFueSkgPT4gYW55O1xuICBwdWJsaWMgY2xhc3M6IHN0cmluZztcblxuICBzZXQgbXVsdGlsaW5lKHZhbDogYm9vbGVhbikge1xuICAgIHZhbCA9IFV0aWwucGFyc2VCb29sZWFuKFN0cmluZyh2YWwpKTtcbiAgICB0aGlzLl9tdWx0aWxpbmUgPSB2YWw7XG4gIH1cbiAgZ2V0IG11bHRpbGluZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbXVsdGlsaW5lO1xuICB9XG4gIHByb3RlY3RlZCBfbXVsdGlsaW5lOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHVibGljIGFuZ3VsYXJWYWxpZGF0b3JzRm46IFZhbGlkYXRvckZuW10gPSBbXTtcbiAgcHVibGljIGFuZ3VsYXJWYWxpZGF0b3JzRm5FcnJvcnM6IEVycm9yRGF0YVtdID0gW107XG5cbiAgcHVibGljIGFuZ3VsYXJBc3luY1ZhbGlkYXRvcnNGbjogQXN5bmNWYWxpZGF0b3JGbltdID0gW107XG5cbiAgZmlsdGVyRXhwcmVzc2lvbkZ1bmN0aW9uOiAoY29sdW1uQXR0cjogc3RyaW5nLCBxdWlja0ZpbHRlcj86IHN0cmluZykgPT4gRXhwcmVzc2lvbjtcblxuICAvKiBpbnB1dCByZW5kZXJlciBiYXNlICovXG4gIHB1YmxpYyBfZmlsdGVyU291cmNlOiAncmVuZGVyJyB8ICdkYXRhJyB8ICdib3RoJyA9ICdyZW5kZXInO1xuICBwdWJsaWMgZmlsdGVyRnVuY3Rpb246IChjZWxsVmFsdWU6IGFueSwgcm93VmFsdWU6IGFueSwgcXVpY2tGaWx0ZXI/OiBzdHJpbmcpID0+IGJvb2xlYW47XG4gIC8qIGlucHV0IHJlbmRlcmVyIGRhdGUgKi9cbiAgcHJvdGVjdGVkIGZvcm1hdDogc3RyaW5nO1xuICAvKiBpbnB1dCByZW5kZXJlciBpbnRlZ2VyICovXG4gIHByb3RlY3RlZCBncm91cGluZzogYW55ID0gdHJ1ZTtcbiAgcHJvdGVjdGVkIHRob3VzYW5kU2VwYXJhdG9yOiBzdHJpbmcgPSAnLCc7XG4gIC8qIGlucHV0IHJlbmRlcmVyIHJlYWwgKi9cbiAgcHJvdGVjdGVkIGRlY2ltYWxTZXBhcmF0b3I6IHN0cmluZyA9ICcuJztcblxuICAvKiBpbnB1dCByZW5kZXJlciBjdXJyZW5jeSAqL1xuICBwcm90ZWN0ZWQgY3VycmVuY3lTeW1ib2w6IHN0cmluZztcbiAgcHJvdGVjdGVkIGN1cnJlbmN5U3ltYm9sUG9zaXRpb246IHN0cmluZztcblxuICAvKiBpbnB1dCByZW5kZXJlciBib29sZWFuICovXG4gIHByb3RlY3RlZCB0cnVlVmFsdWU6IGFueTtcbiAgcHJvdGVjdGVkIGZhbHNlVmFsdWU6IGFueTtcbiAgcHJvdGVjdGVkIHJlbmRlclRydWVWYWx1ZTogYW55O1xuICBwcm90ZWN0ZWQgcmVuZGVyRmFsc2VWYWx1ZTogYW55O1xuICBwcm90ZWN0ZWQgcmVuZGVyVHlwZTogc3RyaW5nID0gJ3N0cmluZyc7XG4gIHByb3RlY3RlZCBib29sZWFuVHlwZTogc3RyaW5nID0gJ2Jvb2xlYW4nO1xuXG4gIC8qIGlucHV0IGltYWdlICovXG4gIHByb3RlY3RlZCBpbWFnZVR5cGU6IHN0cmluZztcbiAgcHJvdGVjdGVkIGF2YXRhcjogc3RyaW5nO1xuICBwcm90ZWN0ZWQgZW1wdHlJbWFnZTogc3RyaW5nO1xuXG4gIC8qIGlucHV0IHJlbmRlcmVyIGFjdGlvbiAqL1xuICBwcm90ZWN0ZWQgaWNvbjogc3RyaW5nO1xuICBwcm90ZWN0ZWQgYWN0aW9uOiBzdHJpbmc7XG4gIHByb3RlY3RlZCB0ZXh0OiBzdHJpbmc7XG4gIHByb3RlY3RlZCBpY29uUG9zaXRpb246IHN0cmluZztcblxuICAvKiBpbnB1dCByZW5kZXJlciBzZXJ2aWNlICovXG4gIHByb3RlY3RlZCBlbnRpdHk6IHN0cmluZztcbiAgcHJvdGVjdGVkIHNlcnZpY2U6IHN0cmluZztcbiAgcHJvdGVjdGVkIGNvbHVtbnM6IHN0cmluZztcbiAgcHJvdGVjdGVkIHZhbHVlQ29sdW1uOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBwYXJlbnRLZXlzOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBxdWVyeU1ldGhvZDogc3RyaW5nID0gQ29kZXMuUVVFUllfTUVUSE9EO1xuICBwcm90ZWN0ZWQgc2VydmljZVR5cGU6IHN0cmluZztcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHByb3RlY3RlZCB0cmFuc2xhdGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyogaW5wdXQgcmVuZGVyZXIgdHJhbnNsYXRlICovXG4gIHByb3RlY3RlZCB0cmFuc2xhdGVBcmdzRm46IChyb3dEYXRhOiBhbnkpID0+IGFueVtdO1xuICAvKiBpbnB1dCB0aW1lICovXG4gIG9EYXRlRm9ybWF0ID0gJ0wnO1xuICBvSG91ckZvcm1hdCA9IDI0O1xuXG4gIC8qIGlucHV0IHJlbmRlcmVyIHBlcmNlbnRhZ2UgKi9cbiAgdmFsdWVCYXNlOiBPUGVyY2VudGFnZVZhbHVlQmFzZVR5cGUgPSAxO1xuXG4gIC8qIGlucHV0IGVkaXRvciAqL1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgcHJvdGVjdGVkIG9yZXF1aXJlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgc2hvd1BsYWNlSG9sZGVyOiBib29sZWFuID0gZmFsc2U7XG4gIG9sYWJlbDogc3RyaW5nO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgdXBkYXRlUmVjb3JkT25FZGl0OiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHNob3dOb3RpZmljYXRpb25PbkVkaXQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiBpbnB1dCBlZGl0b3IgZGF0ZSAqL1xuICBwcm90ZWN0ZWQgbG9jYWxlOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBvU3RhcnRWaWV3OiAnbW9udGgnIHwgJ3llYXInID0gJ21vbnRoJztcbiAgcHJvdGVjdGVkIG9NaW5EYXRlOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBvTWF4RGF0ZTogc3RyaW5nO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgcHJvdGVjdGVkIG9Ub3VjaFVpOiBib29sZWFuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBvU3RhcnRBdDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgZmlsdGVyRGF0ZTogRGF0ZUZpbHRlckZ1bmN0aW9uO1xuICBwcm90ZWN0ZWQgZGF0ZVZhbHVlVHlwZTogT0RhdGVWYWx1ZVR5cGUgPSAndGltZXN0YW1wJztcblxuICAvKiBpbnB1dCBlZGl0b3IgaW50ZWdlciAqL1xuICBATnVtYmVySW5wdXRDb252ZXJ0ZXIoKVxuICBtaW46IG51bWJlcjtcbiAgQE51bWJlcklucHV0Q29udmVydGVyKClcbiAgbWF4OiBudW1iZXI7XG4gIEBOdW1iZXJJbnB1dENvbnZlcnRlcigpXG4gIHN0ZXA6IG51bWJlcjtcbiAgQE51bWJlcklucHV0Q29udmVydGVyKClcbiAgbWluRGVjaW1hbERpZ2l0czogbnVtYmVyID0gMjtcbiAgQE51bWJlcklucHV0Q29udmVydGVyKClcbiAgbWF4RGVjaW1hbERpZ2l0czogbnVtYmVyID0gMjtcblxuICAvKiBpbnB1dCBlZGl0b3IgYm9vbGVhbiAqL1xuICBAQ