UNPKG

theme-lib

Version:

This is a simple example Angular Library published to npm.

225 lines 17 kB
/** * @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 { Component, ContentChildren, HostBinding, Input, QueryList, } from '@angular/core'; import { NbStepComponent } from './step.component'; /** @enum {string} */ const NbStepperOrientation = { VERTICAL: 'vertical', HORIZONTAL: 'horizontal', }; export { NbStepperOrientation }; /* * Stepper component * * @stacked-example(Showcase, stepper/stepper-showcase.component) * * ### Installation * * Import `NbStepperModule` to your feature module. * ```ts * @NgModule({ * imports: [ * // ... * NbStepperModule, * ], * }) * export class PageModule { } * ``` * ### Usage * * If step label is string you can pass it as `label` attribute. Otherwise ng-template should be used: * ```html * // ... * <nb-stepper orientation="horizontal"> * <nb-step label="step number one"> * // ... step content here * <nb-step> * <nb-step label="stepLabel"> * <ng-template #stepLabel> * <div> * step number two * </div> * </ng-template> * // ... step content here * <nb-step> * </nb-stepper> * ``` * Specify `[stepControl]="form"` and user can navigates only if submit previous step's form. * ```html * // ... * <nb-stepper orientation="horizontal"> * <nb-step label="step number one" [stepControl]="form"> * <form [formGroup]="form"> * // ... * </form> * <nb-step> * // ... * </nb-stepper> * ``` * * @stacked-example(Validation, stepper/stepper-validation.component) * * Stepper component has two layout options - `vertical` & `horizontal` * @stacked-example(Vertical, stepper/stepper-vertical.component) * * @styles * * stepper-index-size: * stepper-label-font-size: * stepper-label-font-weight: * stepper-accent-color: * stepper-completed-fg: * stepper-fg: * stepper-completed-icon-size: * stepper-completed-icon-weight: */ export class NbStepperComponent { constructor() { /* * Stepper orientation - `horizontal`|`vertical` * @type {string} */ this.orientation = NbStepperOrientation.HORIZONTAL; this.index = 0; } /** * @return {?} */ get vertical() { return this.orientation === NbStepperOrientation.VERTICAL; } /** * @return {?} */ get horizontal() { return this.orientation === NbStepperOrientation.HORIZONTAL; } /* * Selected step index * * @type {boolean} */ /** * @return {?} */ get selectedIndex() { return this.index; } /** * @param {?} index * @return {?} */ set selectedIndex(index) { if (this.steps) { if (this.index !== index && this.isStepValid(index)) { this.index = index; } } else { this.index = index; } } /* * Selected step component * * @type {boolean} */ /** * @return {?} */ get selected() { return this.steps ? this.steps.toArray()[this.selectedIndex] : undefined; } /** * @param {?} step * @return {?} */ set selected(step) { this.selectedIndex = this.steps ? this.steps.toArray().indexOf(step) : -1; } /* * Navigate to next step * */ /** * @return {?} */ next() { this.selectedIndex = Math.min(this.index + 1, this.steps.length - 1); } /* * Navigate to previous step * */ /** * @return {?} */ previous() { this.selectedIndex = Math.max(this.index - 1, 0); } /* * Reset stepper and stepControls to initial state * */ /** * @return {?} */ reset() { this.selectedIndex = 0; this.steps.forEach(step => step.reset()); } /** * @param {?} step * @return {?} */ isStepSelected(step) { return this.index === this.steps.toArray().indexOf(step); } /** * @private * @param {?} index * @return {?} */ isStepValid(index) { /** @type {?} */ const steps = this.steps.toArray(); steps[this.index].interacted = true; if (index >= this.index && index > 0) { /** @type {?} */ const currentStep = steps[this.index]; return currentStep.completed; } return true; } } NbStepperComponent.decorators = [ { type: Component, args: [{ selector: 'nb-stepper', template: "<ng-template><ng-content select=\"nb-step\"></ng-content></ng-template>\r\n<div class=\"header\">\r\n <ng-container *ngFor=\"let step of steps; let index = index; let first = first\">\r\n\r\n <div *ngIf=\"!first && !step.hidden\"\r\n [class.connector-past]=\"index < selectedIndex\"\r\n class=\"connector\"></div>\r\n\r\n <div *ngIf=\"!step.hidden\" class=\"step\"\r\n [class.selected]=\"isStepSelected(step)\"\r\n [class.completed]=\"!isStepSelected(step) && step.completed\"\r\n (click)=\"step.select()\">\r\n <div class=\"label-index\">\r\n <span *ngIf=\"!step.completed || isStepSelected(step)\">{{ index + 1 }}</span>\r\n <i *ngIf=\"!isStepSelected(step) && step.completed\" class=\"icon nb-checkmark\"></i>\r\n </div>\r\n <div class=\"label\">\r\n <ng-container *ngIf=\"step.isLabelTemplate\">\r\n <ng-container *ngTemplateOutlet=\"step.label\"></ng-container>\r\n </ng-container>\r\n <span *ngIf=\"!step.isLabelTemplate\">{{ step.label }}</span>\r\n </div>\r\n </div>\r\n </ng-container>\r\n</div>\r\n<div class=\"step-content\">\r\n <ng-container [ngTemplateOutlet]=\"selected?.content\"></ng-container>\r\n</div>\r\n", styles: [":host.horizontal .header .step{flex-direction:column}:host.horizontal .header .connector{height:2px}:host.vertical{display:flex;height:100%}:host.vertical .header{flex-direction:column}:host.vertical .header .label{margin:0 10px}:host.vertical .header .connector{width:2px}.header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:10px}.header .connector{flex:auto}.header .step{display:flex;align-items:center;cursor:pointer}.header .label-index{margin-bottom:10px;display:flex;justify-content:center;align-items:center}.header .label{width:-webkit-max-content;width:-moz-max-content;width:max-content}"] }] } ]; NbStepperComponent.propDecorators = { steps: [{ type: ContentChildren, args: [NbStepComponent,] }], vertical: [{ type: HostBinding, args: ['class.vertical',] }], horizontal: [{ type: HostBinding, args: ['class.horizontal',] }], selectedIndex: [{ type: Input }], selected: [{ type: Input }], orientation: [{ type: Input }] }; if (false) { /** @type {?} */ NbStepperComponent.prototype.steps; /** @type {?} */ NbStepperComponent.prototype.orientation; /** * @type {?} * @private */ NbStepperComponent.prototype.index; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcHBlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly90aGVtZS1saWIvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9zdGVwcGVyL3N0ZXBwZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQU1BLE9BQU8sRUFDTCxTQUFTLEVBQ1QsZUFBZSxFQUFFLFdBQVcsRUFDNUIsS0FBSyxFQUNMLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7OztJQUdqRCxVQUFXLFVBQVU7SUFDckIsWUFBYSxZQUFZOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXlFM0IsTUFBTSxPQUFPLGtCQUFrQjtJQUwvQjs7Ozs7UUF5RFcsZ0JBQVcsR0FBVyxvQkFBb0IsQ0FBQyxVQUFVLENBQUM7UUFFdkQsVUFBSyxHQUFHLENBQUMsQ0FBQztJQXdDcEIsQ0FBQzs7OztJQTFGQyxJQUNJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxXQUFXLEtBQUssb0JBQW9CLENBQUMsUUFBUSxDQUFDO0lBQzVELENBQUM7Ozs7SUFFRCxJQUNJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxXQUFXLEtBQUssb0JBQW9CLENBQUMsVUFBVSxDQUFDO0lBQzlELENBQUM7Ozs7Ozs7OztJQU9ELElBQ0ksYUFBYTtRQUNmLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDOzs7OztJQUVELElBQUksYUFBYSxDQUFDLEtBQWE7UUFDN0IsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2QsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNuRCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQzthQUNwQjtTQUNGO2FBQU07WUFDTCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztTQUNwQjtJQUNILENBQUM7Ozs7Ozs7OztJQU9ELElBQ0ksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUMzRSxDQUFDOzs7OztJQUVELElBQUksUUFBUSxDQUFDLElBQXFCO1FBQ2hDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVFLENBQUM7Ozs7Ozs7SUFhRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7Ozs7Ozs7SUFLRCxRQUFRO1FBQ04sSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25ELENBQUM7Ozs7Ozs7SUFLRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUMzQyxDQUFDOzs7OztJQUVELGNBQWMsQ0FBQyxJQUFxQjtRQUNsQyxPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0QsQ0FBQzs7Ozs7O0lBRU8sV0FBVyxDQUFDLEtBQWE7O2NBQ3pCLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRTtRQUVsQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFFcEMsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFOztrQkFDOUIsV0FBVyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ3JDLE9BQU8sV0FBVyxDQUFDLFNBQVMsQ0FBQztTQUM5QjtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7O1lBbEdGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsWUFBWTtnQkFFdEIscXVDQUF1Qzs7YUFDeEM7OztvQkFHRSxlQUFlLFNBQUMsZUFBZTt1QkFFL0IsV0FBVyxTQUFDLGdCQUFnQjt5QkFLNUIsV0FBVyxTQUFDLGtCQUFrQjs0QkFVOUIsS0FBSzt1QkFvQkwsS0FBSzswQkFhTCxLQUFLOzs7O0lBbEROLG1DQUFvRTs7SUFrRHBFLHlDQUErRDs7Ozs7SUFFL0QsbUNBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IEFrdmVvLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG4gKi9cclxuXHJcbmltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIENvbnRlbnRDaGlsZHJlbiwgSG9zdEJpbmRpbmcsXHJcbiAgSW5wdXQsXHJcbiAgUXVlcnlMaXN0LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBOYlN0ZXBDb21wb25lbnQgfSBmcm9tICcuL3N0ZXAuY29tcG9uZW50JztcclxuXHJcbmV4cG9ydCBlbnVtIE5iU3RlcHBlck9yaWVudGF0aW9uIHtcclxuICBWRVJUSUNBTCA9ICd2ZXJ0aWNhbCcsXHJcbiAgSE9SSVpPTlRBTCA9ICdob3Jpem9udGFsJyxcclxufVxyXG5cclxuLypcclxuICogU3RlcHBlciBjb21wb25lbnRcclxuICpcclxuICogQHN0YWNrZWQtZXhhbXBsZShTaG93Y2FzZSwgc3RlcHBlci9zdGVwcGVyLXNob3djYXNlLmNvbXBvbmVudClcclxuICpcclxuICogIyMjIEluc3RhbGxhdGlvblxyXG4gKlxyXG4gKiBJbXBvcnQgYE5iU3RlcHBlck1vZHVsZWAgdG8geW91ciBmZWF0dXJlIG1vZHVsZS5cclxuICogYGBgdHNcclxuICogQE5nTW9kdWxlKHtcclxuICogICBpbXBvcnRzOiBbXHJcbiAqICAgXHQvLyAuLi5cclxuICogICAgIE5iU3RlcHBlck1vZHVsZSxcclxuICogICBdLFxyXG4gKiB9KVxyXG4gKiBleHBvcnQgY2xhc3MgUGFnZU1vZHVsZSB7IH1cclxuICogYGBgXHJcbiAqICMjIyBVc2FnZVxyXG4gKlxyXG4gKiBJZiBzdGVwIGxhYmVsIGlzIHN0cmluZyB5b3UgY2FuIHBhc3MgaXQgYXMgYGxhYmVsYCBhdHRyaWJ1dGUuIE90aGVyd2lzZSBuZy10ZW1wbGF0ZSBzaG91bGQgYmUgdXNlZDpcclxuICogYGBgaHRtbFxyXG4gKiAvLyAuLi5cclxuICogPG5iLXN0ZXBwZXIgb3JpZW50YXRpb249XCJob3Jpem9udGFsXCI+XHJcbiAqICAgPG5iLXN0ZXAgbGFiZWw9XCJzdGVwIG51bWJlciBvbmVcIj5cclxuICogICAgICAgLy8gLi4uIHN0ZXAgY29udGVudCBoZXJlXHJcbiAqICAgPG5iLXN0ZXA+XHJcbiAqICAgPG5iLXN0ZXAgbGFiZWw9XCJzdGVwTGFiZWxcIj5cclxuICogICAgICAgPG5nLXRlbXBsYXRlICNzdGVwTGFiZWw+XHJcbiAqICAgICAgICAgICA8ZGl2PlxyXG4gKiAgICAgICAgICAgICAgIHN0ZXAgbnVtYmVyIHR3b1xyXG4gKiAgICAgICAgICAgPC9kaXY+XHJcbiAqICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAqICAgICAgIC8vIC4uLiBzdGVwIGNvbnRlbnQgaGVyZVxyXG4gKiAgIDxuYi1zdGVwPlxyXG4gKiA8L25iLXN0ZXBwZXI+XHJcbiAqIGBgYFxyXG4gKiBTcGVjaWZ5IGBbc3RlcENvbnRyb2xdPVwiZm9ybVwiYCBhbmQgdXNlciBjYW4gbmF2aWdhdGVzIG9ubHkgaWYgc3VibWl0IHByZXZpb3VzIHN0ZXAncyBmb3JtLlxyXG4gKiBgYGBodG1sXHJcbiAqIC8vIC4uLlxyXG4gKiA8bmItc3RlcHBlciAgb3JpZW50YXRpb249XCJob3Jpem9udGFsXCI+XHJcbiAqICAgPG5iLXN0ZXAgbGFiZWw9XCJzdGVwIG51bWJlciBvbmVcIiBbc3RlcENvbnRyb2xdPVwiZm9ybVwiPlxyXG4gKiAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCI+XHJcbiAqICAgICAgIC8vIC4uLlxyXG4gKiAgICAgPC9mb3JtPlxyXG4gKiAgIDxuYi1zdGVwPlxyXG4gKiAgICAvLyAuLi5cclxuICogPC9uYi1zdGVwcGVyPlxyXG4gKiBgYGBcclxuICpcclxuICogQHN0YWNrZWQtZXhhbXBsZShWYWxpZGF0aW9uLCBzdGVwcGVyL3N0ZXBwZXItdmFsaWRhdGlvbi5jb21wb25lbnQpXHJcbiAqXHJcbiAqIFN0ZXBwZXIgY29tcG9uZW50IGhhcyB0d28gbGF5b3V0IG9wdGlvbnMgLSBgdmVydGljYWxgICYgYGhvcml6b250YWxgXHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoVmVydGljYWwsIHN0ZXBwZXIvc3RlcHBlci12ZXJ0aWNhbC5jb21wb25lbnQpXHJcbiAqXHJcbiAqIEBzdHlsZXNcclxuICpcclxuICogc3RlcHBlci1pbmRleC1zaXplOlxyXG4gKiBzdGVwcGVyLWxhYmVsLWZvbnQtc2l6ZTpcclxuICogc3RlcHBlci1sYWJlbC1mb250LXdlaWdodDpcclxuICogc3RlcHBlci1hY2NlbnQtY29sb3I6XHJcbiAqIHN0ZXBwZXItY29tcGxldGVkLWZnOlxyXG4gKiBzdGVwcGVyLWZnOlxyXG4gKiBzdGVwcGVyLWNvbXBsZXRlZC1pY29uLXNpemU6XHJcbiAqIHN0ZXBwZXItY29tcGxldGVkLWljb24td2VpZ2h0OlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduYi1zdGVwcGVyJyxcclxuICBzdHlsZVVybHM6IFsnLi9zdGVwcGVyLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3N0ZXBwZXIuY29tcG9uZW50Lmh0bWwnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmJTdGVwcGVyQ29tcG9uZW50IHtcclxuXHJcbiAgQENvbnRlbnRDaGlsZHJlbihOYlN0ZXBDb21wb25lbnQpIHN0ZXBzOiBRdWVyeUxpc3Q8TmJTdGVwQ29tcG9uZW50PjtcclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy52ZXJ0aWNhbCcpXHJcbiAgZ2V0IHZlcnRpY2FsKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3JpZW50YXRpb24gPT09IE5iU3RlcHBlck9yaWVudGF0aW9uLlZFUlRJQ0FMO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5ob3Jpem9udGFsJylcclxuICBnZXQgaG9yaXpvbnRhbCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9yaWVudGF0aW9uID09PSBOYlN0ZXBwZXJPcmllbnRhdGlvbi5IT1JJWk9OVEFMO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBTZWxlY3RlZCBzdGVwIGluZGV4XHJcbiAgICpcclxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIGdldCBzZWxlY3RlZEluZGV4KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaW5kZXg7XHJcbiAgfVxyXG5cclxuICBzZXQgc2VsZWN0ZWRJbmRleChpbmRleDogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5zdGVwcykge1xyXG4gICAgICBpZiAodGhpcy5pbmRleCAhPT0gaW5kZXggJiYgdGhpcy5pc1N0ZXBWYWxpZChpbmRleCkpIHtcclxuICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogU2VsZWN0ZWQgc3RlcCBjb21wb25lbnRcclxuICAgKlxyXG4gICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IHNlbGVjdGVkKCk6IE5iU3RlcENvbXBvbmVudCB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5zdGVwcyA/IHRoaXMuc3RlcHMudG9BcnJheSgpW3RoaXMuc2VsZWN0ZWRJbmRleF0gOiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBzZXQgc2VsZWN0ZWQoc3RlcDogTmJTdGVwQ29tcG9uZW50KSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkSW5kZXggPSB0aGlzLnN0ZXBzID8gdGhpcy5zdGVwcy50b0FycmF5KCkuaW5kZXhPZihzdGVwKSA6IC0xO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBTdGVwcGVyIG9yaWVudGF0aW9uIC0gYGhvcml6b250YWxgfGB2ZXJ0aWNhbGBcclxuICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIG9yaWVudGF0aW9uOiBzdHJpbmcgPSBOYlN0ZXBwZXJPcmllbnRhdGlvbi5IT1JJWk9OVEFMO1xyXG5cclxuICBwcml2YXRlIGluZGV4ID0gMDtcclxuXHJcbiAgLypcclxuICAgKiBOYXZpZ2F0ZSB0byBuZXh0IHN0ZXBcclxuICAgKiAqL1xyXG4gIG5leHQoKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkSW5kZXggPSBNYXRoLm1pbih0aGlzLmluZGV4ICsgMSwgdGhpcy5zdGVwcy5sZW5ndGggLSAxKTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogTmF2aWdhdGUgdG8gcHJldmlvdXMgc3RlcFxyXG4gICAqICovXHJcbiAgcHJldmlvdXMoKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkSW5kZXggPSBNYXRoLm1heCh0aGlzLmluZGV4IC0gMSwgMCk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIFJlc2V0IHN0ZXBwZXIgYW5kIHN0ZXBDb250cm9scyB0byBpbml0aWFsIHN0YXRlXHJcbiAgICogKi9cclxuICByZXNldCgpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IDA7XHJcbiAgICB0aGlzLnN0ZXBzLmZvckVhY2goc3RlcCA9PiBzdGVwLnJlc2V0KCkpO1xyXG4gIH1cclxuXHJcbiAgaXNTdGVwU2VsZWN0ZWQoc3RlcDogTmJTdGVwQ29tcG9uZW50KSB7XHJcbiAgICByZXR1cm4gdGhpcy5pbmRleCA9PT0gdGhpcy5zdGVwcy50b0FycmF5KCkuaW5kZXhPZihzdGVwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNTdGVwVmFsaWQoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qgc3RlcHMgPSB0aGlzLnN0ZXBzLnRvQXJyYXkoKTtcclxuXHJcbiAgICBzdGVwc1t0aGlzLmluZGV4XS5pbnRlcmFjdGVkID0gdHJ1ZTtcclxuXHJcbiAgICBpZiAoaW5kZXggPj0gdGhpcy5pbmRleCAmJiBpbmRleCA+IDApIHtcclxuICAgICAgY29uc3QgY3VycmVudFN0ZXAgPSBzdGVwc1t0aGlzLmluZGV4XTtcclxuICAgICAgcmV0dXJuIGN1cnJlbnRTdGVwLmNvbXBsZXRlZDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbn1cclxuIl19