{"ast":null,"code":"import * as i0 from '@angular/core';\nimport { SecurityContext, Injectable, Optional, Inject, SkipSelf, ErrorHandler, InjectionToken, inject, Component, ViewEncapsulation, ChangeDetectionStrategy, Attribute, Input, NgModule } from '@angular/core';\nimport { mixinColor, MatCommonModule } from '@angular/material/core';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { DOCUMENT } from '@angular/common';\nimport { of, throwError, forkJoin, Subscription } from 'rxjs';\nimport { tap, map, catchError, finalize, share, take } from 'rxjs/operators';\nimport * as i1 from '@angular/common/http';\nimport { HttpClient } from '@angular/common/http';\nimport * as i2 from '@angular/platform-browser';\nimport { DomSanitizer } from '@angular/platform-browser';\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * The Trusted Types policy, or null if Trusted Types are not\n * enabled/supported, or undefined if the policy has not been created yet.\n */\n\nconst _c0 = [\"*\"];\nlet policy;\n/**\n * Returns the Trusted Types policy, or null if Trusted Types are not\n * enabled/supported. The first call to this function will create the policy.\n */\n\nfunction getPolicy() {\n  if (policy === undefined) {\n    policy = null;\n\n    if (typeof window !== 'undefined') {\n      const ttWindow = window;\n\n      if (ttWindow.trustedTypes !== undefined) {\n        policy = ttWindow.trustedTypes.createPolicy('angular#components', {\n          createHTML: s => s\n        });\n      }\n    }\n  }\n\n  return policy;\n}\n/**\n * Unsafely promote a string to a TrustedHTML, falling back to strings when\n * Trusted Types are not available.\n * @security This is a security-sensitive function; any use of this function\n * must go through security review. In particular, it must be assured that the\n * provided string will never cause an XSS vulnerability if used in a context\n * that will be interpreted as HTML by a browser, e.g. when assigning to\n * element.innerHTML.\n */\n\n\nfunction trustedHTMLFromString(html) {\n  var _a;\n\n  return ((_a = getPolicy()) === null || _a === void 0 ? void 0 : _a.createHTML(html)) || html;\n}\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Returns an exception to be thrown in the case when attempting to\n * load an icon with a name that cannot be found.\n * @docs-private\n */\n\n\nfunction getMatIconNameNotFoundError(iconName) {\n  return Error(`Unable to find icon with the name \"${iconName}\"`);\n}\n/**\n * Returns an exception to be thrown when the consumer attempts to use\n * `<mat-icon>` without including @angular/common/http.\n * @docs-private\n */\n\n\nfunction getMatIconNoHttpProviderError() {\n  return Error('Could not find HttpClient provider for use with Angular Material icons. ' + 'Please include the HttpClientModule from @angular/common/http in your ' + 'app imports.');\n}\n/**\n * Returns an exception to be thrown when a URL couldn't be sanitized.\n * @param url URL that was attempted to be sanitized.\n * @docs-private\n */\n\n\nfunction getMatIconFailedToSanitizeUrlError(url) {\n  return Error(`The URL provided to MatIconRegistry was not trusted as a resource URL ` + `via Angular's DomSanitizer. Attempted URL was \"${url}\".`);\n}\n/**\n * Returns an exception to be thrown when a HTML string couldn't be sanitized.\n * @param literal HTML that was attempted to be sanitized.\n * @docs-private\n */\n\n\nfunction getMatIconFailedToSanitizeLiteralError(literal) {\n  return Error(`The literal provided to MatIconRegistry was not trusted as safe HTML by ` + `Angular's DomSanitizer. Attempted literal was \"${literal}\".`);\n}\n/**\n * Configuration for an icon, including the URL and possibly the cached SVG element.\n * @docs-private\n */\n\n\nclass SvgIconConfig {\n  constructor(url, svgText, options) {\n    this.url = url;\n    this.svgText = svgText;\n    this.options = options;\n  }\n\n}\n/**\n * Service to register and display icons used by the `<mat-icon>` component.\n * - Registers icon URLs by namespace and name.\n * - Registers icon set URLs by namespace.\n * - Registers aliases for CSS classes, for use with icon fonts.\n * - Loads icons from URLs and extracts individual icons from icon sets.\n */\n\n\nclass MatIconRegistry {\n  constructor(_httpClient, _sanitizer, document, _errorHandler) {\n    this._httpClient = _httpClient;\n    this._sanitizer = _sanitizer;\n    this._errorHandler = _errorHandler;\n    /**\n     * URLs and cached SVG elements for individual icons. Keys are of the format \"[namespace]:[icon]\".\n     */\n\n    this._svgIconConfigs = new Map();\n    /**\n     * SvgIconConfig objects and cached SVG elements for icon sets, keyed by namespace.\n     * Multiple icon sets can be registered under the same namespace.\n     */\n\n    this._iconSetConfigs = new Map();\n    /** Cache for icons loaded by direct URLs. */\n\n    this._cachedIconsByUrl = new Map();\n    /** In-progress icon fetches. Used to coalesce multiple requests to the same URL. */\n\n    this._inProgressUrlFetches = new Map();\n    /** Map from font identifiers to their CSS class names. Used for icon fonts. */\n\n    this._fontCssClassesByAlias = new Map();\n    /** Registered icon resolver functions. */\n\n    this._resolvers = [];\n    /**\n     * The CSS class to apply when an `<mat-icon>` component has no icon name, url, or font specified.\n     * The default 'material-icons' value assumes that the material icon font has been loaded as\n     * described at http://google.github.io/material-design-icons/#icon-font-for-the-web\n     */\n\n    this._defaultFontSetClass = 'material-icons';\n    this._document = document;\n  }\n  /**\n   * Registers an icon by URL in the default namespace.\n   * @param iconName Name under which the icon should be registered.\n   * @param url\n   */\n\n\n  addSvgIcon(iconName, url, options) {\n    return this.addSvgIconInNamespace('', iconName, url, options);\n  }\n  /**\n   * Registers an icon using an HTML string in the default namespace.\n   * @param iconName Name under which the icon should be registered.\n   * @param literal SVG source of the icon.\n   */\n\n\n  addSvgIconLiteral(iconName, literal, options) {\n    return this.addSvgIconLiteralInNamespace('', iconName, literal, options);\n  }\n  /**\n   * Registers an icon by URL in the specified namespace.\n   * @param namespace Namespace in which the icon should be registered.\n   * @param iconName Name under which the icon should be registered.\n   * @param url\n   */\n\n\n  addSvgIconInNamespace(namespace, iconName, url, options) {\n    return this._addSvgIconConfig(namespace, iconName, new SvgIconConfig(url, null, options));\n  }\n  /**\n   * Registers an icon resolver function with the registry. The function will be invoked with the\n   * name and namespace of an icon when the registry tries to resolve the URL from which to fetch\n   * the icon. The resolver is expected to return a `SafeResourceUrl` that points to the icon,\n   * an object with the icon URL and icon options, or `null` if the icon is not supported. Resolvers\n   * will be invoked in the order in which they have been registered.\n   * @param resolver Resolver function to be registered.\n   */\n\n\n  addSvgIconResolver(resolver) {\n    this._resolvers.push(resolver);\n\n    return this;\n  }\n  /**\n   * Registers an icon using an HTML string in the specified namespace.\n   * @param namespace Namespace in which the icon should be registered.\n   * @param iconName Name under which the icon should be registered.\n   * @param literal SVG source of the icon.\n   */\n\n\n  addSvgIconLiteralInNamespace(namespace, iconName, literal, options) {\n    const cleanLiteral = this._sanitizer.sanitize(SecurityContext.HTML, literal); // TODO: add an ngDevMode check\n\n\n    if (!cleanLiteral) {\n      throw getMatIconFailedToSanitizeLiteralError(literal);\n    } // Security: The literal is passed in as SafeHtml, and is thus trusted.\n\n\n    const trustedLiteral = trustedHTMLFromString(cleanLiteral);\n    return this._addSvgIconConfig(namespace, iconName, new SvgIconConfig('', trustedLiteral, options));\n  }\n  /**\n   * Registers an icon set by URL in the default namespace.\n   * @param url\n   */\n\n\n  addSvgIconSet(url, options) {\n    return this.addSvgIconSetInNamespace('', url, options);\n  }\n  /**\n   * Registers an icon set using an HTML string in the default namespace.\n   * @param literal SVG source of the icon set.\n   */\n\n\n  addSvgIconSetLiteral(literal, options) {\n    return this.addSvgIconSetLiteralInNamespace('', literal, options);\n  }\n  /**\n   * Registers an icon set by URL in the specified namespace.\n   * @param namespace Namespace in which to register the icon set.\n   * @param url\n   */\n\n\n  addSvgIconSetInNamespace(namespace, url, options) {\n    return this._addSvgIconSetConfig(namespace, new SvgIconConfig(url, null, options));\n  }\n  /**\n   * Registers an icon set using an HTML string in the specified namespace.\n   * @param namespace Namespace in which to register the icon set.\n   * @param literal SVG source of the icon set.\n   */\n\n\n  addSvgIconSetLiteralInNamespace(namespace, literal, options) {\n    const cleanLiteral = this._sanitizer.sanitize(SecurityContext.HTML, literal);\n\n    if (!cleanLiteral) {\n      throw getMatIconFailedToSanitizeLiteralError(literal);\n    } // Security: The literal is passed in as SafeHtml, and is thus trusted.\n\n\n    const trustedLiteral = trustedHTMLFromString(cleanLiteral);\n    return this._addSvgIconSetConfig(namespace, new SvgIconConfig('', trustedLiteral, options));\n  }\n  /**\n   * Defines an alias for a CSS class name to be used for icon fonts. Creating an matIcon\n   * component with the alias as the fontSet input will cause the class name to be applied\n   * to the `<mat-icon>` element.\n   *\n   * @param alias Alias for the font.\n   * @param className Class name override to be used instead of the alias.\n   */\n\n\n  registerFontClassAlias(alias, className = alias) {\n    this._fontCssClassesByAlias.set(alias, className);\n\n    return this;\n  }\n  /**\n   * Returns the CSS class name associated with the alias by a previous call to\n   * registerFontClassAlias. If no CSS class has been associated, returns the alias unmodified.\n   */\n\n\n  classNameForFontAlias(alias) {\n    return this._fontCssClassesByAlias.get(alias) || alias;\n  }\n  /**\n   * Sets the CSS class name to be used for icon fonts when an `<mat-icon>` component does not\n   * have a fontSet input value, and is not loading an icon by name or URL.\n   *\n   * @param className\n   */\n\n\n  setDefaultFontSetClass(className) {\n    this._defaultFontSetClass = className;\n    return this;\n  }\n  /**\n   * Returns the CSS class name to be used for icon fonts when an `<mat-icon>` component does not\n   * have a fontSet input value, and is not loading an icon by name or URL.\n   */\n\n\n  getDefaultFontSetClass() {\n    return this._defaultFontSetClass;\n  }\n  /**\n   * Returns an Observable that produces the icon (as an `<svg>` DOM element) from the given URL.\n   * The response from the URL may be cached so this will not always cause an HTTP request, but\n   * the produced element will always be a new copy of the originally fetched icon. (That is,\n   * it will not contain any modifications made to elements previously returned).\n   *\n   * @param safeUrl URL from which to fetch the SVG icon.\n   */\n\n\n  getSvgIconFromUrl(safeUrl) {\n    const url = this._sanitizer.sanitize(SecurityContext.RESOURCE_URL, safeUrl);\n\n    if (!url) {\n      throw getMatIconFailedToSanitizeUrlError(safeUrl);\n    }\n\n    const cachedIcon = this._cachedIconsByUrl.get(url);\n\n    if (cachedIcon) {\n      return of(cloneSvg(cachedIcon));\n    }\n\n    return this._loadSvgIconFromConfig(new SvgIconConfig(safeUrl, null)).pipe(tap(svg => this._cachedIconsByUrl.set(url, svg)), map(svg => cloneSvg(svg)));\n  }\n  /**\n   * Returns an Observable that produces the icon (as an `<svg>` DOM element) with the given name\n   * and namespace. The icon must have been previously registered with addIcon or addIconSet;\n   * if not, the Observable will throw an error.\n   *\n   * @param name Name of the icon to be retrieved.\n   * @param namespace Namespace in which to look for the icon.\n   */\n\n\n  getNamedSvgIcon(name, namespace = '') {\n    const key = iconKey(namespace, name);\n\n    let config = this._svgIconConfigs.get(key); // Return (copy of) cached icon if possible.\n\n\n    if (config) {\n      return this._getSvgFromConfig(config);\n    } // Otherwise try to resolve the config from one of the resolver functions.\n\n\n    config = this._getIconConfigFromResolvers(namespace, name);\n\n    if (config) {\n      this._svgIconConfigs.set(key, config);\n\n      return this._getSvgFromConfig(config);\n    } // See if we have any icon sets registered for the namespace.\n\n\n    const iconSetConfigs = this._iconSetConfigs.get(namespace);\n\n    if (iconSetConfigs) {\n      return this._getSvgFromIconSetConfigs(name, iconSetConfigs);\n    }\n\n    return throwError(getMatIconNameNotFoundError(key));\n  }\n\n  ngOnDestroy() {\n    this._resolvers = [];\n\n    this._svgIconConfigs.clear();\n\n    this._iconSetConfigs.clear();\n\n    this._cachedIconsByUrl.clear();\n  }\n  /**\n   * Returns the cached icon for a SvgIconConfig if available, or fetches it from its URL if not.\n   */\n\n\n  _getSvgFromConfig(config) {\n    if (config.svgText) {\n      // We already have the SVG element for this icon, return a copy.\n      return of(cloneSvg(this._svgElementFromConfig(config)));\n    } else {\n      // Fetch the icon from the config's URL, cache it, and return a copy.\n      return this._loadSvgIconFromConfig(config).pipe(map(svg => cloneSvg(svg)));\n    }\n  }\n  /**\n   * Attempts to find an icon with the specified name in any of the SVG icon sets.\n   * First searches the available cached icons for a nested element with a matching name, and\n   * if found copies the element to a new `<svg>` element. If not found, fetches all icon sets\n   * that have not been cached, and searches again after all fetches are completed.\n   * The returned Observable produces the SVG element if possible, and throws\n   * an error if no icon with the specified name can be found.\n   */\n\n\n  _getSvgFromIconSetConfigs(name, iconSetConfigs) {\n    // For all the icon set SVG elements we've fetched, see if any contain an icon with the\n    // requested name.\n    const namedIcon = this._extractIconWithNameFromAnySet(name, iconSetConfigs);\n\n    if (namedIcon) {\n      // We could cache namedIcon in _svgIconConfigs, but since we have to make a copy every\n      // time anyway, there's probably not much advantage compared to just always extracting\n      // it from the icon set.\n      return of(namedIcon);\n    } // Not found in any cached icon sets. If there are icon sets with URLs that we haven't\n    // fetched, fetch them now and look for iconName in the results.\n\n\n    const iconSetFetchRequests = iconSetConfigs.filter(iconSetConfig => !iconSetConfig.svgText).map(iconSetConfig => {\n      return this._loadSvgIconSetFromConfig(iconSetConfig).pipe(catchError(err => {\n        const url = this._sanitizer.sanitize(SecurityContext.RESOURCE_URL, iconSetConfig.url); // Swallow errors fetching individual URLs so the\n        // combined Observable won't necessarily fail.\n\n\n        const errorMessage = `Loading icon set URL: ${url} failed: ${err.message}`;\n\n        this._errorHandler.handleError(new Error(errorMessage));\n\n        return of(null);\n      }));\n    }); // Fetch all the icon set URLs. When the requests complete, every IconSet should have a\n    // cached SVG element (unless the request failed), and we can check again for the icon.\n\n    return forkJoin(iconSetFetchRequests).pipe(map(() => {\n      const foundIcon = this._extractIconWithNameFromAnySet(name, iconSetConfigs); // TODO: add an ngDevMode check\n\n\n      if (!foundIcon) {\n        throw getMatIconNameNotFoundError(name);\n      }\n\n      return foundIcon;\n    }));\n  }\n  /**\n   * Searches the cached SVG elements for the given icon sets for a nested icon element whose \"id\"\n   * tag matches the specified name. If found, copies the nested element to a new SVG element and\n   * returns it. Returns null if no matching element is found.\n   */\n\n\n  _extractIconWithNameFromAnySet(iconName, iconSetConfigs) {\n    // Iterate backwards, so icon sets added later have precedence.\n    for (let i = iconSetConfigs.length - 1; i >= 0; i--) {\n      const config = iconSetConfigs[i]; // Parsing the icon set's text into an SVG element can be expensive. We can avoid some of\n      // the parsing by doing a quick check using `indexOf` to see if there's any chance for the\n      // icon to be in the set. This won't be 100% accurate, but it should help us avoid at least\n      // some of the parsing.\n\n      if (config.svgText && config.svgText.toString().indexOf(iconName) > -1) {\n        const svg = this._svgElementFromConfig(config);\n\n        const foundIcon = this._extractSvgIconFromSet(svg, iconName, config.options);\n\n        if (foundIcon) {\n          return foundIcon;\n        }\n      }\n    }\n\n    return null;\n  }\n  /**\n   * Loads the content of the icon URL specified in the SvgIconConfig and creates an SVG element\n   * from it.\n   */\n\n\n  _loadSvgIconFromConfig(config) {\n    return this._fetchIcon(config).pipe(tap(svgText => config.svgText = svgText), map(() => this._svgElementFromConfig(config)));\n  }\n  /**\n   * Loads the content of the icon set URL specified in the\n   * SvgIconConfig and attaches it to the config.\n   */\n\n\n  _loadSvgIconSetFromConfig(config) {\n    if (config.svgText) {\n      return of(null);\n    }\n\n    return this._fetchIcon(config).pipe(tap(svgText => config.svgText = svgText));\n  }\n  /**\n   * Searches the cached element of the given SvgIconConfig for a nested icon element whose \"id\"\n   * tag matches the specified name. If found, copies the nested element to a new SVG element and\n   * returns it. Returns null if no matching element is found.\n   */\n\n\n  _extractSvgIconFromSet(iconSet, iconName, options) {\n    // Use the `id=\"iconName\"` syntax in order to escape special\n    // characters in the ID (versus using the #iconName syntax).\n    const iconSource = iconSet.querySelector(`[id=\"${iconName}\"]`);\n\n    if (!iconSource) {\n      return null;\n    } // Clone the element and remove the ID to prevent multiple elements from being added\n    // to the page with the same ID.\n\n\n    const iconElement = iconSource.cloneNode(true);\n    iconElement.removeAttribute('id'); // If the icon node is itself an <svg> node, clone and return it directly. If not, set it as\n    // the content of a new <svg> node.\n\n    if (iconElement.nodeName.toLowerCase() === 'svg') {\n      return this._setSvgAttributes(iconElement, options);\n    } // If the node is a <symbol>, it won't be rendered so we have to convert it into <svg>. Note\n    // that the same could be achieved by referring to it via <use href=\"#id\">, however the <use>\n    // tag is problematic on Firefox, because it needs to include the current page path.\n\n\n    if (iconElement.nodeName.toLowerCase() === 'symbol') {\n      return this._setSvgAttributes(this._toSvgElement(iconElement), options);\n    } // createElement('SVG') doesn't work as expected; the DOM ends up with\n    // the correct nodes, but the SVG content doesn't render. Instead we\n    // have to create an empty SVG node using innerHTML and append its content.\n    // Elements created using DOMParser.parseFromString have the same problem.\n    // http://stackoverflow.com/questions/23003278/svg-innerhtml-in-firefox-can-not-display\n\n\n    const svg = this._svgElementFromString(trustedHTMLFromString('<svg></svg>')); // Clone the node so we don't remove it from the parent icon set element.\n\n\n    svg.appendChild(iconElement);\n    return this._setSvgAttributes(svg, options);\n  }\n  /**\n   * Creates a DOM element from the given SVG string.\n   */\n\n\n  _svgElementFromString(str) {\n    const div = this._document.createElement('DIV');\n\n    div.innerHTML = str;\n    const svg = div.querySelector('svg'); // TODO: add an ngDevMode check\n\n    if (!svg) {\n      throw Error('<svg> tag not found');\n    }\n\n    return svg;\n  }\n  /**\n   * Converts an element into an SVG node by cloning all of its children.\n   */\n\n\n  _toSvgElement(element) {\n    const svg = this._svgElementFromString(trustedHTMLFromString('<svg></svg>'));\n\n    const attributes = element.attributes; // Copy over all the attributes from the `symbol` to the new SVG, except the id.\n\n    for (let i = 0; i < attributes.length; i++) {\n      const {\n        name,\n        value\n      } = attributes[i];\n\n      if (name !== 'id') {\n        svg.setAttribute(name, value);\n      }\n    }\n\n    for (let i = 0; i < element.childNodes.length; i++) {\n      if (element.childNodes[i].nodeType === this._document.ELEMENT_NODE) {\n        svg.appendChild(element.childNodes[i].cloneNode(true));\n      }\n    }\n\n    return svg;\n  }\n  /**\n   * Sets the default attributes for an SVG element to be used as an icon.\n   */\n\n\n  _setSvgAttributes(svg, options) {\n    svg.setAttribute('fit', '');\n    svg.setAttribute('height', '100%');\n    svg.setAttribute('width', '100%');\n    svg.setAttribute('preserveAspectRatio', 'xMidYMid meet');\n    svg.setAttribute('focusable', 'false'); // Disable IE11 default behavior to make SVGs focusable.\n\n    if (options && options.viewBox) {\n      svg.setAttribute('viewBox', options.viewBox);\n    }\n\n    return svg;\n  }\n  /**\n   * Returns an Observable which produces the string contents of the given icon. Results may be\n   * cached, so future calls with the same URL may not cause another HTTP request.\n   */\n\n\n  _fetchIcon(iconConfig) {\n    var _a;\n\n    const {\n      url: safeUrl,\n      options\n    } = iconConfig;\n    const withCredentials = (_a = options === null || options === void 0 ? void 0 : options.withCredentials) !== null && _a !== void 0 ? _a : false;\n\n    if (!this._httpClient) {\n      throw getMatIconNoHttpProviderError();\n    } // TODO: add an ngDevMode check\n\n\n    if (safeUrl == null) {\n      throw Error(`Cannot fetch icon from URL \"${safeUrl}\".`);\n    }\n\n    const url = this._sanitizer.sanitize(SecurityContext.RESOURCE_URL, safeUrl); // TODO: add an ngDevMode check\n\n\n    if (!url) {\n      throw getMatIconFailedToSanitizeUrlError(safeUrl);\n    } // Store in-progress fetches to avoid sending a duplicate request for a URL when there is\n    // already a request in progress for that URL. It's necessary to call share() on the\n    // Observable returned by http.get() so that multiple subscribers don't cause multiple XHRs.\n\n\n    const inProgressFetch = this._inProgressUrlFetches.get(url);\n\n    if (inProgressFetch) {\n      return inProgressFetch;\n    }\n\n    const req = this._httpClient.get(url, {\n      responseType: 'text',\n      withCredentials\n    }).pipe(map(svg => {\n      // Security: This SVG is fetched from a SafeResourceUrl, and is thus\n      // trusted HTML.\n      return trustedHTMLFromString(svg);\n    }), finalize(() => this._inProgressUrlFetches.delete(url)), share());\n\n    this._inProgressUrlFetches.set(url, req);\n\n    return req;\n  }\n  /**\n   * Registers an icon config by name in the specified namespace.\n   * @param namespace Namespace in which to register the icon config.\n   * @param iconName Name under which to register the config.\n   * @param config Config to be registered.\n   */\n\n\n  _addSvgIconConfig(namespace, iconName, config) {\n    this._svgIconConfigs.set(iconKey(namespace, iconName), config);\n\n    return this;\n  }\n  /**\n   * Registers an icon set config in the specified namespace.\n   * @param namespace Namespace in which to register the icon config.\n   * @param config Config to be registered.\n   */\n\n\n  _addSvgIconSetConfig(namespace, config) {\n    const configNamespace = this._iconSetConfigs.get(namespace);\n\n    if (configNamespace) {\n      configNamespace.push(config);\n    } else {\n      this._iconSetConfigs.set(namespace, [config]);\n    }\n\n    return this;\n  }\n  /** Parses a config's text into an SVG element. */\n\n\n  _svgElementFromConfig(config) {\n    if (!config.svgElement) {\n      const svg = this._svgElementFromString(config.svgText);\n\n      this._setSvgAttributes(svg, config.options);\n\n      config.svgElement = svg;\n    }\n\n    return config.svgElement;\n  }\n  /** Tries to create an icon config through the registered resolver functions. */\n\n\n  _getIconConfigFromResolvers(namespace, name) {\n    for (let i = 0; i < this._resolvers.length; i++) {\n      const result = this._resolvers[i](name, namespace);\n\n      if (result) {\n        return isSafeUrlWithOptions(result) ? new SvgIconConfig(result.url, null, result.options) : new SvgIconConfig(result, null);\n      }\n    }\n\n    return undefined;\n  }\n\n}\n\nMatIconRegistry.ɵfac = function MatIconRegistry_Factory(t) {\n  return new (t || MatIconRegistry)(i0.ɵɵinject(i1.HttpClient, 8), i0.ɵɵinject(i2.DomSanitizer), i0.ɵɵinject(DOCUMENT, 8), i0.ɵɵinject(i0.ErrorHandler));\n};\n\nMatIconRegistry.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n  token: MatIconRegistry,\n  factory: MatIconRegistry.ɵfac,\n  providedIn: 'root'\n});\n\n(function () {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && i0.ɵsetClassMetadata(MatIconRegistry, [{\n    type: Injectable,\n    args: [{\n      providedIn: 'root'\n    }]\n  }], function () {\n    return [{\n      type: i1.HttpClient,\n      decorators: [{\n        type: Optional\n      }]\n    }, {\n      type: i2.DomSanitizer\n    }, {\n      type: undefined,\n      decorators: [{\n        type: Optional\n      }, {\n        type: Inject,\n        args: [DOCUMENT]\n      }]\n    }, {\n      type: i0.ErrorHandler\n    }];\n  }, null);\n})();\n/** @docs-private */\n\n\nfunction ICON_REGISTRY_PROVIDER_FACTORY(parentRegistry, httpClient, sanitizer, errorHandler, document) {\n  return parentRegistry || new MatIconRegistry(httpClient, sanitizer, document, errorHandler);\n}\n/** @docs-private */\n\n\nconst ICON_REGISTRY_PROVIDER = {\n  // If there is already an MatIconRegistry available, use that. Otherwise, provide a new one.\n  provide: MatIconRegistry,\n  deps: [[new Optional(), new SkipSelf(), MatIconRegistry], [new Optional(), HttpClient], DomSanitizer, ErrorHandler, [new Optional(), DOCUMENT]],\n  useFactory: ICON_REGISTRY_PROVIDER_FACTORY\n};\n/** Clones an SVGElement while preserving type information. */\n\nfunction cloneSvg(svg) {\n  return svg.cloneNode(true);\n}\n/** Returns the cache key to use for an icon namespace and name. */\n\n\nfunction iconKey(namespace, name) {\n  return namespace + ':' + name;\n}\n\nfunction isSafeUrlWithOptions(value) {\n  return !!(value.url && value.options);\n}\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n// Boilerplate for applying mixins to MatIcon.\n\n/** @docs-private */\n\n\nconst _MatIconBase = mixinColor(class {\n  constructor(_elementRef) {\n    this._elementRef = _elementRef;\n  }\n\n});\n/**\n * Injection token used to provide the current location to `MatIcon`.\n * Used to handle server-side rendering and to stub out during unit tests.\n * @docs-private\n */\n\n\nconst MAT_ICON_LOCATION = new InjectionToken('mat-icon-location', {\n  providedIn: 'root',\n  factory: MAT_ICON_LOCATION_FACTORY\n});\n/** @docs-private */\n\nfunction MAT_ICON_LOCATION_FACTORY() {\n  const _document = inject(DOCUMENT);\n\n  const _location = _document ? _document.location : null;\n\n  return {\n    // Note that this needs to be a function, rather than a property, because Angular\n    // will only resolve it once, but we want the current path on each call.\n    getPathname: () => _location ? _location.pathname + _location.search : ''\n  };\n}\n/** SVG attributes that accept a FuncIRI (e.g. `url(<something>)`). */\n\n\nconst funcIriAttributes = ['clip-path', 'color-profile', 'src', 'cursor', 'fill', 'filter', 'marker', 'marker-start', 'marker-mid', 'marker-end', 'mask', 'stroke'];\n/** Selector that can be used to find all elements that are using a `FuncIRI`. */\n\nconst funcIriAttributeSelector = funcIriAttributes.map(attr => `[${attr}]`).join(', ');\n/** Regex that can be used to extract the id out of a FuncIRI. */\n\nconst funcIriPattern = /^url\\(['\"]?#(.*?)['\"]?\\)$/;\n/**\n * Component to display an icon. It can be used in the following ways:\n *\n * - Specify the svgIcon input to load an SVG icon from a URL previously registered with the\n *   addSvgIcon, addSvgIconInNamespace, addSvgIconSet, or addSvgIconSetInNamespace methods of\n *   MatIconRegistry. If the svgIcon value contains a colon it is assumed to be in the format\n *   \"[namespace]:[name]\", if not the value will be the name of an icon in the default namespace.\n *   Examples:\n *     `<mat-icon svgIcon=\"left-arrow\"></mat-icon>\n *     <mat-icon svgIcon=\"animals:cat\"></mat-icon>`\n *\n * - Use a font ligature as an icon by putting the ligature text in the content of the `<mat-icon>`\n *   component. By default the Material icons font is used as described at\n *   http://google.github.io/material-design-icons/#icon-font-for-the-web. You can specify an\n *   alternate font by setting the fontSet input to either the CSS class to apply to use the\n *   desired font, or to an alias previously registered with MatIconRegistry.registerFontClassAlias.\n *   Examples:\n *     `<mat-icon>home</mat-icon>\n *     <mat-icon fontSet=\"myfont\">sun</mat-icon>`\n *\n * - Specify a font glyph to be included via CSS rules by setting the fontSet input to specify the\n *   font, and the fontIcon input to specify the icon. Typically the fontIcon will specify a\n *   CSS class which causes the glyph to be displayed via a :before selector, as in\n *   https://fortawesome.github.io/Font-Awesome/examples/\n *   Example:\n *     `<mat-icon fontSet=\"fa\" fontIcon=\"alarm\"></mat-icon>`\n */\n\nclass MatIcon extends _MatIconBase {\n  constructor(elementRef, _iconRegistry, ariaHidden, _location, _errorHandler) {\n    super(elementRef);\n    this._iconRegistry = _iconRegistry;\n    this._location = _location;\n    this._errorHandler = _errorHandler;\n    this._inline = false;\n    /** Subscription to the current in-progress SVG icon request. */\n\n    this._currentIconFetch = Subscription.EMPTY; // If the user has not explicitly set aria-hidden, mark the icon as hidden, as this is\n    // the right thing to do for the majority of icon use-cases.\n\n    if (!ariaHidden) {\n      elementRef.nativeElement.setAttribute('aria-hidden', 'true');\n    }\n  }\n  /**\n   * Whether the icon should be inlined, automatically sizing the icon to match the font size of\n   * the element the icon is contained in.\n   */\n\n\n  get inline() {\n    return this._inline;\n  }\n\n  set inline(inline) {\n    this._inline = coerceBooleanProperty(inline);\n  }\n  /** Name of the icon in the SVG icon set. */\n\n\n  get svgIcon() {\n    return this._svgIcon;\n  }\n\n  set svgIcon(value) {\n    if (value !== this._svgIcon) {\n      if (value) {\n        this._updateSvgIcon(value);\n      } else if (this._svgIcon) {\n        this._clearSvgElement();\n      }\n\n      this._svgIcon = value;\n    }\n  }\n  /** Font set that the icon is a part of. */\n\n\n  get fontSet() {\n    return this._fontSet;\n  }\n\n  set fontSet(value) {\n    const newValue = this._cleanupFontValue(value);\n\n    if (newValue !== this._fontSet) {\n      this._fontSet = newValue;\n\n      this._updateFontIconClasses();\n    }\n  }\n  /** Name of an icon within a font set. */\n\n\n  get fontIcon() {\n    return this._fontIcon;\n  }\n\n  set fontIcon(value) {\n    const newValue = this._cleanupFontValue(value);\n\n    if (newValue !== this._fontIcon) {\n      this._fontIcon = newValue;\n\n      this._updateFontIconClasses();\n    }\n  }\n  /**\n   * Splits an svgIcon binding value into its icon set and icon name components.\n   * Returns a 2-element array of [(icon set), (icon name)].\n   * The separator for the two fields is ':'. If there is no separator, an empty\n   * string is returned for the icon set and the entire value is returned for\n   * the icon name. If the argument is falsy, returns an array of two empty strings.\n   * Throws an error if the name contains two or more ':' separators.\n   * Examples:\n   *   `'social:cake' -> ['social', 'cake']\n   *   'penguin' -> ['', 'penguin']\n   *   null -> ['', '']\n   *   'a:b:c' -> (throws Error)`\n   */\n\n\n  _splitIconName(iconName) {\n    if (!iconName) {\n      return ['', ''];\n    }\n\n    const parts = iconName.split(':');\n\n    switch (parts.length) {\n      case 1:\n        return ['', parts[0]];\n      // Use default namespace.\n\n      case 2:\n        return parts;\n\n      default:\n        throw Error(`Invalid icon name: \"${iconName}\"`);\n      // TODO: add an ngDevMode check\n    }\n  }\n\n  ngOnInit() {\n    // Update font classes because ngOnChanges won't be called if none of the inputs are present,\n    // e.g. <mat-icon>arrow</mat-icon> In this case we need to add a CSS class for the default font.\n    this._updateFontIconClasses();\n  }\n\n  ngAfterViewChecked() {\n    const cachedElements = this._elementsWithExternalReferences;\n\n    if (cachedElements && cachedElements.size) {\n      const newPath = this._location.getPathname(); // We need to check whether the URL has changed on each change detection since\n      // the browser doesn't have an API that will let us react on link clicks and\n      // we can't depend on the Angular router. The references need to be updated,\n      // because while most browsers don't care whether the URL is correct after\n      // the first render, Safari will break if the user navigates to a different\n      // page and the SVG isn't re-rendered.\n\n\n      if (newPath !== this._previousPath) {\n        this._previousPath = newPath;\n\n        this._prependPathToReferences(newPath);\n      }\n    }\n  }\n\n  ngOnDestroy() {\n    this._currentIconFetch.unsubscribe();\n\n    if (this._elementsWithExternalReferences) {\n      this._elementsWithExternalReferences.clear();\n    }\n  }\n\n  _usingFontIcon() {\n    return !this.svgIcon;\n  }\n\n  _setSvgElement(svg) {\n    this._clearSvgElement(); // Workaround for IE11 and Edge ignoring `style` tags inside dynamically-created SVGs.\n    // See: https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/10898469/\n    // Do this before inserting the element into the DOM, in order to avoid a style recalculation.\n\n\n    const styleTags = svg.querySelectorAll('style');\n\n    for (let i = 0; i < styleTags.length; i++) {\n      styleTags[i].textContent += ' ';\n    } // Note: we do this fix here, rather than the icon registry, because the\n    // references have to point to the URL at the time that the icon was created.\n\n\n    const path = this._location.getPathname();\n\n    this._previousPath = path;\n\n    this._cacheChildrenWithExternalReferences(svg);\n\n    this._prependPathToReferences(path);\n\n    this._elementRef.nativeElement.appendChild(svg);\n  }\n\n  _clearSvgElement() {\n    const layoutElement = this._elementRef.nativeElement;\n    let childCount = layoutElement.childNodes.length;\n\n    if (this._elementsWithExternalReferences) {\n      this._elementsWithExternalReferences.clear();\n    } // Remove existing non-element child nodes and SVGs, and add the new SVG element. Note that\n    // we can't use innerHTML, because IE will throw if the element has a data binding.\n\n\n    while (childCount--) {\n      const child = layoutElement.childNodes[childCount]; // 1 corresponds to Node.ELEMENT_NODE. We remove all non-element nodes in order to get rid\n      // of any loose text nodes, as well as any SVG elements in order to remove any old icons.\n\n      if (child.nodeType !== 1 || child.nodeName.toLowerCase() === 'svg') {\n        child.remove();\n      }\n    }\n  }\n\n  _updateFontIconClasses() {\n    if (!this._usingFontIcon()) {\n      return;\n    }\n\n    const elem = this._elementRef.nativeElement;\n    const fontSetClass = this.fontSet ? this._iconRegistry.classNameForFontAlias(this.fontSet) : this._iconRegistry.getDefaultFontSetClass();\n\n    if (fontSetClass != this._previousFontSetClass) {\n      if (this._previousFontSetClass) {\n        elem.classList.remove(this._previousFontSetClass);\n      }\n\n      if (fontSetClass) {\n        elem.classList.add(fontSetClass);\n      }\n\n      this._previousFontSetClass = fontSetClass;\n    }\n\n    if (this.fontIcon != this._previousFontIconClass) {\n      if (this._previousFontIconClass) {\n        elem.classList.remove(this._previousFontIconClass);\n      }\n\n      if (this.fontIcon) {\n        elem.classList.add(this.fontIcon);\n      }\n\n      this._previousFontIconClass = this.fontIcon;\n    }\n  }\n  /**\n   * Cleans up a value to be used as a fontIcon or fontSet.\n   * Since the value ends up being assigned as a CSS class, we\n   * have to trim the value and omit space-separated values.\n   */\n\n\n  _cleanupFontValue(value) {\n    return typeof value === 'string' ? value.trim().split(' ')[0] : value;\n  }\n  /**\n   * Prepends the current path to all elements that have an attribute pointing to a `FuncIRI`\n   * reference. This is required because WebKit browsers require references to be prefixed with\n   * the current path, if the page has a `base` tag.\n   */\n\n\n  _prependPathToReferences(path) {\n    const elements = this._elementsWithExternalReferences;\n\n    if (elements) {\n      elements.forEach((attrs, element) => {\n        attrs.forEach(attr => {\n          element.setAttribute(attr.name, `url('${path}#${attr.value}')`);\n        });\n      });\n    }\n  }\n  /**\n   * Caches the children of an SVG element that have `url()`\n   * references that we need to prefix with the current path.\n   */\n\n\n  _cacheChildrenWithExternalReferences(element) {\n    const elementsWithFuncIri = element.querySelectorAll(funcIriAttributeSelector);\n    const elements = this._elementsWithExternalReferences = this._elementsWithExternalReferences || new Map();\n\n    for (let i = 0; i < elementsWithFuncIri.length; i++) {\n      funcIriAttributes.forEach(attr => {\n        const elementWithReference = elementsWithFuncIri[i];\n        const value = elementWithReference.getAttribute(attr);\n        const match = value ? value.match(funcIriPattern) : null;\n\n        if (match) {\n          let attributes = elements.get(elementWithReference);\n\n          if (!attributes) {\n            attributes = [];\n            elements.set(elementWithReference, attributes);\n          }\n\n          attributes.push({\n            name: attr,\n            value: match[1]\n          });\n        }\n      });\n    }\n  }\n  /** Sets a new SVG icon with a particular name. */\n\n\n  _updateSvgIcon(rawName) {\n    this._svgNamespace = null;\n    this._svgName = null;\n\n    this._currentIconFetch.unsubscribe();\n\n    if (rawName) {\n      const [namespace, iconName] = this._splitIconName(rawName);\n\n      if (namespace) {\n        this._svgNamespace = namespace;\n      }\n\n      if (iconName) {\n        this._svgName = iconName;\n      }\n\n      this._currentIconFetch = this._iconRegistry.getNamedSvgIcon(iconName, namespace).pipe(take(1)).subscribe(svg => this._setSvgElement(svg), err => {\n        const errorMessage = `Error retrieving icon ${namespace}:${iconName}! ${err.message}`;\n\n        this._errorHandler.handleError(new Error(errorMessage));\n      });\n    }\n  }\n\n}\n\nMatIcon.ɵfac = function MatIcon_Factory(t) {\n  return new (t || MatIcon)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(MatIconRegistry), i0.ɵɵinjectAttribute('aria-hidden'), i0.ɵɵdirectiveInject(MAT_ICON_LOCATION), i0.ɵɵdirectiveInject(i0.ErrorHandler));\n};\n\nMatIcon.ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n  type: MatIcon,\n  selectors: [[\"mat-icon\"]],\n  hostAttrs: [\"role\", \"img\", 1, \"mat-icon\", \"notranslate\"],\n  hostVars: 7,\n  hostBindings: function MatIcon_HostBindings(rf, ctx) {\n    if (rf & 2) {\n      i0.ɵɵattribute(\"data-mat-icon-type\", ctx._usingFontIcon() ? \"font\" : \"svg\")(\"data-mat-icon-name\", ctx._svgName || ctx.fontIcon)(\"data-mat-icon-namespace\", ctx._svgNamespace || ctx.fontSet);\n      i0.ɵɵclassProp(\"mat-icon-inline\", ctx.inline)(\"mat-icon-no-color\", ctx.color !== \"primary\" && ctx.color !== \"accent\" && ctx.color !== \"warn\");\n    }\n  },\n  inputs: {\n    color: \"color\",\n    inline: \"inline\",\n    svgIcon: \"svgIcon\",\n    fontSet: \"fontSet\",\n    fontIcon: \"fontIcon\"\n  },\n  exportAs: [\"matIcon\"],\n  features: [i0.ɵɵInheritDefinitionFeature],\n  ngContentSelectors: _c0,\n  decls: 1,\n  vars: 0,\n  template: function MatIcon_Template(rf, ctx) {\n    if (rf & 1) {\n      i0.ɵɵprojectionDef();\n      i0.ɵɵprojection(0);\n    }\n  },\n  styles: [\".mat-icon{-webkit-user-select:none;-moz-user-select:none;user-select:none;background-repeat:no-repeat;display:inline-block;fill:currentColor;height:24px;width:24px}.mat-icon.mat-icon-inline{font-size:inherit;height:inherit;line-height:inherit;width:inherit}[dir=rtl] .mat-icon-rtl-mirror{transform:scale(-1, 1)}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon{display:block}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon-button .mat-icon,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon-button .mat-icon{margin:auto}\\n\"],\n  encapsulation: 2,\n  changeDetection: 0\n});\n\n(function () {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && i0.ɵsetClassMetadata(MatIcon, [{\n    type: Component,\n    args: [{\n      template: '<ng-content></ng-content>',\n      selector: 'mat-icon',\n      exportAs: 'matIcon',\n      inputs: ['color'],\n      host: {\n        'role': 'img',\n        'class': 'mat-icon notranslate',\n        '[attr.data-mat-icon-type]': '_usingFontIcon() ? \"font\" : \"svg\"',\n        '[attr.data-mat-icon-name]': '_svgName || fontIcon',\n        '[attr.data-mat-icon-namespace]': '_svgNamespace || fontSet',\n        '[class.mat-icon-inline]': 'inline',\n        '[class.mat-icon-no-color]': 'color !== \"primary\" && color !== \"accent\" && color !== \"warn\"'\n      },\n      encapsulation: ViewEncapsulation.None,\n      changeDetection: ChangeDetectionStrategy.OnPush,\n      styles: [\".mat-icon{-webkit-user-select:none;-moz-user-select:none;user-select:none;background-repeat:no-repeat;display:inline-block;fill:currentColor;height:24px;width:24px}.mat-icon.mat-icon-inline{font-size:inherit;height:inherit;line-height:inherit;width:inherit}[dir=rtl] .mat-icon-rtl-mirror{transform:scale(-1, 1)}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon{display:block}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon-button .mat-icon,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon-button .mat-icon{margin:auto}\\n\"]\n    }]\n  }], function () {\n    return [{\n      type: i0.ElementRef\n    }, {\n      type: MatIconRegistry\n    }, {\n      type: undefined,\n      decorators: [{\n        type: Attribute,\n        args: ['aria-hidden']\n      }]\n    }, {\n      type: undefined,\n      decorators: [{\n        type: Inject,\n        args: [MAT_ICON_LOCATION]\n      }]\n    }, {\n      type: i0.ErrorHandler\n    }];\n  }, {\n    inline: [{\n      type: Input\n    }],\n    svgIcon: [{\n      type: Input\n    }],\n    fontSet: [{\n      type: Input\n    }],\n    fontIcon: [{\n      type: Input\n    }]\n  });\n})();\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n\nclass MatIconModule {}\n\nMatIconModule.ɵfac = function MatIconModule_Factory(t) {\n  return new (t || MatIconModule)();\n};\n\nMatIconModule.ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n  type: MatIconModule\n});\nMatIconModule.ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n  imports: [[MatCommonModule], MatCommonModule]\n});\n\n(function () {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && i0.ɵsetClassMetadata(MatIconModule, [{\n    type: NgModule,\n    args: [{\n      imports: [MatCommonModule],\n      exports: [MatIcon, MatCommonModule],\n      declarations: [MatIcon]\n    }]\n  }], null, null);\n})();\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\n\nexport { ICON_REGISTRY_PROVIDER, ICON_REGISTRY_PROVIDER_FACTORY, MAT_ICON_LOCATION, MAT_ICON_LOCATION_FACTORY, MatIcon, MatIconModule, MatIconRegistry, getMatIconFailedToSanitizeLiteralError, getMatIconFailedToSanitizeUrlError, getMatIconNameNotFoundError, getMatIconNoHttpProviderError };","map":{"version":3,"sources":["D:/Development/Work/CENOS/cenos-ui/node_modules/@angular/material/fesm2015/icon.mjs"],"names":["i0","SecurityContext","Injectable","Optional","Inject","SkipSelf","ErrorHandler","InjectionToken","inject","Component","ViewEncapsulation","ChangeDetectionStrategy","Attribute","Input","NgModule","mixinColor","MatCommonModule","coerceBooleanProperty","DOCUMENT","of","throwError","forkJoin","Subscription","tap","map","catchError","finalize","share","take","i1","HttpClient","i2","DomSanitizer","policy","getPolicy","undefined","window","ttWindow","trustedTypes","createPolicy","createHTML","s","trustedHTMLFromString","html","_a","getMatIconNameNotFoundError","iconName","Error","getMatIconNoHttpProviderError","getMatIconFailedToSanitizeUrlError","url","getMatIconFailedToSanitizeLiteralError","literal","SvgIconConfig","constructor","svgText","options","MatIconRegistry","_httpClient","_sanitizer","document","_errorHandler","_svgIconConfigs","Map","_iconSetConfigs","_cachedIconsByUrl","_inProgressUrlFetches","_fontCssClassesByAlias","_resolvers","_defaultFontSetClass","_document","addSvgIcon","addSvgIconInNamespace","addSvgIconLiteral","addSvgIconLiteralInNamespace","namespace","_addSvgIconConfig","addSvgIconResolver","resolver","push","cleanLiteral","sanitize","HTML","trustedLiteral","addSvgIconSet","addSvgIconSetInNamespace","addSvgIconSetLiteral","addSvgIconSetLiteralInNamespace","_addSvgIconSetConfig","registerFontClassAlias","alias","className","set","classNameForFontAlias","get","setDefaultFontSetClass","getDefaultFontSetClass","getSvgIconFromUrl","safeUrl","RESOURCE_URL","cachedIcon","cloneSvg","_loadSvgIconFromConfig","pipe","svg","getNamedSvgIcon","name","key","iconKey","config","_getSvgFromConfig","_getIconConfigFromResolvers","iconSetConfigs","_getSvgFromIconSetConfigs","ngOnDestroy","clear","_svgElementFromConfig","namedIcon","_extractIconWithNameFromAnySet","iconSetFetchRequests","filter","iconSetConfig","_loadSvgIconSetFromConfig","err","errorMessage","message","handleError","foundIcon","i","length","toString","indexOf","_extractSvgIconFromSet","_fetchIcon","iconSet","iconSource","querySelector","iconElement","cloneNode","removeAttribute","nodeName","toLowerCase","_setSvgAttributes","_toSvgElement","_svgElementFromString","appendChild","str","div","createElement","innerHTML","element","attributes","value","setAttribute","childNodes","nodeType","ELEMENT_NODE","viewBox","iconConfig","withCredentials","inProgressFetch","req","responseType","delete","configNamespace","svgElement","result","isSafeUrlWithOptions","ɵfac","ɵprov","type","args","providedIn","decorators","ICON_REGISTRY_PROVIDER_FACTORY","parentRegistry","httpClient","sanitizer","errorHandler","ICON_REGISTRY_PROVIDER","provide","deps","useFactory","_MatIconBase","_elementRef","MAT_ICON_LOCATION","factory","MAT_ICON_LOCATION_FACTORY","_location","location","getPathname","pathname","search","funcIriAttributes","funcIriAttributeSelector","attr","join","funcIriPattern","MatIcon","elementRef","_iconRegistry","ariaHidden","_inline","_currentIconFetch","EMPTY","nativeElement","inline","svgIcon","_svgIcon","_updateSvgIcon","_clearSvgElement","fontSet","_fontSet","newValue","_cleanupFontValue","_updateFontIconClasses","fontIcon","_fontIcon","_splitIconName","parts","split","ngOnInit","ngAfterViewChecked","cachedElements","_elementsWithExternalReferences","size","newPath","_previousPath","_prependPathToReferences","unsubscribe","_usingFontIcon","_setSvgElement","styleTags","querySelectorAll","textContent","path","_cacheChildrenWithExternalReferences","layoutElement","childCount","child","remove","elem","fontSetClass","_previousFontSetClass","classList","add","_previousFontIconClass","trim","elements","forEach","attrs","elementsWithFuncIri","elementWithReference","getAttribute","match","rawName","_svgNamespace","_svgName","subscribe","ElementRef","ɵcmp","template","selector","exportAs","inputs","host","encapsulation","None","changeDetection","OnPush","styles","MatIconModule","ɵmod","ɵinj","imports","exports","declarations"],"mappings":"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","sourcesContent":["import * as i0 from '@angular/core';\nimport { SecurityContext, Injectable, Optional, Inject, SkipSelf, ErrorHandler, InjectionToken, inject, Component, ViewEncapsulation, ChangeDetectionStrategy, Attribute, Input, NgModule } from '@angular/core';\nimport { mixinColor, MatCommonModule } from '@angular/material/core';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { DOCUMENT } from '@angular/common';\nimport { of, throwError, forkJoin, Subscription } from 'rxjs';\nimport { tap, map, catchError, finalize, share, take } from 'rxjs/operators';\nimport * as i1 from '@angular/common/http';\nimport { HttpClient } from '@angular/common/http';\nimport * as i2 from '@angular/platform-browser';\nimport { DomSanitizer } from '@angular/platform-browser';\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * The Trusted Types policy, or null if Trusted Types are not\n * enabled/supported, or undefined if the policy has not been created yet.\n */\nlet policy;\n/**\n * Returns the Trusted Types policy, or null if Trusted Types are not\n * enabled/supported. The first call to this function will create the policy.\n */\nfunction getPolicy() {\n    if (policy === undefined) {\n        policy = null;\n        if (typeof window !== 'undefined') {\n            const ttWindow = window;\n            if (ttWindow.trustedTypes !== undefined) {\n                policy = ttWindow.trustedTypes.createPolicy('angular#components', {\n                    createHTML: (s) => s,\n                });\n            }\n        }\n    }\n    return policy;\n}\n/**\n * Unsafely promote a string to a TrustedHTML, falling back to strings when\n * Trusted Types are not available.\n * @security This is a security-sensitive function; any use of this function\n * must go through security review. In particular, it must be assured that the\n * provided string will never cause an XSS vulnerability if used in a context\n * that will be interpreted as HTML by a browser, e.g. when assigning to\n * element.innerHTML.\n */\nfunction trustedHTMLFromString(html) {\n    var _a;\n    return ((_a = getPolicy()) === null || _a === void 0 ? void 0 : _a.createHTML(html)) || html;\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Returns an exception to be thrown in the case when attempting to\n * load an icon with a name that cannot be found.\n * @docs-private\n */\nfunction getMatIconNameNotFoundError(iconName) {\n    return Error(`Unable to find icon with the name \"${iconName}\"`);\n}\n/**\n * Returns an exception to be thrown when the consumer attempts to use\n * `<mat-icon>` without including @angular/common/http.\n * @docs-private\n */\nfunction getMatIconNoHttpProviderError() {\n    return Error('Could not find HttpClient provider for use with Angular Material icons. ' +\n        'Please include the HttpClientModule from @angular/common/http in your ' +\n        'app imports.');\n}\n/**\n * Returns an exception to be thrown when a URL couldn't be sanitized.\n * @param url URL that was attempted to be sanitized.\n * @docs-private\n */\nfunction getMatIconFailedToSanitizeUrlError(url) {\n    return Error(`The URL provided to MatIconRegistry was not trusted as a resource URL ` +\n        `via Angular's DomSanitizer. Attempted URL was \"${url}\".`);\n}\n/**\n * Returns an exception to be thrown when a HTML string couldn't be sanitized.\n * @param literal HTML that was attempted to be sanitized.\n * @docs-private\n */\nfunction getMatIconFailedToSanitizeLiteralError(literal) {\n    return Error(`The literal provided to MatIconRegistry was not trusted as safe HTML by ` +\n        `Angular's DomSanitizer. Attempted literal was \"${literal}\".`);\n}\n/**\n * Configuration for an icon, including the URL and possibly the cached SVG element.\n * @docs-private\n */\nclass SvgIconConfig {\n    constructor(url, svgText, options) {\n        this.url = url;\n        this.svgText = svgText;\n        this.options = options;\n    }\n}\n/**\n * Service to register and display icons used by the `<mat-icon>` component.\n * - Registers icon URLs by namespace and name.\n * - Registers icon set URLs by namespace.\n * - Registers aliases for CSS classes, for use with icon fonts.\n * - Loads icons from URLs and extracts individual icons from icon sets.\n */\nclass MatIconRegistry {\n    constructor(_httpClient, _sanitizer, document, _errorHandler) {\n        this._httpClient = _httpClient;\n        this._sanitizer = _sanitizer;\n        this._errorHandler = _errorHandler;\n        /**\n         * URLs and cached SVG elements for individual icons. Keys are of the format \"[namespace]:[icon]\".\n         */\n        this._svgIconConfigs = new Map();\n        /**\n         * SvgIconConfig objects and cached SVG elements for icon sets, keyed by namespace.\n         * Multiple icon sets can be registered under the same namespace.\n         */\n        this._iconSetConfigs = new Map();\n        /** Cache for icons loaded by direct URLs. */\n        this._cachedIconsByUrl = new Map();\n        /** In-progress icon fetches. Used to coalesce multiple requests to the same URL. */\n        this._inProgressUrlFetches = new Map();\n        /** Map from font identifiers to their CSS class names. Used for icon fonts. */\n        this._fontCssClassesByAlias = new Map();\n        /** Registered icon resolver functions. */\n        this._resolvers = [];\n        /**\n         * The CSS class to apply when an `<mat-icon>` component has no icon name, url, or font specified.\n         * The default 'material-icons' value assumes that the material icon font has been loaded as\n         * described at http://google.github.io/material-design-icons/#icon-font-for-the-web\n         */\n        this._defaultFontSetClass = 'material-icons';\n        this._document = document;\n    }\n    /**\n     * Registers an icon by URL in the default namespace.\n     * @param iconName Name under which the icon should be registered.\n     * @param url\n     */\n    addSvgIcon(iconName, url, options) {\n        return this.addSvgIconInNamespace('', iconName, url, options);\n    }\n    /**\n     * Registers an icon using an HTML string in the default namespace.\n     * @param iconName Name under which the icon should be registered.\n     * @param literal SVG source of the icon.\n     */\n    addSvgIconLiteral(iconName, literal, options) {\n        return this.addSvgIconLiteralInNamespace('', iconName, literal, options);\n    }\n    /**\n     * Registers an icon by URL in the specified namespace.\n     * @param namespace Namespace in which the icon should be registered.\n     * @param iconName Name under which the icon should be registered.\n     * @param url\n     */\n    addSvgIconInNamespace(namespace, iconName, url, options) {\n        return this._addSvgIconConfig(namespace, iconName, new SvgIconConfig(url, null, options));\n    }\n    /**\n     * Registers an icon resolver function with the registry. The function will be invoked with the\n     * name and namespace of an icon when the registry tries to resolve the URL from which to fetch\n     * the icon. The resolver is expected to return a `SafeResourceUrl` that points to the icon,\n     * an object with the icon URL and icon options, or `null` if the icon is not supported. Resolvers\n     * will be invoked in the order in which they have been registered.\n     * @param resolver Resolver function to be registered.\n     */\n    addSvgIconResolver(resolver) {\n        this._resolvers.push(resolver);\n        return this;\n    }\n    /**\n     * Registers an icon using an HTML string in the specified namespace.\n     * @param namespace Namespace in which the icon should be registered.\n     * @param iconName Name under which the icon should be registered.\n     * @param literal SVG source of the icon.\n     */\n    addSvgIconLiteralInNamespace(namespace, iconName, literal, options) {\n        const cleanLiteral = this._sanitizer.sanitize(SecurityContext.HTML, literal);\n        // TODO: add an ngDevMode check\n        if (!cleanLiteral) {\n            throw getMatIconFailedToSanitizeLiteralError(literal);\n        }\n        // Security: The literal is passed in as SafeHtml, and is thus trusted.\n        const trustedLiteral = trustedHTMLFromString(cleanLiteral);\n        return this._addSvgIconConfig(namespace, iconName, new SvgIconConfig('', trustedLiteral, options));\n    }\n    /**\n     * Registers an icon set by URL in the default namespace.\n     * @param url\n     */\n    addSvgIconSet(url, options) {\n        return this.addSvgIconSetInNamespace('', url, options);\n    }\n    /**\n     * Registers an icon set using an HTML string in the default namespace.\n     * @param literal SVG source of the icon set.\n     */\n    addSvgIconSetLiteral(literal, options) {\n        return this.addSvgIconSetLiteralInNamespace('', literal, options);\n    }\n    /**\n     * Registers an icon set by URL in the specified namespace.\n     * @param namespace Namespace in which to register the icon set.\n     * @param url\n     */\n    addSvgIconSetInNamespace(namespace, url, options) {\n        return this._addSvgIconSetConfig(namespace, new SvgIconConfig(url, null, options));\n    }\n    /**\n     * Registers an icon set using an HTML string in the specified namespace.\n     * @param namespace Namespace in which to register the icon set.\n     * @param literal SVG source of the icon set.\n     */\n    addSvgIconSetLiteralInNamespace(namespace, literal, options) {\n        const cleanLiteral = this._sanitizer.sanitize(SecurityContext.HTML, literal);\n        if (!cleanLiteral) {\n            throw getMatIconFailedToSanitizeLiteralError(literal);\n        }\n        // Security: The literal is passed in as SafeHtml, and is thus trusted.\n        const trustedLiteral = trustedHTMLFromString(cleanLiteral);\n        return this._addSvgIconSetConfig(namespace, new SvgIconConfig('', trustedLiteral, options));\n    }\n    /**\n     * Defines an alias for a CSS class name to be used for icon fonts. Creating an matIcon\n     * component with the alias as the fontSet input will cause the class name to be applied\n     * to the `<mat-icon>` element.\n     *\n     * @param alias Alias for the font.\n     * @param className Class name override to be used instead of the alias.\n     */\n    registerFontClassAlias(alias, className = alias) {\n        this._fontCssClassesByAlias.set(alias, className);\n        return this;\n    }\n    /**\n     * Returns the CSS class name associated with the alias by a previous call to\n     * registerFontClassAlias. If no CSS class has been associated, returns the alias unmodified.\n     */\n    classNameForFontAlias(alias) {\n        return this._fontCssClassesByAlias.get(alias) || alias;\n    }\n    /**\n     * Sets the CSS class name to be used for icon fonts when an `<mat-icon>` component does not\n     * have a fontSet input value, and is not loading an icon by name or URL.\n     *\n     * @param className\n     */\n    setDefaultFontSetClass(className) {\n        this._defaultFontSetClass = className;\n        return this;\n    }\n    /**\n     * Returns the CSS class name to be used for icon fonts when an `<mat-icon>` component does not\n     * have a fontSet input value, and is not loading an icon by name or URL.\n     */\n    getDefaultFontSetClass() {\n        return this._defaultFontSetClass;\n    }\n    /**\n     * Returns an Observable that produces the icon (as an `<svg>` DOM element) from the given URL.\n     * The response from the URL may be cached so this will not always cause an HTTP request, but\n     * the produced element will always be a new copy of the originally fetched icon. (That is,\n     * it will not contain any modifications made to elements previously returned).\n     *\n     * @param safeUrl URL from which to fetch the SVG icon.\n     */\n    getSvgIconFromUrl(safeUrl) {\n        const url = this._sanitizer.sanitize(SecurityContext.RESOURCE_URL, safeUrl);\n        if (!url) {\n            throw getMatIconFailedToSanitizeUrlError(safeUrl);\n        }\n        const cachedIcon = this._cachedIconsByUrl.get(url);\n        if (cachedIcon) {\n            return of(cloneSvg(cachedIcon));\n        }\n        return this._loadSvgIconFromConfig(new SvgIconConfig(safeUrl, null)).pipe(tap(svg => this._cachedIconsByUrl.set(url, svg)), map(svg => cloneSvg(svg)));\n    }\n    /**\n     * Returns an Observable that produces the icon (as an `<svg>` DOM element) with the given name\n     * and namespace. The icon must have been previously registered with addIcon or addIconSet;\n     * if not, the Observable will throw an error.\n     *\n     * @param name Name of the icon to be retrieved.\n     * @param namespace Namespace in which to look for the icon.\n     */\n    getNamedSvgIcon(name, namespace = '') {\n        const key = iconKey(namespace, name);\n        let config = this._svgIconConfigs.get(key);\n        // Return (copy of) cached icon if possible.\n        if (config) {\n            return this._getSvgFromConfig(config);\n        }\n        // Otherwise try to resolve the config from one of the resolver functions.\n        config = this._getIconConfigFromResolvers(namespace, name);\n        if (config) {\n            this._svgIconConfigs.set(key, config);\n            return this._getSvgFromConfig(config);\n        }\n        // See if we have any icon sets registered for the namespace.\n        const iconSetConfigs = this._iconSetConfigs.get(namespace);\n        if (iconSetConfigs) {\n            return this._getSvgFromIconSetConfigs(name, iconSetConfigs);\n        }\n        return throwError(getMatIconNameNotFoundError(key));\n    }\n    ngOnDestroy() {\n        this._resolvers = [];\n        this._svgIconConfigs.clear();\n        this._iconSetConfigs.clear();\n        this._cachedIconsByUrl.clear();\n    }\n    /**\n     * Returns the cached icon for a SvgIconConfig if available, or fetches it from its URL if not.\n     */\n    _getSvgFromConfig(config) {\n        if (config.svgText) {\n            // We already have the SVG element for this icon, return a copy.\n            return of(cloneSvg(this._svgElementFromConfig(config)));\n        }\n        else {\n            // Fetch the icon from the config's URL, cache it, and return a copy.\n            return this._loadSvgIconFromConfig(config).pipe(map(svg => cloneSvg(svg)));\n        }\n    }\n    /**\n     * Attempts to find an icon with the specified name in any of the SVG icon sets.\n     * First searches the available cached icons for a nested element with a matching name, and\n     * if found copies the element to a new `<svg>` element. If not found, fetches all icon sets\n     * that have not been cached, and searches again after all fetches are completed.\n     * The returned Observable produces the SVG element if possible, and throws\n     * an error if no icon with the specified name can be found.\n     */\n    _getSvgFromIconSetConfigs(name, iconSetConfigs) {\n        // For all the icon set SVG elements we've fetched, see if any contain an icon with the\n        // requested name.\n        const namedIcon = this._extractIconWithNameFromAnySet(name, iconSetConfigs);\n        if (namedIcon) {\n            // We could cache namedIcon in _svgIconConfigs, but since we have to make a copy every\n            // time anyway, there's probably not much advantage compared to just always extracting\n            // it from the icon set.\n            return of(namedIcon);\n        }\n        // Not found in any cached icon sets. If there are icon sets with URLs that we haven't\n        // fetched, fetch them now and look for iconName in the results.\n        const iconSetFetchRequests = iconSetConfigs\n            .filter(iconSetConfig => !iconSetConfig.svgText)\n            .map(iconSetConfig => {\n            return this._loadSvgIconSetFromConfig(iconSetConfig).pipe(catchError((err) => {\n                const url = this._sanitizer.sanitize(SecurityContext.RESOURCE_URL, iconSetConfig.url);\n                // Swallow errors fetching individual URLs so the\n                // combined Observable won't necessarily fail.\n                const errorMessage = `Loading icon set URL: ${url} failed: ${err.message}`;\n                this._errorHandler.handleError(new Error(errorMessage));\n                return of(null);\n            }));\n        });\n        // Fetch all the icon set URLs. When the requests complete, every IconSet should have a\n        // cached SVG element (unless the request failed), and we can check again for the icon.\n        return forkJoin(iconSetFetchRequests).pipe(map(() => {\n            const foundIcon = this._extractIconWithNameFromAnySet(name, iconSetConfigs);\n            // TODO: add an ngDevMode check\n            if (!foundIcon) {\n                throw getMatIconNameNotFoundError(name);\n            }\n            return foundIcon;\n        }));\n    }\n    /**\n     * Searches the cached SVG elements for the given icon sets for a nested icon element whose \"id\"\n     * tag matches the specified name. If found, copies the nested element to a new SVG element and\n     * returns it. Returns null if no matching element is found.\n     */\n    _extractIconWithNameFromAnySet(iconName, iconSetConfigs) {\n        // Iterate backwards, so icon sets added later have precedence.\n        for (let i = iconSetConfigs.length - 1; i >= 0; i--) {\n            const config = iconSetConfigs[i];\n            // Parsing the icon set's text into an SVG element can be expensive. We can avoid some of\n            // the parsing by doing a quick check using `indexOf` to see if there's any chance for the\n            // icon to be in the set. This won't be 100% accurate, but it should help us avoid at least\n            // some of the parsing.\n            if (config.svgText && config.svgText.toString().indexOf(iconName) > -1) {\n                const svg = this._svgElementFromConfig(config);\n                const foundIcon = this._extractSvgIconFromSet(svg, iconName, config.options);\n                if (foundIcon) {\n                    return foundIcon;\n                }\n            }\n        }\n        return null;\n    }\n    /**\n     * Loads the content of the icon URL specified in the SvgIconConfig and creates an SVG element\n     * from it.\n     */\n    _loadSvgIconFromConfig(config) {\n        return this._fetchIcon(config).pipe(tap(svgText => (config.svgText = svgText)), map(() => this._svgElementFromConfig(config)));\n    }\n    /**\n     * Loads the content of the icon set URL specified in the\n     * SvgIconConfig and attaches it to the config.\n     */\n    _loadSvgIconSetFromConfig(config) {\n        if (config.svgText) {\n            return of(null);\n        }\n        return this._fetchIcon(config).pipe(tap(svgText => (config.svgText = svgText)));\n    }\n    /**\n     * Searches the cached element of the given SvgIconConfig for a nested icon element whose \"id\"\n     * tag matches the specified name. If found, copies the nested element to a new SVG element and\n     * returns it. Returns null if no matching element is found.\n     */\n    _extractSvgIconFromSet(iconSet, iconName, options) {\n        // Use the `id=\"iconName\"` syntax in order to escape special\n        // characters in the ID (versus using the #iconName syntax).\n        const iconSource = iconSet.querySelector(`[id=\"${iconName}\"]`);\n        if (!iconSource) {\n            return null;\n        }\n        // Clone the element and remove the ID to prevent multiple elements from being added\n        // to the page with the same ID.\n        const iconElement = iconSource.cloneNode(true);\n        iconElement.removeAttribute('id');\n        // If the icon node is itself an <svg> node, clone and return it directly. If not, set it as\n        // the content of a new <svg> node.\n        if (iconElement.nodeName.toLowerCase() === 'svg') {\n            return this._setSvgAttributes(iconElement, options);\n        }\n        // If the node is a <symbol>, it won't be rendered so we have to convert it into <svg>. Note\n        // that the same could be achieved by referring to it via <use href=\"#id\">, however the <use>\n        // tag is problematic on Firefox, because it needs to include the current page path.\n        if (iconElement.nodeName.toLowerCase() === 'symbol') {\n            return this._setSvgAttributes(this._toSvgElement(iconElement), options);\n        }\n        // createElement('SVG') doesn't work as expected; the DOM ends up with\n        // the correct nodes, but the SVG content doesn't render. Instead we\n        // have to create an empty SVG node using innerHTML and append its content.\n        // Elements created using DOMParser.parseFromString have the same problem.\n        // http://stackoverflow.com/questions/23003278/svg-innerhtml-in-firefox-can-not-display\n        const svg = this._svgElementFromString(trustedHTMLFromString('<svg></svg>'));\n        // Clone the node so we don't remove it from the parent icon set element.\n        svg.appendChild(iconElement);\n        return this._setSvgAttributes(svg, options);\n    }\n    /**\n     * Creates a DOM element from the given SVG string.\n     */\n    _svgElementFromString(str) {\n        const div = this._document.createElement('DIV');\n        div.innerHTML = str;\n        const svg = div.querySelector('svg');\n        // TODO: add an ngDevMode check\n        if (!svg) {\n            throw Error('<svg> tag not found');\n        }\n        return svg;\n    }\n    /**\n     * Converts an element into an SVG node by cloning all of its children.\n     */\n    _toSvgElement(element) {\n        const svg = this._svgElementFromString(trustedHTMLFromString('<svg></svg>'));\n        const attributes = element.attributes;\n        // Copy over all the attributes from the `symbol` to the new SVG, except the id.\n        for (let i = 0; i < attributes.length; i++) {\n            const { name, value } = attributes[i];\n            if (name !== 'id') {\n                svg.setAttribute(name, value);\n            }\n        }\n        for (let i = 0; i < element.childNodes.length; i++) {\n            if (element.childNodes[i].nodeType === this._document.ELEMENT_NODE) {\n                svg.appendChild(element.childNodes[i].cloneNode(true));\n            }\n        }\n        return svg;\n    }\n    /**\n     * Sets the default attributes for an SVG element to be used as an icon.\n     */\n    _setSvgAttributes(svg, options) {\n        svg.setAttribute('fit', '');\n        svg.setAttribute('height', '100%');\n        svg.setAttribute('width', '100%');\n        svg.setAttribute('preserveAspectRatio', 'xMidYMid meet');\n        svg.setAttribute('focusable', 'false'); // Disable IE11 default behavior to make SVGs focusable.\n        if (options && options.viewBox) {\n            svg.setAttribute('viewBox', options.viewBox);\n        }\n        return svg;\n    }\n    /**\n     * Returns an Observable which produces the string contents of the given icon. Results may be\n     * cached, so future calls with the same URL may not cause another HTTP request.\n     */\n    _fetchIcon(iconConfig) {\n        var _a;\n        const { url: safeUrl, options } = iconConfig;\n        const withCredentials = (_a = options === null || options === void 0 ? void 0 : options.withCredentials) !== null && _a !== void 0 ? _a : false;\n        if (!this._httpClient) {\n            throw getMatIconNoHttpProviderError();\n        }\n        // TODO: add an ngDevMode check\n        if (safeUrl == null) {\n            throw Error(`Cannot fetch icon from URL \"${safeUrl}\".`);\n        }\n        const url = this._sanitizer.sanitize(SecurityContext.RESOURCE_URL, safeUrl);\n        // TODO: add an ngDevMode check\n        if (!url) {\n            throw getMatIconFailedToSanitizeUrlError(safeUrl);\n        }\n        // Store in-progress fetches to avoid sending a duplicate request for a URL when there is\n        // already a request in progress for that URL. It's necessary to call share() on the\n        // Observable returned by http.get() so that multiple subscribers don't cause multiple XHRs.\n        const inProgressFetch = this._inProgressUrlFetches.get(url);\n        if (inProgressFetch) {\n            return inProgressFetch;\n        }\n        const req = this._httpClient.get(url, { responseType: 'text', withCredentials }).pipe(map(svg => {\n            // Security: This SVG is fetched from a SafeResourceUrl, and is thus\n            // trusted HTML.\n            return trustedHTMLFromString(svg);\n        }), finalize(() => this._inProgressUrlFetches.delete(url)), share());\n        this._inProgressUrlFetches.set(url, req);\n        return req;\n    }\n    /**\n     * Registers an icon config by name in the specified namespace.\n     * @param namespace Namespace in which to register the icon config.\n     * @param iconName Name under which to register the config.\n     * @param config Config to be registered.\n     */\n    _addSvgIconConfig(namespace, iconName, config) {\n        this._svgIconConfigs.set(iconKey(namespace, iconName), config);\n        return this;\n    }\n    /**\n     * Registers an icon set config in the specified namespace.\n     * @param namespace Namespace in which to register the icon config.\n     * @param config Config to be registered.\n     */\n    _addSvgIconSetConfig(namespace, config) {\n        const configNamespace = this._iconSetConfigs.get(namespace);\n        if (configNamespace) {\n            configNamespace.push(config);\n        }\n        else {\n            this._iconSetConfigs.set(namespace, [config]);\n        }\n        return this;\n    }\n    /** Parses a config's text into an SVG element. */\n    _svgElementFromConfig(config) {\n        if (!config.svgElement) {\n            const svg = this._svgElementFromString(config.svgText);\n            this._setSvgAttributes(svg, config.options);\n            config.svgElement = svg;\n        }\n        return config.svgElement;\n    }\n    /** Tries to create an icon config through the registered resolver functions. */\n    _getIconConfigFromResolvers(namespace, name) {\n        for (let i = 0; i < this._resolvers.length; i++) {\n            const result = this._resolvers[i](name, namespace);\n            if (result) {\n                return isSafeUrlWithOptions(result)\n                    ? new SvgIconConfig(result.url, null, result.options)\n                    : new SvgIconConfig(result, null);\n            }\n        }\n        return undefined;\n    }\n}\nMatIconRegistry.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.1.0\", ngImport: i0, type: MatIconRegistry, deps: [{ token: i1.HttpClient, optional: true }, { token: i2.DomSanitizer }, { token: DOCUMENT, optional: true }, { token: i0.ErrorHandler }], target: i0.ɵɵFactoryTarget.Injectable });\nMatIconRegistry.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"13.1.0\", ngImport: i0, type: MatIconRegistry, providedIn: 'root' });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.1.0\", ngImport: i0, type: MatIconRegistry, decorators: [{\n            type: Injectable,\n            args: [{ providedIn: 'root' }]\n        }], ctorParameters: function () {\n        return [{ type: i1.HttpClient, decorators: [{\n                        type: Optional\n                    }] }, { type: i2.DomSanitizer }, { type: undefined, decorators: [{\n                        type: Optional\n                    }, {\n                        type: Inject,\n                        args: [DOCUMENT]\n                    }] }, { type: i0.ErrorHandler }];\n    } });\n/** @docs-private */\nfunction ICON_REGISTRY_PROVIDER_FACTORY(parentRegistry, httpClient, sanitizer, errorHandler, document) {\n    return parentRegistry || new MatIconRegistry(httpClient, sanitizer, document, errorHandler);\n}\n/** @docs-private */\nconst ICON_REGISTRY_PROVIDER = {\n    // If there is already an MatIconRegistry available, use that. Otherwise, provide a new one.\n    provide: MatIconRegistry,\n    deps: [\n        [new Optional(), new SkipSelf(), MatIconRegistry],\n        [new Optional(), HttpClient],\n        DomSanitizer,\n        ErrorHandler,\n        [new Optional(), DOCUMENT],\n    ],\n    useFactory: ICON_REGISTRY_PROVIDER_FACTORY,\n};\n/** Clones an SVGElement while preserving type information. */\nfunction cloneSvg(svg) {\n    return svg.cloneNode(true);\n}\n/** Returns the cache key to use for an icon namespace and name. */\nfunction iconKey(namespace, name) {\n    return namespace + ':' + name;\n}\nfunction isSafeUrlWithOptions(value) {\n    return !!(value.url && value.options);\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n// Boilerplate for applying mixins to MatIcon.\n/** @docs-private */\nconst _MatIconBase = mixinColor(class {\n    constructor(_elementRef) {\n        this._elementRef = _elementRef;\n    }\n});\n/**\n * Injection token used to provide the current location to `MatIcon`.\n * Used to handle server-side rendering and to stub out during unit tests.\n * @docs-private\n */\nconst MAT_ICON_LOCATION = new InjectionToken('mat-icon-location', {\n    providedIn: 'root',\n    factory: MAT_ICON_LOCATION_FACTORY,\n});\n/** @docs-private */\nfunction MAT_ICON_LOCATION_FACTORY() {\n    const _document = inject(DOCUMENT);\n    const _location = _document ? _document.location : null;\n    return {\n        // Note that this needs to be a function, rather than a property, because Angular\n        // will only resolve it once, but we want the current path on each call.\n        getPathname: () => (_location ? _location.pathname + _location.search : ''),\n    };\n}\n/** SVG attributes that accept a FuncIRI (e.g. `url(<something>)`). */\nconst funcIriAttributes = [\n    'clip-path',\n    'color-profile',\n    'src',\n    'cursor',\n    'fill',\n    'filter',\n    'marker',\n    'marker-start',\n    'marker-mid',\n    'marker-end',\n    'mask',\n    'stroke',\n];\n/** Selector that can be used to find all elements that are using a `FuncIRI`. */\nconst funcIriAttributeSelector = funcIriAttributes.map(attr => `[${attr}]`).join(', ');\n/** Regex that can be used to extract the id out of a FuncIRI. */\nconst funcIriPattern = /^url\\(['\"]?#(.*?)['\"]?\\)$/;\n/**\n * Component to display an icon. It can be used in the following ways:\n *\n * - Specify the svgIcon input to load an SVG icon from a URL previously registered with the\n *   addSvgIcon, addSvgIconInNamespace, addSvgIconSet, or addSvgIconSetInNamespace methods of\n *   MatIconRegistry. If the svgIcon value contains a colon it is assumed to be in the format\n *   \"[namespace]:[name]\", if not the value will be the name of an icon in the default namespace.\n *   Examples:\n *     `<mat-icon svgIcon=\"left-arrow\"></mat-icon>\n *     <mat-icon svgIcon=\"animals:cat\"></mat-icon>`\n *\n * - Use a font ligature as an icon by putting the ligature text in the content of the `<mat-icon>`\n *   component. By default the Material icons font is used as described at\n *   http://google.github.io/material-design-icons/#icon-font-for-the-web. You can specify an\n *   alternate font by setting the fontSet input to either the CSS class to apply to use the\n *   desired font, or to an alias previously registered with MatIconRegistry.registerFontClassAlias.\n *   Examples:\n *     `<mat-icon>home</mat-icon>\n *     <mat-icon fontSet=\"myfont\">sun</mat-icon>`\n *\n * - Specify a font glyph to be included via CSS rules by setting the fontSet input to specify the\n *   font, and the fontIcon input to specify the icon. Typically the fontIcon will specify a\n *   CSS class which causes the glyph to be displayed via a :before selector, as in\n *   https://fortawesome.github.io/Font-Awesome/examples/\n *   Example:\n *     `<mat-icon fontSet=\"fa\" fontIcon=\"alarm\"></mat-icon>`\n */\nclass MatIcon extends _MatIconBase {\n    constructor(elementRef, _iconRegistry, ariaHidden, _location, _errorHandler) {\n        super(elementRef);\n        this._iconRegistry = _iconRegistry;\n        this._location = _location;\n        this._errorHandler = _errorHandler;\n        this._inline = false;\n        /** Subscription to the current in-progress SVG icon request. */\n        this._currentIconFetch = Subscription.EMPTY;\n        // If the user has not explicitly set aria-hidden, mark the icon as hidden, as this is\n        // the right thing to do for the majority of icon use-cases.\n        if (!ariaHidden) {\n            elementRef.nativeElement.setAttribute('aria-hidden', 'true');\n        }\n    }\n    /**\n     * Whether the icon should be inlined, automatically sizing the icon to match the font size of\n     * the element the icon is contained in.\n     */\n    get inline() {\n        return this._inline;\n    }\n    set inline(inline) {\n        this._inline = coerceBooleanProperty(inline);\n    }\n    /** Name of the icon in the SVG icon set. */\n    get svgIcon() {\n        return this._svgIcon;\n    }\n    set svgIcon(value) {\n        if (value !== this._svgIcon) {\n            if (value) {\n                this._updateSvgIcon(value);\n            }\n            else if (this._svgIcon) {\n                this._clearSvgElement();\n            }\n            this._svgIcon = value;\n        }\n    }\n    /** Font set that the icon is a part of. */\n    get fontSet() {\n        return this._fontSet;\n    }\n    set fontSet(value) {\n        const newValue = this._cleanupFontValue(value);\n        if (newValue !== this._fontSet) {\n            this._fontSet = newValue;\n            this._updateFontIconClasses();\n        }\n    }\n    /** Name of an icon within a font set. */\n    get fontIcon() {\n        return this._fontIcon;\n    }\n    set fontIcon(value) {\n        const newValue = this._cleanupFontValue(value);\n        if (newValue !== this._fontIcon) {\n            this._fontIcon = newValue;\n            this._updateFontIconClasses();\n        }\n    }\n    /**\n     * Splits an svgIcon binding value into its icon set and icon name components.\n     * Returns a 2-element array of [(icon set), (icon name)].\n     * The separator for the two fields is ':'. If there is no separator, an empty\n     * string is returned for the icon set and the entire value is returned for\n     * the icon name. If the argument is falsy, returns an array of two empty strings.\n     * Throws an error if the name contains two or more ':' separators.\n     * Examples:\n     *   `'social:cake' -> ['social', 'cake']\n     *   'penguin' -> ['', 'penguin']\n     *   null -> ['', '']\n     *   'a:b:c' -> (throws Error)`\n     */\n    _splitIconName(iconName) {\n        if (!iconName) {\n            return ['', ''];\n        }\n        const parts = iconName.split(':');\n        switch (parts.length) {\n            case 1:\n                return ['', parts[0]]; // Use default namespace.\n            case 2:\n                return parts;\n            default:\n                throw Error(`Invalid icon name: \"${iconName}\"`); // TODO: add an ngDevMode check\n        }\n    }\n    ngOnInit() {\n        // Update font classes because ngOnChanges won't be called if none of the inputs are present,\n        // e.g. <mat-icon>arrow</mat-icon> In this case we need to add a CSS class for the default font.\n        this._updateFontIconClasses();\n    }\n    ngAfterViewChecked() {\n        const cachedElements = this._elementsWithExternalReferences;\n        if (cachedElements && cachedElements.size) {\n            const newPath = this._location.getPathname();\n            // We need to check whether the URL has changed on each change detection since\n            // the browser doesn't have an API that will let us react on link clicks and\n            // we can't depend on the Angular router. The references need to be updated,\n            // because while most browsers don't care whether the URL is correct after\n            // the first render, Safari will break if the user navigates to a different\n            // page and the SVG isn't re-rendered.\n            if (newPath !== this._previousPath) {\n                this._previousPath = newPath;\n                this._prependPathToReferences(newPath);\n            }\n        }\n    }\n    ngOnDestroy() {\n        this._currentIconFetch.unsubscribe();\n        if (this._elementsWithExternalReferences) {\n            this._elementsWithExternalReferences.clear();\n        }\n    }\n    _usingFontIcon() {\n        return !this.svgIcon;\n    }\n    _setSvgElement(svg) {\n        this._clearSvgElement();\n        // Workaround for IE11 and Edge ignoring `style` tags inside dynamically-created SVGs.\n        // See: https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/10898469/\n        // Do this before inserting the element into the DOM, in order to avoid a style recalculation.\n        const styleTags = svg.querySelectorAll('style');\n        for (let i = 0; i < styleTags.length; i++) {\n            styleTags[i].textContent += ' ';\n        }\n        // Note: we do this fix here, rather than the icon registry, because the\n        // references have to point to the URL at the time that the icon was created.\n        const path = this._location.getPathname();\n        this._previousPath = path;\n        this._cacheChildrenWithExternalReferences(svg);\n        this._prependPathToReferences(path);\n        this._elementRef.nativeElement.appendChild(svg);\n    }\n    _clearSvgElement() {\n        const layoutElement = this._elementRef.nativeElement;\n        let childCount = layoutElement.childNodes.length;\n        if (this._elementsWithExternalReferences) {\n            this._elementsWithExternalReferences.clear();\n        }\n        // Remove existing non-element child nodes and SVGs, and add the new SVG element. Note that\n        // we can't use innerHTML, because IE will throw if the element has a data binding.\n        while (childCount--) {\n            const child = layoutElement.childNodes[childCount];\n            // 1 corresponds to Node.ELEMENT_NODE. We remove all non-element nodes in order to get rid\n            // of any loose text nodes, as well as any SVG elements in order to remove any old icons.\n            if (child.nodeType !== 1 || child.nodeName.toLowerCase() === 'svg') {\n                child.remove();\n            }\n        }\n    }\n    _updateFontIconClasses() {\n        if (!this._usingFontIcon()) {\n            return;\n        }\n        const elem = this._elementRef.nativeElement;\n        const fontSetClass = this.fontSet\n            ? this._iconRegistry.classNameForFontAlias(this.fontSet)\n            : this._iconRegistry.getDefaultFontSetClass();\n        if (fontSetClass != this._previousFontSetClass) {\n            if (this._previousFontSetClass) {\n                elem.classList.remove(this._previousFontSetClass);\n            }\n            if (fontSetClass) {\n                elem.classList.add(fontSetClass);\n            }\n            this._previousFontSetClass = fontSetClass;\n        }\n        if (this.fontIcon != this._previousFontIconClass) {\n            if (this._previousFontIconClass) {\n                elem.classList.remove(this._previousFontIconClass);\n            }\n            if (this.fontIcon) {\n                elem.classList.add(this.fontIcon);\n            }\n            this._previousFontIconClass = this.fontIcon;\n        }\n    }\n    /**\n     * Cleans up a value to be used as a fontIcon or fontSet.\n     * Since the value ends up being assigned as a CSS class, we\n     * have to trim the value and omit space-separated values.\n     */\n    _cleanupFontValue(value) {\n        return typeof value === 'string' ? value.trim().split(' ')[0] : value;\n    }\n    /**\n     * Prepends the current path to all elements that have an attribute pointing to a `FuncIRI`\n     * reference. This is required because WebKit browsers require references to be prefixed with\n     * the current path, if the page has a `base` tag.\n     */\n    _prependPathToReferences(path) {\n        const elements = this._elementsWithExternalReferences;\n        if (elements) {\n            elements.forEach((attrs, element) => {\n                attrs.forEach(attr => {\n                    element.setAttribute(attr.name, `url('${path}#${attr.value}')`);\n                });\n            });\n        }\n    }\n    /**\n     * Caches the children of an SVG element that have `url()`\n     * references that we need to prefix with the current path.\n     */\n    _cacheChildrenWithExternalReferences(element) {\n        const elementsWithFuncIri = element.querySelectorAll(funcIriAttributeSelector);\n        const elements = (this._elementsWithExternalReferences =\n            this._elementsWithExternalReferences || new Map());\n        for (let i = 0; i < elementsWithFuncIri.length; i++) {\n            funcIriAttributes.forEach(attr => {\n                const elementWithReference = elementsWithFuncIri[i];\n                const value = elementWithReference.getAttribute(attr);\n                const match = value ? value.match(funcIriPattern) : null;\n                if (match) {\n                    let attributes = elements.get(elementWithReference);\n                    if (!attributes) {\n                        attributes = [];\n                        elements.set(elementWithReference, attributes);\n                    }\n                    attributes.push({ name: attr, value: match[1] });\n                }\n            });\n        }\n    }\n    /** Sets a new SVG icon with a particular name. */\n    _updateSvgIcon(rawName) {\n        this._svgNamespace = null;\n        this._svgName = null;\n        this._currentIconFetch.unsubscribe();\n        if (rawName) {\n            const [namespace, iconName] = this._splitIconName(rawName);\n            if (namespace) {\n                this._svgNamespace = namespace;\n            }\n            if (iconName) {\n                this._svgName = iconName;\n            }\n            this._currentIconFetch = this._iconRegistry\n                .getNamedSvgIcon(iconName, namespace)\n                .pipe(take(1))\n                .subscribe(svg => this._setSvgElement(svg), (err) => {\n                const errorMessage = `Error retrieving icon ${namespace}:${iconName}! ${err.message}`;\n                this._errorHandler.handleError(new Error(errorMessage));\n            });\n        }\n    }\n}\nMatIcon.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.1.0\", ngImport: i0, type: MatIcon, deps: [{ token: i0.ElementRef }, { token: MatIconRegistry }, { token: 'aria-hidden', attribute: true }, { token: MAT_ICON_LOCATION }, { token: i0.ErrorHandler }], target: i0.ɵɵFactoryTarget.Component });\nMatIcon.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"12.0.0\", version: \"13.1.0\", type: MatIcon, selector: \"mat-icon\", inputs: { color: \"color\", inline: \"inline\", svgIcon: \"svgIcon\", fontSet: \"fontSet\", fontIcon: \"fontIcon\" }, host: { attributes: { \"role\": \"img\" }, properties: { \"attr.data-mat-icon-type\": \"_usingFontIcon() ? \\\"font\\\" : \\\"svg\\\"\", \"attr.data-mat-icon-name\": \"_svgName || fontIcon\", \"attr.data-mat-icon-namespace\": \"_svgNamespace || fontSet\", \"class.mat-icon-inline\": \"inline\", \"class.mat-icon-no-color\": \"color !== \\\"primary\\\" && color !== \\\"accent\\\" && color !== \\\"warn\\\"\" }, classAttribute: \"mat-icon notranslate\" }, exportAs: [\"matIcon\"], usesInheritance: true, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, styles: [\".mat-icon{-webkit-user-select:none;-moz-user-select:none;user-select:none;background-repeat:no-repeat;display:inline-block;fill:currentColor;height:24px;width:24px}.mat-icon.mat-icon-inline{font-size:inherit;height:inherit;line-height:inherit;width:inherit}[dir=rtl] .mat-icon-rtl-mirror{transform:scale(-1, 1)}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon{display:block}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon-button .mat-icon,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon-button .mat-icon{margin:auto}\\n\"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.1.0\", ngImport: i0, type: MatIcon, decorators: [{\n            type: Component,\n            args: [{ template: '<ng-content></ng-content>', selector: 'mat-icon', exportAs: 'matIcon', inputs: ['color'], host: {\n                        'role': 'img',\n                        'class': 'mat-icon notranslate',\n                        '[attr.data-mat-icon-type]': '_usingFontIcon() ? \"font\" : \"svg\"',\n                        '[attr.data-mat-icon-name]': '_svgName || fontIcon',\n                        '[attr.data-mat-icon-namespace]': '_svgNamespace || fontSet',\n                        '[class.mat-icon-inline]': 'inline',\n                        '[class.mat-icon-no-color]': 'color !== \"primary\" && color !== \"accent\" && color !== \"warn\"',\n                    }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, styles: [\".mat-icon{-webkit-user-select:none;-moz-user-select:none;user-select:none;background-repeat:no-repeat;display:inline-block;fill:currentColor;height:24px;width:24px}.mat-icon.mat-icon-inline{font-size:inherit;height:inherit;line-height:inherit;width:inherit}[dir=rtl] .mat-icon-rtl-mirror{transform:scale(-1, 1)}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon{display:block}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon-button .mat-icon,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon-button .mat-icon{margin:auto}\\n\"] }]\n        }], ctorParameters: function () {\n        return [{ type: i0.ElementRef }, { type: MatIconRegistry }, { type: undefined, decorators: [{\n                        type: Attribute,\n                        args: ['aria-hidden']\n                    }] }, { type: undefined, decorators: [{\n                        type: Inject,\n                        args: [MAT_ICON_LOCATION]\n                    }] }, { type: i0.ErrorHandler }];\n    }, propDecorators: { inline: [{\n                type: Input\n            }], svgIcon: [{\n                type: Input\n            }], fontSet: [{\n                type: Input\n            }], fontIcon: [{\n                type: Input\n            }] } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass MatIconModule {\n}\nMatIconModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.1.0\", ngImport: i0, type: MatIconModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nMatIconModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"12.0.0\", version: \"13.1.0\", ngImport: i0, type: MatIconModule, declarations: [MatIcon], imports: [MatCommonModule], exports: [MatIcon, MatCommonModule] });\nMatIconModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"13.1.0\", ngImport: i0, type: MatIconModule, imports: [[MatCommonModule], MatCommonModule] });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.1.0\", ngImport: i0, type: MatIconModule, decorators: [{\n            type: NgModule,\n            args: [{\n                    imports: [MatCommonModule],\n                    exports: [MatIcon, MatCommonModule],\n                    declarations: [MatIcon],\n                }]\n        }] });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { ICON_REGISTRY_PROVIDER, ICON_REGISTRY_PROVIDER_FACTORY, MAT_ICON_LOCATION, MAT_ICON_LOCATION_FACTORY, MatIcon, MatIconModule, MatIconRegistry, getMatIconFailedToSanitizeLiteralError, getMatIconFailedToSanitizeUrlError, getMatIconNameNotFoundError, getMatIconNoHttpProviderError };\n"]},"metadata":{},"sourceType":"module"}