angular-admin-lte-teliqo
Version:
npm# angular-admin-lte
394 lines (393 loc) • 34.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { ChangeDetectorRef, Component, ContentChild, ContentChildren, EventEmitter, Input, NgZone, Output, QueryList, Renderer2, TemplateRef, ViewChild, ViewChildren } from '@angular/core';
import { AccordionToggleDirective } from './accordion.directive';
import { removeListeners, removeSubscriptions } from '../helpers';
export class AccordionHeaderComponent {
}
AccordionHeaderComponent.decorators = [
{ type: Component, args: [{
selector: 'mk-accordion-header',
template: '<ng-template #templateRef><ng-content></ng-content></ng-template>'
},] },
];
/** @nocollapse */
AccordionHeaderComponent.propDecorators = {
"templateRef": [{ type: ViewChild, args: ['templateRef',] },],
};
function AccordionHeaderComponent_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
AccordionHeaderComponent.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
AccordionHeaderComponent.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
AccordionHeaderComponent.propDecorators;
/** @type {?} */
AccordionHeaderComponent.prototype.templateRef;
}
export class AccordionContentComponent {
}
AccordionContentComponent.decorators = [
{ type: Component, args: [{
selector: 'mk-accordion-content',
template: '<ng-template #templateRef><ng-content></ng-content></ng-template>'
},] },
];
/** @nocollapse */
AccordionContentComponent.propDecorators = {
"templateRef": [{ type: ViewChild, args: ['templateRef',] },],
};
function AccordionContentComponent_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
AccordionContentComponent.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
AccordionContentComponent.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
AccordionContentComponent.propDecorators;
/** @type {?} */
AccordionContentComponent.prototype.templateRef;
}
export class AccordionComponent {
constructor() {
this.contentStyleClass = 'box-body';
this.headerStyleClass = 'box-header with-border';
}
/**
* \@method ngOnInit
* @return {?}
*/
ngOnInit() {
this.headerStyleColor = this.headerColor;
if (!this.header && !this.accordionHeaderComponent) {
throw new Error('Attribute "header" OR Component "mk-+accordion-header" is required for component "mk-+accordion"');
}
if (this.accordionContentComponent) {
this.contentTemplateRef = this.accordionContentComponent.templateRef;
}
else {
this.contentTemplateRef = this.templateRef;
}
}
}
AccordionComponent.decorators = [
{ type: Component, args: [{
selector: 'mk-accordion',
template: '<ng-template #templateRef><ng-content></ng-content></ng-template>'
},] },
];
/** @nocollapse */
AccordionComponent.propDecorators = {
"borderColor": [{ type: Input },],
"contentColor": [{ type: Input },],
"contentStyleClass": [{ type: Input },],
"header": [{ type: Input },],
"headerColor": [{ type: Input },],
"headerColorHover": [{ type: Input },],
"headerStyleClass": [{ type: Input },],
"accordionHeaderComponent": [{ type: ContentChild, args: [AccordionHeaderComponent,] },],
"accordionContentComponent": [{ type: ContentChild, args: [AccordionContentComponent,] },],
"templateRef": [{ type: ViewChild, args: ['templateRef',] },],
};
function AccordionComponent_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
AccordionComponent.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
AccordionComponent.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
AccordionComponent.propDecorators;
/** @type {?} */
AccordionComponent.prototype.contentTemplateRef;
/** @type {?} */
AccordionComponent.prototype.headerStyleColor;
/** @type {?} */
AccordionComponent.prototype.isCollapsing;
/** @type {?} */
AccordionComponent.prototype.isCollapsed;
/** @type {?} */
AccordionComponent.prototype.index;
/** @type {?} */
AccordionComponent.prototype.borderColor;
/** @type {?} */
AccordionComponent.prototype.contentColor;
/** @type {?} */
AccordionComponent.prototype.contentStyleClass;
/** @type {?} */
AccordionComponent.prototype.header;
/** @type {?} */
AccordionComponent.prototype.headerColor;
/** @type {?} */
AccordionComponent.prototype.headerColorHover;
/** @type {?} */
AccordionComponent.prototype.headerStyleClass;
/** @type {?} */
AccordionComponent.prototype.accordionHeaderComponent;
/** @type {?} */
AccordionComponent.prototype.accordionContentComponent;
/** @type {?} */
AccordionComponent.prototype.templateRef;
}
export class AccordionGroupComponent {
/**
* \@method constructor
* @param {?} changeDetectorRef [description]
* @param {?} ngZone [description]
* @param {?} renderer2 [description]
*/
constructor(changeDetectorRef, ngZone, renderer2) {
this.changeDetectorRef = changeDetectorRef;
this.ngZone = ngZone;
this.renderer2 = renderer2;
this.activeIndex = [0];
this.listeners = [];
this.subscriptions = [];
this.styleClass = 'box-group';
this.onCollapseStart = new EventEmitter();
this.onCollapseDone = new EventEmitter();
}
/**
* @param {?} value
* @return {?}
*/
set _activeIndex(value) {
this.activeIndex = value instanceof Array ? value : [value];
}
/**
* [headerMouseLeave description]
* \@method headerMouseLeave
* @param {?} accordion [description]
* @return {?}
*/
static headerMouseLeave(accordion) {
accordion.headerStyleColor = accordion.headerColor;
}
/**
* [headerMouseEnter description]
* \@method headerMouseEnter
* @param {?} accordion [description]
* @return {?}
*/
static headerMouseEnter(accordion) {
if (accordion.headerColorHover) {
accordion.headerStyleColor = accordion.headerColorHover;
}
}
/**
* \@method ngAfterViewInit
* @return {?}
*/
ngAfterContentInit() {
this.setAccordionsIndex();
this.updateAccordionIsCollapsed();
this.subscriptions.push(this.accordionComponents.changes.subscribe(() => {
this.setAccordionsIndex();
}));
}
/**
* \@method ngAfterViewInit
* @return {?}
*/
ngAfterViewInit() {
this.setAccordionsToggle();
this.subscriptions.push(this.accordionToggleDirectives.changes.subscribe(() => {
this.setAccordionsToggle();
}));
}
/**
* [ngOnChanges description]
* \@method ngOnChanges
* @param {?} changes [description]
* @return {?} [description]
*/
ngOnChanges(changes) {
if (changes["_activeIndex"].firstChange === false) {
this.updateAccordionIsCollapsed();
}
}
/**
* \@method ngOnDestroy
* @return {?}
*/
ngOnDestroy() {
removeListeners(this.listeners);
removeSubscriptions(this.subscriptions);
}
/**
* [toggleAccordion description]
* \@method toggleAccordion
* @param {?} event [description]
* @param {?} toggleIndex [description]
* @return {?}
*/
toggleAccordion(event, toggleIndex) {
event.preventDefault();
const /** @type {?} */ indexOf = this.activeIndex['indexOf'](toggleIndex);
if (indexOf === -1) {
if (this.isMultiple) {
this.activeIndex.push(toggleIndex);
}
else {
this.activeIndex = [toggleIndex];
}
}
else {
if (this.isMultiple) {
this.activeIndex.splice(indexOf, 1);
}
else {
this.activeIndex = [];
}
}
this.updateAccordionIsCollapsed();
}
/**
* [collapseStart description]
* \@method collapseStart
* @param {?} event [description]
* @param {?} accordion [description]
* @return {?}
*/
collapseStart(event, accordion) {
accordion.isCollapsing = true;
this.onCollapseStart.emit({ animationEvent: event, index: accordion.index });
}
/**
* [collapseDone description]
* \@method collapseDone
* @param {?} event [description]
* @param {?} accordion [description]
* @return {?}
*/
collapseDone(event, accordion) {
accordion.isCollapsing = false;
this.onCollapseDone.emit({ animationEvent: event, index: accordion.index });
}
/**
* [setAccordionsIndex description]
* \@method setAccordionsIndex
* @return {?}
*/
setAccordionsIndex() {
this.accordionComponents.forEach((accordion, index) => {
accordion.index = index;
});
}
/**
* [setAccordionsToggle description]
* \@method setAccordionsToggle
* @return {?}
*/
setAccordionsToggle() {
this.listeners = removeListeners(this.listeners);
this.ngZone.runOutsideAngular(() => {
this.accordionToggleDirectives.forEach((accordionToggle) => {
this.listeners.push(this.renderer2.listen(accordionToggle.elementRef.nativeElement, 'click', (event) => {
this.toggleAccordion(event, accordionToggle.accordionComponent.index);
this.changeDetectorRef.detectChanges();
}));
this.listeners.push(this.renderer2.listen(accordionToggle.elementRef.nativeElement, 'mouseenter', () => {
AccordionGroupComponent.headerMouseEnter(accordionToggle.accordionComponent);
this.changeDetectorRef.detectChanges();
}));
this.listeners.push(this.renderer2.listen(accordionToggle.elementRef.nativeElement, 'mouseleave', () => {
AccordionGroupComponent.headerMouseLeave(accordionToggle.accordionComponent);
this.changeDetectorRef.detectChanges();
}));
});
});
}
/**
* [updateAccordionIsCollapsed description]
* \@method updateAccordionIsCollapsed
* @return {?}
*/
updateAccordionIsCollapsed() {
this.accordionComponents.forEach((accordion, index) => {
accordion.isCollapsed = this.activeIndex.indexOf(index) === -1;
});
}
}
AccordionGroupComponent.decorators = [
{ type: Component, args: [{
selector: 'mk-accordion-group',
template: `<div [ngClass]="styleClass">
<div *ngFor="let accordion of accordionComponents" class="panel box" [mkColor]="accordion.borderColor" mkColorProperty="border-top-color" mkColorPrefix="box">
<div [ngClass]="accordion.headerStyleClass" [class.no-border]="accordion.isCollapsed && !accordion.isCollapsing">
<h4 class="box-title">
<a [mkAccordionToggle]="accordion" href="#" [mkFontColor]="accordion.headerStyleColor" [class.collapsed]="accordion.isCollapsed">
{{accordion.header}}
<ng-template *ngIf="!accordion.header" [ngTemplateOutlet]="accordion.accordionHeaderComponent?.templateRef"></ng-template>
</a>
</h4>
</div>
<div class="panel-collapse" [collapseAnimation]="accordion.isCollapsed" (collapseAnimation.start)="collapseStart($event, accordion)" (collapseAnimation.done)="collapseDone($event, accordion)">
<div [ngClass]="accordion.contentStyleClass" [mkFontColor]="accordion.contentColor">
<ng-template [ngTemplateOutlet]="accordion.contentTemplateRef"></ng-template>
</div>
</div>
</div>
</div>
`
},] },
];
/** @nocollapse */
AccordionGroupComponent.ctorParameters = () => [
{ type: ChangeDetectorRef, },
{ type: NgZone, },
{ type: Renderer2, },
];
AccordionGroupComponent.propDecorators = {
"_activeIndex": [{ type: Input, args: ['activeIndex',] },],
"isMultiple": [{ type: Input },],
"styleClass": [{ type: Input },],
"onCollapseStart": [{ type: Output },],
"onCollapseDone": [{ type: Output },],
"accordionComponents": [{ type: ContentChildren, args: [AccordionComponent,] },],
"accordionToggleDirectives": [{ type: ViewChildren, args: [AccordionToggleDirective,] },],
};
function AccordionGroupComponent_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
AccordionGroupComponent.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
AccordionGroupComponent.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
AccordionGroupComponent.propDecorators;
/** @type {?} */
AccordionGroupComponent.prototype.activeIndex;
/** @type {?} */
AccordionGroupComponent.prototype.listeners;
/** @type {?} */
AccordionGroupComponent.prototype.subscriptions;
/** @type {?} */
AccordionGroupComponent.prototype.isMultiple;
/** @type {?} */
AccordionGroupComponent.prototype.styleClass;
/** @type {?} */
AccordionGroupComponent.prototype.onCollapseStart;
/** @type {?} */
AccordionGroupComponent.prototype.onCollapseDone;
/** @type {?} */
AccordionGroupComponent.prototype.accordionComponents;
/** @type {?} */
AccordionGroupComponent.prototype.accordionToggleDirectives;
/** @type {?} */
AccordionGroupComponent.prototype.changeDetectorRef;
/** @type {?} */
AccordionGroupComponent.prototype.ngZone;
/** @type {?} */
AccordionGroupComponent.prototype.renderer2;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3JkaW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXItYWRtaW4tbHRlLXRlbGlxby8iLCJzb3VyY2VzIjpbImxpYi9hY2NvcmRpb24vYWNjb3JkaW9uLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUdMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLGVBQWUsRUFDZixZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFJTixNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsRUFFVCxXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDYixNQUFNLGVBQWUsQ0FBQztBQUl2QixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVqRSxPQUFPLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBVWxFLE1BQU07OztZQUpMLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUscUJBQXFCO2dCQUMvQixRQUFRLEVBQUUsbUVBQW1FO2FBQzlFOzs7OzRCQUVFLFNBQVMsU0FBQyxhQUFhOzs7Ozs7Ozs7Ozs7Ozs7QUFXMUIsTUFBTTs7O1lBSkwsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxzQkFBc0I7Z0JBQ2hDLFFBQVEsRUFBRSxtRUFBbUU7YUFDOUU7Ozs7NEJBRUUsU0FBUyxTQUFDLGFBQWE7Ozs7Ozs7Ozs7Ozs7OztBQVcxQixNQUFNOztpQ0FTZ0MsVUFBVTtnQ0FJWCx3QkFBd0I7Ozs7OztJQVUzRCxRQUFRO1FBQ04sSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFFekMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQztZQUNuRCxNQUFNLElBQUksS0FBSyxDQUFDLGtHQUFrRyxDQUFDLENBQUM7U0FDckg7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QUFFLEdBQUcsRUFBRTtvQkFDckcsdUJBQXVCLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLENBQUM7b0JBQzdFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsQ0FBQztpQkFDeEMsQ0FBQyxDQUFDLENBQUM7YUFDTCxDQUFDLENBQUM7U0FDSixDQUFDLENBQUM7Ozs7Ozs7SUFPRywwQkFBMEI7UUFDaEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQTZCLEVBQUUsS0FBYSxFQUFFLEVBQUU7WUFDaEYsU0FBUyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUNoRSxDQUFDLENBQUM7Ozs7WUEvTU4sU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxvQkFBb0I7Z0JBQzlCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FpQlg7YUFDQTs7OztZQXZIQyxpQkFBaUI7WUFNakIsTUFBTTtZQU1OLFNBQVM7Ozs2QkFvSFIsS0FBSyxTQUFDLGFBQWE7MkJBR25CLEtBQUs7MkJBQ0wsS0FBSztnQ0FFTCxNQUFNOytCQUNOLE1BQU07b0NBRU4sZUFBZSxTQUFDLGtCQUFrQjswQ0FFbEMsWUFBWSxTQUFDLHdCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBSZW5kZXJlcjIsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQW5pbWF0aW9uRXZlbnQgfSBmcm9tICcuLi9hbmltYXRpb25zL2FuaW1hdGlvbnMuaW50ZXJmYWNlJztcblxuaW1wb3J0IHsgQWNjb3JkaW9uVG9nZ2xlRGlyZWN0aXZlIH0gZnJvbSAnLi9hY2NvcmRpb24uZGlyZWN0aXZlJztcblxuaW1wb3J0IHsgcmVtb3ZlTGlzdGVuZXJzLCByZW1vdmVTdWJzY3JpcHRpb25zIH0gZnJvbSAnLi4vaGVscGVycyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuLypcbiAqXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21rLWFjY29yZGlvbi1oZWFkZXInLFxuICB0ZW1wbGF0ZTogJzxuZy10ZW1wbGF0ZSAjdGVtcGxhdGVSZWY+PG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PjwvbmctdGVtcGxhdGU+J1xufSlcbmV4cG9ydCBjbGFzcyBBY2NvcmRpb25IZWFkZXJDb21wb25lbnQge1xuICBAVmlld0NoaWxkKCd0ZW1wbGF0ZVJlZicpIHB1YmxpYyB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55Pjtcbn1cblxuXG4vKlxuICpcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbWstYWNjb3JkaW9uLWNvbnRlbnQnLFxuICB0ZW1wbGF0ZTogJzxuZy10ZW1wbGF0ZSAjdGVtcGxhdGVSZWY+PG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PjwvbmctdGVtcGxhdGU+J1xufSlcbmV4cG9ydCBjbGFzcyBBY2NvcmRpb25Db250ZW50Q29tcG9uZW50IHtcbiAgQFZpZXdDaGlsZCgndGVtcGxhdGVSZWYnKSBwdWJsaWMgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT47XG59XG5cblxuLypcbiAqXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21rLWFjY29yZGlvbicsXG4gIHRlbXBsYXRlOiAnPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZVJlZj48bmctY29udGVudD48L25nLWNvbnRlbnQ+PC9uZy10ZW1wbGF0ZT4nXG59KVxuZXhwb3J0IGNsYXNzIEFjY29yZGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHB1YmxpYyBjb250ZW50VGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPEFjY29yZGlvbkNvbnRlbnRDb21wb25lbnQ+O1xuICBwdWJsaWMgaGVhZGVyU3R5bGVDb2xvcjogc3RyaW5nO1xuICBwdWJsaWMgaXNDb2xsYXBzaW5nOiBib29sZWFuO1xuICBwdWJsaWMgaXNDb2xsYXBzZWQ6IGJvb2xlYW47XG4gIHB1YmxpYyBpbmRleDogbnVtYmVyO1xuXG4gIEBJbnB1dCgpIHB1YmxpYyBib3JkZXJDb2xvcjogc3RyaW5nO1xuICBASW5wdXQoKSBwdWJsaWMgY29udGVudENvbG9yOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHB1YmxpYyBjb250ZW50U3R5bGVDbGFzcyA9ICdib3gtYm9keSc7XG4gIEBJbnB1dCgpIHB1YmxpYyBoZWFkZXI6IHN0cmluZztcbiAgQElucHV0KCkgcHVibGljIGhlYWRlckNvbG9yOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHB1YmxpYyBoZWFkZXJDb2xvckhvdmVyOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHB1YmxpYyBoZWFkZXJTdHlsZUNsYXNzID0gJ2JveC1oZWFkZXIgd2l0aC1ib3JkZXInO1xuXG4gIEBDb250ZW50Q2hpbGQoQWNjb3JkaW9uSGVhZGVyQ29tcG9uZW50KSBwdWJsaWMgYWNjb3JkaW9uSGVhZGVyQ29tcG9uZW50OiBBY2NvcmRpb25IZWFkZXJDb21wb25lbnQ7XG4gIEBDb250ZW50Q2hpbGQoQWNjb3JkaW9uQ29udGVudENvbXBvbmVudCkgcHVibGljIGFjY29yZGlvbkNvbnRlbnRDb21wb25lbnQ6IEFjY29yZGlvbkNvbnRlbnRDb21wb25lbnQ7XG5cbiAgQFZpZXdDaGlsZCgndGVtcGxhdGVSZWYnKSBwdWJsaWMgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgbmdPbkluaXRcbiAgICovXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaGVhZGVyU3R5bGVDb2xvciA9IHRoaXMuaGVhZGVyQ29sb3I7XG5cbiAgICBpZiAoIXRoaXMuaGVhZGVyICYmICF0aGlzLmFjY29yZGlvbkhlYWRlckNvbXBvbmVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdHRyaWJ1dGUgXCJoZWFkZXJcIiBPUiBDb21wb25lbnQgXCJtay0rYWNjb3JkaW9uLWhlYWRlclwiIGlzIHJlcXVpcmVkIGZvciBjb21wb25lbnQgXCJtay0rYWNjb3JkaW9uXCInKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hY2NvcmRpb25Db250ZW50Q29tcG9uZW50KSB7XG4gICAgICB0aGlzLmNvbnRlbnRUZW1wbGF0ZVJlZiA9IHRoaXMuYWNjb3JkaW9uQ29udGVudENvbXBvbmVudC50ZW1wbGF0ZVJlZjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb250ZW50VGVtcGxhdGVSZWYgPSB0aGlzLnRlbXBsYXRlUmVmO1xuICAgIH1cbiAgfVxufVxuXG5cbi8qXG4gKlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtay1hY2NvcmRpb24tZ3JvdXAnLFxuICB0ZW1wbGF0ZTogYDxkaXYgW25nQ2xhc3NdPVwic3R5bGVDbGFzc1wiPlxuICA8ZGl2ICpuZ0Zvcj1cImxldCBhY2NvcmRpb24gb2YgYWNjb3JkaW9uQ29tcG9uZW50c1wiIGNsYXNzPVwicGFuZWwgYm94XCIgW21rQ29sb3JdPVwiYWNjb3JkaW9uLmJvcmRlckNvbG9yXCIgbWtDb2xvclByb3BlcnR5PVwiYm9yZGVyLXRvcC1jb2xvclwiIG1rQ29sb3JQcmVmaXg9XCJib3hcIj5cbiAgICA8ZGl2IFtuZ0NsYXNzXT1cImFjY29yZGlvbi5oZWFkZXJTdHlsZUNsYXNzXCIgW2NsYXNzLm5vLWJvcmRlcl09XCJhY2NvcmRpb24uaXNDb2xsYXBzZWQgJiYgIWFjY29yZGlvbi5pc0NvbGxhcHNpbmdcIj5cbiAgICAgIDxoNCBjbGFzcz1cImJveC10aXRsZVwiPlxuICAgICAgICA8YSBbbWtBY2NvcmRpb25Ub2dnbGVdPVwiYWNjb3JkaW9uXCIgaHJlZj1cIiNcIiBbbWtGb250Q29sb3JdPVwiYWNjb3JkaW9uLmhlYWRlclN0eWxlQ29sb3JcIiBbY2xhc3MuY29sbGFwc2VkXT1cImFjY29yZGlvbi5pc0NvbGxhcHNlZFwiPlxuICAgICAgICAgIHt7YWNjb3JkaW9uLmhlYWRlcn19XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICpuZ0lmPVwiIWFjY29yZGlvbi5oZWFkZXJcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJhY2NvcmRpb24uYWNjb3JkaW9uSGVhZGVyQ29tcG9uZW50Py50ZW1wbGF0ZVJlZlwiPjwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvYT5cbiAgICAgIDwvaDQ+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInBhbmVsLWNvbGxhcHNlXCIgW2NvbGxhcHNlQW5pbWF0aW9uXT1cImFjY29yZGlvbi5pc0NvbGxhcHNlZFwiIChjb2xsYXBzZUFuaW1hdGlvbi5zdGFydCk9XCJjb2xsYXBzZVN0YXJ0KCRldmVudCwgYWNjb3JkaW9uKVwiIChjb2xsYXBzZUFuaW1hdGlvbi5kb25lKT1cImNvbGxhcHNlRG9uZSgkZXZlbnQsIGFjY29yZGlvbilcIj5cbiAgICAgIDxkaXYgW25nQ2xhc3NdPVwiYWNjb3JkaW9uLmNvbnRlbnRTdHlsZUNsYXNzXCIgW21rRm9udENvbG9yXT1cImFjY29yZGlvbi5jb250ZW50Q29sb3JcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImFjY29yZGlvbi5jb250ZW50VGVtcGxhdGVSZWZcIj48L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5gXG59KVxuZXhwb3J0IGNsYXNzIEFjY29yZGlvbkdyb3VwQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIGFjdGl2ZUluZGV4OiBhbnkgPSBbMF07XG4gIC8vIEBUT0RPIGNoYW5nZSB0eXBlcyBmb3IgbGlzdGVuZXJzIHRvIGFsbCBmaWxlc1xuICBwcml2YXRlIGxpc3RlbmVyczogQXJyYXk8RnVuY3Rpb24+ID0gW107XG4gIC8vIEBUT0RPIGNoYW5nZSB0eXBlcyBmb3Igc3Vic2NyaXB0aW9ucyB0byBhbGwgZmlsZXNcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBBcnJheTxTdWJzY3JpcHRpb24+ID0gW107XG5cblxuICBASW5wdXQoJ2FjdGl2ZUluZGV4Jykgc2V0IF9hY3RpdmVJbmRleCh2YWx1ZSkge1xuICAgIHRoaXMuYWN0aXZlSW5kZXggPSB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5ID8gdmFsdWUgOiBbdmFsdWVdO1xuICB9XG4gIEBJbnB1dCgpIHB1YmxpYyBpc011bHRpcGxlOiBib29sZWFuO1xuICBASW5wdXQoKSBwdWJsaWMgc3R5bGVDbGFzcyA9ICdib3gtZ3JvdXAnO1xuXG4gIEBPdXRwdXQoKSBwdWJsaWMgb25Db2xsYXBzZVN0YXJ0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcHVibGljIG9uQ29sbGFwc2VEb25lID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oQWNjb3JkaW9uQ29tcG9uZW50KSBwdWJsaWMgYWNjb3JkaW9uQ29tcG9uZW50czogUXVlcnlMaXN0PEFjY29yZGlvbkNvbXBvbmVudD47XG5cbiAgQFZpZXdDaGlsZHJlbihBY2NvcmRpb25Ub2dnbGVEaXJlY3RpdmUpIHByaXZhdGUgYWNjb3JkaW9uVG9nZ2xlRGlyZWN0aXZlczogUXVlcnlMaXN0PEFjY29yZGlvblRvZ2dsZURpcmVjdGl2ZT47XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIGNoYW5nZURldGVjdG9yUmVmIFtkZXNjcmlwdGlvbl1cbiAgICogQHBhcmFtIG5nWm9uZSAgICAgICAgICAgIFtkZXNjcmlwdGlvbl1cbiAgICogQHBhcmFtIHJlbmRlcmVyMiAgICAgICAgIFtkZXNjcmlwdGlvbl1cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjI6IFJlbmRlcmVyMlxuICApIHt9XG5cbiAgLyoqXG4gICAqIFtoZWFkZXJNb3VzZUxlYXZlIGRlc2NyaXB0aW9uXVxuICAgKiBAbWV0aG9kIGhlYWRlck1vdXNlTGVhdmVcbiAgICogQHBhcmFtIGFjY29yZGlvbiBbZGVzY3JpcHRpb25dXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGhlYWRlck1vdXNlTGVhdmUoYWNjb3JkaW9uOiBBY2NvcmRpb25Db21wb25lbnQpOiB2b2lkIHtcbiAgICBhY2NvcmRpb24uaGVhZGVyU3R5bGVDb2xvciA9IGFjY29yZGlvbi5oZWFkZXJDb2xvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBbaGVhZGVyTW91c2VFbnRlciBkZXNjcmlwdGlvbl1cbiAgICogQG1ldGhvZCBoZWFkZXJNb3VzZUVudGVyXG4gICAqIEBwYXJhbSBhY2NvcmRpb24gW2Rlc2NyaXB0aW9uXVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBoZWFkZXJNb3VzZUVudGVyKGFjY29yZGlvbjogQWNjb3JkaW9uQ29tcG9uZW50KTogdm9pZCB7XG4gICAgaWYgKGFjY29yZGlvbi5oZWFkZXJDb2xvckhvdmVyKSB7XG4gICAgICBhY2NvcmRpb24uaGVhZGVyU3R5bGVDb2xvciA9IGFjY29yZGlvbi5oZWFkZXJDb2xvckhvdmVyO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIG5nQWZ0ZXJWaWV3SW5pdFxuICAgKi9cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIHRoaXMuc2V0QWNjb3JkaW9uc0luZGV4KCk7XG4gICAgdGhpcy51cGRhdGVBY2NvcmRpb25Jc0NvbGxhcHNlZCgpO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5hY2NvcmRpb25Db21wb25lbnRzLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuc2V0QWNjb3JkaW9uc0luZGV4KCk7XG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgbmdBZnRlclZpZXdJbml0XG4gICAqL1xuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5zZXRBY2NvcmRpb25zVG9nZ2xlKCk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaCh0aGlzLmFjY29yZGlvblRvZ2dsZURpcmVjdGl2ZXMuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5zZXRBY2NvcmRpb25zVG9nZ2xlKCk7XG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFtuZ09uQ2hhbmdlcyBkZXNjcmlwdGlvbl1cbiAgICogQG1ldGhvZCBuZ09uQ2hhbmdlc1xuICAgKiBAcGFyYW0gY2hhbmdlcyBbZGVzY3JpcHRpb25dXG4gICAqIEByZXR1cm4gW2Rlc2NyaXB0aW9uXVxuICAgKi9cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzLl9hY3RpdmVJbmRleC5maXJzdENoYW5nZSA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMudXBkYXRlQWNjb3JkaW9uSXNDb2xsYXBzZWQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBuZ09uRGVzdHJveVxuICAgKi9cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgcmVtb3ZlTGlzdGVuZXJzKHRoaXMubGlzdGVuZXJzKTtcbiAgICByZW1vdmVTdWJzY3JpcHRpb25zKHRoaXMuc3Vic2NyaXB0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogW3RvZ2dsZUFjY29yZGlvbiBkZXNjcmlwdGlvbl1cbiAgICogQG1ldGhvZCB0b2dnbGVBY2NvcmRpb25cbiAgICogQHBhcmFtIGV2ZW50ICAgICAgIFtkZXNjcmlwdGlvbl1cbiAgICogQHBhcmFtIHRvZ2dsZUluZGV4IFtkZXNjcmlwdGlvbl1cbiAgICovXG4gIHB1YmxpYyB0b2dnbGVBY2NvcmRpb24oZXZlbnQ6IEV2ZW50LCB0b2dnbGVJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGNvbnN0IGluZGV4T2YgPSB0aGlzLmFjdGl2ZUluZGV4WydpbmRleE9mJ10odG9nZ2xlSW5kZXgpO1xuICAgIGlmIChpbmRleE9mID09PSAtMSkge1xuICAgICAgaWYgKHRoaXMuaXNNdWx0aXBsZSkge1xuICAgICAgICB0aGlzLmFjdGl2ZUluZGV4LnB1c2godG9nZ2xlSW5kZXgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IFt0b2dnbGVJbmRleF07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmlzTXVsdGlwbGUpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVJbmRleC5zcGxpY2UoaW5kZXhPZiwgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFjdGl2ZUluZGV4ID0gW107XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudXBkYXRlQWNjb3JkaW9uSXNDb2xsYXBzZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBbY29sbGFwc2VTdGFydCBkZXNjcmlwdGlvbl1cbiAgICogQG1ldGhvZCBjb2xsYXBzZVN0YXJ0XG4gICAqIEBwYXJhbSBldmVudCBbZGVzY3JpcHRpb25dXG4gICAqIEBwYXJhbSBhY2NvcmRpb24gW2Rlc2NyaXB0aW9uXVxuICAgKi9cbiAgcHVibGljIGNvbGxhcHNlU3RhcnQoZXZlbnQ6IEFuaW1hdGlvbkV2ZW50LCBhY2NvcmRpb246IEFjY29yZGlvbkNvbXBvbmVudCk6IHZvaWQge1xuICAgIGFjY29yZGlvbi5pc0NvbGxhcHNpbmcgPSB0cnVlO1xuICAgIHRoaXMub25Db2xsYXBzZVN0YXJ0LmVtaXQoe2FuaW1hdGlvbkV2ZW50OiBldmVudCwgaW5kZXg6IGFjY29yZGlvbi5pbmRleH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFtjb2xsYXBzZURvbmUgZGVzY3JpcHRpb25dXG4gICAqIEBtZXRob2QgY29sbGFwc2VEb25lXG4gICAqIEBwYXJhbSBldmVudCBbZGVzY3JpcHRpb25dXG4gICAqIEBwYXJhbSBhY2NvcmRpb24gW2Rlc2NyaXB0aW9uXVxuICAgKi9cbiAgcHVibGljIGNvbGxhcHNlRG9uZShldmVudDogQW5pbWF0aW9uRXZlbnQsIGFjY29yZGlvbjogQWNjb3JkaW9uQ29tcG9uZW50KTogdm9pZCB7XG4gICAgYWNjb3JkaW9uLmlzQ29sbGFwc2luZyA9IGZhbHNlO1xuICAgIHRoaXMub25Db2xsYXBzZURvbmUuZW1pdCh7YW5pbWF0aW9uRXZlbnQ6IGV2ZW50LCBpbmRleDogYWNjb3JkaW9uLmluZGV4fSk7XG4gIH1cblxuICAvKipcbiAgICogW3NldEFjY29yZGlvbnNJbmRleCBkZXNjcmlwdGlvbl1cbiAgICogQG1ldGhvZCBzZXRBY2NvcmRpb25zSW5kZXhcbiAgICovXG4gIHByaXZhdGUgc2V0QWNjb3JkaW9uc0luZGV4KCk6IHZvaWQge1xuICAgIHRoaXMuYWNjb3JkaW9uQ29tcG9uZW50cy5mb3JFYWNoKChhY2NvcmRpb246IEFjY29yZGlvbkNvbXBvbmVudCwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgYWNjb3JkaW9uLmluZGV4ID0gaW5kZXg7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogW3NldEFjY29yZGlvbnNUb2dnbGUgZGVzY3JpcHRpb25dXG4gICAqIEBtZXRob2Qgc2V0QWNjb3JkaW9uc1RvZ2dsZVxuICAgKi9cbiAgcHJpdmF0ZSBzZXRBY2NvcmRpb25zVG9nZ2xlKCk6IHZvaWQge1xuICAgIHRoaXMubGlzdGVuZXJzID0gcmVtb3ZlTGlzdGVuZXJzKHRoaXMubGlzdGVuZXJzKTtcblxuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuYWNjb3JkaW9uVG9nZ2xlRGlyZWN0aXZlcy5mb3JFYWNoKChhY2NvcmRpb25Ub2dnbGU6IEFjY29yZGlvblRvZ2dsZURpcmVjdGl2ZSkgPT4ge1xuICAgICAgICB0aGlzLmxpc3RlbmVycy5wdXNoKHRoaXMucmVuZGVyZXIyLmxpc3RlbihhY2NvcmRpb25Ub2dnbGUuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICB0aGlzLnRvZ2dsZUFjY29yZGlvbihldmVudCwgYWNjb3JkaW9uVG9nZ2xlLmFjY29yZGlvbkNvbXBvbmVudC5pbmRleCk7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH0pKTtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMucHVzaCh0aGlzLnJlbmRlcmVyMi5saXN0ZW4oYWNjb3JkaW9uVG9nZ2xlLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ21vdXNlZW50ZXInLCAoKSA9PiB7XG4gICAgICAgICAgQWNjb3JkaW9uR3JvdXBDb21wb25lbnQuaGVhZGVyTW91c2VFbnRlcihhY2NvcmRpb25Ub2dnbGUuYWNjb3JkaW9uQ29tcG9uZW50KTtcbiAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLmxpc3RlbmVycy5wdXNoKHRoaXMucmVuZGVyZXIyLmxpc3RlbihhY2NvcmRpb25Ub2dnbGUuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnbW91c2VsZWF2ZScsICgpID0+IHtcbiAgICAgICAgICBBY2NvcmRpb25Hcm91cENvbXBvbmVudC5oZWFkZXJNb3VzZUxlYXZlKGFjY29yZGlvblRvZ2dsZS5hY2NvcmRpb25Db21wb25lbnQpO1xuICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9KSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBbdXBkYXRlQWNjb3JkaW9uSXNDb2xsYXBzZWQgZGVzY3JpcHRpb25dXG4gICAqIEBtZXRob2QgdXBkYXRlQWNjb3JkaW9uSXNDb2xsYXBzZWRcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlQWNjb3JkaW9uSXNDb2xsYXBzZWQoKTogdm9pZCB7XG4gICAgdGhpcy5hY2NvcmRpb25Db21wb25lbnRzLmZvckVhY2goKGFjY29yZGlvbjogQWNjb3JkaW9uQ29tcG9uZW50LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICBhY2NvcmRpb24uaXNDb2xsYXBzZWQgPSB0aGlzLmFjdGl2ZUluZGV4LmluZGV4T2YoaW5kZXgpID09PSAtMTtcbiAgICB9KTtcbiAgfVxufVxuIl19