igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
277 lines • 23.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Injectable, SecurityContext, Inject } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';
import { HttpClient } from '@angular/common/http';
import { DOCUMENT } from '@angular/common';
import * as i0 from "@angular/core";
import * as i1 from "@angular/platform-browser";
import * as i2 from "@angular/common/http";
import * as i3 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');
* ```
*/
export class IgxIconService {
/**
* @param {?} _sanitizer
* @param {?} _httpClient
* @param {?} _document
*/
constructor(_sanitizer, _httpClient, _document) {
this._sanitizer = _sanitizer;
this._httpClient = _httpClient;
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;
* ```
* @return {?}
*/
get defaultFontSet() {
return this._fontSet;
}
/**
* Sets the default font set.
* ```typescript
* this.iconService.defaultFontSet = 'svg-flags';
* ```
* @param {?} className
* @return {?}
*/
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');
* ```
* @template THIS
* @this {THIS}
* @param {?} alias
* @param {?=} className
* @return {THIS}
*/
registerFontSetAlias(alias, className = alias) {
(/** @type {?} */ (this))._fontSetAliases.set(alias, className);
return (/** @type {?} */ (this));
}
/**
* Returns the custom class, if any, associated to a given fontSet.
* ```typescript
* const fontSetClass = this.iconService.fontSetClassName('material');
* ```
* @param {?} alias
* @return {?}
*/
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');
* ```
* @param {?} iconName
* @param {?} url
* @param {?=} fontSet
* @return {?}
*/
addSvgIcon(iconName, url, fontSet = '') {
if (iconName && url) {
/** @type {?} */
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}".`);
}
/** @type {?} */
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');
* ```
* @param {?} iconName
* @param {?} iconText
* @param {?=} fontSet
* @return {?}
*/
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 wheather a given SVG image is present in the cache.
* ```typescript
* const isSvgCached = this.iconService.isSvgIconCached('aruba', 'svg-flags');
* ```
* @param {?} iconName
* @param {?=} fontSet
* @return {?}
*/
isSvgIconCached(iconName, fontSet = '') {
/** @type {?} */
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');
* ```
* @param {?} iconName
* @param {?=} fontSet
* @return {?}
*/
getSvgIconKey(iconName, fontSet = '') {
return fontSet + '_' + iconName;
}
/**
* @hidden
* @private
* @param {?} iconName
* @param {?} url
* @param {?=} fontSet
* @return {?}
*/
fetchSvg(iconName, url, fontSet = '') {
/** @type {?} */
const request = this._httpClient.get(url, { responseType: 'text' });
/** @type {?} */
const subscription = request.subscribe((value) => {
this.cacheSvgIcon(iconName, value, fontSet);
}, (error) => {
throw new Error(`Could not fetch SVG from url: ${url}; error: ${error.message}`);
}, () => {
subscription.unsubscribe();
});
}
/**
* @hidden
* @private
* @param {?} iconName
* @param {?} value
* @param {?=} fontSet
* @return {?}
*/
cacheSvgIcon(iconName, value, fontSet = '') {
if (iconName && value) {
this.ensureSvgContainerCreated();
/** @type {?} */
const div = this._document.createElement('DIV');
div.innerHTML = value;
/** @type {?} */
const svg = (/** @type {?} */ (div.querySelector('svg')));
if (svg) {
/** @type {?} */
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)) {
/** @type {?} */
const oldChild = this._svgContainer.querySelector(`svg[id='${iconKey}']`);
this._svgContainer.removeChild(oldChild);
}
this._svgContainer.appendChild(svg);
this._cachedSvgIcons.add(iconKey);
}
}
}
/**
* @hidden
* @private
* @return {?}
*/
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.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] }
];
/** @nocollapse */
IgxIconService.ctorParameters = () => [
{ type: DomSanitizer },
{ type: HttpClient },
{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }
];
/** @nocollapse */ IgxIconService.ngInjectableDef = i0.defineInjectable({ factory: function IgxIconService_Factory() { return new IgxIconService(i0.inject(i1.DomSanitizer), i0.inject(i2.HttpClient), i0.inject(i3.DOCUMENT)); }, token: IgxIconService, providedIn: "root" });
if (false) {
/**
* @type {?}
* @private
*/
IgxIconService.prototype._fontSet;
/**
* @type {?}
* @private
*/
IgxIconService.prototype._fontSetAliases;
/**
* @type {?}
* @private
*/
IgxIconService.prototype._svgContainer;
/**
* @type {?}
* @private
*/
IgxIconService.prototype._cachedSvgIcons;
/**
* @type {?}
* @private
*/
IgxIconService.prototype._sanitizer;
/**
* @type {?}
* @private
*/
IgxIconService.prototype._httpClient;
/**
* @type {?}
* @private
*/
IgxIconService.prototype._document;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9pY29uL2ljb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQWtCM0MsTUFBTSxPQUFPLGNBQWM7Ozs7OztJQU12QixZQUFxQixVQUF3QixFQUFVLFdBQXVCLEVBQTRCLFNBQWM7UUFBbkcsZUFBVSxHQUFWLFVBQVUsQ0FBYztRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQTRCLGNBQVMsR0FBVCxTQUFTLENBQUs7UUFMaEgsYUFBUSxHQUFHLGdCQUFnQixDQUFDO1FBQzVCLG9CQUFlLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7UUFFNUMsb0JBQWUsR0FBZ0IsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUVtRSxDQUFDOzs7Ozs7OztJQVE3SCxJQUFJLGNBQWM7UUFDZCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDekIsQ0FBQzs7Ozs7Ozs7O0lBUUQsSUFBSSxjQUFjLENBQUMsU0FBaUI7UUFDaEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7SUFDOUIsQ0FBQzs7Ozs7Ozs7Ozs7O0lBUU0sb0JBQW9CLENBQUMsS0FBYSxFQUFFLFlBQW9CLEtBQUs7UUFDaEUsbUJBQUEsSUFBSSxFQUFBLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDM0MsT0FBTyxtQkFBQSxJQUFJLEVBQUEs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Q0FBQyxDQUFDO2dCQUN6RCxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQztnQkFDdEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUNsRTtTQUNKO0lBQ0wsQ0FBQzs7O1lBeEtKLFVBQVUsU0FBQztnQkFDUixVQUFVLEVBQUUsTUFBTTthQUNyQjs7OztZQW5CUSxZQUFZO1lBQ1osVUFBVTs0Q0F5QmtFLE1BQU0sU0FBQyxRQUFROzs7Ozs7OztJQUxoRyxrQ0FBb0M7Ozs7O0lBQ3BDLHlDQUFvRDs7Ozs7SUFDcEQsdUNBQW1DOzs7OztJQUNuQyx5Q0FBeUQ7Ozs7O0lBRTVDLG9DQUFnQzs7Ozs7SUFBRSxxQ0FBK0I7Ozs7O0lBQUUsbUNBQXdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgU2VjdXJpdHlDb250ZXh0LCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuLyoqXG4gKiAqKklnbml0ZSBVSSBmb3IgQW5ndWxhciBJY29uIFNlcnZpY2UqKiAtXG4gKlxuICogVGhlIElnbml0ZSBVSSBJY29uIFNlcnZpY2UgbWFrZXMgaXQgZWFzeSBmb3IgZGV2ZWxvcGVycyB0byBpbmNsdWRlIGN1c3RvbSBTVkcgaW1hZ2VzIGFuZCB1c2UgdGhlbSB3aXRoIElneEljb25Db21wb25lbnQuXG4gKiBJbiBhZGRpdGlvbiBpdCBjb3VsZCBiZSB1c2VkIHRvIGFzc29jaWF0ZSBhIGN1c3RvbSBjbGFzcyB0byBiZSBhcHBsaWVkIG9uIElneEljb25Db21wb25lbnQgYWNjb3JkaW5nIHRvIGdpdmVuIGZvbnRTZXQuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHRoaXMuaWNvblNlcnZpY2UucmVnaXN0ZXJGb250U2V0QWxpYXMoJ21hdGVyaWFsJywgJ21hdGVyaWFsLWljb25zJyk7XG4gKiB0aGlzLmljb25TZXJ2aWNlLmFkZFN2Z0ljb24oJ2FydWJhJywgJy9hc3NldHMvc3ZnL2NvdW50cnlfZmxhZ3MvYXJ1YmEuc3ZnJywgJ3N2Zy1mbGFncycpO1xuICogYGBgXG4gKi9cblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hJY29uU2VydmljZSB7XG4gICAgcHJpdmF0ZSBfZm9udFNldCA9ICdtYXRlcmlhbC1pY29ucyc7XG4gICAgcHJpdmF0ZSBfZm9udFNldEFsaWFzZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIHByaXZhdGUgX3N2Z0NvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gICAgcHJpdmF0ZSBfY2FjaGVkU3ZnSWNvbnM6IFNldDxzdHJpbmc+ID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdHJ1Y3RvciAocHJpdmF0ZSBfc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsIHByaXZhdGUgX2h0dHBDbGllbnQ6IEh0dHBDbGllbnQsIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgX2RvY3VtZW50OiBhbnkpIHsgfVxuXG4gICAgLyoqXG4gICAgICogIFJldHVybnMgdGhlIGRlZmF1bHQgZm9udCBzZXQuXG4gICAgICpgYGB0eXBlc2NyaXB0XG4gICAgICogICBjb25zdCBkZWZhdWx0Rm9udFNldCA9IHRoaXMuaWNvblNlcnZpY2UuZGVmYXVsdEZvbnRTZXQ7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IGRlZmF1bHRGb250U2V0KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb250U2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBTZXRzIHRoZSBkZWZhdWx0IGZvbnQgc2V0LlxuICAgICAqYGBgdHlwZXNjcmlwdFxuICAgICAqICAgdGhpcy5pY29uU2VydmljZS5kZWZhdWx0Rm9udFNldCA9ICdzdmctZmxhZ3MnO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHNldCBkZWZhdWx0Rm9udFNldChjbGFzc05hbWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9mb250U2V0ID0gY2xhc3NOYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBSZWdpc3RlcnMgYSBjdXN0b20gY2xhc3MgdG8gYmUgYXBwbGllZCB0byBJZ3hJY29uQ29tcG9uZW50IGZvciBhIGdpdmVuIGZvbnRTZXQuXG4gICAgICpgYGB0eXBlc2NyaXB0XG4gICAgICogICB0aGlzLmljb25TZXJ2aWNlLnJlZ2lzdGVyRm9udFNldEFsaWFzKCdtYXRlcmlhbCcsICdtYXRlcmlhbC1pY29ucycpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyByZWdpc3RlckZvbnRTZXRBbGlhcyhhbGlhczogc3RyaW5nLCBjbGFzc05hbWU6IHN0cmluZyA9IGFsaWFzKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZvbnRTZXRBbGlhc2VzLnNldChhbGlhcywgY2xhc3NOYW1lKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIFJldHVybnMgdGhlIGN1c3RvbSBjbGFzcywgaWYgYW55LCBhc3NvY2lhdGVkIHRvIGEgZ2l2ZW4gZm9udFNldC5cbiAgICAgKmBgYHR5cGVzY3JpcHRcbiAgICAgKiAgIGNvbnN0IGZvbnRTZXRDbGFzcyA9IHRoaXMuaWNvblNlcnZpY2UuZm9udFNldENsYXNzTmFtZSgnbWF0ZXJpYWwnKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZm9udFNldENsYXNzTmFtZShhbGlhczogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZvbnRTZXRBbGlhc2VzLmdldChhbGlhcykgfHwgYWxpYXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIEFkZHMgYW4gU1ZHIGltYWdlIHRvIHRoZSBjYWNoZS4gU1ZHIHNvdXJjZSBpcyBhbiB1cmwuXG4gICAgICpgYGB0eXBlc2NyaXB0XG4gICAgICogICB0aGlzLmljb25TZXJ2aWNlLmFkZFN2Z0ljb24oJ2FydWJhJywgJy9hc3NldHMvc3ZnL2NvdW50cnlfZmxhZ3MvYXJ1YmEuc3ZnJywgJ3N2Zy1mbGFncycpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRTdmdJY29uKGljb25OYW1lOiBzdHJpbmcsIHVybDogc3RyaW5nLCBmb250U2V0OiBzdHJpbmcgPSAnJykge1xuICAgICAgICBpZiAoaWNvbk5hbWUgJiYgdXJsKSB7XG4gICAgICAgICAgICBjb25zdCBzYWZlVXJsID0gdGhpcy5fc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybCh1cmwpO1xuICAgICAgICAgICAgaWYgKCFzYWZlVXJsKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcHJvdmlkZWQgVVJMIGNvdWxkIG5vdCBiZSBwcm9jZXNzZWQgYXMgdHJ1c3RlZCByZXNvdXJjZSBVUkwgYnkgQW5ndWxhcidzIERvbVNhbml0aXplcjogXCIke3VybH1cIi5gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc2FuaXRpemVkVXJsID0gdGhpcy5fc2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5SRVNPVVJDRV9VUkwsIHNhZmVVcmwpO1xuICAgICAgICAgICAgaWYgKCFzYW5pdGl6ZWRVcmwpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBVUkwgcHJvdmlkZWQgd2FzIG5vdCB0cnVzdGVkIGFzIGEgcmVzb3VyY2UgVVJMOiBcIiR7dXJsfVwiLmApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmZldGNoU3ZnKGljb25OYW1lLCB1cmwsIGZvbnRTZXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3Ugc2hvdWxkIHByb3ZpZGUgYXQgbGVhc3QgYGljb25OYW1lYCBhbmQgYHVybGAgdG8gcmVnaXN0ZXIgYW4gc3ZnIGljb24uJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgQWRkcyBhbiBTVkcgaW1hZ2UgdG8gdGhlIGNhY2hlLiBTVkcgc291cmNlIGlzIGl0cyB0ZXh0LlxuICAgICAqYGBgdHlwZXNjcmlwdFxuICAgICAqICAgdGhpcy5pY29uU2VydmljZS5hZGRTdmdJY29uKCdzaW1wbGUnLCAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyMDAgMjAwXCI+XG4gICAgICogICA8cGF0aCBkPVwiTTc0IDc0aDU0djU0SDc0XCIgLz48L3N2Zz4nLCAnc3ZnLWZsYWdzJyk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGFkZFN2Z0ljb25Gcm9tVGV4dChpY29uTmFtZTogc3RyaW5nLCBpY29uVGV4dDogc3RyaW5nLCBmb250U2V0OiBzdHJpbmcgPSAnJykge1xuICAgICAgICBpZiAoaWNvbk5hbWUgJiYgaWNvblRleHQpIHtcbiAgICAgICAgICAgIHRoaXMuY2FjaGVTdmdJY29uKGljb25OYW1lLCBpY29uVGV4dCwgZm9udFNldCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBzaG91bGQgcHJvdmlkZSBhdCBsZWFzdCBgaWNvbk5hbWVgIGFuZCBgaWNvblRleHRgIHRvIHJlZ2lzdGVyIGFuIHN2ZyBpY29uLicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIFJldHVybnMgd2hlYXRoZXIgYSBnaXZlbiBTVkcgaW1hZ2UgaXMgcHJlc2VudCBpbiB0aGUgY2FjaGUuXG4gICAgICpgYGB0eXBlc2NyaXB0XG4gICAgICogICBjb25zdCBpc1N2Z0NhY2hlZCA9IHRoaXMuaWNvblNlcnZpY2UuaXNTdmdJY29uQ2FjaGVkKCdhcnViYScsICdzdmctZmxhZ3MnKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNTdmdJY29uQ2FjaGVkKGljb25OYW1lOiBzdHJpbmcsIGZvbnRTZXQ6IHN0cmluZyA9ICcnKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGljb25LZXkgPSB0aGlzLmdldFN2Z0ljb25LZXkoaWNvbk5hbWUsIGZvbnRTZXQpO1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGVkU3ZnSWNvbnMuaGFzKGljb25LZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIHRoZSBrZXkgb2YgYSBjYWNoZWQgU1ZHIGltYWdlLlxuICAgICAqYGBgdHlwZXNjcmlwdFxuICAgICAqICAgY29uc3Qgc3ZnSWNvbktleSA9IHRoaXMuaWNvblNlcnZpY2UuZ2V0U3ZnSWNvbktleSgnYXJ1YmEnLCAnc3ZnLWZsYWdzJyk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldFN2Z0ljb25LZXkoaWNvbk5hbWU6IHN0cmluZywgZm9udFNldDogc3RyaW5nID0gJycpIHtcbiAgICAgICAgcmV0dXJuIGZvbnRTZXQgKyAnXycgKyBpY29uTmFtZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBmZXRjaFN2ZyhpY29uTmFtZTogc3RyaW5nLCB1cmw6IHN0cmluZywgZm9udFNldDogc3RyaW5nID0gJycpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuX2h0dHBDbGllbnQuZ2V0KHVybCwgeyByZXNwb25zZVR5cGU6ICd0ZXh0JyB9KTtcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gcmVxdWVzdC5zdWJzY3JpYmUoKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2FjaGVTdmdJY29uKGljb25OYW1lLCB2YWx1ZSwgZm9udFNldCk7XG4gICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmV0Y2ggU1ZHIGZyb20gdXJsOiAke3VybH07IGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjYWNoZVN2Z0ljb24oaWNvbk5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZywgZm9udFNldDogc3RyaW5nID0gJycpIHtcbiAgICAgICAgaWYgKGljb25OYW1lICYmIHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmVuc3VyZVN2Z0NvbnRhaW5lckNyZWF0ZWQoKTtcblxuICAgICAgICAgICAgY29uc3QgZGl2ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7XG4gICAgICAgICAgICBkaXYuaW5uZXJIVE1MID0gdmFsdWU7XG4gICAgICAgICAgICBjb25zdCBzdmcgPSBkaXYucXVlcnlTZWxlY3Rvcignc3ZnJykgYXMgU1ZHRWxlbWVudDtcblxuICAgICAgICAgICAgaWYgKHN2Zykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGljb25LZXkgPSB0aGlzLmdldFN2Z0ljb25LZXkoaWNvbk5hbWUsIGZvbnRTZXQpO1xuXG4gICAgICAgICAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZSgnaWQnLCBpY29uS2V5KTtcbiAgICAgICAgICAgICAgICBzdmcuc2V0QXR0cmlidXRlKCdmaXQnLCAnJyk7XG4gICAgICAgICAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZSgncHJlc2VydmVBc3BlY3RSYXRpbycsICd4TWlkWU1pZCBtZWV0Jyk7XG4gICAgICAgICAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZSgnZm9jdXNhYmxlJywgJ2ZhbHNlJyk7IC8vIERpc2FibGUgSUUxMSBkZWZhdWx0IGJlaGF2aW9yIHRvIG1ha2UgU1ZHcyBmb2N1c2FibGUuXG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2FjaGVkU3ZnSWNvbnMuaGFzKGljb25LZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZENoaWxkID0gdGhpcy5fc3ZnQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYHN2Z1tpZD0nJHtpY29uS2V5fSddYCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3N2Z0NvbnRhaW5lci5yZW1vdmVDaGlsZChvbGRDaGlsZCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5fc3ZnQ29udGFpbmVyLmFwcGVuZENoaWxkKHN2Zyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVkU3ZnSWNvbnMuYWRkKGljb25LZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgZW5zdXJlU3ZnQ29udGFpbmVyQ3JlYXRlZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zdmdDb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3N2Z0NvbnRhaW5lciA9IHRoaXMuX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuaWd4LXN2Zy1jb250YWluZXInKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5fc3ZnQ29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3ZnQ29udGFpbmVyID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3ZnQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2lneC1zdmctY29udGFpbmVyJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3N2Z0NvbnRhaW5lcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=