theme-lib
Version:
This is a simple example Angular Library published to npm.
295 lines • 22 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/*
* @license
* Copyright Akveo. All Rights Reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*/
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChildren, EventEmitter, forwardRef, Input, Output, QueryList, PLATFORM_ID, Inject, ElementRef, } from '@angular/core';
import { isPlatformBrowser } from '@angular/common';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { fromEvent, merge } from 'rxjs';
import { filter, switchMap, take, takeWhile } from 'rxjs/operators';
import { convertToBoolProperty } from '../helpers';
import { NB_DOCUMENT } from '../../theme.options';
import { NbRadioComponent } from './radio.component';
/*
* The `NbRadioGroupComponent` is the wrapper for `nb-radio` button.
* It provides form bindings:
*
* ```html
* <nb-radio-group [(ngModel)]="selectedOption">
* <nb-radio>Option 1</nb-radio>
* <nb-radio>Option 2</nb-radio>
* <nb-radio>Option 3</nb-radio>
* </nb-radio-group>
* ```
*
* Also, you can use `value` and `valueChange` for binding without forms.
*
* ```html
* <nb-radio-group [(value)]="selectedOption">
* <nb-radio>Option 1</nb-radio>
* <nb-radio>Option 2</nb-radio>
* <nb-radio>Option 3</nb-radio>
* </nb-radio-group>
* ```
*
* Radio items name has to be provided through `name` input property of the radio group.
*
* ```html
* <nb-radio-group name="my-radio-group">
* ...
* </nb-radio-group>
* ```
*
* Also, you can disable the whole group using `disabled` attribute.
*
* ```html
* <nb-radio-group disabled>
* ...
* </nb-radio-group>
* ```
* */
export class NbRadioGroupComponent {
/**
* @param {?} cd
* @param {?} hostElement
* @param {?} platformId
* @param {?} document
*/
constructor(cd, hostElement, platformId, document) {
this.cd = cd;
this.hostElement = hostElement;
this.platformId = platformId;
this.document = document;
this.valueChange = new EventEmitter();
this.alive = true;
this.onChange = (value) => { };
this.onTouched = () => { };
}
/**
* @param {?} value
* @return {?}
*/
set setValue(value) {
this.value = value;
this.updateValues();
}
/**
* @param {?} name
* @return {?}
*/
set setName(name) {
this.name = name;
this.updateNames();
}
/**
* @param {?} disabled
* @return {?}
*/
set setDisabled(disabled) {
this.disabled = convertToBoolProperty(disabled);
this.updateDisabled();
}
/**
* @return {?}
*/
ngAfterContentInit() {
this.updateNames();
this.updateValues();
this.updateDisabled();
this.subscribeOnRadiosValueChange();
this.subscribeOnRadiosBlur();
}
/**
* @return {?}
*/
ngOnDestroy() {
this.alive = false;
}
/**
* @param {?} fn
* @return {?}
*/
registerOnChange(fn) {
this.onChange = fn;
}
/**
* @param {?} fn
* @return {?}
*/
registerOnTouched(fn) {
this.onTouched = fn;
}
/**
* @param {?} value
* @return {?}
*/
writeValue(value) {
this.value = value;
if (typeof value !== 'undefined') {
this.updateValues();
}
}
/**
* @protected
* @return {?}
*/
updateNames() {
if (this.radios) {
this.radios.forEach((radio) => radio.name = this.name);
this.markRadiosForCheck();
}
}
/**
* @protected
* @return {?}
*/
updateValues() {
if (this.radios && typeof this.value !== 'undefined') {
this.radios.forEach((radio) => radio.checked = radio.value === this.value);
this.markRadiosForCheck();
}
}
/**
* @protected
* @return {?}
*/
updateDisabled() {
if (this.radios && typeof this.disabled !== 'undefined') {
this.radios.forEach((radio) => radio.setDisabled = this.disabled);
this.markRadiosForCheck();
}
}
/**
* @protected
* @return {?}
*/
subscribeOnRadiosValueChange() {
merge(...this.radios.map((radio) => radio.valueChange))
.pipe(takeWhile(() => this.alive))
.subscribe((value) => {
this.writeValue(value);
this.propagateValue(value);
});
}
/**
* @protected
* @param {?} value
* @return {?}
*/
propagateValue(value) {
this.valueChange.emit(value);
this.onChange(value);
}
/**
* @protected
* @return {?}
*/
markRadiosForCheck() {
this.radios.forEach((radio) => radio.markForCheck());
}
/**
* @protected
* @return {?}
*/
subscribeOnRadiosBlur() {
if (!isPlatformBrowser(this.platformId)) {
return;
}
/** @type {?} */
const hostElement = this.hostElement.nativeElement;
fromEvent(hostElement, 'focusin')
.pipe(filter(event => hostElement.contains((/** @type {?} */ (event.target)))), switchMap(() => merge(fromEvent(this.document, 'focusin'), fromEvent(this.document, 'click'))), filter(event => !hostElement.contains((/** @type {?} */ (event.target)))), take(1))
.subscribe(() => this.onTouched());
}
}
NbRadioGroupComponent.decorators = [
{ type: Component, args: [{
selector: 'nb-radio-group',
template: `
<ng-content select="nb-radio"></ng-content>`,
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => NbRadioGroupComponent),
multi: true,
},
],
changeDetection: ChangeDetectionStrategy.OnPush
}] }
];
/** @nocollapse */
NbRadioGroupComponent.ctorParameters = () => [
{ type: ChangeDetectorRef },
{ type: ElementRef },
{ type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] },
{ type: undefined, decorators: [{ type: Inject, args: [NB_DOCUMENT,] }] }
];
NbRadioGroupComponent.propDecorators = {
radios: [{ type: ContentChildren, args: [NbRadioComponent, { descendants: true },] }],
setValue: [{ type: Input, args: ['value',] }],
setName: [{ type: Input, args: ['name',] }],
setDisabled: [{ type: Input, args: ['disabled',] }],
valueChange: [{ type: Output }]
};
if (false) {
/** @type {?} */
NbRadioGroupComponent.prototype.radios;
/** @type {?} */
NbRadioGroupComponent.prototype.valueChange;
/**
* @type {?}
* @protected
*/
NbRadioGroupComponent.prototype.disabled;
/**
* @type {?}
* @protected
*/
NbRadioGroupComponent.prototype.value;
/**
* @type {?}
* @protected
*/
NbRadioGroupComponent.prototype.name;
/**
* @type {?}
* @protected
*/
NbRadioGroupComponent.prototype.alive;
/**
* @type {?}
* @protected
*/
NbRadioGroupComponent.prototype.onChange;
/**
* @type {?}
* @protected
*/
NbRadioGroupComponent.prototype.onTouched;
/**
* @type {?}
* @protected
*/
NbRadioGroupComponent.prototype.cd;
/**
* @type {?}
* @protected
*/
NbRadioGroupComponent.prototype.hostElement;
/**
* @type {?}
* @protected
*/
NbRadioGroupComponent.prototype.platformId;
/**
* @type {?}
* @protected
*/
NbRadioGroupComponent.prototype.document;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFkaW8tZ3JvdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vdGhlbWUtbGliLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvcmFkaW8vcmFkaW8tZ3JvdXAuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQU1BLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxlQUFlLEVBQ2YsWUFBWSxFQUNaLFVBQVUsRUFDVixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsRUFDVCxXQUFXLEVBQ1gsTUFBTSxFQUNOLFVBQVUsR0FDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNuRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXNEckQsTUFBTSxPQUFPLHFCQUFxQjs7Ozs7OztJQStCaEMsWUFDWSxFQUFxQixFQUNyQixXQUFvQyxFQUNmLFVBQVUsRUFDVixRQUFRO1FBSDdCLE9BQUUsR0FBRixFQUFFLENBQW1CO1FBQ3JCLGdCQUFXLEdBQVgsV0FBVyxDQUF5QjtRQUNmLGVBQVUsR0FBVixVQUFVLENBQUE7UUFDVixhQUFRLEdBQVIsUUFBUSxDQUFBO1FBYi9C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cmlnaHQgQWt2ZW8uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcbiAqL1xyXG5cclxuaW1wb3J0IHtcclxuICBBZnRlckNvbnRlbnRJbml0LFxyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBDb250ZW50Q2hpbGRyZW4sXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIGZvcndhcmRSZWYsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE91dHB1dCxcclxuICBRdWVyeUxpc3QsXHJcbiAgUExBVEZPUk1fSUQsXHJcbiAgSW5qZWN0LFxyXG4gIEVsZW1lbnRSZWYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBmcm9tRXZlbnQsIG1lcmdlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGZpbHRlciwgc3dpdGNoTWFwLCB0YWtlLCB0YWtlV2hpbGUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IGNvbnZlcnRUb0Jvb2xQcm9wZXJ0eSB9IGZyb20gJy4uL2hlbHBlcnMnO1xyXG5pbXBvcnQgeyBOQl9ET0NVTUVOVCB9IGZyb20gJy4uLy4uL3RoZW1lLm9wdGlvbnMnO1xyXG5pbXBvcnQgeyBOYlJhZGlvQ29tcG9uZW50IH0gZnJvbSAnLi9yYWRpby5jb21wb25lbnQnO1xyXG5cclxuXHJcbi8qXHJcbiAqIFRoZSBgTmJSYWRpb0dyb3VwQ29tcG9uZW50YCBpcyB0aGUgd3JhcHBlciBmb3IgYG5iLXJhZGlvYCBidXR0b24uXHJcbiAqIEl0IHByb3ZpZGVzIGZvcm0gYmluZGluZ3M6XHJcbiAqXHJcbiAqIGBgYGh0bWxcclxuICogPG5iLXJhZGlvLWdyb3VwIFsobmdNb2RlbCldPVwic2VsZWN0ZWRPcHRpb25cIj5cclxuICogICA8bmItcmFkaW8+T3B0aW9uIDE8L25iLXJhZGlvPlxyXG4gKiAgIDxuYi1yYWRpbz5PcHRpb24gMjwvbmItcmFkaW8+XHJcbiAqICAgPG5iLXJhZGlvPk9wdGlvbiAzPC9uYi1yYWRpbz5cclxuICogPC9uYi1yYWRpby1ncm91cD5cclxuICogYGBgXHJcbiAqXHJcbiAqIEFsc28sIHlvdSBjYW4gdXNlIGB2YWx1ZWAgYW5kIGB2YWx1ZUNoYW5nZWAgZm9yIGJpbmRpbmcgd2l0aG91dCBmb3Jtcy5cclxuICpcclxuICogYGBgaHRtbFxyXG4gKiA8bmItcmFkaW8tZ3JvdXAgWyh2YWx1ZSldPVwic2VsZWN0ZWRPcHRpb25cIj5cclxuICogICA8bmItcmFkaW8+T3B0aW9uIDE8L25iLXJhZGlvPlxyXG4gKiAgIDxuYi1yYWRpbz5PcHRpb24gMjwvbmItcmFkaW8+XHJcbiAqICAgPG5iLXJhZGlvPk9wdGlvbiAzPC9uYi1yYWRpbz5cclxuICogPC9uYi1yYWRpby1ncm91cD5cclxuICogYGBgXHJcbiAqXHJcbiAqIFJhZGlvIGl0ZW1zIG5hbWUgaGFzIHRvIGJlIHByb3ZpZGVkIHRocm91Z2ggYG5hbWVgIGlucHV0IHByb3BlcnR5IG9mIHRoZSByYWRpbyBncm91cC5cclxuICpcclxuICogYGBgaHRtbFxyXG4gKiA8bmItcmFkaW8tZ3JvdXAgbmFtZT1cIm15LXJhZGlvLWdyb3VwXCI+XHJcbiAqICAgLi4uXHJcbiAqIDwvbmItcmFkaW8tZ3JvdXA+XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBBbHNvLCB5b3UgY2FuIGRpc2FibGUgdGhlIHdob2xlIGdyb3VwIHVzaW5nIGBkaXNhYmxlZGAgYXR0cmlidXRlLlxyXG4gKlxyXG4gKiBgYGBodG1sXHJcbiAqIDxuYi1yYWRpby1ncm91cCBkaXNhYmxlZD5cclxuICogICAuLi5cclxuICogPC9uYi1yYWRpby1ncm91cD5cclxuICogYGBgXHJcbiAqICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbmItcmFkaW8tZ3JvdXAnLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJuYi1yYWRpb1wiPjwvbmctY29udGVudD5gLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmJSYWRpb0dyb3VwQ29tcG9uZW50KSxcclxuICAgICAgbXVsdGk6IHRydWUsXHJcbiAgICB9LFxyXG4gIF0sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOYlJhZGlvR3JvdXBDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcclxuXHJcbiAgQENvbnRlbnRDaGlsZHJlbihOYlJhZGlvQ29tcG9uZW50LCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pIHJhZGlvczogUXVlcnlMaXN0PE5iUmFkaW9Db21wb25lbnQ+O1xyXG5cclxuICBASW5wdXQoJ3ZhbHVlJylcclxuICBzZXQgc2V0VmFsdWUodmFsdWU6IGFueSkge1xyXG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG4gICAgdGhpcy51cGRhdGVWYWx1ZXMoKTtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgnbmFtZScpXHJcbiAgc2V0IHNldE5hbWUobmFtZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xyXG4gICAgdGhpcy51cGRhdGVOYW1lcygpO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCdkaXNhYmxlZCcpXHJcbiAgc2V0IHNldERpc2FibGVkKGRpc2FibGVkOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmRpc2FibGVkID0gY29udmVydFRvQm9vbFByb3BlcnR5KGRpc2FibGVkKTtcclxuICAgIHRoaXMudXBkYXRlRGlzYWJsZWQoKTtcclxuICB9XHJcblxyXG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIHByb3RlY3RlZCBkaXNhYmxlZDogYm9vbGVhbjtcclxuICBwcm90ZWN0ZWQgdmFsdWU6IGFueTtcclxuICBwcm90ZWN0ZWQgbmFtZTogc3RyaW5nO1xyXG4gIHByb3RlY3RlZCBhbGl2ZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJvdGVjdGVkIG9uQ2hhbmdlID0gKHZhbHVlOiBhbnkpID0+IHt9O1xyXG4gIHByb3RlY3RlZCBvblRvdWNoZWQgPSAoKSA9PiB7fTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcm90ZWN0ZWQgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJvdGVjdGVkIGhvc3RFbGVtZW50OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcclxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByb3RlY3RlZCBwbGF0Zm9ybUlkLFxyXG4gICAgQEluamVjdChOQl9ET0NVTUVOVCkgcHJvdGVjdGVkIGRvY3VtZW50LFxyXG4gICkge31cclxuXHJcbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xyXG4gICAgdGhpcy51cGRhdGVOYW1lcygpO1xyXG4gICAgdGhpcy51cGRhdGVWYWx1ZXMoKTtcclxuICAgIHRoaXMudXBkYXRlRGlzYWJsZWQoKTtcclxuICAgIHRoaXMuc3Vic2NyaWJlT25SYWRpb3NWYWx1ZUNoYW5nZSgpO1xyXG4gICAgdGhpcy5zdWJzY3JpYmVPblJhZGlvc0JsdXIoKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5hbGl2ZSA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG4gIH1cclxuXHJcbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcblxyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgdGhpcy51cGRhdGVWYWx1ZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCB1cGRhdGVOYW1lcygpIHtcclxuICAgIGlmICh0aGlzLnJhZGlvcykge1xyXG4gICAgICB0aGlzLnJhZGlvcy5mb3JFYWNoKChyYWRpbzogTmJSYWRpb0NvbXBvbmVudCkgPT4gcmFkaW8ubmFtZSA9IHRoaXMubmFtZSk7XHJcbiAgICAgIHRoaXMubWFya1JhZGlvc0ZvckNoZWNrKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgdXBkYXRlVmFsdWVzKCkge1xyXG4gICAgaWYgKHRoaXMucmFkaW9zICYmIHR5cGVvZiB0aGlzLnZhbHVlICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICB0aGlzLnJhZGlvcy5mb3JFYWNoKChyYWRpbzogTmJSYWRpb0NvbXBvbmVudCkgPT4gcmFkaW8uY2hlY2tlZCA9IHJhZGlvLnZhbHVlID09PSB0aGlzLnZhbHVlKTtcclxuICAgICAgdGhpcy5tYXJrUmFkaW9zRm9yQ2hlY2soKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCB1cGRhdGVEaXNhYmxlZCgpIHtcclxuICAgIGlmICh0aGlzLnJhZGlvcyAmJiB0eXBlb2YgdGhpcy5kaXNhYmxlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgdGhpcy5yYWRpb3MuZm9yRWFjaCgocmFkaW86IE5iUmFkaW9Db21wb25lbnQpID0+IHJhZGlvLnNldERpc2FibGVkID0gdGhpcy5kaXNhYmxlZCk7XHJcbiAgICAgIHRoaXMubWFya1JhZGlvc0ZvckNoZWNrKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgc3Vic2NyaWJlT25SYWRpb3NWYWx1ZUNoYW5nZSgpIHtcclxuICAgIG1lcmdlKC4uLnRoaXMucmFkaW9zLm1hcCgocmFkaW86IE5iUmFkaW9Db21wb25lbnQpID0+IHJhZGlvLnZhbHVlQ2hhbmdlKSlcclxuICAgICAgLnBpcGUodGFrZVdoaWxlKCgpID0+IHRoaXMuYWxpdmUpKVxyXG4gICAgICAuc3Vic2NyaWJlKCh2YWx1ZTogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy53cml0ZVZhbHVlKHZhbHVlKTtcclxuICAgICAgICB0aGlzLnByb3BhZ2F0ZVZhbHVlKHZhbHVlKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcHJvcGFnYXRlVmFsdWUodmFsdWU6IGFueSkge1xyXG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHZhbHVlKTtcclxuICAgIHRoaXMub25DaGFuZ2UodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG1hcmtSYWRpb3NGb3JDaGVjaygpIHtcclxuICAgIHRoaXMucmFkaW9zLmZvckVhY2goKHJhZGlvOiBOYlJhZGlvQ29tcG9uZW50KSA9PiByYWRpby5tYXJrRm9yQ2hlY2soKSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgc3Vic2NyaWJlT25SYWRpb3NCbHVyKCkge1xyXG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBob3N0RWxlbWVudCA9IHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgIGZyb21FdmVudDxFdmVudD4oaG9zdEVsZW1lbnQsICdmb2N1c2luJylcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgZmlsdGVyKGV2ZW50ID0+IGhvc3RFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSksXHJcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IG1lcmdlKFxyXG4gICAgICAgICAgZnJvbUV2ZW50PEV2ZW50Pih0aGlzLmRvY3VtZW50LCAnZm9jdXNpbicpLFxyXG4gICAgICAgICAgZnJvbUV2ZW50PEV2ZW50Pih0aGlzLmRvY3VtZW50LCAnY2xpY2snKSxcclxuICAgICAgICApKSxcclxuICAgICAgICBmaWx0ZXIoZXZlbnQgPT4gIWhvc3RFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSksXHJcbiAgICAgICAgdGFrZSgxKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMub25Ub3VjaGVkKCkpO1xyXG4gIH1cclxufVxyXG4iXX0=