@junte/ui
Version:
Quality Angular UI components kit
211 lines • 22.1 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { animate, state, style, transition, trigger } from '@angular/animations';
import { Component, ContentChild, ContentChildren, EventEmitter, HostBinding, HostListener, Input, Output, QueryList, TemplateRef } from '@angular/core';
import { FormArray, FormGroup } from '@angular/forms';
import { NGXLogger } from 'ngx-logger';
import { MethodApi, PropertyApi } from '../../core/decorators/api';
import { Height } from '../../core/enums/height';
import { State } from '../../core/enums/state';
import { UI } from '../../core/enums/ui';
import { FormControlComponent } from './control/form-control.component';
var FormComponent = /** @class */ (function () {
function FormComponent(logger) {
this.logger = logger;
this.host = 'jnt-form-host';
this.ui = UI;
this._state = { success: false };
this._height = Height.default;
this.submitted = new EventEmitter();
this.checked = new EventEmitter();
}
Object.defineProperty(FormComponent.prototype, "height", {
set: function (height) {
this._height = height || Height.default;
},
enumerable: true,
configurable: true
});
FormComponent.prototype.success = function () {
var _this = this;
this._state.success = true;
setTimeout(function () { return _this._state.success = false; }, 2100);
};
FormComponent.prototype.ngOnInit = function () {
var _this = this;
if (!!this.form) {
this.form.statusChanges.subscribe(function () {
_this.render();
_this.checked.emit(_this.check(_this.form));
});
}
};
FormComponent.prototype.render = function () {
this.logger.debug('render form');
if (!!this.controls) {
this.controls.filter(function (component) { return !!component.name && !!component.messages.length; })
.forEach(function (component) { return component.check(); });
}
};
FormComponent.prototype.check = function (form) {
this.logger.debug('check form');
var errors = [];
for (var key in form.controls) {
var control = form.controls[key];
if (control instanceof FormGroup || control instanceof FormArray) {
errors = errors.concat(this.check(control));
}
else {
if (!!control.errors && control.dirty) {
errors.push(control);
}
}
}
this.logger.debug('controls have errors = ', errors.map(function (e) { return e.name; }));
return errors;
};
/**
* @deprecated please use submit() instead
*/
FormComponent.prototype.onSubmit = function () {
this.submit();
};
FormComponent.prototype.submit = function () {
this.logger.debug('submit form');
if (!!this.form) {
this.validate(this.form);
if (this.form.valid) {
this.submitted.emit();
this.refresh(this.form);
}
}
};
FormComponent.prototype.validate = function (form) {
this.logger.debug('validate form');
for (var key in form.controls) {
var control = form.controls[key];
if (control instanceof FormGroup || control instanceof FormArray) {
this.validate(control);
}
else {
control.markAsDirty();
control.updateValueAndValidity({ emitEvent: false });
}
}
this.render();
this.checked.emit(this.check(this.form));
};
FormComponent.prototype.refresh = function (form) {
this.logger.debug('refresh form');
for (var key in form.controls) {
var control = form.controls[key];
if (control instanceof FormGroup || control instanceof FormArray) {
this.refresh(control);
}
else {
control.markAsPristine();
}
}
};
FormComponent.ctorParameters = function () { return [
{ type: NGXLogger }
]; };
__decorate([
HostBinding('attr.host'),
__metadata("design:type", Object)
], FormComponent.prototype, "host", void 0);
__decorate([
HostBinding('attr.data-height'),
__metadata("design:type", String)
], FormComponent.prototype, "_height", void 0);
__decorate([
PropertyApi({
description: 'Name form group',
type: 'FormGroup',
}),
Input('formGroup'),
__metadata("design:type", FormGroup)
], FormComponent.prototype, "form", void 0);
__decorate([
PropertyApi({
description: 'Title for form',
type: 'string',
}),
Input(),
__metadata("design:type", String)
], FormComponent.prototype, "title", void 0);
__decorate([
PropertyApi({
description: 'State of form',
path: 'ui.state',
options: [State.error, State.loading]
}),
Input(),
__metadata("design:type", String)
], FormComponent.prototype, "state", void 0);
__decorate([
PropertyApi({
description: 'Height of form',
path: 'ui.height',
options: [Height.default, Height.fluid],
default: Height.default
}),
Input(),
__metadata("design:type", String),
__metadata("design:paramtypes", [String])
], FormComponent.prototype, "height", null);
__decorate([
ContentChild('formTitleTemplate'),
__metadata("design:type", TemplateRef)
], FormComponent.prototype, "titleTemplate", void 0);
__decorate([
ContentChild('formFooterTemplate'),
__metadata("design:type", TemplateRef)
], FormComponent.prototype, "footerTemplate", void 0);
__decorate([
ContentChildren(FormControlComponent, { descendants: true }),
__metadata("design:type", QueryList)
], FormComponent.prototype, "controls", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], FormComponent.prototype, "submitted", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], FormComponent.prototype, "checked", void 0);
__decorate([
MethodApi({ description: 'show success animation' }),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], FormComponent.prototype, "success", null);
__decorate([
HostListener('submit'),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], FormComponent.prototype, "submit", null);
FormComponent = __decorate([
Component({
selector: 'jnt-form',
template: "<form child-of=\"jnt-form-host\" >\n <header child-of=\"jnt-form-host\" *ngIf=\"!!title || !!titleTemplate\">\n <h3 child-of=\"jnt-form-host\" *ngIf=\"!!title && !titleTemplate\">{{title}}</h3>\n <ng-container *ngIf=\"!!titleTemplate\">\n <ng-container *ngTemplateOutlet=\"titleTemplate\"></ng-container>\n </ng-container>\n </header>\n\n <div child-of=\"jnt-form-host\" data-content>\n <ng-content></ng-content>\n </div>\n\n <footer child-of=\"jnt-form-host\" *ngIf=\"!!footerTemplate\">\n <ng-container *ngTemplateOutlet=\"footerTemplate\"></ng-container>\n </footer>\n\n <div child-of=\"jnt-form-host\" data-loading *ngIf=\"state === ui.state.loading\">\n <jnt-spinner child-of=\"jnt-form-host\" [size]=\"ui.size.large\"></jnt-spinner>\n </div>\n <div child-of=\"jnt-form-host\" data-error *ngIf=\"state === ui.state.error\">\n <jnt-icon child-of=\"jnt-form-host\" [icon]=\"ui.icons.sad\"></jnt-icon>\n </div>\n <div child-of=\"jnt-form-host\" data-success *ngIf=\"_state.success\" [@success]=\"_state.success\">\n <jnt-icon child-of=\"jnt-form-host\" [icon]=\"ui.icons.animated.success\"></jnt-icon>\n </div>\n</form>",
animations: [
trigger('success', [
state('void', style({
opacity: 0
})),
state('*', style({
opacity: 1
})),
transition('void <=> *', [
animate('.3s ease-in-out')
]),
]),
]
}),
__metadata("design:paramtypes", [NGXLogger])
], FormComponent);
return FormComponent;
}());
export { FormComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AanVudGUvdWkvIiwic291cmNlcyI6WyJsaWIvZm9ybXMvZm9ybS9mb3JtLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRixPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBQ2YsWUFBWSxFQUNaLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixTQUFTLEVBQ1QsV0FBVyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBbUIsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDdkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQTZCeEU7SUFpRUUsdUJBQW9CLE1BQWlCO1FBQWpCLFdBQU0sR0FBTixNQUFNLENBQVc7UUE5RDVCLFNBQUksR0FBRyxlQUFlLENBQUM7UUFFaEMsT0FBRSxHQUFHLEVBQUUsQ0FBQztRQUVSLFdBQU0sR0FBRyxFQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUMsQ0FBQztRQUcxQixZQUFPLEdBQVcsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQTRDakMsY0FBUyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFHL0IsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFxQixDQUFDO0lBU2hELENBQUM7SUExQlEsc0JBQUksaUNBQU07YUFBVixVQUFXLE1BQWM7WUFDaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUMxQyxDQUFDOzs7T0FBQTtJQWtCRCwrQkFBTyxHQUFQO1FBREEsaUJBSUM7UUFGQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDM0IsVUFBVSxDQUFDLGNBQU0sT0FBQSxLQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxLQUFLLEVBQTNCLENBQTJCLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUtELGdDQUFRLEdBQVI7UUFBQSxpQkFPQztRQU5DLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUM7Z0JBQ2hDLEtBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDZCxLQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFJLENBQUMsS0FBSyxDQUFDLEtBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzNDLENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRUQsOEJBQU0sR0FBTjtRQUNFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBQSxTQUFTLElBQUksT0FBQSxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQS9DLENBQStDLENBQUM7aUJBQy9FLE9BQU8sQ0FBQyxVQUFBLFNBQVMsSUFBSSxPQUFBLFNBQVMsQ0FBQyxLQUFLLEVBQUUsRUFBakIsQ0FBaUIsQ0FBQyxDQUFDO1NBQzVDO0lBQ0gsQ0FBQztJQUVPLDZCQUFLLEdBQWIsVUFBYyxJQUEyQjtRQUN2QyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNoQyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEIsS0FBSyxJQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQy9CLElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFbkMsSUFBSSxPQUFPLFlBQVksU0FBUyxJQUFJLE9BQU8sWUFBWSxTQUFTLEVBQUU7Z0JBQ2hFLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQzthQUM3QztpQkFBTTtnQkFDTCxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUU7b0JBQ3JDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQ3RCO2FBQ0Y7U0FDRjtRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHlCQUF5QixFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsSUFBSSxFQUFOLENBQU0sQ0FBQyxDQUFDLENBQUM7UUFDdEUsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZ0NBQVEsR0FBUjtRQUNFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNoQixDQUFDO0lBR0QsOEJBQU0sR0FBTjtRQUNFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDZixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUV6QixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUNuQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN0QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN6QjtTQUNGO0lBQ0gsQ0FBQztJQUVPLGdDQUFRLEdBQWhCLFVBQWlCLElBQTJCO1FBQzFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ25DLEtBQUssSUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUMvQixJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRW5DLElBQUksT0FBTyxZQUFZLFNBQVMsSUFBSSxPQUFPLFlBQVksU0FBUyxFQUFFO2dCQUNoRSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ3hCO2lCQUFNO2dCQUNMLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDdEIsT0FBTyxDQUFDLHNCQUFzQixDQUFDLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUM7YUFDcEQ7U0FDRjtRQUVELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVPLCtCQUFPLEdBQWYsVUFBZ0IsSUFBMkI7UUFDekMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDbEMsS0FBSyxJQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQy9CLElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFbkMsSUFBSSxPQUFPLFlBQVksU0FBUyxJQUFJLE9BQU8sWUFBWSxTQUFTLEVBQUU7Z0JBQ2hFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDdkI7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDO2FBQzFCO1NBQ0Y7SUFDSCxDQUFDOztnQkF0RjJCLFNBQVM7O0lBOURyQztRQURDLFdBQVcsQ0FBQyxXQUFXLENBQUM7OytDQUNPO0lBT2hDO1FBREMsV0FBVyxDQUFDLGtCQUFrQixDQUFDOztrREFDQztJQU9qQztRQUxDLFdBQVcsQ0FBQztZQUNYLFdBQVcsRUFBRSxpQkFBaUI7WUFDOUIsSUFBSSxFQUFFLFdBQVc7U0FDbEIsQ0FBQztRQUNELEtBQUssQ0FBQyxXQUFXLENBQUM7a0NBQ2IsU0FBUzsrQ0FBQztJQU9oQjtRQUxDLFdBQVcsQ0FBQztZQUNYLFdBQVcsRUFBRSxnQkFBZ0I7WUFDN0IsSUFBSSxFQUFFLFFBQVE7U0FDZixDQUFDO1FBQ0QsS0FBSyxFQUFFOztnREFDTTtJQVFkO1FBTkMsV0FBVyxDQUFDO1lBQ1gsV0FBVyxFQUFFLGVBQWU7WUFDNUIsSUFBSSxFQUFFLFVBQVU7WUFDaEIsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDO1NBQ3RDLENBQUM7UUFDRCxLQUFLLEVBQUU7O2dEQUNLO0lBUUo7UUFOUixXQUFXLENBQUM7WUFDWCxXQUFXLEVBQUUsZ0JBQWdCO1lBQzdCLElBQUksRUFBRSxXQUFXO1lBQ2pCLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUN2QyxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87U0FDeEIsQ0FBQztRQUNELEtBQUssRUFBRTs7OytDQUVQO0lBR0Q7UUFEQyxZQUFZLENBQUMsbUJBQW1CLENBQUM7a0NBQ25CLFdBQVc7d0RBQU07SUFHaEM7UUFEQyxZQUFZLENBQUMsb0JBQW9CLENBQUM7a0NBQ25CLFdBQVc7eURBQU07SUFHakM7UUFEQyxlQUFlLENBQUMsb0JBQW9CLEVBQUUsRUFBQyxXQUFXLEVBQUUsSUFBSSxFQUFDLENBQUM7a0NBQ2pELFNBQVM7bURBQXVCO0lBRzFDO1FBREMsTUFBTSxFQUFFOztvREFDc0I7SUFHL0I7UUFEQyxNQUFNLEVBQUU7O2tEQUN1QztJQUdoRDtRQURDLFNBQVMsQ0FBQyxFQUFDLFdBQVcsRUFBRSx3QkFBd0IsRUFBQyxDQUFDOzs7O2dEQUlsRDtJQWdERDtRQURDLFlBQVksQ0FBQyxRQUFRLENBQUM7Ozs7K0NBV3RCO0lBekhVLGFBQWE7UUEzQnpCLFNBQVMsQ0FBQztZQUNULFFBQVEsRUFBRSxVQUFVO1lBQ3BCLHNwQ0FBdUM7WUFDdkMsVUFBVSxFQUFFO2dCQUNWLE9BQU8sQ0FBQyxTQUFTLEVBQUU7b0JBQ2YsS0FBSyxDQUNILE1BQU0sRUFDTixLQUFLLENBQUM7d0JBQ0osT0FBTyxFQUFFLENBQUM7cUJBQ1gsQ0FBQyxDQUNIO29CQUNELEtBQUssQ0FDSCxHQUFHLEVBQ0gsS0FBSyxDQUFDO3dCQUNKLE9BQU8sRUFBRSxDQUFDO3FCQUNYLENBQUMsQ0FDSDtvQkFDRCxVQUFVLENBQ1IsWUFBWSxFQUNaO3dCQUNFLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztxQkFDM0IsQ0FDRjtpQkFDRixDQUNGO2FBQ0Y7U0FDRixDQUFDO3lDQWtFNEIsU0FBUztPQWpFMUIsYUFBYSxDQXdKekI7SUFBRCxvQkFBQztDQUFBLEFBeEpELElBd0pDO1NBeEpZLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhbmltYXRlLCBzdGF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmcsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFRlbXBsYXRlUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQXJyYXksIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE5HWExvZ2dlciB9IGZyb20gJ25neC1sb2dnZXInO1xuaW1wb3J0IHsgTWV0aG9kQXBpLCBQcm9wZXJ0eUFwaSB9IGZyb20gJy4uLy4uL2NvcmUvZGVjb3JhdG9ycy9hcGknO1xuaW1wb3J0IHsgSGVpZ2h0IH0gZnJvbSAnLi4vLi4vY29yZS9lbnVtcy9oZWlnaHQnO1xuaW1wb3J0IHsgU3RhdGUgfSBmcm9tICcuLi8uLi9jb3JlL2VudW1zL3N0YXRlJztcbmltcG9ydCB7IFVJIH0gZnJvbSAnLi4vLi4vY29yZS9lbnVtcy91aSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbENvbXBvbmVudCB9IGZyb20gJy4vY29udHJvbC9mb3JtLWNvbnRyb2wuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnam50LWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybS5lbmNhcHN1bGF0ZWQuaHRtbCcsXG4gIGFuaW1hdGlvbnM6IFtcbiAgICB0cmlnZ2VyKCdzdWNjZXNzJywgW1xuICAgICAgICBzdGF0ZShcbiAgICAgICAgICAndm9pZCcsXG4gICAgICAgICAgc3R5bGUoe1xuICAgICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICAgIH0pXG4gICAgICAgICksXG4gICAgICAgIHN0YXRlKFxuICAgICAgICAgICcqJyxcbiAgICAgICAgICBzdHlsZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiAxXG4gICAgICAgICAgfSlcbiAgICAgICAgKSxcbiAgICAgICAgdHJhbnNpdGlvbihcbiAgICAgICAgICAndm9pZCA8PT4gKicsXG4gICAgICAgICAgW1xuICAgICAgICAgICAgYW5pbWF0ZSgnLjNzIGVhc2UtaW4tb3V0JylcbiAgICAgICAgICBdXG4gICAgICAgICksXG4gICAgICBdXG4gICAgKSxcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBASG9zdEJpbmRpbmcoJ2F0dHIuaG9zdCcpXG4gIHJlYWRvbmx5IGhvc3QgPSAnam50LWZvcm0taG9zdCc7XG5cbiAgdWkgPSBVSTtcblxuICBfc3RhdGUgPSB7c3VjY2VzczogZmFsc2V9O1xuXG4gIEBIb3N0QmluZGluZygnYXR0ci5kYXRhLWhlaWdodCcpXG4gIF9oZWlnaHQ6IEhlaWdodCA9IEhlaWdodC5kZWZhdWx0O1xuXG4gIEBQcm9wZXJ0eUFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdOYW1lIGZvcm0gZ3JvdXAnLFxuICAgIHR5cGU6ICdGb3JtR3JvdXAnLFxuICB9KVxuICBASW5wdXQoJ2Zvcm1Hcm91cCcpXG4gIGZvcm06IEZvcm1Hcm91cDtcblxuICBAUHJvcGVydHlBcGkoe1xuICAgIGRlc2NyaXB0aW9uOiAnVGl0bGUgZm9yIGZvcm0nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9KVxuICBASW5wdXQoKVxuICB0aXRsZTogc3RyaW5nO1xuXG4gIEBQcm9wZXJ0eUFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdTdGF0ZSBvZiBmb3JtJyxcbiAgICBwYXRoOiAndWkuc3RhdGUnLFxuICAgIG9wdGlvbnM6IFtTdGF0ZS5lcnJvciwgU3RhdGUubG9hZGluZ11cbiAgfSlcbiAgQElucHV0KClcbiAgc3RhdGU6IFN0YXRlO1xuXG4gIEBQcm9wZXJ0eUFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdIZWlnaHQgb2YgZm9ybScsXG4gICAgcGF0aDogJ3VpLmhlaWdodCcsXG4gICAgb3B0aW9uczogW0hlaWdodC5kZWZhdWx0LCBIZWlnaHQuZmx1aWRdLFxuICAgIGRlZmF1bHQ6IEhlaWdodC5kZWZhdWx0XG4gIH0pXG4gIEBJbnB1dCgpIHNldCBoZWlnaHQoaGVpZ2h0OiBIZWlnaHQpIHtcbiAgICB0aGlzLl9oZWlnaHQgPSBoZWlnaHQgfHwgSGVpZ2h0LmRlZmF1bHQ7XG4gIH1cblxuICBAQ29udGVudENoaWxkKCdmb3JtVGl0bGVUZW1wbGF0ZScpXG4gIHRpdGxlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQENvbnRlbnRDaGlsZCgnZm9ybUZvb3RlclRlbXBsYXRlJylcbiAgZm9vdGVyVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQENvbnRlbnRDaGlsZHJlbihGb3JtQ29udHJvbENvbXBvbmVudCwge2Rlc2NlbmRhbnRzOiB0cnVlfSlcbiAgY29udHJvbHM6IFF1ZXJ5TGlzdDxGb3JtQ29udHJvbENvbXBvbmVudD47XG5cbiAgQE91dHB1dCgpXG4gIHN1Ym1pdHRlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KClcbiAgY2hlY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8QWJzdHJhY3RDb250cm9sW10+KCk7XG5cbiAgQE1ldGhvZEFwaSh7ZGVzY3JpcHRpb246ICdzaG93IHN1Y2Nlc3MgYW5pbWF0aW9uJ30pXG4gIHN1Y2Nlc3MoKSB7XG4gICAgdGhpcy5fc3RhdGUuc3VjY2VzcyA9IHRydWU7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLl9zdGF0ZS5zdWNjZXNzID0gZmFsc2UsIDIxMDApO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBsb2dnZXI6IE5HWExvZ2dlcikge1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKCEhdGhpcy5mb3JtKSB7XG4gICAgICB0aGlzLmZvcm0uc3RhdHVzQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICB0aGlzLmNoZWNrZWQuZW1pdCh0aGlzLmNoZWNrKHRoaXMuZm9ybSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdyZW5kZXIgZm9ybScpO1xuICAgIGlmICghIXRoaXMuY29udHJvbHMpIHtcbiAgICAgIHRoaXMuY29udHJvbHMuZmlsdGVyKGNvbXBvbmVudCA9PiAhIWNvbXBvbmVudC5uYW1lICYmICEhY29tcG9uZW50Lm1lc3NhZ2VzLmxlbmd0aClcbiAgICAgICAgLmZvckVhY2goY29tcG9uZW50ID0+IGNvbXBvbmVudC5jaGVjaygpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNoZWNrKGZvcm06IEZvcm1Hcm91cCB8IEZvcm1BcnJheSk6IEFic3RyYWN0Q29udHJvbFtdIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnY2hlY2sgZm9ybScpO1xuICAgIGxldCBlcnJvcnMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBmb3JtLmNvbnRyb2xzKSB7XG4gICAgICBjb25zdCBjb250cm9sID0gZm9ybS5jb250cm9sc1trZXldO1xuXG4gICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCB8fCBjb250cm9sIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodGhpcy5jaGVjayhjb250cm9sKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoISFjb250cm9sLmVycm9ycyAmJiBjb250cm9sLmRpcnR5KSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goY29udHJvbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ2NvbnRyb2xzIGhhdmUgZXJyb3JzID0gJywgZXJyb3JzLm1hcChlID0+IGUubmFtZSkpO1xuICAgIHJldHVybiBlcnJvcnM7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgcGxlYXNlIHVzZSBzdWJtaXQoKSBpbnN0ZWFkXG4gICAqL1xuICBvblN1Ym1pdCgpIHtcbiAgICB0aGlzLnN1Ym1pdCgpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignc3VibWl0JylcbiAgc3VibWl0KCkge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdzdWJtaXQgZm9ybScpO1xuICAgIGlmICghIXRoaXMuZm9ybSkge1xuICAgICAgdGhpcy52YWxpZGF0ZSh0aGlzLmZvcm0pO1xuXG4gICAgICBpZiAodGhpcy5mb3JtLnZhbGlkKSB7XG4gICAgICAgIHRoaXMuc3VibWl0dGVkLmVtaXQoKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoKHRoaXMuZm9ybSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZShmb3JtOiBGb3JtR3JvdXAgfCBGb3JtQXJyYXkpIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygndmFsaWRhdGUgZm9ybScpO1xuICAgIGZvciAoY29uc3Qga2V5IGluIGZvcm0uY29udHJvbHMpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtLmNvbnRyb2xzW2tleV07XG5cbiAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUdyb3VwIHx8IGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZShjb250cm9sKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRyb2wubWFya0FzRGlydHkoKTtcbiAgICAgICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgICB0aGlzLmNoZWNrZWQuZW1pdCh0aGlzLmNoZWNrKHRoaXMuZm9ybSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoKGZvcm06IEZvcm1Hcm91cCB8IEZvcm1BcnJheSkge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdyZWZyZXNoIGZvcm0nKTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBmb3JtLmNvbnRyb2xzKSB7XG4gICAgICBjb25zdCBjb250cm9sID0gZm9ybS5jb250cm9sc1trZXldO1xuXG4gICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCB8fCBjb250cm9sIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgICAgIHRoaXMucmVmcmVzaChjb250cm9sKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRyb2wubWFya0FzUHJpc3RpbmUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==