{"action":"created","comment":{"url":"https://api.github.com/repos/angular/material2/pulls/comments/60282353","id":60282353,"diff_hunk":"@@ -0,0 +1,370 @@\n+import {Injectable} from 'angular2/core';\n+import {BaseException} from 'angular2/src/facade/exceptions';\n+import {Http} from 'angular2/http';\n+import {Observable} from 'rxjs/Rx';\n+\n+\n+/** Exception thrown when attmepting to load an icon with a name that cannot be found. */\n+export class MdIconNameNotFoundException extends BaseException {\n+  constructor(iconName: string) {\n+      super(`Unable to find icon with the name \"${name}\"`);\n+  }\n+}\n+\n+/**\n+ * Exception thrown when attmepting to load SVG content that does not contain the expected\n+ * <svg> tag.\n+ */\n+export class MdIconSvgTagNotFoundException extends BaseException {\n+  constructor() {\n+      super('<svg> tag not found');\n+  }\n+}\n+\n+/**\n+  * Configuration for an icon, including the URL and possibly the cached SVG element.\n+  * @internal\n+  */\n+class SvgIconConfig {\n+  svgElement: SVGElement = null;\n+  constructor(public url: string) {\n+  }\n+}\n+\n+/**\n+ * Service to register and display icons used by the <md-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+@Injectable()\n+export class MdIconRegistry {\n+  /**\n+   * URLs and cached SVG elements for individual icons. Keys are of the format \"[namespace]:[icon]\".\n+   */\n+  private _svgIconConfigs = new Map<string, SvgIconConfig>();\n+\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+  private _iconSetConfigs = new Map<string, SvgIconConfig[]>();\n+\n+  /**\n+   * Cache for icons loaded by direct URLs.\n+   */\n+  private _cachedIconsByUrl = new Map<string, SVGElement>();\n+\n+  /**\n+   * In-progress icon fetches. Used to coalesce multiple requests to the same URL.\n+   */\n+  private _inProgressUrlFetches = new Map<string, Observable<string>>();\n+\n+  /**\n+   * Map from font identifiers to their CSS class names. Used for icon fonts.\n+   */\n+  private _fontCssClassesByAlias = new Map<string, string>();\n+\n+  /**\n+   * The CSS class to apply when an <md-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+  private _defaultFontSetClass = 'material-icons';\n+\n+  constructor(private _http: Http) {}\n+\n+  /**\n+   * Registers an icon by URL in the default namespace.\n+   */\n+  addSvgIcon(iconName: string, url: string): this {\n+    return this.addSvgIconInNamespace('', iconName, url);\n+  }\n+\n+  /**\n+   * Registers an icon by URL in the specified namespace.\n+   */\n+  addSvgIconInNamespace(namespace: string, iconName: string, url: string): this {\n+    const iconKey = namespace + ':' + iconName;\n+    this._svgIconConfigs.set(iconKey, new SvgIconConfig(url));\n+    return this;\n+  }\n+\n+  /**\n+   * Registers an icon set by URL in the default namespace.\n+   */\n+  addSvgIconSet(url: string): this {\n+    return this.addSvgIconSetInNamespace('', url);\n+  }\n+\n+  /**\n+   * Registers an icon set by URL in the specified namespace.\n+   */\n+  addSvgIconSetInNamespace(namespace: string, url: string): this {\n+    const config = new SvgIconConfig(url);\n+    if (this._iconSetConfigs.has(namespace)) {\n+      this._iconSetConfigs.get(namespace).push(config);\n+    } else {\n+      this._iconSetConfigs.set(namespace, [config]);\n+    }\n+    return this;\n+  }\n+\n+  /**\n+   * Defines an alias for a CSS class name to be used for icon fonts. Creating an mdIcon\n+   * component with the alias as the fontSet input will cause the class name to be applied\n+   * to the <md-icon> element.\n+   */\n+  registerFontClassAlias(alias: string, className = alias): this {\n+    this._fontCssClassesByAlias.set(alias, className);\n+    return this;\n+  }\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: string): string {\n+    return this._fontCssClassesByAlias.get(alias) || alias;\n+  }\n+\n+  /**\n+   * Sets the CSS class name to be used for icon fonts when an <md-icon> component does not\n+   * have a fontSet input value, and is not loading an icon by name or URL.\n+   */\n+  setDefaultFontSetClass(className: string) {\n+    this._defaultFontSetClass = className;\n+    return this;\n+  }\n+\n+  /**\n+   * Returns the CSS class name to be used for icon fonts when an <md-icon> component does not\n+   * have a fontSet input value, and is not loading an icon by name or URL.\n+   */\n+  getDefaultFontSetClass(): string {\n+    return this._defaultFontSetClass;\n+  }\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+  getSvgIconFromUrl(url: string): Observable<SVGElement> {\n+    if (this._cachedIconsByUrl.has(url)) {\n+      return Observable.of(this._cachedIconsByUrl.get(url).cloneNode(true));\n+    }\n+    return this._loadSvgIconFromConfig(new SvgIconConfig(url))\n+        .do(svg => this._cachedIconsByUrl.set(url, svg))\n+        .map(svg => svg.cloneNode(true));\n+  }\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 MdIconNameNotFoundException.\n+   */\n+  getNamedSvgIcon(name: string, namespace = ''): Observable<SVGElement> {\n+    // Return (copy of) cached icon if possible.\n+    const iconKey = namespace + ':' + name;\n+    if (this._svgIconConfigs.has(iconKey)) {\n+      return this._getSvgFromConfig(this._svgIconConfigs.get(iconKey));\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, this._iconSetConfigs.get(namespace));\n+    }\n+    return Observable.throw(new MdIconNameNotFoundException(iconKey));\n+  }\n+\n+  /**\n+   * Returns the cached icon for a SvgIconConfig if available, or fetches it from its URL if not.\n+   */\n+  private _getSvgFromConfig(config: SvgIconConfig): Observable<SVGElement> {\n+    if (config.svgElement) {\n+      // We already have the SVG element for this icon, return a copy.\n+      return Observable.of(config.svgElement.cloneNode(true));\n+    } else {\n+      // Fetch the icon from the config's URL, cache it, and return a copy.\n+      return this._loadSvgIconFromConfig(config)\n+          .do((svg: SVGElement) => config.svgElement = svg)\n+          .map((svg: SVGElement) => svg.cloneNode(true));\n+    }\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+   * MdIconNameNotFoundException if no icon with the specified name can be found.\n+   */\n+  private _getSvgFromIconSetConfigs(name: string, iconSetConfigs: SvgIconConfig[]):\n+      Observable<SVGElement> {\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 namedSvg 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 Observable.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: Observable<SVGElement>[] = iconSetConfigs\n+        .filter(iconSetConfig => !iconSetConfig.svgElement)\n+        .map(iconSetConfig =>\n+            this._loadSvgIconSetFromConfig(iconSetConfig)\n+                .catch((err: any, source: any, caught: any): Observable<SVGElement> => {\n+                  // Swallow errors fetching individual URLs so the combined Observable won't\n+                  // necessarily fail.\n+                  console.log(`Loading icon set URL: ${iconSetConfig.url} failed: ${err}`);\n+                  return Observable.of(null);\n+                })\n+                .do((svg: SVGElement) => {\n+                  // Cache SVG element.\n+                  if (svg) {\n+                    iconSetConfig.svgElement = svg;\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 Observable.forkJoin(iconSetFetchRequests)\n+        .map((ignoredResults: any) => {\n+          const foundIcon = this._extractIconWithNameFromAnySet(name, iconSetConfigs);\n+          if (!foundIcon) {\n+            throw new MdIconNameNotFoundException(name);\n+          }\n+          return foundIcon;\n+        });\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+  private _extractIconWithNameFromAnySet(iconName: string, iconSetConfigs: SvgIconConfig[]):\n+      SVGElement {\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+      if (config.svgElement) {\n+        const foundIcon = this._extractSvgIconFromSet(config.svgElement, iconName, config);\n+        if (foundIcon) {\n+          return foundIcon;\n+        }\n+      }\n+    }\n+    return null;\n+  }\n+\n+  /**\n+   * Loads the content of the icon URL specified in the SvgIconConfig and creates an SVG element\n+   * from it.\n+   */\n+  private _loadSvgIconFromConfig(config: SvgIconConfig): Observable<SVGElement> {\n+    return this._fetchUrl(config.url)\n+        .map(svgText => this._createSvgElementForSingleIcon(svgText, config));\n+  }\n+\n+  /**\n+   * Loads the content of the icon set URL specified in the SvgIconConfig and creates an SVG element\n+   * from it.\n+   */\n+  private _loadSvgIconSetFromConfig(config: SvgIconConfig): Observable<SVGElement> {\n+    return this._fetchUrl(config.url)\n+        .map((svgText) => this._svgElementFromString(svgText));\n+  }\n+\n+  /**\n+   * Creates a DOM element from the given SVG string, and adds default attributes.\n+   */\n+  private _createSvgElementForSingleIcon(responseText: string, config: SvgIconConfig): SVGElement {\n+    const svg = this._svgElementFromString(responseText);\n+    this._setSvgAttributes(svg, config);\n+    return svg;\n+  }\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+  private _extractSvgIconFromSet(\n+      iconSet: SVGElement, iconName: string, config: SvgIconConfig): SVGElement {\n+    const iconNode = iconSet.querySelector('#' + iconName);\n+    if (!iconNode) {\n+      return null;\n+    }\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 (iconNode.tagName.toLowerCase() == 'svg') {\n+      return this._setSvgAttributes(<SVGElement>iconNode.cloneNode(true), config);\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+    // http://stackoverflow.com/questions/23003278/svg-innerhtml-in-firefox-can-not-display\n+    const svg = this._svgElementFromString('<svg></svg>');\n+    // Clone the node so we don't remove it from the parent icon set element.\n+    svg.appendChild(iconNode.cloneNode(true));\n+    return this._setSvgAttributes(svg, config);\n+  }\n+\n+  /**\n+   * Creates a DOM element from the given SVG string.\n+   */\n+  private _svgElementFromString(str: string): SVGElement {\n+    // TODO: Is there a better way than innerHTML? Renderer doesn't appear to have a method for\n+    // creating an element from an HTML string.\n+    const div = document.createElement('DIV');","path":"src/components/icon/icon-registry.ts","position":326,"original_position":326,"commit_id":"195acd31c2498da6ad1516d599ae3030fe1b632b","original_commit_id":"195acd31c2498da6ad1516d599ae3030fe1b632b","user":{"login":"kara","id":3871688,"avatar_url":"https://avatars.githubusercontent.com/u/3871688?v=3","gravatar_id":"","url":"https://api.github.com/users/kara","html_url":"https://github.com/kara","followers_url":"https://api.github.com/users/kara/followers","following_url":"https://api.github.com/users/kara/following{/other_user}","gists_url":"https://api.github.com/users/kara/gists{/gist_id}","starred_url":"https://api.github.com/users/kara/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kara/subscriptions","organizations_url":"https://api.github.com/users/kara/orgs","repos_url":"https://api.github.com/users/kara/repos","events_url":"https://api.github.com/users/kara/events{/privacy}","received_events_url":"https://api.github.com/users/kara/received_events","type":"User","site_admin":false},"body":"Gotcha","created_at":"2016-04-19T18:15:02Z","updated_at":"2016-04-19T18:15:02Z","html_url":"https://github.com/angular/material2/pull/281#discussion_r60282353","pull_request_url":"https://api.github.com/repos/angular/material2/pulls/281","_links":{"self":{"href":"https://api.github.com/repos/angular/material2/pulls/comments/60282353"},"html":{"href":"https://github.com/angular/material2/pull/281#discussion_r60282353"},"pull_request":{"href":"https://api.github.com/repos/angular/material2/pulls/281"}}},"pull_request":{"url":"https://api.github.com/repos/angular/material2/pulls/281","id":65832490,"html_url":"https://github.com/angular/material2/pull/281","diff_url":"https://github.com/angular/material2/pull/281.diff","patch_url":"https://github.com/angular/material2/pull/281.patch","issue_url":"https://api.github.com/repos/angular/material2/issues/281","number":281,"state":"open","locked":false,"title":"md-icon","user":{"login":"dozingcat","id":489398,"avatar_url":"https://avatars.githubusercontent.com/u/489398?v=3","gravatar_id":"","url":"https://api.github.com/users/dozingcat","html_url":"https://github.com/dozingcat","followers_url":"https://api.github.com/users/dozingcat/followers","following_url":"https://api.github.com/users/dozingcat/following{/other_user}","gists_url":"https://api.github.com/users/dozingcat/gists{/gist_id}","starred_url":"https://api.github.com/users/dozingcat/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dozingcat/subscriptions","organizations_url":"https://api.github.com/users/dozingcat/orgs","repos_url":"https://api.github.com/users/dozingcat/repos","events_url":"https://api.github.com/users/dozingcat/events{/privacy}","received_events_url":"https://api.github.com/users/dozingcat/received_events","type":"User","site_admin":false},"body":"Preview PR for md-icon. Doc at https://docs.google.com/a/google.com/document/d/1zWTjnSLFPV4II9IxpIehyeSFtnzw_efdy7kEerMRIuo/edit?usp=sharing","created_at":"2016-04-08T19:04:13Z","updated_at":"2016-04-19T18:15:02Z","closed_at":null,"merged_at":null,"merge_commit_sha":"38788167673a901312b6ac73ec69f7ef59255c44","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/angular/material2/pulls/281/commits","review_comments_url":"https://api.github.com/repos/angular/material2/pulls/281/comments","review_comment_url":"https://api.github.com/repos/angular/material2/pulls/comments{/number}","comments_url":"https://api.github.com/repos/angular/material2/issues/281/comments","statuses_url":"https://api.github.com/repos/angular/material2/statuses/195acd31c2498da6ad1516d599ae3030fe1b632b","head":{"label":"dozingcat:mdicon","ref":"mdicon","sha":"195acd31c2498da6ad1516d599ae3030fe1b632b","user":{"login":"dozingcat","id":489398,"avatar_url":"https://avatars.githubusercontent.com/u/489398?v=3","gravatar_id":"","url":"https://api.github.com/users/dozingcat","html_url":"https://github.com/dozingcat","followers_url":"https://api.github.com/users/dozingcat/followers","following_url":"https://api.github.com/users/dozingcat/following{/other_user}","gists_url":"https://api.github.com/users/dozingcat/gists{/gist_id}","starred_url":"https://api.github.com/users/dozingcat/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dozingcat/subscriptions","organizations_url":"https://api.github.com/users/dozingcat/orgs","repos_url":"https://api.github.com/users/dozingcat/repos","events_url":"https://api.github.com/users/dozingcat/events{/privacy}","received_events_url":"https://api.github.com/users/dozingcat/received_events","type":"User","site_admin":false},"repo":{"id":53767913,"name":"material2","full_name":"dozingcat/material2","owner":{"login":"dozingcat","id":489398,"avatar_url":"https://avatars.githubusercontent.com/u/489398?v=3","gravatar_id":"","url":"https://api.github.com/users/dozingcat","html_url":"https://github.com/dozingcat","followers_url":"https://api.github.com/users/dozingcat/followers","following_url":"https://api.github.com/users/dozingcat/following{/other_user}","gists_url":"https://api.github.com/users/dozingcat/gists{/gist_id}","starred_url":"https://api.github.com/users/dozingcat/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dozingcat/subscriptions","organizations_url":"https://api.github.com/users/dozingcat/orgs","repos_url":"https://api.github.com/users/dozingcat/repos","events_url":"https://api.github.com/users/dozingcat/events{/privacy}","received_events_url":"https://api.github.com/users/dozingcat/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/dozingcat/material2","description":"Material Design components for Angular 2","fork":true,"url":"https://api.github.com/repos/dozingcat/material2","forks_url":"https://api.github.com/repos/dozingcat/material2/forks","keys_url":"https://api.github.com/repos/dozingcat/material2/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dozingcat/material2/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dozingcat/material2/teams","hooks_url":"https://api.github.com/repos/dozingcat/material2/hooks","issue_events_url":"https://api.github.com/repos/dozingcat/material2/issues/events{/number}","events_url":"https://api.github.com/repos/dozingcat/material2/events","assignees_url":"https://api.github.com/repos/dozingcat/material2/assignees{/user}","branches_url":"https://api.github.com/repos/dozingcat/material2/branches{/branch}","tags_url":"https://api.github.com/repos/dozingcat/material2/tags","blobs_url":"https://api.github.com/repos/dozingcat/material2/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dozingcat/material2/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dozingcat/material2/git/refs{/sha}","trees_url":"https://api.github.com/repos/dozingcat/material2/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dozingcat/material2/statuses/{sha}","languages_url":"https://api.github.com/repos/dozingcat/material2/languages","stargazers_url":"https://api.github.com/repos/dozingcat/material2/stargazers","contributors_url":"https://api.github.com/repos/dozingcat/material2/contributors","subscribers_url":"https://api.github.com/repos/dozingcat/material2/subscribers","subscription_url":"https://api.github.com/repos/dozingcat/material2/subscription","commits_url":"https://api.github.com/repos/dozingcat/material2/commits{/sha}","git_commits_url":"https://api.github.com/repos/dozingcat/material2/git/commits{/sha}","comments_url":"https://api.github.com/repos/dozingcat/material2/comments{/number}","issue_comment_url":"https://api.github.com/repos/dozingcat/material2/issues/comments{/number}","contents_url":"https://api.github.com/repos/dozingcat/material2/contents/{+path}","compare_url":"https://api.github.com/repos/dozingcat/material2/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dozingcat/material2/merges","archive_url":"https://api.github.com/repos/dozingcat/material2/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dozingcat/material2/downloads","issues_url":"https://api.github.com/repos/dozingcat/material2/issues{/number}","pulls_url":"https://api.github.com/repos/dozingcat/material2/pulls{/number}","milestones_url":"https://api.github.com/repos/dozingcat/material2/milestones{/number}","notifications_url":"https://api.github.com/repos/dozingcat/material2/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dozingcat/material2/labels{/name}","releases_url":"https://api.github.com/repos/dozingcat/material2/releases{/id}","deployments_url":"https://api.github.com/repos/dozingcat/material2/deployments","created_at":"2016-03-13T04:44:56Z","updated_at":"2016-03-13T04:44:57Z","pushed_at":"2016-04-19T02:05:18Z","git_url":"git://github.com/dozingcat/material2.git","ssh_url":"git@github.com:dozingcat/material2.git","clone_url":"https://github.com/dozingcat/material2.git","svn_url":"https://github.com/dozingcat/material2","homepage":"","size":621,"stargazers_count":0,"watchers_count":0,"language":"TypeScript","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"angular:master","ref":"master","sha":"c21c336cc0b605967c82b7edbb5d9922eb3e2793","user":{"login":"angular","id":139426,"avatar_url":"https://avatars.githubusercontent.com/u/139426?v=3","gravatar_id":"","url":"https://api.github.com/users/angular","html_url":"https://github.com/angular","followers_url":"https://api.github.com/users/angular/followers","following_url":"https://api.github.com/users/angular/following{/other_user}","gists_url":"https://api.github.com/users/angular/gists{/gist_id}","starred_url":"https://api.github.com/users/angular/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/angular/subscriptions","organizations_url":"https://api.github.com/users/angular/orgs","repos_url":"https://api.github.com/users/angular/repos","events_url":"https://api.github.com/users/angular/events{/privacy}","received_events_url":"https://api.github.com/users/angular/received_events","type":"Organization","site_admin":false},"repo":{"id":49016322,"name":"material2","full_name":"angular/material2","owner":{"login":"angular","id":139426,"avatar_url":"https://avatars.githubusercontent.com/u/139426?v=3","gravatar_id":"","url":"https://api.github.com/users/angular","html_url":"https://github.com/angular","followers_url":"https://api.github.com/users/angular/followers","following_url":"https://api.github.com/users/angular/following{/other_user}","gists_url":"https://api.github.com/users/angular/gists{/gist_id}","starred_url":"https://api.github.com/users/angular/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/angular/subscriptions","organizations_url":"https://api.github.com/users/angular/orgs","repos_url":"https://api.github.com/users/angular/repos","events_url":"https://api.github.com/users/angular/events{/privacy}","received_events_url":"https://api.github.com/users/angular/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/angular/material2","description":"Material Design components for Angular 2","fork":false,"url":"https://api.github.com/repos/angular/material2","forks_url":"https://api.github.com/repos/angular/material2/forks","keys_url":"https://api.github.com/repos/angular/material2/keys{/key_id}","collaborators_url":"https://api.github.com/repos/angular/material2/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/angular/material2/teams","hooks_url":"https://api.github.com/repos/angular/material2/hooks","issue_events_url":"https://api.github.com/repos/angular/material2/issues/events{/number}","events_url":"https://api.github.com/repos/angular/material2/events","assignees_url":"https://api.github.com/repos/angular/material2/assignees{/user}","branches_url":"https://api.github.com/repos/angular/material2/branches{/branch}","tags_url":"https://api.github.com/repos/angular/material2/tags","blobs_url":"https://api.github.com/repos/angular/material2/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/angular/material2/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/angular/material2/git/refs{/sha}","trees_url":"https://api.github.com/repos/angular/material2/git/trees{/sha}","statuses_url":"https://api.github.com/repos/angular/material2/statuses/{sha}","languages_url":"https://api.github.com/repos/angular/material2/languages","stargazers_url":"https://api.github.com/repos/angular/material2/stargazers","contributors_url":"https://api.github.com/repos/angular/material2/contributors","subscribers_url":"https://api.github.com/repos/angular/material2/subscribers","subscription_url":"https://api.github.com/repos/angular/material2/subscription","commits_url":"https://api.github.com/repos/angular/material2/commits{/sha}","git_commits_url":"https://api.github.com/repos/angular/material2/git/commits{/sha}","comments_url":"https://api.github.com/repos/angular/material2/comments{/number}","issue_comment_url":"https://api.github.com/repos/angular/material2/issues/comments{/number}","contents_url":"https://api.github.com/repos/angular/material2/contents/{+path}","compare_url":"https://api.github.com/repos/angular/material2/compare/{base}...{head}","merges_url":"https://api.github.com/repos/angular/material2/merges","archive_url":"https://api.github.com/repos/angular/material2/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/angular/material2/downloads","issues_url":"https://api.github.com/repos/angular/material2/issues{/number}","pulls_url":"https://api.github.com/repos/angular/material2/pulls{/number}","milestones_url":"https://api.github.com/repos/angular/material2/milestones{/number}","notifications_url":"https://api.github.com/repos/angular/material2/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/angular/material2/labels{/name}","releases_url":"https://api.github.com/repos/angular/material2/releases{/id}","deployments_url":"https://api.github.com/repos/angular/material2/deployments","created_at":"2016-01-04T18:50:02Z","updated_at":"2016-04-19T17:04:30Z","pushed_at":"2016-04-19T17:16:38Z","git_url":"git://github.com/angular/material2.git","ssh_url":"git@github.com:angular/material2.git","clone_url":"https://github.com/angular/material2.git","svn_url":"https://github.com/angular/material2","homepage":"","size":820,"stargazers_count":1645,"watchers_count":1645,"language":"TypeScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":201,"mirror_url":null,"open_issues_count":62,"forks":201,"open_issues":62,"watchers":1645,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/angular/material2/pulls/281"},"html":{"href":"https://github.com/angular/material2/pull/281"},"issue":{"href":"https://api.github.com/repos/angular/material2/issues/281"},"comments":{"href":"https://api.github.com/repos/angular/material2/issues/281/comments"},"review_comments":{"href":"https://api.github.com/repos/angular/material2/pulls/281/comments"},"review_comment":{"href":"https://api.github.com/repos/angular/material2/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/angular/material2/pulls/281/commits"},"statuses":{"href":"https://api.github.com/repos/angular/material2/statuses/195acd31c2498da6ad1516d599ae3030fe1b632b"}}}}