@junte/ui
Version:
Quality Angular UI components kit
265 lines • 31.5 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { Component, ContentChildren, EventEmitter, forwardRef, HostBinding, HostListener, Input, Output, QueryList } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { NGXLogger } from 'ngx-logger';
import { DeviceService } from '../../layout/responsive/device.service';
import { PropertyApi } from '../../core/decorators/api';
import { Feature } from '../../core/enums/feature';
import { Orientation } from '../../core/enums/orientation';
import { UI } from '../../core/enums/ui';
import { Width } from '../../core/enums/width';
import { isEqual } from '../../core/utils/equal';
import { BreakpointService } from '../../layout/responsive/breakpoint.service';
import { SelectMode } from '../select/enums';
import { SwitcherOptionComponent } from './switcher-option.component';
var SwitcherComponent = /** @class */ (function () {
function SwitcherComponent(logger, breakpoint, device) {
var _this = this;
this.logger = logger;
this.breakpoint = breakpoint;
this.device = device;
this.host = 'jnt-switcher-host';
this.ui = UI;
this._features = [];
this._orientation = Orientation.horizontal;
this._width = Width.default;
this.disabled = false;
this._mode = SelectMode.single;
this.capacity = 3;
this.loading = false;
this.updated = new EventEmitter();
this.selected = [];
this.version = 0;
this.onChange = function () { return _this.logger.error('value accessor is not registered'); };
this.onTouched = function () { return _this.logger.error('value accessor is not registered'); };
this.registerOnChange = function (fn) { return _this.onChange = fn; };
this.registerOnTouched = function (fn) { return _this.onTouched = fn; };
this.onBlur = function () { return _this.onTouched(); };
}
SwitcherComponent_1 = SwitcherComponent;
Object.defineProperty(SwitcherComponent.prototype, "orientation", {
get: function () {
return this._orientation;
},
set: function (type) {
this._orientation = type || Orientation.horizontal;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SwitcherComponent.prototype, "mode", {
get: function () {
return this._mode;
},
set: function (mode) {
this._mode = mode || SelectMode.single;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SwitcherComponent.prototype, "features", {
get: function () {
return this._features;
},
set: function (features) {
this._features = features || [];
},
enumerable: true,
configurable: true
});
Object.defineProperty(SwitcherComponent.prototype, "width", {
set: function (width) {
this._width = width || Width.default;
},
enumerable: true,
configurable: true
});
SwitcherComponent.prototype.writeValue = function (value) {
if (this.mode === SelectMode.multiple && !value) {
throw new Error('Wrong value form multiple select mode');
}
this.selected = (this.mode === SelectMode.single ? (!!value ? [value] : []) : value);
};
SwitcherComponent.prototype.setDisabledState = function (disabled) {
this.disabled = disabled;
};
SwitcherComponent.prototype.select = function (value) {
switch (this.mode) {
case SelectMode.single:
var current = this.selected.length > 0 ? this.selected[0] : null;
if (current !== null) {
var same = !!this.keyField
? current[this.keyField] === value[this.keyField]
: isEqual(current, value);
if (same && !this.features.includes(Feature.allowEmpty)) {
return;
}
this.selected = same || value === null ? [] : [value];
this.onChange(same ? null : value);
this.updated.emit(same ? null : value);
}
else {
this.selected = value === null ? [] : [value];
this.onChange(value);
this.updated.emit(value);
}
this.version++;
break;
case SelectMode.multiple:
var index = !!this.keyField
? this.selected.indexOf(value[this.keyField])
: this.selected.findIndex(function (e) { return isEqual(e, value); });
if (index !== -1) {
this.selected.splice(index, 1);
}
else {
this.selected.push(value);
}
this.version++;
this.onChange(this.selected);
this.updated.emit(this.selected);
break;
}
};
SwitcherComponent.prototype.selectAll = function () {
var _this = this;
this.options.forEach(function (o) { return _this.selected.push(o.value); });
this.version++;
this.onChange(this.selected);
this.updated.emit(this.selected);
};
var SwitcherComponent_1;
SwitcherComponent.ctorParameters = function () { return [
{ type: NGXLogger },
{ type: BreakpointService },
{ type: DeviceService }
]; };
__decorate([
HostBinding('attr.host'),
__metadata("design:type", Object)
], SwitcherComponent.prototype, "host", void 0);
__decorate([
HostBinding('attr.data-width'),
__metadata("design:type", String)
], SwitcherComponent.prototype, "_width", void 0);
__decorate([
PropertyApi({
description: 'Switcher orientation ',
path: 'ui.orientation',
default: Orientation.horizontal,
options: [Orientation.horizontal, Orientation.vertical]
}),
HostBinding('attr.data-orientation'),
Input(),
__metadata("design:type", String),
__metadata("design:paramtypes", [String])
], SwitcherComponent.prototype, "orientation", null);
__decorate([
PropertyApi({
description: 'Set disabled state',
type: 'boolean',
default: 'false',
}),
HostBinding('attr.data-disabled'),
Input(),
__metadata("design:type", Object)
], SwitcherComponent.prototype, "disabled", void 0);
__decorate([
PropertyApi({
description: 'Select key field',
type: 'string',
default: 'key'
}),
Input(),
__metadata("design:type", String)
], SwitcherComponent.prototype, "keyField", void 0);
__decorate([
HostBinding('attr.data-mode'),
__metadata("design:type", String)
], SwitcherComponent.prototype, "_mode", void 0);
__decorate([
PropertyApi({
description: 'Switcher mode',
path: 'ui.select.mode',
default: SelectMode.single,
options: [SelectMode.single, SelectMode.multiple]
}),
Input(),
__metadata("design:type", String),
__metadata("design:paramtypes", [String])
], SwitcherComponent.prototype, "mode", null);
__decorate([
PropertyApi({
description: 'Add badge with the number of selected items; Select all item in switcher; Allow empty value in switcher; Adapted on mobile; Display marks',
path: 'ui.feature',
default: '[ui.feature.adapted]',
options: [Feature.badge, Feature.selectAll, Feature.allowEmpty, Feature.adapted, Feature.marks]
}),
Input(),
__metadata("design:type", Array),
__metadata("design:paramtypes", [Array])
], SwitcherComponent.prototype, "features", null);
__decorate([
PropertyApi({
description: 'Display skeleton',
type: 'count: number',
}),
Input(),
__metadata("design:type", Object)
], SwitcherComponent.prototype, "capacity", void 0);
__decorate([
PropertyApi({
description: 'Loading',
type: 'boolean',
default: 'false',
}),
Input(),
__metadata("design:type", Object)
], SwitcherComponent.prototype, "loading", void 0);
__decorate([
PropertyApi({
description: 'Input width',
path: 'ui.width',
default: Width.default,
options: [Width.default, Width.fluid]
}),
Input(),
__metadata("design:type", String),
__metadata("design:paramtypes", [String])
], SwitcherComponent.prototype, "width", null);
__decorate([
PropertyApi({
description: 'Selected value',
type: '(selected)='
}),
Output('selected'),
__metadata("design:type", Object)
], SwitcherComponent.prototype, "updated", void 0);
__decorate([
ContentChildren(SwitcherOptionComponent),
__metadata("design:type", QueryList)
], SwitcherComponent.prototype, "options", void 0);
__decorate([
HostListener('blur'),
__metadata("design:type", Object)
], SwitcherComponent.prototype, "onBlur", void 0);
SwitcherComponent = SwitcherComponent_1 = __decorate([
Component({
selector: 'jnt-switcher',
template: "<ng-template #optionDefaultTemplate\n let-icon=\"option.icon\"\n let-dot=\"option.dot\"\n let-badge=\"option.badge\"\n let-label=\"option.label\"\n let-selected=\"selected\">\n <jnt-dot child-of=\"jnt-switcher-host\" *ngIf=\"dot\" [color]=\"dot.color\"></jnt-dot>\n <jnt-icon child-of=\"jnt-switcher-host\" *ngIf=\"icon\" data-icon [icon]=\"icon\"></jnt-icon>\n\n <div child-of=\"jnt-switcher-host\" data-switch *ngIf=\"!!features && features.includes(ui.feature.marks)\"\n [attr.data-single]=\"mode === ui.select.mode.single\">\n <span child-of=\"jnt-switcher-host\" data-indicator *ngIf=\"selected\"></span>\n </div>\n\n <jnt-stack child-of=\"jnt-switcher-host\" *ngIf=\"label || badge\" [orientation]=\"ui.orientation.horizontal\"\n [justify]=\"ui.justify.between\"\n [align]=\"ui.align.center\"\n [gutter]=\"ui.gutter.small\"\n data-title>\n <div child-of=\"jnt-switcher-host\" data-label *ngIf=\"label\">{{label}}</div>\n <jnt-badge child-of=\"jnt-switcher-host\" *ngIf=\"badge\"\n [position]=\"ui.position.inline\"\n [color]=\"badge.color\"\n [text]=\"badge.text\"\n [value]=\"badge.value\"\n [overflow]=\"badge.overflow\">\n </jnt-badge>\n </jnt-stack>\n</ng-template>\n\n<div child-of=\"jnt-switcher-host\" data-switcher>\n <div child-of=\"jnt-switcher-host\" data-scroll [attr.data-windows]=\"device.platform.windows\">\n <jnt-stack child-of=\"jnt-switcher-host\" data-options\n [orientation]=\"breakpoint.current === ui.breakpoint.mobile && (features | includes : ui.feature.adapted) ?\n ui.orientation.vertical : orientation\"\n [gutter]=\"ui.gutter.none\"\n [align]=\"ui.align.stretch\">\n <ng-container *ngIf=\"!loading; else loadingTemplate\">\n <ng-container *ngFor=\"let option of options\">\n <ng-container *ngIf=\"!!option.optionTemplate;else defaultOptionTemplate\">\n <div child-of=\"jnt-switcher-host\" data-option data-custom-option tabindex=\"0\"\n [attr.data-selected]=\"option.value | check:selected:keyField:version\"\n [attr.data-disabled]=\"option.disabled\"\n (click)=\"select(option.value)\">\n <ng-container *ngTemplateOutlet=\"option.optionTemplate; context: {selected: option.value | check:selected:keyField:version }\"></ng-container>\n </div>\n </ng-container>\n <ng-template #defaultOptionTemplate>\n <jnt-stack child-of=\"jnt-switcher-host\" data-option tabindex=\"0\"\n [orientation]=\"ui.orientation.horizontal\"\n [align]=\"ui.align.center\"\n [gutter]=\"ui.gutter.small\"\n [attr.data-selected]=\"option.value | check:selected:keyField:version\"\n [attr.data-disabled]=\"option.disabled\"\n (click)=\"select(option.value)\">\n <ng-container *ngTemplateOutlet=\"optionDefaultTemplate; context: {option: option, mode: mode, selected: option.value | check:selected:keyField:version }\">\n </ng-container>\n </jnt-stack>\n </ng-template>\n </ng-container>\n </ng-container>\n </jnt-stack>\n </div>\n</div>\n\n<jnt-badge child-of=\"jnt-switcher-host\" data-count\n *ngIf=\"!!features && features.includes(ui.feature.badge) && mode === ui.select.mode.multiple && selected.length > 0\"\n [color]=\"ui.color.green\"\n [value]=\"selected.length\"></jnt-badge>\n\n<jnt-button child-of=\"jnt-switcher-host\" data-button\n *ngIf=\"!!features && features.includes(ui.feature.selectAll) && mode === ui.select.mode.multiple\"\n [text]=\"'action.select_all' | translate\"\n [outline]=\"ui.outline.transparent\"\n [size]=\"ui.size.tiny\"\n [scheme]=\"ui.scheme.secondary\"\n (click)=\"selectAll()\"></jnt-button>\n\n<ng-template #loadingTemplate>\n <div child-of=\"jnt-switcher-host\" data-placeholder *ngFor=\"let line of capacity | mockArray\"></div>\n</ng-template>",
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(function () { return SwitcherComponent_1; }),
multi: true
}
]
}),
__metadata("design:paramtypes", [NGXLogger,
BreakpointService,
DeviceService])
], SwitcherComponent);
return SwitcherComponent;
}());
export { SwitcherComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dpdGNoZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGp1bnRlL3VpLyIsInNvdXJjZXMiOlsibGliL2Zvcm1zL3N3aXRjaGVyL3N3aXRjaGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFJLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDeEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDekMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFN0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFhdEU7SUF3SEUsMkJBQW9CLE1BQWlCLEVBQ2xCLFVBQTZCLEVBQzdCLE1BQXFCO1FBRnhDLGlCQUdDO1FBSG1CLFdBQU0sR0FBTixNQUFNLENBQVc7UUFDbEIsZUFBVSxHQUFWLFVB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QixZQUFZLENBQUMsTUFBTSxDQUFDOztxREFBaUM7SUF0SDNDLGlCQUFpQjtRQVg3QixTQUFTLENBQUM7WUFDVCxRQUFRLEVBQUUsY0FBYztZQUN4QixpdElBQTJDO1lBQzNDLFNBQVMsRUFBRTtnQkFDVDtvQkFDRSxPQUFPLEVBQUUsaUJBQWlCO29CQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLGNBQU0sT0FBQSxtQkFBaUIsRUFBakIsQ0FBaUIsQ0FBQztvQkFDaEQsS0FBSyxFQUFFLElBQUk7aUJBQ1o7YUFDRjtTQUNGLENBQUM7eUNBeUg0QixTQUFTO1lBQ04saUJBQWlCO1lBQ3JCLGFBQWE7T0ExSDdCLGlCQUFpQixDQXNMN0I7SUFBRCx3QkFBQztDQUFBLEFBdExELElBc0xDO1NBdExZLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgQ29udGVudENoaWxkcmVuLCBFdmVudEVtaXR0ZXIsIGZvcndhcmRSZWYsIEhvc3RCaW5kaW5nLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPdXRwdXQsIFF1ZXJ5TGlzdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTkdYTG9nZ2VyIH0gZnJvbSAnbmd4LWxvZ2dlcic7XG5pbXBvcnQgeyBEZXZpY2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbGF5b3V0L3Jlc3BvbnNpdmUvZGV2aWNlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUHJvcGVydHlBcGkgfSBmcm9tICcuLi8uLi9jb3JlL2RlY29yYXRvcnMvYXBpJztcbmltcG9ydCB7IEZlYXR1cmUgfSBmcm9tICcuLi8uLi9jb3JlL2VudW1zL2ZlYXR1cmUnO1xuaW1wb3J0IHsgT3JpZW50YXRpb24gfSBmcm9tICcuLi8uLi9jb3JlL2VudW1zL29yaWVudGF0aW9uJztcbmltcG9ydCB7IFVJIH0gZnJvbSAnLi4vLi4vY29yZS9lbnVtcy91aSc7XG5pbXBvcnQgeyBXaWR0aCB9IGZyb20gJy4uLy4uL2NvcmUvZW51bXMvd2lkdGgnO1xuaW1wb3J0IHsgaXNFcXVhbCB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMvZXF1YWwnO1xuaW1wb3J0IHsgQnJlYWtwb2ludFNlcnZpY2UgfSBmcm9tICcuLi8uLi9sYXlvdXQvcmVzcG9uc2l2ZS9icmVha3BvaW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgU2VsZWN0TW9kZSB9IGZyb20gJy4uL3NlbGVjdC9lbnVtcyc7XG5pbXBvcnQgeyBLZXkgfSBmcm9tICcuLi9zZWxlY3QvbW9kZWwnO1xuaW1wb3J0IHsgU3dpdGNoZXJPcHRpb25Db21wb25lbnQgfSBmcm9tICcuL3N3aXRjaGVyLW9wdGlvbi5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdqbnQtc3dpdGNoZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vc3dpdGNoZXIuZW5jYXBzdWxhdGVkLmh0bWwnLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFN3aXRjaGVyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFN3aXRjaGVyQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuXG4gIEBIb3N0QmluZGluZygnYXR0ci5ob3N0JylcbiAgcmVhZG9ubHkgaG9zdCA9ICdqbnQtc3dpdGNoZXItaG9zdCc7XG5cbiAgdWkgPSBVSTtcblxuICBwcml2YXRlIF9mZWF0dXJlczogRmVhdHVyZVtdID0gW107XG4gIHByaXZhdGUgX29yaWVudGF0aW9uOiBPcmllbnRhdGlvbiA9IE9yaWVudGF0aW9uLmhvcml6b250YWw7XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmRhdGEtd2lkdGgnKVxuICBfd2lkdGg6IFdpZHRoID0gV2lkdGguZGVmYXVsdDtcblxuICBAUHJvcGVydHlBcGkoe1xuICAgIGRlc2NyaXB0aW9uOiAnU3dpdGNoZXIgb3JpZW50YXRpb24gJyxcbiAgICBwYXRoOiAndWkub3JpZW50YXRpb24nLFxuICAgIGRlZmF1bHQ6IE9yaWVudGF0aW9uLmhvcml6b250YWwsXG4gICAgb3B0aW9uczogW09yaWVudGF0aW9uLmhvcml6b250YWwsIE9yaWVudGF0aW9uLnZlcnRpY2FsXVxuICB9KVxuICBASG9zdEJpbmRpbmcoJ2F0dHIuZGF0YS1vcmllbnRhdGlvbicpXG4gIEBJbnB1dCgpIHNldCBvcmllbnRhdGlvbih0eXBlOiBPcmllbnRhdGlvbikge1xuICAgIHRoaXMuX29yaWVudGF0aW9uID0gdHlwZSB8fCBPcmllbnRhdGlvbi5ob3Jpem9udGFsO1xuICB9XG5cbiAgZ2V0IG9yaWVudGF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9vcmllbnRhdGlvbjtcbiAgfVxuXG4gIEBQcm9wZXJ0eUFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdTZXQgZGlzYWJsZWQgc3RhdGUnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiAnZmFsc2UnLFxuICB9KVxuICBASG9zdEJpbmRpbmcoJ2F0dHIuZGF0YS1kaXNhYmxlZCcpXG4gIEBJbnB1dCgpXG4gIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgQFByb3BlcnR5QXBpKHtcbiAgICBkZXNjcmlwdGlvbjogJ1NlbGVjdCBrZXkgZmllbGQnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGRlZmF1bHQ6ICdrZXknXG4gIH0pXG4gIEBJbnB1dCgpIGtleUZpZWxkOiBzdHJpbmc7XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmRhdGEtbW9kZScpXG4gIF9tb2RlOiBTZWxlY3RNb2RlID0gU2VsZWN0TW9kZS5zaW5nbGU7XG5cbiAgQFByb3BlcnR5QXBpKHtcbiAgICBkZXNjcmlwdGlvbjogJ1N3aXRjaGVyIG1vZGUnLFxuICAgIHBhdGg6ICd1aS5zZWxlY3QubW9kZScsXG4gICAgZGVmYXVsdDogU2VsZWN0TW9kZS5zaW5nbGUsXG4gICAgb3B0aW9uczogW1NlbGVjdE1vZGUuc2luZ2xlLCBTZWxlY3RNb2RlLm11bHRpcGxlXVxuICB9KVxuICBASW5wdXQoKSBzZXQgbW9kZShtb2RlOiBTZWxlY3RNb2RlKSB7XG4gICAgdGhpcy5fbW9kZSA9IG1vZGUgfHwgU2VsZWN0TW9kZS5zaW5nbGU7XG4gIH1cblxuICBnZXQgbW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbW9kZTtcbiAgfVxuXG4gIEBQcm9wZXJ0eUFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdBZGQgYmFkZ2Ugd2l0aCB0aGUgbnVtYmVyIG9mIHNlbGVjdGVkIGl0ZW1zOyBTZWxlY3QgYWxsIGl0ZW0gaW4gc3dpdGNoZXI7IEFsbG93IGVtcHR5IHZhbHVlIGluIHN3aXRjaGVyOyBBZGFwdGVkIG9uIG1vYmlsZTsgRGlzcGxheSBtYXJrcycsXG4gICAgcGF0aDogJ3VpLmZlYXR1cmUnLFxuICAgIGRlZmF1bHQ6ICdbdWkuZmVhdHVyZS5hZGFwdGVkXScsXG4gICAgb3B0aW9uczogW0ZlYXR1cmUuYmFkZ2UsIEZlYXR1cmUuc2VsZWN0QWxsLCBGZWF0dXJlLmFsbG93RW1wdHksIEZlYXR1cmUuYWRhcHRlZCwgRmVhdHVyZS5tYXJrc11cbiAgfSlcbiAgQElucHV0KClcbiAgc2V0IGZlYXR1cmVzKGZlYXR1cmVzOiBGZWF0dXJlW10pIHtcbiAgICB0aGlzLl9mZWF0dXJlcyA9IGZlYXR1cmVzIHx8IFtdO1xuICB9XG5cbiAgZ2V0IGZlYXR1cmVzKCkge1xuICAgIHJldHVybiB0aGlzLl9mZWF0dXJlcztcbiAgfVxuXG4gIEBQcm9wZXJ0eUFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdEaXNwbGF5IHNrZWxldG9uJyxcbiAgICB0eXBlOiAnY291bnQ6IG51bWJlcicsXG4gIH0pXG4gIEBJbnB1dCgpXG4gIGNhcGFjaXR5ID0gMztcblxuICBAUHJvcGVydHlBcGkoe1xuICAgIGRlc2NyaXB0aW9uOiAnTG9hZGluZycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6ICdmYWxzZScsXG4gIH0pXG4gIEBJbnB1dCgpXG4gIGxvYWRpbmcgPSBmYWxzZTtcblxuICBAUHJvcGVydHlBcGkoe1xuICAgIGRlc2NyaXB0aW9uOiAnSW5wdXQgd2lkdGgnLFxuICAgIHBhdGg6ICd1aS53aWR0aCcsXG4gICAgZGVmYXVsdDogV2lkdGguZGVmYXVsdCxcbiAgICBvcHRpb25zOiBbV2lkdGguZGVmYXVsdCwgV2lkdGguZmx1aWRdXG4gIH0pXG4gIEBJbnB1dCgpIHNldCB3aWR0aCh3aWR0aDogV2lkdGgpIHtcbiAgICB0aGlzLl93aWR0aCA9IHdpZHRoIHx8IFdpZHRoLmRlZmF1bHQ7XG4gIH1cblxuICBAUHJvcGVydHlBcGkoe1xuICAgIGRlc2NyaXB0aW9uOiAnU2VsZWN0ZWQgdmFsdWUnLFxuICAgIHR5cGU6ICcoc2VsZWN0ZWQpPSdcbiAgfSlcbiAgQE91dHB1dCgnc2VsZWN0ZWQnKVxuICB1cGRhdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihTd2l0Y2hlck9wdGlvbkNvbXBvbmVudClcbiAgb3B0aW9uczogUXVlcnlMaXN0PFN3aXRjaGVyT3B0aW9uQ29tcG9uZW50PjtcblxuICBzZWxlY3RlZDogYW55W10gPSBbXTtcbiAgdmVyc2lvbiA9IDA7XG5cbiAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB2b2lkID0gKCkgPT4gdGhpcy5sb2dnZXIuZXJyb3IoJ3ZhbHVlIGFjY2Vzc29yIGlzIG5vdCByZWdpc3RlcmVkJyk7XG4gIG9uVG91Y2hlZDogKCkgPT4gdm9pZCA9ICgpID0+IHRoaXMubG9nZ2VyLmVycm9yKCd2YWx1ZSBhY2Nlc3NvciBpcyBub3QgcmVnaXN0ZXJlZCcpO1xuICByZWdpc3Rlck9uQ2hhbmdlID0gZm4gPT4gdGhpcy5vbkNoYW5nZSA9IGZuO1xuICByZWdpc3Rlck9uVG91Y2hlZCA9IGZuID0+IHRoaXMub25Ub3VjaGVkID0gZm47XG4gIEBIb3N0TGlzdGVuZXIoJ2JsdXInKSBvbkJsdXIgPSAoKSA9PiB0aGlzLm9uVG91Y2hlZCgpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbG9nZ2VyOiBOR1hMb2dnZXIsXG4gICAgICAgICAgICAgIHB1YmxpYyBicmVha3BvaW50OiBCcmVha3BvaW50U2VydmljZSxcbiAgICAgICAgICAgICAgcHVibGljIGRldmljZTogRGV2aWNlU2VydmljZSkge1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55IHwgYW55W10pIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSBTZWxlY3RNb2RlLm11bHRpcGxlICYmICF2YWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdXcm9uZyB2YWx1ZSBmb3JtIG11bHRpcGxlIHNlbGVjdCBtb2RlJyk7XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RlZCA9ICh0aGlzLm1vZGUgPT09IFNlbGVjdE1vZGUuc2luZ2xlID8gKCEhdmFsdWUgPyBbdmFsdWVdIDogW10pIDogdmFsdWUpIGFzIEtleVtdO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShkaXNhYmxlZDogYm9vbGVhbikge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgfVxuXG4gIHNlbGVjdCh2YWx1ZTogYW55KSB7XG4gICAgc3dpdGNoICh0aGlzLm1vZGUpIHtcbiAgICAgIGNhc2UgU2VsZWN0TW9kZS5zaW5nbGU6XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnNlbGVjdGVkLmxlbmd0aCA+IDAgPyB0aGlzLnNlbGVjdGVkWzBdIDogbnVsbDtcbiAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBzYW1lID0gISF0aGlzLmtleUZpZWxkXG4gICAgICAgICAgICA/IGN1cnJlbnRbdGhpcy5rZXlGaWVsZF0gPT09IHZhbHVlW3RoaXMua2V5RmllbGRdXG4gICAgICAgICAgICA6IGlzRXF1YWwoY3VycmVudCwgdmFsdWUpO1xuICAgICAgICAgIGlmIChzYW1lICYmICF0aGlzLmZlYXR1cmVzLmluY2x1ZGVzKEZlYXR1cmUuYWxsb3dFbXB0eSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnNlbGVjdGVkID0gc2FtZSB8fCB2YWx1ZSA9PT0gbnVsbCA/IFtdIDogW3ZhbHVlXTtcbiAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHNhbWUgPyBudWxsIDogdmFsdWUpO1xuICAgICAgICAgIHRoaXMudXBkYXRlZC5lbWl0KHNhbWUgPyBudWxsIDogdmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSB2YWx1ZSA9PT0gbnVsbCA/IFtdIDogW3ZhbHVlXTtcbiAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZWQuZW1pdCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnZlcnNpb24rKztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFNlbGVjdE1vZGUubXVsdGlwbGU6XG4gICAgICAgIGNvbnN0IGluZGV4ID0gISF0aGlzLmtleUZpZWxkXG4gICAgICAgICAgPyB0aGlzLnNlbGVjdGVkLmluZGV4T2YodmFsdWVbdGhpcy5rZXlGaWVsZF0pXG4gICAgICAgICAgOiB0aGlzLnNlbGVjdGVkLmZpbmRJbmRleChlID0+IGlzRXF1YWwoZSwgdmFsdWUpKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkLnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmVyc2lvbisrO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuc2VsZWN0ZWQpO1xuICAgICAgICB0aGlzLnVwZGF0ZWQuZW1pdCh0aGlzLnNlbGVjdGVkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgc2VsZWN0QWxsKCkge1xuICAgIHRoaXMub3B0aW9ucy5mb3JFYWNoKG8gPT4gdGhpcy5zZWxlY3RlZC5wdXNoKG8udmFsdWUpKTtcbiAgICB0aGlzLnZlcnNpb24rKztcbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuc2VsZWN0ZWQpO1xuICAgIHRoaXMudXBkYXRlZC5lbWl0KHRoaXMuc2VsZWN0ZWQpO1xuICB9XG59XG4iXX0=