UNPKG

@visa/nova-angular

Version:

Visa Product Design System Nova Angular library

243 lines 26.1 kB
/** * © 2025 Visa * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **/ import { coerceBooleanProperty } from '@angular/cdk/coercion'; import { CommonModule } from '@angular/common'; import { Component, HostBinding, Input } from '@angular/core'; import { IconLibrary, IconSize } from './icon.constants'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; /** * <code>IconComponent</code> is intended <i>only</i> for use with icons used with an icon sprite. <br /> * <strong>Standalone icons from @visa/nova-icons-angular is recommended over using the <code>IconComponent</code>.</strong>. <br /> * Icon component for displaying icons from VPDS' [Icon Library](https://design.visa.com/icons). <br /> */ export class IconComponent { /** * Provides custom class&#40;es&#41; for custom styling. * @default .v-icon.v-icon-&lt;iconSize&gt;.v-icon-&lt;library&gt; */ get class() { return [ this._class, 'v-icon', 'v-icon-' + this.iconSize, 'v-icon-' + this.library, this.isBadgeEllipse ? 'v-badge-ellipse' : '', this.rtl ? 'v-icon-rtl' : '' ].join(' '); } set class(value) { this._class = value; } get hostClass() { return this.class; } /** * Flips icon from right to left when true and <code>dir="rtl" is present on a parent element. * @default false */ get rtl() { return this._rtl; } set rtl(value) { this._rtl = coerceBooleanProperty(value); } /** * Sets icon resolution/size. * @default 'tiny' / IconSize.TINY * @options 'tiny' | IconSize.TINY | <br> 'low' | IconSize.LOW | <br> 'high' | IconSize.HIGH */ // default of tiny chosen because it is the default for majority of buttons get iconSize() { return this._iconSize; } set iconSize(value) { this._iconSize = value; this.setIcon(); } /** * Tells icon which library to reference. * @default 'visa' / IconLibrary.VISA * @options 'visa' | IconLibrary.VISA | <br> 'generic' | IconLibrary.GENERIC */ get library() { return this._library; } set library(value) { this._library = value; } /** * Name of icon to display. <br /> * Should refer to an icon in VPDS' [Icon Library](https://design.visa.com/icons). */ get icon() { return this._icon; } set icon(value) { this._icon = value; this.setIcon(); } /** * Sets icon to badge-ellipse variant when true. <br /> * Intended for use in badges with an indicator. * @default false */ get isBadgeEllipse() { return this._isBadgeEllipse; } set isBadgeEllipse(value) { this._isBadgeEllipse = coerceBooleanProperty(value); } get hostStyleFill() { if (this.isBadgeEllipse) { return 'var(--v-badge-ellipse-color)'; } } get hostStyleIconHeight() { if (this.isBadgeEllipse) { return `var(--size-scalable-${this.customHeight})`; } } get hostStyleIconWidth() { if (this.isBadgeEllipse) { return `var(--size-scalable-${this.customWidth})`; } } /** * Set CSS variable <code>--v-icon-height</code> which customizes icon height. * @default '--size-scalable-8' */ get customHeight() { return this._customHeight; } set customHeight(value) { this._customHeight = value; } /** * Set CSS variable <code>--v-icon-width</code> which customizes icon width. * @default '--size-scalable-8' */ get customWidth() { return this._customWidth; } set customWidth(value) { this._customWidth = value; } /** * Name of <strong>custom</strong> icon reference. <br /> * Should refer to an icon within an icon sprite in your application. <br /> * The href will reference the string provided directly. No library or iconSize will be added. */ get customIcon() { return this._customIcon; } set customIcon(value) { this._customIcon = value; this.setIcon(); } get hostViewBox() { return `0 0 ${this._computedSize} ${this._computedSize}`; } get hostHeight() { return `${this._computedSize}`; } get hostWidth() { return `${this._computedSize}`; } get hostFocusable() { return 'false'; } get hostAriaHidden() { return 'true'; } constructor() { this._computedSize = 24; this._class = ''; this._rtl = false; this._iconSize = IconSize.TINY; this._library = IconLibrary.VISA; this._isBadgeEllipse = false; this._customHeight = '8'; this._customWidth = '8'; } ngOnInit() { this.setIcon(); } setIcon() { this._computedSize = this.iconSize === IconSize.LOW ? 24 : this.iconSize === IconSize.HIGH ? 48 : 16; this._iconRef = this.customIcon ? this.customIcon : this.icon ? `${this.library}-${this.icon}-${this.iconSize}` : ''; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: IconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: IconComponent, isStandalone: true, selector: "[v-icon]", inputs: { class: "class", rtl: "rtl", iconSize: "iconSize", library: "library", icon: "icon", isBadgeEllipse: "isBadgeEllipse", customHeight: "customHeight", customWidth: "customWidth", customIcon: "customIcon" }, host: { properties: { "class": "this.hostClass", "style.--v-icon-primary": "this.hostStyleFill", "style.--v-icon-secondary": "this.hostStyleFill", "style.--v-icon-height": "this.hostStyleIconHeight", "style.--v-icon-width": "this.hostStyleIconWidth", "attr.viewBox": "this.hostViewBox", "attr.height": "this.hostHeight", "attr.width": "this.hostWidth", "attr.focusable": "this.hostFocusable", "attr.aria-hidden": "this.hostAriaHidden" } }, ngImport: i0, template: "<!--\n * \u00A9 2025 Visa\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n -->\n<svg:use *ngIf=\"_iconRef\" [attr.href]=\"'#' + _iconRef\" [attr.xlink:href]=\"'#' + _iconRef\"></svg:use>\n<svg:circle *ngIf=\"isBadgeEllipse\" cx=\"8\" cy=\"8\" r=\"8\" style=\"fill: var(--v-badge-ellipse-color)\"></svg:circle>\n<ng-content></ng-content>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: IconComponent, decorators: [{ type: Component, args: [{ standalone: true, imports: [CommonModule], selector: '[v-icon]', template: "<!--\n * \u00A9 2025 Visa\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n -->\n<svg:use *ngIf=\"_iconRef\" [attr.href]=\"'#' + _iconRef\" [attr.xlink:href]=\"'#' + _iconRef\"></svg:use>\n<svg:circle *ngIf=\"isBadgeEllipse\" cx=\"8\" cy=\"8\" r=\"8\" style=\"fill: var(--v-badge-ellipse-color)\"></svg:circle>\n<ng-content></ng-content>\n" }] }], ctorParameters: () => [], propDecorators: { class: [{ type: Input }], hostClass: [{ type: HostBinding, args: ['class'] }], rtl: [{ type: Input }], iconSize: [{ type: Input }], library: [{ type: Input }], icon: [{ type: Input }], isBadgeEllipse: [{ type: Input }], hostStyleFill: [{ type: HostBinding, args: ['style.--v-icon-primary'] }, { type: HostBinding, args: ['style.--v-icon-secondary'] }], hostStyleIconHeight: [{ type: HostBinding, args: ['style.--v-icon-height'] }], hostStyleIconWidth: [{ type: HostBinding, args: ['style.--v-icon-width'] }], customHeight: [{ type: Input }], customWidth: [{ type: Input }], customIcon: [{ type: Input }], hostViewBox: [{ type: HostBinding, args: ['attr.viewBox'] }], hostHeight: [{ type: HostBinding, args: ['attr.height'] }], hostWidth: [{ type: HostBinding, args: ['attr.width'] }], hostFocusable: [{ type: HostBinding, args: ['attr.focusable'] }], hostAriaHidden: [{ type: HostBinding, args: ['attr.aria-hidden'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25vdmEtbGliL3NyYy9saWIvaWNvbi9pY29uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbm92YS1saWIvc3JjL2xpYi9pY29uL2ljb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztJQWVJO0FBQ0osT0FBTyxFQUFnQixxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDdEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7O0FBRXpEOzs7O0dBSUc7QUFPSCxNQUFNLE9BQU8sYUFBYTtJQUl4Qjs7O09BR0c7SUFDSCxJQUNJLEtBQUs7UUFDUCxPQUFPO1lBQ0wsSUFBSSxDQUFDLE1BQU07WUFDWCxRQUFRO1lBQ1IsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRO1lBQ3pCLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTztZQUN4QixJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUM1QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUU7U0FDN0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDZCxDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsS0FBYTtRQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFDSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFD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LFNBQVM7aUNBQ0ksSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDLFlBQ2IsVUFBVTt3REFZaEIsS0FBSztzQkFEUixLQUFLO2dCQWdCRixTQUFTO3NCQURaLFdBQVc7dUJBQUMsT0FBTztnQkFVaEIsR0FBRztzQkFETixLQUFLO2dCQWdCRixRQUFRO3NCQURYLEtBQUs7Z0JBZ0JGLE9BQU87c0JBRFYsS0FBSztnQkFjRixJQUFJO3NCQURQLEtBQUs7Z0JBZ0JGLGNBQWM7c0JBRGpCLEtBQUs7Z0JBV0YsYUFBYTtzQkFGaEIsV0FBVzt1QkFBQyx3QkFBd0I7O3NCQUNwQyxXQUFXO3VCQUFDLDBCQUEwQjtnQkFRbkMsbUJBQW1CO3NCQUR0QixXQUFXO3VCQUFDLHVCQUF1QjtnQkFRaEMsa0JBQWtCO3NCQURyQixXQUFXO3VCQUFDLHNCQUFzQjtnQkFZL0IsWUFBWTtzQkFEZixLQUFLO2dCQWNGLFdBQVc7c0JBRGQsS0FBSztnQkFlRixVQUFVO3NCQURiLEtBQUs7Z0JBV0YsV0FBVztzQkFEZCxXQUFXO3VCQUFDLGNBQWM7Z0JBTXZCLFVBQVU7c0JBRGIsV0FBVzt1QkFBQyxhQUFhO2dCQU10QixTQUFTO3NCQURaLFdBQVc7dUJBQUMsWUFBWTtnQkFNckIsYUFBYTtzQkFEaEIsV0FBVzt1QkFBQyxnQkFBZ0I7Z0JBTXpCLGNBQWM7c0JBRGpCLFdBQVc7dUJBQUMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiAgICAgICAgICAgICAgwqkgMjAyNSBWaXNhXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiovXG5pbXBvcnQgeyBCb29sZWFuSW5wdXQsIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBIb3N0QmluZGluZywgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSWNvbkxpYnJhcnksIEljb25TaXplIH0gZnJvbSAnLi9pY29uLmNvbnN0YW50cyc7XG5cbi8qKlxuICogPGNvZGU+SWNvbkNvbXBvbmVudDwvY29kZT4gaXMgaW50ZW5kZWQgPGk+b25seTwvaT4gZm9yIHVzZSB3aXRoIGljb25zIHVzZWQgd2l0aCBhbiBpY29uIHNwcml0ZS4gPGJyIC8+XG4gKiA8c3Ryb25nPlN0YW5kYWxvbmUgaWNvbnMgZnJvbSBAdmlzYS9ub3ZhLWljb25zLWFuZ3VsYXIgaXMgcmVjb21tZW5kZWQgb3ZlciB1c2luZyB0aGUgPGNvZGU+SWNvbkNvbXBvbmVudDwvY29kZT4uPC9zdHJvbmc+LiA8YnIgLz5cbiAqIEljb24gY29tcG9uZW50IGZvciBkaXNwbGF5aW5nIGljb25zIGZyb20gVlBEUycgW0ljb24gTGlicmFyeV0oaHR0cHM6Ly9kZXNpZ24udmlzYS5jb20vaWNvbnMpLiA8YnIgLz5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBzZWxlY3RvcjogJ1t2LWljb25dJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ljb24uY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIEljb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBfY29tcHV0ZWRTaXplOiBudW1iZXIgPSAyNDtcbiAgX2ljb25SZWY6IHN0cmluZztcblxuICAvKipcbiAgICogUHJvdmlkZXMgY3VzdG9tIGNsYXNzJiM0MDtlcyYjNDE7IGZvciBjdXN0b20gc3R5bGluZy5cbiAgICogQGRlZmF1bHQgLnYtaWNvbi52LWljb24tJmx0O2ljb25TaXplJmd0Oy52LWljb24tJmx0O2xpYnJhcnkmZ3Q7XG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgY2xhc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gW1xuICAgICAgdGhpcy5fY2xhc3MsXG4gICAgICAndi1pY29uJyxcbiAgICAgICd2LWljb24tJyArIHRoaXMuaWNvblNpemUsXG4gICAgICAndi1pY29uLScgKyB0aGlzLmxpYnJhcnksXG4gICAgICB0aGlzLmlzQmFkZ2VFbGxpcHNlID8gJ3YtYmFkZ2UtZWxsaXBzZScgOiAnJyxcbiAgICAgIHRoaXMucnRsID8gJ3YtaWNvbi1ydGwnIDogJydcbiAgICBdLmpvaW4oJyAnKTtcbiAgfVxuICBzZXQgY2xhc3ModmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2NsYXNzID0gdmFsdWU7XG4gIH1cbiAgX2NsYXNzOiBzdHJpbmcgPSAnJztcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcycpXG4gIGdldCBob3N0Q2xhc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jbGFzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBGbGlwcyBpY29uIGZyb20gcmlnaHQgdG8gbGVmdCB3aGVuIHRydWUgYW5kIDxjb2RlPmRpcj1cInJ0bFwiIGlzIHByZXNlbnQgb24gYSBwYXJlbnQgZWxlbWVudC5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBydGwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3J0bDtcbiAgfVxuICBzZXQgcnRsKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9ydGwgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF9ydGw6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogU2V0cyBpY29uIHJlc29sdXRpb24vc2l6ZS5cbiAgICogQGRlZmF1bHQgJ3RpbnknIC8gSWNvblNpemUuVElOWVxuICAgKiBAb3B0aW9ucyAndGlueScgfCBJY29uU2l6ZS5USU5ZIHwgPGJyPiAnbG93JyB8IEljb25TaXplLkxPVyB8IDxicj4gJ2hpZ2gnIHwgSWNvblNpemUuSElHSFxuICAgKi9cbiAgLy8gZGVmYXVsdCBvZiB0aW55IGNob3NlbiBiZWNhdXNlIGl0IGlzIHRoZSBkZWZhdWx0IGZvciBtYWpvcml0eSBvZiBidXR0b25zXG4gIEBJbnB1dCgpXG4gIGdldCBpY29uU2l6ZSgpOiBJY29uU2l6ZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ljb25TaXplO1xuICB9XG4gIHNldCBpY29uU2l6ZSh2YWx1ZTogSWNvblNpemUpIHtcbiAgICB0aGlzLl9pY29uU2l6ZSA9IHZhbHVlO1xuICAgIHRoaXMuc2V0SWNvbigpO1xuICB9XG4gIF9pY29uU2l6ZTogSWNvblNpemUgPSBJY29uU2l6ZS5USU5ZO1xuXG4gIC8qKlxuICAgKiBUZWxscyBpY29uIHdoaWNoIGxpYnJhcnkgdG8gcmVmZXJlbmNlLlxuICAgKiBAZGVmYXVsdCAndmlzYScgLyBJY29uTGlicmFyeS5WSVNBXG4gICAqIEBvcHRpb25zICd2aXNhJyB8IEljb25MaWJyYXJ5LlZJU0EgfCA8YnI+ICdnZW5lcmljJyB8IEljb25MaWJyYXJ5LkdFTkVSSUNcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBsaWJyYXJ5KCk6IEljb25MaWJyYXJ5IHtcbiAgICByZXR1cm4gdGhpcy5fbGlicmFyeTtcbiAgfVxuICBzZXQgbGlicmFyeSh2YWx1ZTogSWNvbkxpYnJhcnkpIHtcbiAgICB0aGlzLl9saWJyYXJ5ID0gdmFsdWU7XG4gIH1cbiAgX2xpYnJhcnk6IEljb25MaWJyYXJ5ID0gSWNvbkxpYnJhcnkuVklTQTtcblxuICAvKipcbiAgICogTmFtZSBvZiBpY29uIHRvIGRpc3BsYXkuIDxiciAvPlxuICAgKiBTaG91bGQgcmVmZXIgdG8gYW4gaWNvbiBpbiBWUERTJyBbSWNvbiBMaWJyYXJ5XShodHRwczovL2Rlc2lnbi52aXNhLmNvbS9pY29ucykuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgaWNvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9pY29uO1xuICB9XG4gIHNldCBpY29uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9pY29uID0gdmFsdWU7XG4gICAgdGhpcy5zZXRJY29uKCk7XG4gIH1cbiAgX2ljb246IHN0cmluZztcblxuICAvKipcbiAgICogU2V0cyBpY29uIHRvIGJhZGdlLWVsbGlwc2UgdmFyaWFudCB3aGVuIHRydWUuIDxiciAvPlxuICAgKiBJbnRlbmRlZCBmb3IgdXNlIGluIGJhZGdlcyB3aXRoIGFuIGluZGljYXRvci5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBpc0JhZGdlRWxsaXBzZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNCYWRnZUVsbGlwc2U7XG4gIH1cbiAgc2V0IGlzQmFkZ2VFbGxpcHNlKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9pc0JhZGdlRWxsaXBzZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX2lzQmFkZ2VFbGxpcHNlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQEhvc3RCaW5kaW5nKCdzdHlsZS4tLXYtaWNvbi1wcmltYXJ5JylcbiAgQEhvc3RCaW5kaW5nKCdzdHlsZS4tLXYtaWNvbi1zZWNvbmRhcnknKVxuICBnZXQgaG9zdFN0eWxlRmlsbCgpOiBzdHJpbmcgfCB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0JhZGdlRWxsaXBzZSkge1xuICAgICAgcmV0dXJuICd2YXIoLS12LWJhZGdlLWVsbGlwc2UtY29sb3IpJztcbiAgICB9XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ3N0eWxlLi0tdi1pY29uLWhlaWdodCcpXG4gIGdldCBob3N0U3R5bGVJY29uSGVpZ2h0KCk6IHN0cmluZyB8IHZvaWQge1xuICAgIGlmICh0aGlzLmlzQmFkZ2VFbGxpcHNlKSB7XG4gICAgICByZXR1cm4gYHZhcigtLXNpemUtc2NhbGFibGUtJHt0aGlzLmN1c3RvbUhlaWdodH0pYDtcbiAgICB9XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ3N0eWxlLi0tdi1pY29uLXdpZHRoJylcbiAgZ2V0IGhvc3RTdHlsZUljb25XaWR0aCgpOiBzdHJpbmcgfCB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0JhZGdlRWxsaXBzZSkge1xuICAgICAgcmV0dXJuIGB2YXIoLS1zaXplLXNjYWxhYmxlLSR7dGhpcy5jdXN0b21XaWR0aH0pYDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IENTUyB2YXJpYWJsZSA8Y29kZT4tLXYtaWNvbi1oZWlnaHQ8L2NvZGU+IHdoaWNoIGN1c3RvbWl6ZXMgaWNvbiBoZWlnaHQuXG4gICAqIEBkZWZhdWx0ICctLXNpemUtc2NhbGFibGUtOCdcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBjdXN0b21IZWlnaHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY3VzdG9tSGVpZ2h0O1xuICB9XG4gIHNldCBjdXN0b21IZWlnaHQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2N1c3RvbUhlaWdodCA9IHZhbHVlO1xuICB9XG4gIF9jdXN0b21IZWlnaHQ6IHN0cmluZyA9ICc4JztcblxuICAvKipcbiAgICogU2V0IENTUyB2YXJpYWJsZSA8Y29kZT4tLXYtaWNvbi13aWR0aDwvY29kZT4gd2hpY2ggY3VzdG9taXplcyBpY29uIHdpZHRoLlxuICAgKiBAZGVmYXVsdCAnLS1zaXplLXNjYWxhYmxlLTgnXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgY3VzdG9tV2lkdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY3VzdG9tV2lkdGg7XG4gIH1cbiAgc2V0IGN1c3RvbVdpZHRoKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jdXN0b21XaWR0aCA9IHZhbHVlO1xuICB9XG4gIF9jdXN0b21XaWR0aDogc3RyaW5nID0gJzgnO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIDxzdHJvbmc+Y3VzdG9tPC9zdHJvbmc+IGljb24gcmVmZXJlbmNlLiA8YnIgLz5cbiAgICogU2hvdWxkIHJlZmVyIHRvIGFuIGljb24gd2l0aGluIGFuIGljb24gc3ByaXRlIGluIHlvdXIgYXBwbGljYXRpb24uIDxiciAvPlxuICAgKiBUaGUgaHJlZiB3aWxsIHJlZmVyZW5jZSB0aGUgc3RyaW5nIHByb3ZpZGVkIGRpcmVjdGx5LiBObyBsaWJyYXJ5IG9yIGljb25TaXplIHdpbGwgYmUgYWRkZWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgY3VzdG9tSWNvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jdXN0b21JY29uO1xuICB9XG4gIHNldCBjdXN0b21JY29uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jdXN0b21JY29uID0gdmFsdWU7XG4gICAgdGhpcy5zZXRJY29uKCk7XG4gIH1cbiAgX2N1c3RvbUljb246IHN0cmluZztcblxuICBASG9zdEJpbmRpbmcoJ2F0dHIudmlld0JveCcpXG4gIGdldCBob3N0Vmlld0JveCgpIHtcbiAgICByZXR1cm4gYDAgMCAke3RoaXMuX2NvbXB1dGVkU2l6ZX0gJHt0aGlzLl9jb21wdXRlZFNpemV9YDtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnYXR0ci5oZWlnaHQnKVxuICBnZXQgaG9zdEhlaWdodCgpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5fY29tcHV0ZWRTaXplfWA7XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ2F0dHIud2lkdGgnKVxuICBnZXQgaG9zdFdpZHRoKCkge1xuICAgIHJldHVybiBgJHt0aGlzLl9jb21wdXRlZFNpemV9YDtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnYXR0ci5mb2N1c2FibGUnKVxuICBnZXQgaG9zdEZvY3VzYWJsZSgpIHtcbiAgICByZXR1cm4gJ2ZhbHNlJztcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWhpZGRlbicpXG4gIGdldCBob3N0QXJpYUhpZGRlbigpIHtcbiAgICByZXR1cm4gJ3RydWUnO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0SWNvbigpO1xuICB9XG5cbiAgc2V0SWNvbigpIHtcbiAgICB0aGlzLl9jb21wdXRlZFNpemUgPSB0aGlzLmljb25TaXplID09PSBJY29uU2l6ZS5MT1cgPyAyNCA6IHRoaXMuaWNvblNpemUgPT09IEljb25TaXplLkhJR0ggPyA0OCA6IDE2O1xuICAgIHRoaXMuX2ljb25SZWYgPSB0aGlzLmN1c3RvbUljb25cbiAgICAgID8gdGhpcy5jdXN0b21JY29uXG4gICAgICA6IHRoaXMuaWNvblxuICAgICAgICA/IGAke3RoaXMubGlicmFyeX0tJHt0aGlzLmljb259LSR7dGhpcy5pY29uU2l6ZX1gXG4gICAgICAgIDogJyc7XG4gIH1cbn1cbiIsIjwhLS1cbiAqICAgICAgICAgICAgICDCqSAyMDI1IFZpc2FcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAtLT5cbjxzdmc6dXNlICpuZ0lmPVwiX2ljb25SZWZcIiBbYXR0ci5ocmVmXT1cIicjJyArIF9pY29uUmVmXCIgW2F0dHIueGxpbms6aHJlZl09XCInIycgKyBfaWNvblJlZlwiPjwvc3ZnOnVzZT5cbjxzdmc6Y2lyY2xlICpuZ0lmPVwiaXNCYWRnZUVsbGlwc2VcIiBjeD1cIjhcIiBjeT1cIjhcIiByPVwiOFwiIHN0eWxlPVwiZmlsbDogdmFyKC0tdi1iYWRnZS1lbGxpcHNlLWNvbG9yKVwiPjwvc3ZnOmNpcmNsZT5cbjxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiJdfQ==