UNPKG

@doku-dev/doku-fragment

Version:

A new Angular UI library that moving away from Bootstrap and built from scratch.

158 lines 22.5 kB
import { CommonModule } from '@angular/common'; import { ChangeDetectionStrategy, Component, ContentChild, Host, HostBinding, Input, Optional, ViewChild, ViewEncapsulation, } from '@angular/core'; import { ReplaySubject, takeUntil } from 'rxjs'; import { DokuRadioCustomAppearanceContext } from './context'; import { DokuRadioCustomAppearance } from './radio-custom-appearance.directive'; import { DOKU_RADIO, DOKU_RADIO_BUILT_IN_APPEARANCE } from './token'; import * as i0 from "@angular/core"; import * as i1 from "./radio-group.component"; let nextId = 1; export class DokuRadio { constructor(cdr, appRef, renderer, radioGroup) { this.cdr = cdr; this.appRef = appRef; this.renderer = renderer; this.radioGroup = radioGroup; /** * Analog to HTML 'name' attribute used to group radios for unique selection. * @default 'd-radio-name-[nextId]'' */ this.name = `d-radio-name-${nextId++}`; /** * The value of this radio button. * @default '' */ this.value = ''; /** * Whether this radio button is checked. * @default false */ this.checked = false; /** * Whether the radio button is disabled. * @default false */ this.disabled = false; /** * The size of the radio button indicator. * @default 'medium' */ this.size = 'medium'; this.customAppearanceContext = new DokuRadioCustomAppearanceContext(); this.hasIndicator = false; this.destroy$ = new ReplaySubject(); } get classes() { return ['d-radio', `d-radio-${this.size}`]; } get hasCustomAppearance() { return !!this.customAppearance || !!this.builtInAppearance; } ngAfterViewInit() { this.cdr.detectChanges(); if (this.hasCustomAppearance) { this.createAndAppendCustomAppearance(); setTimeout(() => this.appendIndicator({ appendChildTo: this.container?.nativeElement, hidden: true }), 0); this.label?.nativeElement?.remove(); } else { this.appendIndicator(); } this.watchGroupChanges(); } ngOnChanges() { this.updateCustomAppearanceContext(); } ngOnDestroy() { this.destroy$.next(true); this.destroy$.complete(); } onCheckedChange(ev) { this.checked = ev.target.checked; this.cdr.detectChanges(); if (this.hasCustomAppearance) { this.updateCustomAppearanceContext(); } this.checkedChangeCallback?.(this.value, this.checked); } appendIndicator(props) { if (!this.indicator || this.hasIndicator) return; const viewRef = this.indicator.createEmbeddedView(null); this.appRef.attachView(viewRef); viewRef.rootNodes.forEach((node) => { if (props?.hidden) this.renderer.setStyle(node, 'display', 'none'); if (props?.appendChildTo) { this.renderer.appendChild(props.appendChildTo, node); } else { this.renderer.insertBefore(this.container?.nativeElement, node, this.label?.nativeElement); } }); this.hasIndicator = true; this.destroy$.subscribe(() => viewRef.destroy()); } createAndAppendCustomAppearance() { const templateRef = this.customAppearance?.templateRef || this.builtInAppearance?.template?.templateRef; if (!templateRef) return; const viewRef = templateRef.createEmbeddedView(this.customAppearanceContext); this.appRef.attachView(viewRef); viewRef.rootNodes.forEach((node) => { this.renderer.appendChild(this.container?.nativeElement, node); }); this.destroy$.subscribe(() => viewRef.destroy()); } updateCustomAppearanceContext() { this.customAppearanceContext.checked = this.checked; this.customAppearanceContext.disabled = this.disabled; this.customAppearanceContext.value = this.value; } watchGroupChanges() { this.radioGroup?.['_notifyChanges$'].pipe(takeUntil(this.destroy$)).subscribe(() => { this.checked = this.value === this.radioGroup?.value; this.disabled = this.disabled || !!this.radioGroup?.disabled; this.updateCustomAppearanceContext(); }); } } DokuRadio.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuRadio, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ApplicationRef }, { token: i0.Renderer2 }, { token: i1.DokuRadioGroup, host: true, optional: true }], target: i0.ɵɵFactoryTarget.Component }); DokuRadio.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: DokuRadio, isStandalone: true, selector: "doku-radio", inputs: { name: "name", value: "value", checked: "checked", disabled: "disabled", size: "size" }, host: { properties: { "class": "this.classes" } }, providers: [{ provide: DOKU_RADIO, useExisting: DokuRadio }], queries: [{ propertyName: "customAppearance", first: true, predicate: DokuRadioCustomAppearance, descendants: true }, { propertyName: "builtInAppearance", first: true, predicate: DOKU_RADIO_BUILT_IN_APPEARANCE, descendants: true }], viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }, { propertyName: "indicator", first: true, predicate: ["indicator"], descendants: true }, { propertyName: "label", first: true, predicate: ["label"], descendants: true }], exportAs: ["dokuRadio"], usesOnChanges: true, ngImport: i0, template: "<label #container class=\"d-radio-container\">\n <span #label class=\"d-radio-label\"><ng-content></ng-content></span>\n</label>\n\n<ng-template #indicator>\n <input\n type=\"radio\"\n class=\"d-radio-input\"\n [name]=\"name\"\n [value]=\"value\"\n [disabled]=\"disabled\"\n [checked]=\"checked\"\n (change)=\"onCheckedChange($event)\"\n />\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuRadio, decorators: [{ type: Component, args: [{ selector: 'doku-radio', exportAs: 'dokuRadio', standalone: true, imports: [CommonModule], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [{ provide: DOKU_RADIO, useExisting: DokuRadio }], template: "<label #container class=\"d-radio-container\">\n <span #label class=\"d-radio-label\"><ng-content></ng-content></span>\n</label>\n\n<ng-template #indicator>\n <input\n type=\"radio\"\n class=\"d-radio-input\"\n [name]=\"name\"\n [value]=\"value\"\n [disabled]=\"disabled\"\n [checked]=\"checked\"\n (change)=\"onCheckedChange($event)\"\n />\n</ng-template>\n" }] }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ApplicationRef }, { type: i0.Renderer2 }, { type: i1.DokuRadioGroup, decorators: [{ type: Optional }, { type: Host }] }]; }, propDecorators: { name: [{ type: Input }], value: [{ type: Input }], checked: [{ type: Input }], disabled: [{ type: Input }], size: [{ type: Input }], container: [{ type: ViewChild, args: ['container'] }], indicator: [{ type: ViewChild, args: ['indicator'] }], label: [{ type: ViewChild, args: ['label'] }], customAppearance: [{ type: ContentChild, args: [DokuRadioCustomAppearance] }], builtInAppearance: [{ type: ContentChild, args: [DOKU_RADIO_BUILT_IN_APPEARANCE] }], classes: [{ type: HostBinding, args: ['class'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFkaW8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZG9rdS1mcmFnbWVudC9zcmMvbGliL3JhZGlvL3JhZGlvLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rva3UtZnJhZ21lbnQvc3JjL2xpYi9yYWRpby9yYWRpby5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFXLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUdMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUVaLElBQUksRUFDSixXQUFXLEVBQ1gsS0FBSyxFQUdMLFFBQVEsRUFHUixTQUFTLEVBQ1QsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUM3RCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUdoRixPQUFPLEVBQUUsVUFBVSxFQUFFLDhCQUE4QixFQUFFLE1BQU0sU0FBUyxDQUFDOzs7QUFFckUsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBWWYsTUFBTSxPQUFPLFNBQVM7SUE4Q3BCLFlBQ1UsR0FBc0IsRUFDdEIsTUFBc0IsRUFDdEIsUUFBbUIsRUFDQyxVQUEyQjtRQUgvQyxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUN0QixXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQUN0QixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ0MsZUFBVSxHQUFWLFVBQVUsQ0FBaUI7UUFqRHpEOzs7V0FHRztRQUNNLFNBQUksR0FBRyxnQkFBZ0IsTUFBTSxFQUFFLEVBQUUsQ0FBQztRQUUzQzs7O1dBR0c7UUFDTSxVQUFLLEdB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QUs7c0JBQWhDLFNBQVM7dUJBQUMsT0FBTztnQkFHVixnQkFBZ0I7c0JBRHZCLFlBQVk7dUJBQUMseUJBQXlCO2dCQUkvQixpQkFBaUI7c0JBRHhCLFlBQVk7dUJBQUMsOEJBQThCO2dCQWdCOUIsT0FBTztzQkFEcEIsV0FBVzt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlLCBOZ0NsYXNzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIEFwcGxpY2F0aW9uUmVmLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBFbGVtZW50UmVmLFxuICBIb3N0LFxuICBIb3N0QmluZGluZyxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPcHRpb25hbCxcbiAgUmVuZGVyZXIyLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSZXBsYXlTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERva3VSYWRpb0N1c3RvbUFwcGVhcmFuY2VDb250ZXh0IH0gZnJvbSAnLi9jb250ZXh0JztcbmltcG9ydCB7IERva3VSYWRpb0N1c3RvbUFwcGVhcmFuY2UgfSBmcm9tICcuL3JhZGlvLWN1c3RvbS1hcHBlYXJhbmNlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBEb2t1UmFkaW9Hcm91cCB9IGZyb20gJy4vcmFkaW8tZ3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IERva3VSYWRpb0J1aWx0SW5BcHBlYXJhbmNlIH0gZnJvbSAnLi9yYWRpby5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRE9LVV9SQURJTywgRE9LVV9SQURJT19CVUlMVF9JTl9BUFBFQVJBTkNFIH0gZnJvbSAnLi90b2tlbic7XG5cbmxldCBuZXh0SWQgPSAxO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkb2t1LXJhZGlvJyxcbiAgZXhwb3J0QXM6ICdkb2t1UmFkaW8nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3JhZGlvLmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogRE9LVV9SQURJTywgdXNlRXhpc3Rpbmc6IERva3VSYWRpbyB9XSxcbn0pXG5leHBvcnQgY2xhc3MgRG9rdVJhZGlvIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogQW5hbG9nIHRvIEhUTUwgJ25hbWUnIGF0dHJpYnV0ZSB1c2VkIHRvIGdyb3VwIHJhZGlvcyBmb3IgdW5pcXVlIHNlbGVjdGlvbi5cbiAgICogQGRlZmF1bHQgJ2QtcmFkaW8tbmFtZS1bbmV4dElkXScnXG4gICAqL1xuICBASW5wdXQoKSBuYW1lID0gYGQtcmFkaW8tbmFtZS0ke25leHRJZCsrfWA7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGlzIHJhZGlvIGJ1dHRvbi5cbiAgICogQGRlZmF1bHQgJydcbiAgICovXG4gIEBJbnB1dCgpIHZhbHVlID0gJyc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyByYWRpbyBidXR0b24gaXMgY2hlY2tlZC5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpIGNoZWNrZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcmFkaW8gYnV0dG9uIGlzIGRpc2FibGVkLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgdGhlIHJhZGlvIGJ1dHRvbiBpbmRpY2F0b3IuXG4gICAqIEBkZWZhdWx0ICdtZWRpdW0nXG4gICAqL1xuICBASW5wdXQoKSBzaXplOiAnbWVkaXVtJyB8ICdzbWFsbCcgPSAnbWVkaXVtJztcblxuICBAVmlld0NoaWxkKCdjb250YWluZXInKSBwcml2YXRlIGNvbnRhaW5lcj86IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2luZGljYXRvcicpIHByaXZhdGUgaW5kaWNhdG9yPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgQFZpZXdDaGlsZCgnbGFiZWwnKSBwcml2YXRlIGxhYmVsPzogRWxlbWVudFJlZjtcblxuICBAQ29udGVudENoaWxkKERva3VSYWRpb0N1c3RvbUFwcGVhcmFuY2UpXG4gIHByaXZhdGUgY3VzdG9tQXBwZWFyYW5jZT86IERva3VSYWRpb0N1c3RvbUFwcGVhcmFuY2U7XG5cbiAgQENvbnRlbnRDaGlsZChET0tVX1JBRElPX0JVSUxUX0lOX0FQUEVBUkFOQ0UpXG4gIHByaXZhdGUgYnVpbHRJbkFwcGVhcmFuY2U/OiBEb2t1UmFkaW9CdWlsdEluQXBwZWFyYW5jZTtcblxuICBwcm90ZWN0ZWQgY3VzdG9tQXBwZWFyYW5jZUNvbnRleHQgPSBuZXcgRG9rdVJhZGlvQ3VzdG9tQXBwZWFyYW5jZUNvbnRleHQoKTtcbiAgcHJvdGVjdGVkIGhhc0luZGljYXRvciA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgY2hlY2tlZENoYW5nZUNhbGxiYWNrPzogKHZhbHVlOiBzdHJpbmcsIGNoZWNrZWQ6IGJvb2xlYW4pID0+IHZvaWQ7XG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgUmVwbGF5U3ViamVjdCgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGFwcFJlZjogQXBwbGljYXRpb25SZWYsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIEBPcHRpb25hbCgpIEBIb3N0KCkgcHJpdmF0ZSByYWRpb0dyb3VwPzogRG9rdVJhZGlvR3JvdXBcbiAgKSB7fVxuXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICBwcm90ZWN0ZWQgZ2V0IGNsYXNzZXMoKTogTmdDbGFzc1snbmdDbGFzcyddIHtcbiAgICByZXR1cm4gWydkLXJhZGlvJywgYGQtcmFkaW8tJHt0aGlzLnNpemV9YF07XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGhhc0N1c3RvbUFwcGVhcmFuY2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5jdXN0b21BcHBlYXJhbmNlIHx8ICEhdGhpcy5idWlsdEluQXBwZWFyYW5jZTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgaWYgKHRoaXMuaGFzQ3VzdG9tQXBwZWFyYW5jZSkge1xuICAgICAgdGhpcy5jcmVhdGVBbmRBcHBlbmRDdXN0b21BcHBlYXJhbmNlKCk7XG4gICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAoKSA9PiB0aGlzLmFwcGVuZEluZGljYXRvcih7IGFwcGVuZENoaWxkVG86IHRoaXMuY29udGFpbmVyPy5uYXRpdmVFbGVtZW50LCBoaWRkZW46IHRydWUgfSksXG4gICAgICAgIDBcbiAgICAgICk7XG4gICAgICAodGhpcy5sYWJlbD8ubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCk/LnJlbW92ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFwcGVuZEluZGljYXRvcigpO1xuICAgIH1cblxuICAgIHRoaXMud2F0Y2hHcm91cENoYW5nZXMoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlQ3VzdG9tQXBwZWFyYW5jZUNvbnRleHQoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25DaGVja2VkQ2hhbmdlKGV2OiBFdmVudCkge1xuICAgIHRoaXMuY2hlY2tlZCA9IChldi50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZDtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgaWYgKHRoaXMuaGFzQ3VzdG9tQXBwZWFyYW5jZSkge1xuICAgICAgdGhpcy51cGRhdGVDdXN0b21BcHBlYXJhbmNlQ29udGV4dCgpO1xuICAgIH1cbiAgICB0aGlzLmNoZWNrZWRDaGFuZ2VDYWxsYmFjaz8uKHRoaXMudmFsdWUsIHRoaXMuY2hlY2tlZCk7XG4gIH1cblxuICBwcml2YXRlIGFwcGVuZEluZGljYXRvcihwcm9wcz86IHsgYXBwZW5kQ2hpbGRUbz86IEhUTUxFbGVtZW50OyBoaWRkZW4/OiBib29sZWFuIH0pIHtcbiAgICBpZiAoIXRoaXMuaW5kaWNhdG9yIHx8IHRoaXMuaGFzSW5kaWNhdG9yKSByZXR1cm47XG4gICAgY29uc3Qgdmlld1JlZiA9IHRoaXMuaW5kaWNhdG9yLmNyZWF0ZUVtYmVkZGVkVmlldyhudWxsKTtcbiAgICB0aGlzLmFwcFJlZi5hdHRhY2hWaWV3KHZpZXdSZWYpO1xuICAgIHZpZXdSZWYucm9vdE5vZGVzLmZvckVhY2goKG5vZGUpID0+IHtcbiAgICAgIGlmIChwcm9wcz8uaGlkZGVuKSB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKG5vZGUsICdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgIGlmIChwcm9wcz8uYXBwZW5kQ2hpbGRUbykge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHByb3BzLmFwcGVuZENoaWxkVG8sIG5vZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5pbnNlcnRCZWZvcmUodGhpcy5jb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQsIG5vZGUsIHRoaXMubGFiZWw/Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuaGFzSW5kaWNhdG9yID0gdHJ1ZTtcbiAgICB0aGlzLmRlc3Ryb3kkLnN1YnNjcmliZSgoKSA9PiB2aWV3UmVmLmRlc3Ryb3koKSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUFuZEFwcGVuZEN1c3RvbUFwcGVhcmFuY2UoKSB7XG4gICAgY29uc3QgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQgPVxuICAgICAgdGhpcy5jdXN0b21BcHBlYXJhbmNlPy50ZW1wbGF0ZVJlZiB8fCB0aGlzLmJ1aWx0SW5BcHBlYXJhbmNlPy50ZW1wbGF0ZT8udGVtcGxhdGVSZWY7XG4gICAgaWYgKCF0ZW1wbGF0ZVJlZikgcmV0dXJuO1xuXG4gICAgY29uc3Qgdmlld1JlZiA9IHRlbXBsYXRlUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLmN1c3RvbUFwcGVhcmFuY2VDb250ZXh0KTtcbiAgICB0aGlzLmFwcFJlZi5hdHRhY2hWaWV3KHZpZXdSZWYpO1xuICAgIHZpZXdSZWYucm9vdE5vZGVzLmZvckVhY2goKG5vZGUpID0+IHtcbiAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5jb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQsIG5vZGUpO1xuICAgIH0pO1xuICAgIHRoaXMuZGVzdHJveSQuc3Vic2NyaWJlKCgpID0+IHZpZXdSZWYuZGVzdHJveSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ3VzdG9tQXBwZWFyYW5jZUNvbnRleHQoKSB7XG4gICAgdGhpcy5jdXN0b21BcHBlYXJhbmNlQ29udGV4dC5jaGVja2VkID0gdGhpcy5jaGVja2VkO1xuICAgIHRoaXMuY3VzdG9tQXBwZWFyYW5jZUNvbnRleHQuZGlzYWJsZWQgPSB0aGlzLmRpc2FibGVkO1xuICAgIHRoaXMuY3VzdG9tQXBwZWFyYW5jZUNvbnRleHQudmFsdWUgPSB0aGlzLnZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSB3YXRjaEdyb3VwQ2hhbmdlcygpIHtcbiAgICB0aGlzLnJhZGlvR3JvdXA/LlsnX25vdGlmeUNoYW5nZXMkJ10ucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmNoZWNrZWQgPSB0aGlzLnZhbHVlID09PSB0aGlzLnJhZGlvR3JvdXA/LnZhbHVlO1xuICAgICAgdGhpcy5kaXNhYmxlZCA9IHRoaXMuZGlzYWJsZWQgfHwgISF0aGlzLnJhZGlvR3JvdXA/LmRpc2FibGVkO1xuICAgICAgdGhpcy51cGRhdGVDdXN0b21BcHBlYXJhbmNlQ29udGV4dCgpO1xuICAgIH0pO1xuICB9XG59XG4iLCI8bGFiZWwgI2NvbnRhaW5lciBjbGFzcz1cImQtcmFkaW8tY29udGFpbmVyXCI+XG4gIDxzcGFuICNsYWJlbCBjbGFzcz1cImQtcmFkaW8tbGFiZWxcIj48bmctY29udGVudD48L25nLWNvbnRlbnQ+PC9zcGFuPlxuPC9sYWJlbD5cblxuPG5nLXRlbXBsYXRlICNpbmRpY2F0b3I+XG4gIDxpbnB1dFxuICAgIHR5cGU9XCJyYWRpb1wiXG4gICAgY2xhc3M9XCJkLXJhZGlvLWlucHV0XCJcbiAgICBbbmFtZV09XCJuYW1lXCJcbiAgICBbdmFsdWVdPVwidmFsdWVcIlxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgW2NoZWNrZWRdPVwiY2hlY2tlZFwiXG4gICAgKGNoYW5nZSk9XCJvbkNoZWNrZWRDaGFuZ2UoJGV2ZW50KVwiXG4gIC8+XG48L25nLXRlbXBsYXRlPlxuIl19