UNPKG

@taiga-ui/kit

Version:

Taiga UI Angular main components kit

139 lines 22 kB
import { computed, Directive, effect, inject, Input, isSignal, signal, untracked, } from '@angular/core'; import { tuiAsControl, TuiControl } from '@taiga-ui/cdk/classes'; import { TUI_ALLOW_SIGNAL_WRITES, TUI_STRICT_MATCHER } from '@taiga-ui/cdk/constants'; import { tuiAsOptionContent, } from '@taiga-ui/core/components/data-list'; import { tuiAsTextfieldAccessor, tuiInjectAuxiliary, TuiTextfieldComponent, TuiTextfieldDirective, TuiWithTextfield, } from '@taiga-ui/core/components/textfield'; import { TuiDropdownDirective, tuiDropdownEnabled, tuiDropdownOpen, } from '@taiga-ui/core/directives/dropdown'; import { TUI_ITEMS_HANDLERS, } from '@taiga-ui/core/directives/items-handlers'; import { TuiSelectOption } from '@taiga-ui/kit/components/select'; import * as i0 from "@angular/core"; import * as i1 from "@taiga-ui/core/components/textfield"; class TuiComboBox extends TuiControl { constructor() { super(...arguments); this.host = inject(TuiTextfieldComponent); this.textfield = inject(TuiTextfieldDirective); this.open = tuiDropdownOpen(); this.dropdownEnabled = tuiDropdownEnabled(this.interactive); this.dropdown = inject(TuiDropdownDirective); this.handlers = inject(TUI_ITEMS_HANDLERS); this.matcher = signal(TUI_STRICT_MATCHER); this.strict = signal(true); this.datalist = tuiInjectAuxiliary((x) => x !== this && 'options' in x && isSignal(x.options)); this.options = computed(() => this.datalist() ?.options?.() // TODO(v5): remove optional call `?.()` .filter((x) => !this.handlers.disabledItemHandler()(x)) ?? []); this.nonStrictControlEffect = effect(() => { if (!this.options().length && !this.strict() && this.stringify(this.value()) !== this.textfield.value()) { this.onChange(this.textfield.value() || null); } }, TUI_ALLOW_SIGNAL_WRITES); this.matchingEffect = effect(() => { const options = this.options(); const matcher = this.matcher(); if (!options.length || !matcher) { return; } const textfieldValue = this.textfield.value(); const selectedOption = options.find((x) => matcher(x, textfieldValue, this.handlers.stringify())); const value = untracked(() => this.value()); const unchanged = this.stringify(value) === textfieldValue; const fallback = this.strict() || !textfieldValue ? null : textfieldValue; this.onChange(selectedOption ?? /** * Don't clear already not-null form control value on new `this.options()` array. * Otherwise, `ComboBox` becomes incompatible with virtual scroll * (which displays large lists of elements by only rendering the items that fit on-screen). * Users can still able to patch form value with `null` on new items if they wish the such behavior. */ (unchanged ? value : fallback)); }, TUI_ALLOW_SIGNAL_WRITES); this.newValueEffect = effect(() => { const stringified = this.stringify(this.value()); this.textfield.value.update((x) => stringified || x); }, TUI_ALLOW_SIGNAL_WRITES); this.blurEffect = effect(() => { const incomplete = untracked(() => this.strict() && this.value() === null); if (!this.host.focused() && incomplete) { this.textfield.value.set(''); } }, TUI_ALLOW_SIGNAL_WRITES); } // TODO(v5): use signal input set strictSetter(x) { this.strict.set(x); } // TODO(v5): use signal input set matcherSetter(x) { this.matcher.set(x); } setValue(value) { this.textfield.setValue(value); this.onChange(value); if (!value) { this.toggleDropdown(true); } } writeValue(value) { const reset = this.control.pristine && this.control.untouched && !value; const changed = untracked(() => value !== this.value()); if (changed || reset) { super.writeValue(value); untracked(() => this.textfield.value.set(this.stringify(value))); } } toggleDropdown(open = !this.open()) { if (this.dropdownEnabled() && this.dropdown._content()) { this.open.set(open); } } keydownEnter(event) { if (!this.open()) { return; } event.preventDefault(); const options = this.options(); if (options.length === 1 && options[0]) { this.setValue(options[0]); this.toggleDropdown(false); } } stringify(value) { return value != null ? this.handlers.stringify()(value) : ''; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiComboBox, deps: null, target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: TuiComboBox, isStandalone: true, selector: "input[tuiComboBox]", inputs: { strictSetter: ["strict", "strictSetter"], matcherSetter: ["matcher", "matcherSetter"] }, host: { listeners: { "click": "toggleDropdown()", "input": "toggleDropdown(true)", "keydown.enter": "keydownEnter($event)" }, properties: { "disabled": "disabled()" } }, providers: [ tuiAsOptionContent(TuiSelectOption), tuiAsTextfieldAccessor(TuiComboBox), tuiAsControl(TuiComboBox), ], usesInheritance: true, hostDirectives: [{ directive: i1.TuiWithTextfield }], ngImport: i0 }); } } export { TuiComboBox }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiComboBox, decorators: [{ type: Directive, args: [{ standalone: true, selector: 'input[tuiComboBox]', providers: [ tuiAsOptionContent(TuiSelectOption), tuiAsTextfieldAccessor(TuiComboBox), tuiAsControl(TuiComboBox), ], hostDirectives: [TuiWithTextfield], host: { '[disabled]': 'disabled()', '(click)': 'toggleDropdown()', '(input)': 'toggleDropdown(true)', '(keydown.enter)': 'keydownEnter($event)', }, }] }], propDecorators: { strictSetter: [{ type: Input, args: ['strict'] }], matcherSetter: [{ type: Input, args: ['matcher'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm8tYm94LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tpdC9jb21wb25lbnRzL2NvbWJvLWJveC9jb21iby1ib3guZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxRQUFRLEVBQ1IsU0FBUyxFQUNULE1BQU0sRUFDTixNQUFNLEVBQ04sS0FBSyxFQUNMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxZQUFZLEVBQUUsVUFBVSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDL0QsT0FBTyxFQUFDLHVCQUF1QixFQUFFLGtCQUFrQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFFcEYsT0FBTyxFQUNILGtCQUFrQixHQUVyQixNQUFNLHFDQUFxQyxDQUFDO0FBQzdDLE9BQU8sRUFDSCxzQkFBc0IsRUFDdEIsa0JBQWtCLEVBRWxCLHFCQUFxQixFQUNyQixxQkFBcUIsRUFDckIsZ0JBQWdCLEdBQ25CLE1BQU0scUNBQXFDLENBQUM7QUFDN0MsT0FBTyxFQUNILG9CQUFvQixFQUNwQixrQkFBa0IsRUFDbEIsZUFBZSxHQUNsQixNQUFNLG9DQUFvQyxDQUFDO0FBQzVDLE9BQU8sRUFDSCxrQkFBa0IsR0FFckIsTUFBTSwwQ0FBMEMsQ0FBQztBQUNsRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0saUNBQWlDLENBQUM7OztBQUVoRSxNQWdCYSxXQUNULFNBQVEsVUFBNkI7SUFqQnpDOztRQW9CcUIsU0FBSSxHQUE2QixNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUMvRCxjQUFTLEdBQTZCLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3BFLFNBQUksR0FBRyxlQUFlLEVBQUUsQ0FBQztRQUN6QixvQkFBZSxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMs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QUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ2pFLENBQUM7K0dBbElRLFdBQVc7bUdBQVgsV0FBVyw4VUFiVDtZQUNQLGtCQUFrQixDQUFDLGVBQWUsQ0FBQztZQUNuQyxzQkFBc0IsQ0FBQyxXQUFXLENBQUM7WUFDbkMsWUFBWSxDQUFDLFdBQVcsQ0FBQztTQUM1Qjs7U0FTUSxXQUFXOzRGQUFYLFdBQVc7a0JBaEJ2QixTQUFTO21CQUFDO29CQUNQLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUUsb0JBQW9CO29CQUM5QixTQUFTLEVBQUU7d0JBQ1Asa0JBQWtCLENBQUMsZUFBZSxDQUFDO3dCQUNuQyxzQkFBc0IsYUFBYTt3QkFDbkMsWUFBWSxhQUFhO3FCQUM1QjtvQkFDRCxjQUFjLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztvQkFDbEMsSUFBSSxFQUFFO3dCQUNGLFlBQVksRUFBRSxZQUFZO3dCQUMxQixTQUFTLEVBQUUsa0JBQWtCO3dCQUM3QixTQUFTLEVBQUUsc0JBQXNCO3dCQUNqQyxpQkFBaUIsRUFBRSxzQkFBc0I7cUJBQzVDO2lCQUNKOzhCQStFYyxZQUFZO3NCQUR0QixLQUFLO3VCQUFDLFFBQVE7Z0JBT0osYUFBYTtzQkFEdkIsS0FBSzt1QkFBQyxTQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBjb21wdXRlZCxcbiAgICBEaXJlY3RpdmUsXG4gICAgZWZmZWN0LFxuICAgIGluamVjdCxcbiAgICBJbnB1dCxcbiAgICBpc1NpZ25hbCxcbiAgICBzaWduYWwsXG4gICAgdW50cmFja2VkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7dHVpQXNDb250cm9sLCBUdWlDb250cm9sfSBmcm9tICdAdGFpZ2EtdWkvY2RrL2NsYXNzZXMnO1xuaW1wb3J0IHtUVUlfQUxMT1dfU0lHTkFMX1dSSVRFUywgVFVJX1NUUklDVF9NQVRDSEVSfSBmcm9tICdAdGFpZ2EtdWkvY2RrL2NvbnN0YW50cyc7XG5pbXBvcnQge3R5cGUgVHVpU3RyaW5nTWF0Y2hlcn0gZnJvbSAnQHRhaWdhLXVpL2Nkay90eXBlcyc7XG5pbXBvcnQge1xuICAgIHR1aUFzT3B0aW9uQ29udGVudCxcbiAgICB0eXBlIFR1aURhdGFMaXN0QWNjZXNzb3IsXG59IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvZGF0YS1saXN0JztcbmltcG9ydCB7XG4gICAgdHVpQXNUZXh0ZmllbGRBY2Nlc3NvcixcbiAgICB0dWlJbmplY3RBdXhpbGlhcnksXG4gICAgdHlwZSBUdWlUZXh0ZmllbGRBY2Nlc3NvcixcbiAgICBUdWlUZXh0ZmllbGRDb21wb25lbnQsXG4gICAgVHVpVGV4dGZpZWxkRGlyZWN0aXZlLFxuICAgIFR1aVdpdGhUZXh0ZmllbGQsXG59IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvdGV4dGZpZWxkJztcbmltcG9ydCB7XG4gICAgVHVpRHJvcGRvd25EaXJlY3RpdmUsXG4gICAgdHVpRHJvcGRvd25FbmFibGVkLFxuICAgIHR1aURyb3Bkb3duT3Blbixcbn0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvZGlyZWN0aXZlcy9kcm9wZG93bic7XG5pbXBvcnQge1xuICAgIFRVSV9JVEVNU19IQU5ETEVSUyxcbiAgICB0eXBlIFR1aUl0ZW1zSGFuZGxlcnMsXG59IGZyb20gJ0B0YWlnYS11aS9jb3JlL2RpcmVjdGl2ZXMvaXRlbXMtaGFuZGxlcnMnO1xuaW1wb3J0IHtUdWlTZWxlY3RPcHRpb259IGZyb20gJ0B0YWlnYS11aS9raXQvY29tcG9uZW50cy9zZWxlY3QnO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAnaW5wdXRbdHVpQ29tYm9Cb3hdJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgdHVpQXNPcHRpb25Db250ZW50KFR1aVNlbGVjdE9wdGlvbiksXG4gICAgICAgIHR1aUFzVGV4dGZpZWxkQWNjZXNzb3IoVHVpQ29tYm9Cb3gpLFxuICAgICAgICB0dWlBc0NvbnRyb2woVHVpQ29tYm9Cb3gpLFxuICAgIF0sXG4gICAgaG9zdERpcmVjdGl2ZXM6IFtUdWlXaXRoVGV4dGZpZWxkXSxcbiAgICBob3N0OiB7XG4gICAgICAgICdbZGlzYWJsZWRdJzogJ2Rpc2FibGVkKCknLFxuICAgICAgICAnKGNsaWNrKSc6ICd0b2dnbGVEcm9wZG93bigpJyxcbiAgICAgICAgJyhpbnB1dCknOiAndG9nZ2xlRHJvcGRvd24odHJ1ZSknLFxuICAgICAgICAnKGtleWRvd24uZW50ZXIpJzogJ2tleWRvd25FbnRlcigkZXZlbnQpJyxcbiAgICB9LFxufSlcbmV4cG9ydCBjbGFzcyBUdWlDb21ib0JveDxUPlxuICAgIGV4dGVuZHMgVHVpQ29udHJvbDxUIHwgc3RyaW5nIHwgbnVsbD5cbiAgICBpbXBsZW1lbnRzIFR1aVRleHRmaWVsZEFjY2Vzc29yPFQ+XG57XG4gICAgcHJpdmF0ZSByZWFkb25seSBob3N0OiBUdWlUZXh0ZmllbGRDb21wb25lbnQ8VD4gPSBpbmplY3QoVHVpVGV4dGZpZWxkQ29tcG9uZW50KTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRleHRmaWVsZDogVHVpVGV4dGZpZWxkRGlyZWN0aXZlPFQ+ID0gaW5qZWN0KFR1aVRleHRmaWVsZERpcmVjdGl2ZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBvcGVuID0gdHVpRHJvcGRvd25PcGVuKCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkcm9wZG93bkVuYWJsZWQgPSB0dWlEcm9wZG93bkVuYWJsZWQodGhpcy5pbnRlcmFjdGl2ZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkcm9wZG93biA9IGluamVjdChUdWlEcm9wZG93bkRpcmVjdGl2ZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVyczogVHVpSXRlbXNIYW5kbGVyczxUIHwgc3RyaW5nPiA9IGluamVjdChUVUlfSVRFTVNfSEFORExFUlMpO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBtYXRjaGVyID0gc2lnbmFsPFR1aVN0cmluZ01hdGNoZXI8VD4gfCBudWxsPihUVUlfU1RSSUNUX01BVENIRVIpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaWN0ID0gc2lnbmFsKHRydWUpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGF0YWxpc3QgPSB0dWlJbmplY3RBdXhpbGlhcnk8VHVpRGF0YUxpc3RBY2Nlc3NvcjxUPj4oXG4gICAgICAgICh4KSA9PiB4ICE9PSB0aGlzICYmICdvcHRpb25zJyBpbiB4ICYmIGlzU2lnbmFsKHgub3B0aW9ucyksXG4gICAgKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9ucyA9IGNvbXB1dGVkKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgICAgdGhpcy5kYXRhbGlzdCgpXG4gICAgICAgICAgICAgICAgPy5vcHRpb25zPy4oKSAvLyBUT0RPKHY1KTogcmVtb3ZlIG9wdGlvbmFsIGNhbGwgYD8uKClgXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoeCkgPT4gIXRoaXMuaGFuZGxlcnMuZGlzYWJsZWRJdGVtSGFuZGxlcigpKHgpKSA/PyBbXSxcbiAgICApO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG5vblN0cmljdENvbnRyb2xFZmZlY3QgPSBlZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhdGhpcy5vcHRpb25zKCkubGVuZ3RoICYmXG4gICAgICAgICAgICAhdGhpcy5zdHJpY3QoKSAmJlxuICAgICAgICAgICAgdGhpcy5zdHJpbmdpZnkodGhpcy52YWx1ZSgpKSAhPT0gdGhpcy50ZXh0ZmllbGQudmFsdWUoKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy50ZXh0ZmllbGQudmFsdWUoKSB8fCBudWxsKTtcbiAgICAgICAgfVxuICAgIH0sIFRVSV9BTExPV19TSUdOQUxfV1JJVEVTKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBtYXRjaGluZ0VmZmVjdCA9IGVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMoKTtcbiAgICAgICAgY29uc3QgbWF0Y2hlciA9IHRoaXMubWF0Y2hlcigpO1xuXG4gICAgICAgIGlmICghb3B0aW9ucy5sZW5ndGggfHwgIW1hdGNoZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRleHRmaWVsZFZhbHVlID0gdGhpcy50ZXh0ZmllbGQudmFsdWUoKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRPcHRpb24gPSBvcHRpb25zLmZpbmQoKHgpID0+XG4gICAgICAgICAgICBtYXRjaGVyKHgsIHRleHRmaWVsZFZhbHVlLCB0aGlzLmhhbmRsZXJzLnN0cmluZ2lmeSgpKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB1bnRyYWNrZWQoKCkgPT4gdGhpcy52YWx1ZSgpKTtcbiAgICAgICAgY29uc3QgdW5jaGFuZ2VkID0gdGhpcy5zdHJpbmdpZnkodmFsdWUpID09PSB0ZXh0ZmllbGRWYWx1ZTtcbiAgICAgICAgY29uc3QgZmFsbGJhY2sgPSB0aGlzLnN0cmljdCgpIHx8ICF0ZXh0ZmllbGRWYWx1ZSA/IG51bGwgOiB0ZXh0ZmllbGRWYWx1ZTtcblxuICAgICAgICB0aGlzLm9uQ2hhbmdlKFxuICAgICAgICAgICAgc2VsZWN0ZWRPcHRpb24gPz9cbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBEb24ndCBjbGVhciBhbHJlYWR5IG5vdC1udWxsIGZvcm0gY29udHJvbCB2YWx1ZSBvbiBuZXcgYHRoaXMub3B0aW9ucygpYCBhcnJheS5cbiAgICAgICAgICAgICAgICAgKiBPdGhlcndpc2UsIGBDb21ib0JveGAgYmVjb21lcyBpbmNvbXBhdGlibGUgd2l0aCB2aXJ0dWFsIHNjcm9sbFxuICAgICAgICAgICAgICAgICAqICh3aGljaCBkaXNwbGF5cyBsYXJnZSBsaXN0cyBvZiBlbGVtZW50cyBieSBvbmx5IHJlbmRlcmluZyB0aGUgaXRlbXMgdGhhdCBmaXQgb24tc2NyZWVuKS5cbiAgICAgICAgICAgICAgICAgKiBVc2VycyBjYW4gc3RpbGwgYWJsZSB0byBwYXRjaCBmb3JtIHZhbHVlIHdpdGggYG51bGxgIG9uIG5ldyBpdGVtcyBpZiB0aGV5IHdpc2ggdGhlIHN1Y2ggYmVoYXZpb3IuXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgKHVuY2hhbmdlZCA/IHZhbHVlIDogZmFsbGJhY2spLFxuICAgICAgICApO1xuICAgIH0sIFRVSV9BTExPV19TSUdOQUxfV1JJVEVTKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBuZXdWYWx1ZUVmZmVjdCA9IGVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0cmluZ2lmaWVkID0gdGhpcy5zdHJpbmdpZnkodGhpcy52YWx1ZSgpKTtcblxuICAgICAgICB0aGlzLnRleHRmaWVsZC52YWx1ZS51cGRhdGUoKHgpID0+IHN0cmluZ2lmaWVkIHx8IHgpO1xuICAgIH0sIFRVSV9BTExPV19TSUdOQUxfV1JJVEVTKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBibHVyRWZmZWN0ID0gZWZmZWN0KCgpID0+IHtcbiAgICAgICAgY29uc3QgaW5jb21wbGV0ZSA9IHVudHJhY2tlZCgoKSA9PiB0aGlzLnN0cmljdCgpICYmIHRoaXMudmFsdWUoKSA9PT0gbnVsbCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmhvc3QuZm9jdXNlZCgpICYmIGluY29tcGxldGUpIHtcbiAgICAgICAgICAgIHRoaXMudGV4dGZpZWxkLnZhbHVlLnNldCgnJyk7XG4gICAgICAgIH1cbiAgICB9LCBUVUlfQUxMT1dfU0lHTkFMX1dSSVRFUyk7XG5cbiAgICAvLyBUT0RPKHY1KTogdXNlIHNpZ25hbCBpbnB1dFxuICAgIEBJbnB1dCgnc3RyaWN0JylcbiAgICBwdWJsaWMgc2V0IHN0cmljdFNldHRlcih4OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc3RyaWN0LnNldCh4KTtcbiAgICB9XG5cbiAgICAvLyBUT0RPKHY1KTogdXNlIHNpZ25hbCBpbnB1dFxuICAgIEBJbnB1dCgnbWF0Y2hlcicpXG4gICAgcHVibGljIHNldCBtYXRjaGVyU2V0dGVyKHg6IFR1aVN0cmluZ01hdGNoZXI8VD4gfCBudWxsKSB7XG4gICAgICAgIHRoaXMubWF0Y2hlci5zZXQoeCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFZhbHVlKHZhbHVlOiBUIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRleHRmaWVsZC5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMub25DaGFuZ2UodmFsdWUpO1xuXG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlRHJvcGRvd24odHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgd3JpdGVWYWx1ZSh2YWx1ZTogVCB8IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVzZXQgPSB0aGlzLmNvbnRyb2wucHJpc3RpbmUgJiYgdGhpcy5jb250cm9sLnVudG91Y2hlZCAmJiAhdmFsdWU7XG4gICAgICAgIGNvbnN0IGNoYW5nZWQgPSB1bnRyYWNrZWQoKCkgPT4gdmFsdWUgIT09IHRoaXMudmFsdWUoKSk7XG5cbiAgICAgICAgaWYgKGNoYW5nZWQgfHwgcmVzZXQpIHtcbiAgICAgICAgICAgIHN1cGVyLndyaXRlVmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgdW50cmFja2VkKCgpID0+IHRoaXMudGV4dGZpZWxkLnZhbHVlLnNldCh0aGlzLnN0cmluZ2lmeSh2YWx1ZSkpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCB0b2dnbGVEcm9wZG93bihvcGVuID0gIXRoaXMub3BlbigpKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRyb3Bkb3duRW5hYmxlZCgpICYmIHRoaXMuZHJvcGRvd24uX2NvbnRlbnQoKSkge1xuICAgICAgICAgICAgdGhpcy5vcGVuLnNldChvcGVuKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBrZXlkb3duRW50ZXIoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLm9wZW4oKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zKCk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID09PSAxICYmIG9wdGlvbnNbMF0pIHtcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUob3B0aW9uc1swXSk7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZURyb3Bkb3duKGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RyaW5naWZ5KHZhbHVlPzogVCB8IHN0cmluZyB8IG51bGwpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCA/IHRoaXMuaGFuZGxlcnMuc3RyaW5naWZ5KCkodmFsdWUpIDogJyc7XG4gICAgfVxufVxuIl19