UNPKG

@catull/igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

205 lines 24.3 kB
import { __decorate, __metadata, __param } from "tslib"; import { Injectable, SecurityContext, Inject } from '@angular/core'; import { DomSanitizer } from '@angular/platform-browser'; import { DOCUMENT } from '@angular/common'; import * as i0 from "@angular/core"; import * as i1 from "@angular/platform-browser"; import * as i2 from "@angular/common"; /** * **Ignite UI for Angular Icon Service** - * * The Ignite UI Icon Service makes it easy for developers to include custom SVG images and use them with IgxIconComponent. * In addition it could be used to associate a custom class to be applied on IgxIconComponent according to given fontSet. * * Example: * ```typescript * this.iconService.registerFontSetAlias('material', 'material-icons'); * this.iconService.addSvgIcon('aruba', '/assets/svg/country_flags/aruba.svg', 'svg-flags'); * ``` */ let IgxIconService = class IgxIconService { constructor(_sanitizer, _document) { this._sanitizer = _sanitizer; this._document = _document; this._fontSet = 'material-icons'; this._fontSetAliases = new Map(); this._cachedSvgIcons = new Set(); } /** * Returns the default font set. *```typescript * const defaultFontSet = this.iconService.defaultFontSet; * ``` */ get defaultFontSet() { return this._fontSet; } /** * Sets the default font set. *```typescript * this.iconService.defaultFontSet = 'svg-flags'; * ``` */ set defaultFontSet(className) { this._fontSet = className; } /** * Registers a custom class to be applied to IgxIconComponent for a given fontSet. *```typescript * this.iconService.registerFontSetAlias('material', 'material-icons'); * ``` */ registerFontSetAlias(alias, className = alias) { this._fontSetAliases.set(alias, className); return this; } /** * Returns the custom class, if any, associated to a given fontSet. *```typescript * const fontSetClass = this.iconService.fontSetClassName('material'); * ``` */ fontSetClassName(alias) { return this._fontSetAliases.get(alias) || alias; } /** * Adds an SVG image to the cache. SVG source is an url. *```typescript * this.iconService.addSvgIcon('aruba', '/assets/svg/country_flags/aruba.svg', 'svg-flags'); * ``` */ addSvgIcon(iconName, url, fontSet = '') { if (iconName && url) { const safeUrl = this._sanitizer.bypassSecurityTrustResourceUrl(url); if (!safeUrl) { throw new Error(`The provided URL could not be processed as trusted resource URL by Angular's DomSanitizer: "${url}".`); } const sanitizedUrl = this._sanitizer.sanitize(SecurityContext.RESOURCE_URL, safeUrl); if (!sanitizedUrl) { throw new Error(`The URL provided was not trusted as a resource URL: "${url}".`); } this.fetchSvg(iconName, url, fontSet); } else { throw new Error('You should provide at least `iconName` and `url` to register an svg icon.'); } } /** * Adds an SVG image to the cache. SVG source is its text. *```typescript * this.iconService.addSvgIcon('simple', '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200"> * <path d="M74 74h54v54H74" /></svg>', 'svg-flags'); * ``` */ addSvgIconFromText(iconName, iconText, fontSet = '') { if (iconName && iconText) { this.cacheSvgIcon(iconName, iconText, fontSet); } else { throw new Error('You should provide at least `iconName` and `iconText` to register an svg icon.'); } } /** * Returns whether a given SVG image is present in the cache. *```typescript * const isSvgCached = this.iconService.isSvgIconCached('aruba', 'svg-flags'); * ``` */ isSvgIconCached(iconName, fontSet = '') { const iconKey = this.getSvgIconKey(iconName, fontSet); return this._cachedSvgIcons.has(iconKey); } /** * Returns the key of a cached SVG image. *```typescript * const svgIconKey = this.iconService.getSvgIconKey('aruba', 'svg-flags'); * ``` */ getSvgIconKey(iconName, fontSet = '') { return fontSet + '_' + iconName; } /** * @hidden */ fetchSvg(iconName, url, fontSet = '') { const instance = this; const httpRequest = new XMLHttpRequest(); httpRequest.open('GET', url, true); httpRequest.responseType = 'text'; // load – when the result is ready, that includes HTTP errors like 404. httpRequest.onload = function (event) { if (event) { const request = event.target; if (request.status === 200) { instance.cacheSvgIcon(iconName, request.responseText, fontSet); } else { throw new Error(`Could not fetch SVG from url: ${url}; error: ${request.status} (${request.statusText})`); } } else { throw new Error(`Could not fetch SVG from url: ${url};`); } }; // error – when the request couldn’t be made, e.g.network down or invalid URL. httpRequest.onerror = function (event) { if (event) { const request = event.target; throw new Error(`Could not fetch SVG from url: ${url}; error status code: ${request.status} (${request.statusText})`); } throw new Error(`Could not fetch SVG from url: ${url};`); }; httpRequest.send(); } /** * @hidden */ cacheSvgIcon(iconName, value, fontSet = '') { if (iconName && value) { this.ensureSvgContainerCreated(); const div = this._document.createElement('DIV'); div.innerHTML = value; const svg = div.querySelector('svg'); if (svg) { const iconKey = this.getSvgIconKey(iconName, fontSet); svg.setAttribute('id', iconKey); svg.setAttribute('fit', ''); svg.setAttribute('preserveAspectRatio', 'xMidYMid meet'); svg.setAttribute('focusable', 'false'); // Disable IE11 default behavior to make SVGs focusable. if (this._cachedSvgIcons.has(iconKey)) { const oldChild = this._svgContainer.querySelector(`svg[id='${iconKey}']`); this._svgContainer.removeChild(oldChild); } this._svgContainer.appendChild(svg); this._cachedSvgIcons.add(iconKey); } } } /** * @hidden */ ensureSvgContainerCreated() { if (!this._svgContainer) { this._svgContainer = this._document.documentElement.querySelector('.igx-svg-container'); if (!this._svgContainer) { this._svgContainer = this._document.createElement('DIV'); this._svgContainer.classList.add('igx-svg-container'); this._document.documentElement.appendChild(this._svgContainer); } } } }; IgxIconService.ctorParameters = () => [ { type: DomSanitizer }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] } ]; IgxIconService.ɵprov = i0.ɵɵdefineInjectable({ factory: function IgxIconService_Factory() { return new IgxIconService(i0.ɵɵinject(i1.DomSanitizer), i0.ɵɵinject(i2.DOCUMENT)); }, token: IgxIconService, providedIn: "root" }); IgxIconService = __decorate([ Injectable({ providedIn: 'root' }), __param(1, Inject(DOCUMENT)), __metadata("design:paramtypes", [DomSanitizer, Object]) ], IgxIconService); export { IgxIconService }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9pY29uL2ljb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7QUFFM0M7Ozs7Ozs7Ozs7O0dBV0c7QUFNSCxJQUFhLGNBQWMsR0FBM0IsTUFBYSxjQUFjO0lBTXZCLFlBQW9CLFVBQXdCLEVBQTRCLFNBQWM7UUFBbEUsZUFBVSxHQUFWLFVBQVUsQ0FBYztRQUE0QixjQUFTLEdBQVQsU0FBUyxDQUFLO1FBTDlFLGFBQVEsR0FBRyxnQkFBZ0IsQ0FBQztRQUM1QixvQkFBZSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1FBRTVDLG9CQUFlLEdBQWdCLElBQUksR0FBRyxFQUFVLENBQUM7SUFFaUMsQ0FBQztJQUUzRjs7Ozs7T0FLRztJQUNILElBQUksY0FBYztRQUNkLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxJQUFJLGNBQWMsQ0FBQyxTQUFpQjtRQUNoQyxJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxvQkFBb0IsQ0FBQyxLQUFhLEVBQUUsWUFBb0IsS0FBSztRQUNoRSxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDM0MsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksZ0JBQWdCLENBQUMsS0FBYTtRQUNqQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQztJQUNwRCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxVQUFVLENBQUMsUUFBZ0IsRUFBRSxHQUFXLEVBQUUsVUFBa0IsRUFBRTtRQUNqRSxJQUFJLFFBQVEsSUFBSSxHQUFHLEVBQUU7WUFDakIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyw4QkFBOEIsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwRSxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsK0ZBQStGLEdBQUcsSUFBSSxDQUFDLENBQUM7YUFDM0g7WUFFRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3JGLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyx3REFBd0QsR0FBRyxJQUFJLENBQUMsQ0FBQzthQUNwRjtZQUVELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztTQUN6QzthQUFNO1lBQ0gsTUFBTSxJQUFJLEtBQUssQ0FBQywyRUFBMkUsQ0FBQyxDQUFDO1NBQ2hHO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGtCQUFrQixDQUFDLFFBQWdCLEVBQUUsUUFBZ0IsRUFBRSxVQUFrQixFQUFFO1FBQzlFLElBQUksUUFBUSxJQUFJLFFBQVEsRUFBRTtZQUN0QixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDbEQ7YUFBTTtZQUNILE1BQU0sSUFBSSxLQUFLLENBQUMsZ0ZBQWdGLENBQUMsQ0FBQztTQUNyRztJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLGVBQWUsQ0FBQyxRQUFnQixFQUFFLFVBQWtCLEVBQUU7UUFDekQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdEQsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxhQUFhLENBQUMsUUFBZ0IsRUFBRSxVQUFrQixFQUFFO1FBQ3ZELE9BQU8sT0FBTyxHQUFHLEdBQUcsR0FBRyxRQUFRLENBQUM7SUFDcEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ssUUFBUSxDQUFDLFFBQWdCLEVBQUUsR0FBVyxFQUFFLFVBQWtCLEVBQUU7UUFDaEUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLE1BQU0sV0FBVyxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7UUFDekMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25DLFdBQVcsQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDO1FBRWxDLHVFQUF1RTtRQUN2RSxXQUFXLENBQUMsTUFBTSxHQUFHLFVBQVUsS0FBb0I7WUFDL0MsSUFBSSxLQUFLLEVBQUU7Z0JBQ1AsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE1BQXdCLENBQUM7Z0JBQy9DLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUU7b0JBQ3hCLFFBQVEsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7aUJBQ2xFO3FCQUFNO29CQUNILE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLEdBQUcsWUFBWSxPQUFPLENBQUMsTUFBTSxLQUFLLE9BQU8sQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO2lCQUM3RzthQUNKO2lCQUFNO2dCQUNILE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLEdBQUcsR0FBRyxDQUFDLENBQUM7YUFDNUQ7UUFDTCxDQUFDLENBQUM7UUFFRiw4RUFBOEU7UUFDOUUsV0FBVyxDQUFDLE9BQU8sR0FBRyxVQUFVLEtBQW9CO1lBQ2hELElBQUksS0FBSyxFQUFFO2dCQUNQLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxNQUF3QixDQUFDO2dCQUMvQyxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxHQUFHLHdCQUF3QixPQUFPLENBQUMsTUFBTSxLQUFLLE9BQU8sQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO2FBQ3pIO1lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUM3RCxDQUFDLENBQUM7UUFFRixXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssWUFBWSxDQUFDLFFBQWdCLEVBQUUsS0FBYSxFQUFFLFVBQWtCLEVBQUU7UUFDdEUsSUFBSSxRQUFRLElBQUksS0FBSyxFQUFFO1lBQ25CLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1lBRWpDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hELEdBQUcsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3RCLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFlLENBQUM7WUFFbkQsSUFBSSxHQUFHLEVBQUU7Z0JBQ0wsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBRXRELEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNoQyxHQUFHLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDNUIsR0FBRyxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsRUFBRSxlQUFlLENBQUMsQ0FBQztnQkFDekQsR0FBRyxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyx3REFBd0Q7Z0JBRWhHLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ25DLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFdBQVcsT0FBTyxJQUFJLENBQUMsQ0FBQztvQkFDMUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQzVDO2dCQUVELElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUNyQztTQUNKO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0sseUJBQXlCO1FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDeEYsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0JBQ3JCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3pELElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2dCQUN0RCxJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQ2xFO1NBQ0o7SUFDTCxDQUFDO0NBQ0osQ0FBQTs7WUFyTG1DLFlBQVk7NENBQUcsTUFBTSxTQUFDLFFBQVE7OztBQU5yRCxjQUFjO0lBSjFCLFVBQVUsQ0FBQztRQUNSLFVBQVUsRUFBRSxNQUFNO0tBQ3JCLENBQUM7SUFRaUQsV0FBQSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUE7cUNBQS9CLFlBQVk7R0FObkMsY0FBYyxDQTJMMUI7U0EzTFksY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIFNlY3VyaXR5Q29udGV4dCwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuLyoqXG4gKiAqKklnbml0ZSBVSSBmb3IgQW5ndWxhciBJY29uIFNlcnZpY2UqKiAtXG4gKlxuICogVGhlIElnbml0ZSBVSSBJY29uIFNlcnZpY2UgbWFrZXMgaXQgZWFzeSBmb3IgZGV2ZWxvcGVycyB0byBpbmNsdWRlIGN1c3RvbSBTVkcgaW1hZ2VzIGFuZCB1c2UgdGhlbSB3aXRoIElneEljb25Db21wb25lbnQuXG4gKiBJbiBhZGRpdGlvbiBpdCBjb3VsZCBiZSB1c2VkIHRvIGFzc29jaWF0ZSBhIGN1c3RvbSBjbGFzcyB0byBiZSBhcHBsaWVkIG9uIElneEljb25Db21wb25lbnQgYWNjb3JkaW5nIHRvIGdpdmVuIGZvbnRTZXQuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHRoaXMuaWNvblNlcnZpY2UucmVnaXN0ZXJGb250U2V0QWxpYXMoJ21hdGVyaWFsJywgJ21hdGVyaWFsLWljb25zJyk7XG4gKiB0aGlzLmljb25TZXJ2aWNlLmFkZFN2Z0ljb24oJ2FydWJhJywgJy9hc3NldHMvc3ZnL2NvdW50cnlfZmxhZ3MvYXJ1YmEuc3ZnJywgJ3N2Zy1mbGFncycpO1xuICogYGBgXG4gKi9cblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcblxuZXhwb3J0IGNsYXNzIElneEljb25TZXJ2aWNlIHtcbiAgICBwcml2YXRlIF9mb250U2V0ID0gJ21hdGVyaWFsLWljb25zJztcbiAgICBwcml2YXRlIF9mb250U2V0QWxpYXNlcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgcHJpdmF0ZSBfc3ZnQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgICBwcml2YXRlIF9jYWNoZWRTdmdJY29uczogU2V0PHN0cmluZz4gPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX3Nhbml0aXplcjogRG9tU2FuaXRpemVyLCBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIF9kb2N1bWVudDogYW55KSB7IH1cblxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIHRoZSBkZWZhdWx0IGZvbnQgc2V0LlxuICAgICAqYGBgdHlwZXNjcmlwdFxuICAgICAqICAgY29uc3QgZGVmYXVsdEZvbnRTZXQgPSB0aGlzLmljb25TZXJ2aWNlLmRlZmF1bHRGb250U2V0O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGdldCBkZWZhdWx0Rm9udFNldCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9udFNldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgU2V0cyB0aGUgZGVmYXVsdCBmb250IHNldC5cbiAgICAgKmBgYHR5cGVzY3JpcHRcbiAgICAgKiAgIHRoaXMuaWNvblNlcnZpY2UuZGVmYXVsdEZvbnRTZXQgPSAnc3ZnLWZsYWdzJztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBzZXQgZGVmYXVsdEZvbnRTZXQoY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fZm9udFNldCA9IGNsYXNzTmFtZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgUmVnaXN0ZXJzIGEgY3VzdG9tIGNsYXNzIHRvIGJlIGFwcGxpZWQgdG8gSWd4SWNvbkNvbXBvbmVudCBmb3IgYSBnaXZlbiBmb250U2V0LlxuICAgICAqYGBgdHlwZXNjcmlwdFxuICAgICAqICAgdGhpcy5pY29uU2VydmljZS5yZWdpc3RlckZvbnRTZXRBbGlhcygnbWF0ZXJpYWwnLCAnbWF0ZXJpYWwtaWNvbnMnKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJGb250U2V0QWxpYXMoYWxpYXM6IHN0cmluZywgY2xhc3NOYW1lOiBzdHJpbmcgPSBhbGlhcyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9mb250U2V0QWxpYXNlcy5zZXQoYWxpYXMsIGNsYXNzTmFtZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIHRoZSBjdXN0b20gY2xhc3MsIGlmIGFueSwgYXNzb2NpYXRlZCB0byBhIGdpdmVuIGZvbnRTZXQuXG4gICAgICpgYGB0eXBlc2NyaXB0XG4gICAgICogICBjb25zdCBmb250U2V0Q2xhc3MgPSB0aGlzLmljb25TZXJ2aWNlLmZvbnRTZXRDbGFzc05hbWUoJ21hdGVyaWFsJyk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGZvbnRTZXRDbGFzc05hbWUoYWxpYXM6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb250U2V0QWxpYXNlcy5nZXQoYWxpYXMpIHx8IGFsaWFzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBBZGRzIGFuIFNWRyBpbWFnZSB0byB0aGUgY2FjaGUuIFNWRyBzb3VyY2UgaXMgYW4gdXJsLlxuICAgICAqYGBgdHlwZXNjcmlwdFxuICAgICAqICAgdGhpcy5pY29uU2VydmljZS5hZGRTdmdJY29uKCdhcnViYScsICcvYXNzZXRzL3N2Zy9jb3VudHJ5X2ZsYWdzL2FydWJhLnN2ZycsICdzdmctZmxhZ3MnKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkU3ZnSWNvbihpY29uTmFtZTogc3RyaW5nLCB1cmw6IHN0cmluZywgZm9udFNldDogc3RyaW5nID0gJycpIHtcbiAgICAgICAgaWYgKGljb25OYW1lICYmIHVybCkge1xuICAgICAgICAgICAgY29uc3Qgc2FmZVVybCA9IHRoaXMuX3Nhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwodXJsKTtcbiAgICAgICAgICAgIGlmICghc2FmZVVybCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHByb3ZpZGVkIFVSTCBjb3VsZCBub3QgYmUgcHJvY2Vzc2VkIGFzIHRydXN0ZWQgcmVzb3VyY2UgVVJMIGJ5IEFuZ3VsYXIncyBEb21TYW5pdGl6ZXI6IFwiJHt1cmx9XCIuYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNhbml0aXplZFVybCA9IHRoaXMuX3Nhbml0aXplci5zYW5pdGl6ZShTZWN1cml0eUNvbnRleHQuUkVTT1VSQ0VfVVJMLCBzYWZlVXJsKTtcbiAgICAgICAgICAgIGlmICghc2FuaXRpemVkVXJsKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgVVJMIHByb3ZpZGVkIHdhcyBub3QgdHJ1c3RlZCBhcyBhIHJlc291cmNlIFVSTDogXCIke3VybH1cIi5gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5mZXRjaFN2ZyhpY29uTmFtZSwgdXJsLCBmb250U2V0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWW91IHNob3VsZCBwcm92aWRlIGF0IGxlYXN0IGBpY29uTmFtZWAgYW5kIGB1cmxgIHRvIHJlZ2lzdGVyIGFuIHN2ZyBpY29uLicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIEFkZHMgYW4gU1ZHIGltYWdlIHRvIHRoZSBjYWNoZS4gU1ZHIHNvdXJjZSBpcyBpdHMgdGV4dC5cbiAgICAgKmBgYHR5cGVzY3JpcHRcbiAgICAgKiAgIHRoaXMuaWNvblNlcnZpY2UuYWRkU3ZnSWNvbignc2ltcGxlJywgJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMjAwIDIwMFwiPlxuICAgICAqICAgPHBhdGggZD1cIk03NCA3NGg1NHY1NEg3NFwiIC8+PC9zdmc+JywgJ3N2Zy1mbGFncycpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRTdmdJY29uRnJvbVRleHQoaWNvbk5hbWU6IHN0cmluZywgaWNvblRleHQ6IHN0cmluZywgZm9udFNldDogc3RyaW5nID0gJycpIHtcbiAgICAgICAgaWYgKGljb25OYW1lICYmIGljb25UZXh0KSB7XG4gICAgICAgICAgICB0aGlzLmNhY2hlU3ZnSWNvbihpY29uTmFtZSwgaWNvblRleHQsIGZvbnRTZXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3Ugc2hvdWxkIHByb3ZpZGUgYXQgbGVhc3QgYGljb25OYW1lYCBhbmQgYGljb25UZXh0YCB0byByZWdpc3RlciBhbiBzdmcgaWNvbi4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIHdoZXRoZXIgYSBnaXZlbiBTVkcgaW1hZ2UgaXMgcHJlc2VudCBpbiB0aGUgY2FjaGUuXG4gICAgICpgYGB0eXBlc2NyaXB0XG4gICAgICogICBjb25zdCBpc1N2Z0NhY2hlZCA9IHRoaXMuaWNvblNlcnZpY2UuaXNTdmdJY29uQ2FjaGVkKCdhcnViYScsICdzdmctZmxhZ3MnKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNTdmdJY29uQ2FjaGVkKGljb25OYW1lOiBzdHJpbmcsIGZvbnRTZXQ6IHN0cmluZyA9ICcnKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGljb25LZXkgPSB0aGlzLmdldFN2Z0ljb25LZXkoaWNvbk5hbWUsIGZvbnRTZXQpO1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGVkU3ZnSWNvbnMuaGFzKGljb25LZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIHRoZSBrZXkgb2YgYSBjYWNoZWQgU1ZHIGltYWdlLlxuICAgICAqYGBgdHlwZXNjcmlwdFxuICAgICAqICAgY29uc3Qgc3ZnSWNvbktleSA9IHRoaXMuaWNvblNlcnZpY2UuZ2V0U3ZnSWNvbktleSgnYXJ1YmEnLCAnc3ZnLWZsYWdzJyk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldFN2Z0ljb25LZXkoaWNvbk5hbWU6IHN0cmluZywgZm9udFNldDogc3RyaW5nID0gJycpIHtcbiAgICAgICAgcmV0dXJuIGZvbnRTZXQgKyAnXycgKyBpY29uTmFtZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBmZXRjaFN2ZyhpY29uTmFtZTogc3RyaW5nLCB1cmw6IHN0cmluZywgZm9udFNldDogc3RyaW5nID0gJycpIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzO1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICBodHRwUmVxdWVzdC5vcGVuKCdHRVQnLCB1cmwsIHRydWUpO1xuICAgICAgICBodHRwUmVxdWVzdC5yZXNwb25zZVR5cGUgPSAndGV4dCc7XG5cbiAgICAgICAgLy8gbG9hZCDigJMgd2hlbiB0aGUgcmVzdWx0IGlzIHJlYWR5LCB0aGF0IGluY2x1ZGVzIEhUVFAgZXJyb3JzIGxpa2UgNDA0LlxuICAgICAgICBodHRwUmVxdWVzdC5vbmxvYWQgPSBmdW5jdGlvbiAoZXZlbnQ6IFByb2dyZXNzRXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBldmVudC50YXJnZXQgYXMgWE1MSHR0cFJlcXVlc3Q7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3Quc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuY2FjaGVTdmdJY29uKGljb25OYW1lLCByZXF1ZXN0LnJlc3BvbnNlVGV4dCwgZm9udFNldCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmV0Y2ggU1ZHIGZyb20gdXJsOiAke3VybH07IGVycm9yOiAke3JlcXVlc3Quc3RhdHVzfSAoJHtyZXF1ZXN0LnN0YXR1c1RleHR9KWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmV0Y2ggU1ZHIGZyb20gdXJsOiAke3VybH07YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gZXJyb3Ig4oCTIHdoZW4gdGhlIHJlcXVlc3QgY291bGRu4oCZdCBiZSBtYWRlLCBlLmcubmV0d29yayBkb3duIG9yIGludmFsaWQgVVJMLlxuICAgICAgICBodHRwUmVxdWVzdC5vbmVycm9yID0gZnVuY3Rpb24gKGV2ZW50OiBQcm9ncmVzc0V2ZW50KSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gZXZlbnQudGFyZ2V0IGFzIFhNTEh0dHBSZXF1ZXN0O1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZldGNoIFNWRyBmcm9tIHVybDogJHt1cmx9OyBlcnJvciBzdGF0dXMgY29kZTogJHtyZXF1ZXN0LnN0YXR1c30gKCR7cmVxdWVzdC5zdGF0dXNUZXh0fSlgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZldGNoIFNWRyBmcm9tIHVybDogJHt1cmx9O2ApO1xuICAgICAgICB9O1xuXG4gICAgICAgIGh0dHBSZXF1ZXN0LnNlbmQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjYWNoZVN2Z0ljb24oaWNvbk5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZywgZm9udFNldDogc3RyaW5nID0gJycpIHtcbiAgICAgICAgaWYgKGljb25OYW1lICYmIHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmVuc3VyZVN2Z0NvbnRhaW5lckNyZWF0ZWQoKTtcblxuICAgICAgICAgICAgY29uc3QgZGl2ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7XG4gICAgICAgICAgICBkaXYuaW5uZXJIVE1MID0gdmFsdWU7XG4gICAgICAgICAgICBjb25zdCBzdmcgPSBkaXYucXVlcnlTZWxlY3Rvcignc3ZnJykgYXMgU1ZHRWxlbWVudDtcblxuICAgICAgICAgICAgaWYgKHN2Zykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGljb25LZXkgPSB0aGlzLmdldFN2Z0ljb25LZXkoaWNvbk5hbWUsIGZvbnRTZXQpO1xuXG4gICAgICAgICAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZSgnaWQnLCBpY29uS2V5KTtcbiAgICAgICAgICAgICAgICBzdmcuc2V0QXR0cmlidXRlKCdmaXQnLCAnJyk7XG4gICAgICAgICAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZSgncHJlc2VydmVBc3BlY3RSYXRpbycsICd4TWlkWU1pZCBtZWV0Jyk7XG4gICAgICAgICAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZSgnZm9jdXNhYmxlJywgJ2ZhbHNlJyk7IC8vIERpc2FibGUgSUUxMSBkZWZhdWx0IGJlaGF2aW9yIHRvIG1ha2UgU1ZHcyBmb2N1c2FibGUuXG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2FjaGVkU3ZnSWNvbnMuaGFzKGljb25LZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZENoaWxkID0gdGhpcy5fc3ZnQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYHN2Z1tpZD0nJHtpY29uS2V5fSddYCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3N2Z0NvbnRhaW5lci5yZW1vdmVDaGlsZChvbGRDaGlsZCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5fc3ZnQ29udGFpbmVyLmFwcGVuZENoaWxkKHN2Zyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVkU3ZnSWNvbnMuYWRkKGljb25LZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgZW5zdXJlU3ZnQ29udGFpbmVyQ3JlYXRlZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zdmdDb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3N2Z0NvbnRhaW5lciA9IHRoaXMuX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuaWd4LXN2Zy1jb250YWluZXInKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5fc3ZnQ29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3ZnQ29udGFpbmVyID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3ZnQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2lneC1zdmctY29udGFpbmVyJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3N2Z0NvbnRhaW5lcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=